Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

PHP में विदेशी कुंजी अपवादों को संभालना

जिस तरह से मैं इसे संभालता हूं, जब आप डेटाबेस त्रुटि का सामना करते हैं तो हमेशा अपवाद फेंकने के लिए अपना डेटाबेस रैपर क्लास सेट अप करना है। इसलिए, उदाहरण के लिए, मेरे पास 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';

दुर्भाग्य से, मुझे नहीं लगता कि त्रुटियों और बाधाओं की बहुत सावधानी से जांच करने के अलावा आपके समाधान के लिए कोई जादू की गोली है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL CONCAT शर्त के साथ चयन करें

  2. Mysql में उपनाम पर फ़िल्टर करना

  3. mysql - क्या मैं पूछ सकता हूं कि किसी दिए गए होस्ट ने कितने Connect_errors दिए हैं?

  4. कैसे स्वचालित रूप से सभी संदर्भ पंक्तियों को हटाने के लिए अगर मूल पंक्ति mysql में हटा दी जाती है?

  5. Django डेटाटाइम फ़ील्ड - दृश्य में समयक्षेत्र में कनवर्ट करें