Ben bu işi şekilde bir veritabanı hatasıyla karşılaşırsanız her zaman bir özel durum için benim veritabanı sarıcı sınıf kurmaktır. Yani, örneğin, ben aşağıdaki işlevleri ile MySQL
adında bir sınıf olabilir:
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());
}
Bir sorgu başarısız her zaman, düzenli bir PHP istisnası atılır. Ben operasyon başarılı olup olmadığı bağlı olarak, bir connect()
fonksiyonu ya da bir selectDb()
fonksiyonu gibi, çok başka yerlerden içinde bu atmak olacağını unutmayın.
Bu kurmak ile gitmek için iyi bir konum. Eğer bir veritabanı hatası işleme gerekebilir bekliyoruz Herhangi bir yerde, aşağıdaki gibi bir şey yapın:
//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.
}
}
Edit
Aşağıdaki web yorumuna yanıt olarak, bir yabancı anahtar sorunu teşhis yardımcı olmak için size bazı sınırlı bilgiler var. Başarısız bir yabancı anahtar kısıtlama tarafından oluşturulan ve tarafından döndürülen hata metin mysql_error()
Böyle bir şey görünüyor:
Cannot delete or update a parent row:
a foreign key constraint fails
(`dbname`.`childtable`, CONSTRAINT `FK_name_1` FOREIGN KEY
(`fieldName`) REFERENCES `parenttable` (`fieldName`));
Yabancı tuşları, belirli bir sorgu için bir yabancı anahtar hatası neden olabilir ne emin olamaz yeterince karmaşık iseniz, o zaman muhtemelen onu anlamaya yardımcı olmak için bu hata metni ayrıştırmak. Komut SHOW ENGINE INNODB STATUS
son yabancı anahtar hata için daha detaylı bir sonuç döndürür de.
Aksi takdirde, muhtemelen bazı kendinizi kazma yapmak zorunda gidiyoruz. Aşağıdaki sorgu size bilgi inceleyebilirsiniz verilen bir tablodaki yabancı anahtar, bir listesini verecektir:
select * from information_schema.table_constraints
WHERE table_schema=schema() AND table_name='table_name';
Ne yazık ki, çok dikkatli hataları ve kısıtlamaları inceleyerek başka çözümünüz için sihirli bir mermi olduğunu sanmıyorum.