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);
Каковы другие варианты после "или"? Я не нашел этого в документации, любые подсказки приветствуются.
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 на запись журналов ошибок и регулярно проверяйте их.
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
, что почти наверняка вызовет проблемы.