以下评论(source)
默认情况下,PHP不会报告mysqli或PDO错误,因为该信息非常敏感,将其显示给用户是学习如何注入恶意数据的好方法。
MYSQLI_REPORT_ERROR告诉它打开错误,MYSQLI_REPORT_STRICT告诉它将这些错误转换为异常。这将为您提供错误消息的完整报告,因此请勿在生产环境中执行此操作。
如何检查生产中的外键约束错误,以通知用户他或她是否,例如,在删除所有相关记录之前无法删除记录?
答案 0 :(得分:2)
作为一般准则,exceptions should not be used for control flow。您应该做的是保护DELETE
语句中的if
语句,即:
<?php
$mysqli = new mysqli(/* blah */);
$parent_id = /* id of parent record that we're trying to delete */;
if ($stmt = $mysqli->prepare("select count(1) from child_table where parent_id = ?")) {
$stmt->bind_param("i", $parent_id);
$stmt->execute();
$stmt->bind_result($child_row_count);
$stmt->fetch();
$stmt->close();
if ($child_row_count == 0) {
// there is no dependant object, so we can delete
}
else {
die("Can't delete object, it has child objects linked to it");
}
}
?>
另一种方法是使用cascading deletes to automatically remove child data,在这种情况下,您不再需要检查孤儿。