PHP yabancı anahtar durumları işleme

2 Cevap php

Mysql veritabanı üzerinde yabancı anahtar istisnaları işlemek için PHP en iyi yol nedir? Herhangi bir kod basitleştirmek için kullanılabilecek bir mysql sınıf var mı?

İdeal olarak, ben ne yapmak istediğinizi, bir örnek olarak, bu çocuk tabloları herhangi bir sayıda yabancı anahtar üst bir kaydı silmek için çalışmaktır. Yabancı anahtar istisna atar, böylece daha sonra ben her yabancı anahtar tablosuna bakmak mümkün olacak ve durum neden kayıtların tabloları ve sayısına anlamlı geribildirim vererek, bunu test etmek istiyorum. Son kullanıcı kusurlu kayıtları başvuru ve silebilir böylece bu daha sonra hata olarak döneceklerdi.

2 Cevap

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.

Ben bir transaction yapmak için en iyi bahis olacağını düşünüyorum. Bu şekilde, insert her zaman bütün yapılan geçerli, ya da olmayacaktır. Yani siz de birlikte çalışabilir bir hata mesajı dönebilirsiniz. Db sizin için yapar - Bu el her tablo kontrol zorunda sizi engelleyecektir.