没有mysqli_report检查外键限制错误

时间:2015-04-18 19:48:30

标签: php mysqli foreign-keys restriction

以下评论(source

  

默认情况下,PHP不会报告mysqli或PDO错误,因为该信息非常敏感,将其显示给用户是学习如何注入恶意数据的好方法。

     

MYSQLI_REPORT_ERROR告诉它打开错误,MYSQLI_REPORT_STRICT告诉它将这些错误转换为异常。这将为您提供错误消息的完整报告,因此请勿在生产环境中执行此操作。

如何检查生产中的外键约束错误,以通知用户他或她是否,例如,在删除所有相关记录之前无法删除记录?

1 个答案:

答案 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,在这种情况下,您不再需要检查孤儿。