これを処理する方法は、データベースエラーが発生したときに常に例外をスローするようにデータベースラッパークラスを設定することです。したがって、たとえば、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';
残念ながら、エラーと制約を注意深く調べる以外に、ソリューションに特効薬があるとは思いません。