जिस तरह से मैं इसे संभालने का तरीका डेटाबेस डेटाबेस त्रुटि का सामना करते समय हमेशा एक अपवाद फेंकने के लिए अपना डेटाबेस रैपर क्लास सेट अप करना है।
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());
}
किसी भी समय एक प्रश्न विफल रहता है, एक नियमित रूप से पीएचपी अपवाद फेंक दिया जाता है: तो, उदाहरण के लिए, मैं एक वर्ग निम्नलिखित कार्यों के साथ MySQL
कहा जाता है हो सकता है। ध्यान दें कि ऑपरेशन सफल होने या नहीं, इस पर निर्भर करता है कि मैं 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';
दुर्भाग्य से, मैं कोई त्रुटि की जांच के अलावा अन्य अपने समाधान करने के लिए एक जादुई गोली नहीं लगता है और है: निम्न क्वेरी आप किसी तालिका, जो आपको जानकारी के लिए जांच कर सकते हैं पर विदेशी कुंजी की एक सूची दे देंगे बाधाएं बहुत सावधानी से।
यह संरचनात्मक रूप से त्रुटि प्रबंधन को नियंत्रित करने का एक अच्छा तरीका प्रतीत होता है, लेकिन मैं वास्तव में यह जानना चाहता हूं कि क्या मैं गतिशील रूप से बाल तालिकाओं को सूचीबद्ध कर सकता हूं और फिर वास्तविक अपवादों को सूचीबद्ध करने के लिए उनसे पूछता हूं। तो यह 'कुछ सामान करो' के अंदर थोड़ा सा है जिसके साथ मैं संघर्ष कर रहा हूं। :) – Das123
यह लगभग अपने दृष्टिकोण के समान है। –
बहुत बढ़िया। धन्यवाद। :) अतिरिक्त जानकारी मेरे लिए तस्वीर को पूरा करती है। :) – Das123