Cara saya menangani ini adalah dengan mengatur kelas pembungkus basis data saya untuk selalu memberikan pengecualian ketika Anda menemukan kesalahan basis data. Jadi, misalnya, saya mungkin memiliki kelas bernama MySQL
dengan fungsi sebagai berikut:
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());
}
Setiap kali kueri gagal, pengecualian PHP biasa dilemparkan. Perhatikan bahwa saya akan membuang ini dari dalam tempat lain juga, seperti connect()
fungsi atau selectDb()
fungsi, tergantung pada apakah operasi berhasil atau tidak.
Dengan pengaturan itu, Anda siap melakukannya. Di tempat mana pun yang Anda harapkan mungkin perlu menangani kesalahan basis data, lakukan sesuatu seperti berikut:
//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.
}
}
Sunting
Menanggapi komentar poster di bawah, Anda memiliki beberapa informasi terbatas yang tersedia bagi Anda untuk membantu mendiagnosis masalah kunci asing. Teks kesalahan yang dibuat oleh pembatasan kunci asing yang gagal dan dikembalikan oleh mysql_error()
terlihat seperti ini:
Cannot delete or update a parent row:
a foreign key constraint fails
(`dbname`.`childtable`, CONSTRAINT `FK_name_1` FOREIGN KEY
(`fieldName`) REFERENCES `parenttable` (`fieldName`));
Jika kunci asing Anda cukup kompleks sehingga Anda tidak yakin apa yang mungkin menyebabkan kesalahan kunci asing untuk kueri tertentu, Anda mungkin dapat menguraikan teks kesalahan ini untuk membantu mengetahuinya. Perintah SHOW ENGINE INNODB STATUS
mengembalikan hasil yang lebih detail untuk kesalahan kunci asing terbaru juga.
Jika tidak, Anda mungkin harus menggali sendiri. Kueri berikut akan memberi Anda daftar kunci asing pada tabel tertentu, yang dapat Anda periksa untuk mendapatkan informasi:
select * from information_schema.table_constraints
WHERE table_schema=schema() AND table_name='table_name';
Sayangnya, menurut saya tidak ada solusi ajaib untuk solusi Anda selain memeriksa kesalahan dan kendala dengan sangat hati-hati.