जिस तरह से मैं इसे संभालता हूं, जब आप डेटाबेस त्रुटि का सामना करते हैं तो हमेशा अपवाद फेंकने के लिए अपना डेटाबेस रैपर क्लास सेट अप करना है। इसलिए, उदाहरण के लिए, मेरे पास MySQL
. नामक एक वर्ग हो सकता है निम्नलिखित कार्यों के साथ:
public function query($query_string)
{
$this->queryId = mysql_query($query_string,$this->connectionId);
if (! $this->queryId) {
$this->_throwException($query_string);
}
return $this->queryId;
}
private function _throwException($query = null)
{
$msg = mysql_error().". Query was:\n\n".$query.
"\n\nError number: ".mysql_errno();
throw new Exception($msg,mysql_errno());
}
जब भी कोई क्वेरी विफल हो जाती है, तो एक नियमित PHP अपवाद फेंक दिया जाता है। ध्यान दें कि मैं इन्हें अन्य स्थानों से भी फेंक दूंगा, जैसे connect()
फ़ंक्शन या selectDb()
ऑपरेशन सफल हुआ या नहीं, इस पर निर्भर करता है।
उस सेट अप के साथ, आप जाने के लिए अच्छे हैं। किसी भी स्थान पर जहां आप उम्मीद करते हैं कि आपको डेटाबेस त्रुटि को संभालने की आवश्यकता हो सकती है, निम्न की तरह कुछ करें:
//assume $db has been set up to be an instance of the MySQL class
try {
$db->query("DELETE FROM parent WHERE id=123");
} catch (Exception $e) {
//uh-oh, maybe a foreign key restraint failed?
if ($e->getCode() == 'mysql foreign key error code') {
//yep, it failed. Do some stuff.
}
}
संपादित करें
नीचे पोस्टर की टिप्पणी के जवाब में, आपके पास कुछ सीमित जानकारी उपलब्ध है जो किसी विदेशी कुंजी समस्या का निदान करने में मदद करती है। एक विफल विदेशी कुंजी संयम द्वारा बनाया गया त्रुटि पाठ और mysql_error()
. द्वारा लौटाया गया कुछ इस तरह दिखता है:
Cannot delete or update a parent row:
a foreign key constraint fails
(`dbname`.`childtable`, CONSTRAINT `FK_name_1` FOREIGN KEY
(`fieldName`) REFERENCES `parenttable` (`fieldName`));
यदि आपकी विदेशी कुंजियाँ इतनी जटिल हैं कि आप सुनिश्चित नहीं हो सकते कि किसी दिए गए प्रश्न के लिए विदेशी कुंजी त्रुटि क्या हो सकती है, तो आप शायद इस त्रुटि पाठ को इसका पता लगाने में मदद करने के लिए पार्स कर सकते हैं। कमांड SHOW ENGINE INNODB STATUS
नवीनतम विदेशी कुंजी त्रुटि के लिए भी अधिक विस्तृत परिणाम देता है।
अन्यथा, आपको शायद खुद को कुछ खोदना होगा। निम्नलिखित क्वेरी आपको दी गई तालिका पर विदेशी कुंजियों की एक सूची देगी, जिसे आप जानकारी के लिए जांच सकते हैं:
select * from information_schema.table_constraints
WHERE table_schema=schema() AND table_name='table_name';
दुर्भाग्य से, मुझे नहीं लगता कि त्रुटियों और बाधाओं की बहुत सावधानी से जांच करने के अलावा आपके समाधान के लिए कोई जादू की गोली है।