在 PHP 中处理 mysql 数据库外键异常的最佳方法是什么?有没有可以用来简化任何代码的 mysql 类?
理想情况下,我想要做的,例如,尝试删除一条记录,它是任意数量子表的外键父级。外键抛出异常,所以我希望能够查看每个外键表并对其进行测试,对导致异常的表和记录数提供有意义的反馈。这将作为错误返回,以便最终用户可以引用和删除违规记录。
最佳答案
我处理这个问题的方法是将我的数据库包装器类设置为在遇到数据库错误时始终抛出异常。因此,例如,我可能有一个名为 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';
不幸的是,除了非常仔细地检查错误和约束之外,我认为您的解决方案没有 Elixir 。
关于php - 在 PHP 中处理外键异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1744190/