2015-04-18 9 views
0

следующий комментарий (source)Проверка внешних ключей ошибок ограничений без mysqli_report

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

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

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

ответ

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, в этом случае вам больше не нужно проверять для детей-сирот.

+0

Спасибо. Лучше ли проверять готовность или выполнение? Где происходит фактическое общение с базой данных? – Talib