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


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

$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);

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

Author: Maelish, 2013-03-10

4 answers

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

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

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

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

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

  • Если вы собираетесь использовать mysqli_query() полностью в своем коде приложения (что неправильно, но в StackOverflow вас никогда не научат никакому другому способу), вы можете использовать trigger_error() вместо die. Это вызовет обычную ошибку 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 на запись журналов ошибок и регулярно проверяйте их.

 54
Author: Your Common Sense, 2018-03-02 11:58:01

or является просто оператором (очень похожим на ||).

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

 5
Author: Blender, 2015-12-11 16:39:56

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

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

function some_func($str) {
    die("ERROR: ".$str);
}
 1
Author: kalaero, 2013-03-10 03:01:37

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

 0
Author: duskwuff, 2013-03-10 03:02:40