2009-11-16 53 views
6

PHP中處理mysql數據庫外鍵異常的最佳方式是什麼?有沒有可以用來簡化任何代碼的mysql類?在PHP中處理外鍵異常

理想情況下,我想做的事,作爲一個例子,就是試圖刪除記錄的地方是外鍵父任意數量的子表。外鍵引發異常,所以我希望能夠查看每個外鍵表並對其進行測試,從而對引起異常的表和記錄數提供有意義的反饋。這將作爲錯誤返回,以便最終用戶可以參考和刪除違規記錄。

回答

6

我處理這個問題的方法是設置我的數據庫包裝類,以便在遇到數據庫錯誤時始終引發異常。所以,舉例來說,我可能有一個叫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'; 

不幸的是,我不認爲有妙法您的解決方案不是檢查錯誤等,並嚴格限制。

+0

這看起來像是一種控制結構錯誤處理的好方法,但我真的想知道是否可以動態列出子表,然後查詢這些表以列出實際的異常。所以這是'我做了一些'我正在努力的一點。 :) – Das123 2009-11-16 19:44:01

+0

這與我自己的方法幾乎相同。 – 2009-11-16 19:50:28

+0

太棒了。謝謝。 :)額外的信息爲我完成了圖片。 :) – Das123 2009-11-17 02:37:46

0

我認爲最好的辦法是給你做一個transaction。這樣,插入將始終有效,或根本沒有完成。這可能會返回一條錯誤消息,您也可以使用它。這將防止你不得不手動檢查每個表 - 數據庫爲你做。

+0

感謝您的回覆,但從我所瞭解的事務中只打包查詢(s)。我想要做的是,在異常觸發後,給出導致異常的實際子記錄的有意義的反饋。 – Das123 2009-11-16 19:31:03