MySQL или умереть, он должен умереть?

Если я использую немного кода, как это:

$update_result = mysqli_query( $link , $sql_update_login ) or die ('Unable to execute query. '. mysqli_error($link));

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

$update_result = mysqli_query( $link , $sql_update_login ) or function('$query, $error);

Какие есть другие варианты после 'или'? Я не нашел это в документации, любые подсказки приветствуются.

4 ответа

Решение

Должен ли он умереть

Наоборот, это не должно die() Когда-либо.
PHP - это язык с плохой наследственностью. Очень плохая наследственность. А также or die() с сообщением об ошибке, являющимся одним из худших зачатков:

  • die выдает сообщение об ошибке, раскрывая некоторые внутренние компоненты системы потенциальному злоумышленнику
  • это сбивает с толку невинных пользователей странными сообщениями и не оставляет им интерфейса для работы, так что они, скорее всего, просто уйдут.
  • он убивает сценарий посередине, поэтому может привести к появлению разорванного дизайна (или вообще никакого дизайна) (то есть неполного рендеринга страницы, запрошенной пользователем)
  • убивает сценарий безвозвратно. Пока выброшенное исключение можно поймать и изящно обработать
  • die() не дает вам подсказку о месте, где произошла ошибка. И в относительно большом приложении это будет довольно трудно найти.

Так что никогда не используйте die() с ошибками mysql, даже для временной отладки: есть лучшие способы.

Для вашего запроса у вас есть, но 2 варианта:

  • если вы собираетесь использовать mysqli_query() весь путь в коде вашего приложения (что неправильно, но в Stackru вас никогда не научат как-либо иначе), вы можете использовать trigger_error() вместо того чтобы умереть. Это вызовет обычную ошибку PHP и будет регистрироваться автоматически, в зависимости от настроек PHP.

    $result = mysqli_query($link , $sql) or trigger_error($link->error."[ $sql]");
    
  • если вы собираетесь использовать mysqli_query() как часть библиотеки абстракций, вы должны вместо этого генерировать новое исключение, потому что вам потребуется некоторая трассировка стека (которая всегда поставляется с исключением), чтобы иметь представление о том, где произошла эта ошибка.

Тем не менее, вы не можете использовать new Exception с OR оператор. Итак, код становится немного длиннее:

$result = mysqli_query($link , $sql);
if (!$result) {
    throw new Exception(mysqli_error($link)."[ $sql]");
}

Что не имеет большого значения, так как вам придется написать это только один раз.

Обновить. Как оказалось, mysqli может генерировать исключения самостоятельно, что может избавить нас от написания кода вручную:

$result = mysqli_query($link, $sql);

Этот код выдаст исключение в случае ошибки, и поэтому вы всегда будете проинформированы без дополнительного кода. Однако в предыдущих примерах к сообщению об ошибке добавлен SQL-запрос, который может быть весьма ценным, поэтому можно придерживаться и вышеупомянутых методов.

Одно важное замечание

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

Это, видимо, плохая идея. Особенно, если вы хотите записать сообщение об ошибке на тот же носитель, на котором произошла ошибка предыдущей попытки.
Ошибки должны регистрироваться в наиболее надежной среде - в текстовом журнале. Итак, просто настройте свой PHP на запись журналов ошибок и регулярно проверяйте их.

or это просто оператор (очень похоже на ||).

or die() синтаксис работает, потому что or короткие замыкания, что означает, что если первое утверждение верно, True or X всегда будет правдой, так X не оценивается, и ваш скрипт не die,

Да, вы можете предоставить другую функцию после (или). Я проверил следующее:

mysqli_query($sel_db,'what!') or some_func(mysqli_error($sel_db));

function some_func($str) {
    die("ERROR: ".$str);
}

Это не должно быть die() в частности, но это должно быть что-то, что заставит скрипт остановиться exit() или же die()или что-то, что выдает исключение. В противном случае сценарий продолжит работу с возвращаемым значением этой функции (которое может быть либо нулевым, либо каким-то ненужным) в $update_result, что почти наверняка вызовет проблемы.

Другие вопросы по тегам