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
, что почти наверняка вызовет проблемы.