PHP在mysql数据库上处理外键异常的最佳方法是什么?是否有可用于简化任何代码的mysql类?
理想情况下,我想要做的是尝试删除一条记录,它是任意数量子表的外键父级。外键抛出异常,因此我希望能够查看每个外键表并对其进行测试,从而对表和引起异常的记录数提供有意义的反馈。然后将其作为错误返回,以便最终用户可以引用和删除有问题的记录。
答案 0 :(得分: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';
不幸的是,除了非常仔细地检查错误和限制之外,我认为你的解决方案没有灵丹妙药。
答案 1 :(得分:0)
我认为最好的选择是你做transaction。这样,插入将始终有效,或根本不进行。这可以返回您也可以使用的错误消息。这将阻止您必须手动检查每个表 - 数据库为您执行此操作。