PHP

2009-11-16 3 views
6

में विदेशी कुंजी अपवादों को संभालना एक mysql डेटाबेस पर विदेशी कुंजी अपवादों को संभालने के लिए PHP में सबसे अच्छा तरीका क्या है? क्या कोई MySQL क्लास है जिसका उपयोग किसी भी कोड को सरल बनाने के लिए किया जा सकता है?PHP

आदर्श रूप से, मैं एक उदाहरण के रूप में, जो करना चाहता हूं, वह एक रिकॉर्ड को हटाने का प्रयास करना है जहां यह किसी भी बाल तालिका के लिए विदेशी कुंजी माता-पिता है। विदेशी कुंजी अपवाद फेंकता है, इसलिए मैं प्रत्येक विदेशी कुंजी तालिका को देखने और परीक्षण करने में सक्षम होना चाहता हूं, टेबल पर सार्थक प्रतिक्रिया देना और अपवाद के कारण रिकॉर्ड की संख्या देना। फिर इसे त्रुटि के रूप में वापस कर दिया जाएगा ताकि अंतिम उपयोगकर्ता आपत्तिजनक रिकॉर्ड को संदर्भित और हटा सके।

उत्तर

6

जिस तरह से मैं इसे संभालने का तरीका डेटाबेस डेटाबेस त्रुटि का सामना करते समय हमेशा एक अपवाद फेंकने के लिए अपना डेटाबेस रैपर क्लास सेट अप करना है।

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'; 

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

+0

यह संरचनात्मक रूप से त्रुटि प्रबंधन को नियंत्रित करने का एक अच्छा तरीका प्रतीत होता है, लेकिन मैं वास्तव में यह जानना चाहता हूं कि क्या मैं गतिशील रूप से बाल तालिकाओं को सूचीबद्ध कर सकता हूं और फिर वास्तविक अपवादों को सूचीबद्ध करने के लिए उनसे पूछता हूं। तो यह 'कुछ सामान करो' के अंदर थोड़ा सा है जिसके साथ मैं संघर्ष कर रहा हूं। :) – Das123

+0

यह लगभग अपने दृष्टिकोण के समान है। –

+0

बहुत बढ़िया। धन्यवाद। :) अतिरिक्त जानकारी मेरे लिए तस्वीर को पूरा करती है। :) – Das123

0

मुझे लगता है कि transaction करने के लिए सबसे अच्छी शर्त होगी। इस तरह, सम्मिलन हमेशा वैध होगा, या बिल्कुल नहीं किया जाएगा। यह एक त्रुटि संदेश लौटा सकता है जिसे आप साथ भी काम कर सकते हैं। यह आपको प्रत्येक तालिका को मैन्युअल रूप से जांचने से रोक देगा - डीबी यह आपके लिए करता है।

+0

प्रतिक्रिया के लिए धन्यवाद, लेकिन जो लेनदेन मैं समझता हूं उससे केवल क्वेरी (क्वेरी) को संकुलित करता है। मैं क्या करना चाहता हूं, अपवाद के बाद, अपवाद के कारण वास्तविक बाल रिकॉर्ड की सार्थक प्रतिक्रिया दें। – Das123

संबंधित मुद्दे