Проверка ошибок ограничения внешнего ключа без mysqli_report

Для следующего комментария (источник)

По умолчанию PHP не сообщает об ошибках mysqli или PDO, потому что эта информация очень чувствительна, ее отображение пользователю является отличным способом научиться внедрять вредоносные данные.

MYSQLI_REPORT_ERROR говорит ему включить ошибки, а MYSQLI_REPORT_STRICT говорит ему преобразовывать эти ошибки в исключения. Это даст вам полный отчет об ошибке, поэтому никогда не делайте этого в производственных средах.

Как можно проверить наличие ошибок ограничения внешнего ключа в производственной среде, чтобы уведомить пользователя о том, что он, например, не может удалить запись, пока не будут удалены все связанные записи?

0

Решение

Как общее руководство, исключения не должны использоваться для потока управления. Что вы должны сделать, это охранять 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");
}
}

?>

Альтернативой было бы использовать каскадное удаление для автоматического удаления дочерних данных, в этом случае вам больше не нужно проверять сирот.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]