Если я использую такой код:
$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);
Каковы другие варианты после «или»? Я не нашел его в документации, любые подсказки оценены.
Нужно ли умирать
Совсем наоборот, он не должен die() когда-либо.
PHP – это язык плохой наследственности. Очень плохая наследственность. Это or 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 для записи журналов ошибок и регулярно их проверяйте.
Выражение
some_expression OR other expression;
это просто выражение PHP. Точно так же, как
$variable = some expression;
и оператор OR такой же, как = (или любой другой – > , * , и такой) оператор.
Большую часть времени мы хотели бы присвоить результат оператора OR некоторой переменной (заметим, что здесь мы имеем 2 оператора: = и OR ):
$variable = (some expression OR some expression);
который даст нам логическую $variable , но это необязательно. Мы всегда можем опустить крайнюю левую часть, оставив только
$var1 OR $var2;
и это не вызовет ошибки анализа.
И здесь мы приходим к интересной части:
Поскольку оператор
ORвернетTRUEесли один из 2 операндов TRUE, интеллектуальный интерпретатор вообще не будет запускать второй операнд, если сначала он уже был оценен как true!
Итак, это трюк:
some expression 1 OR some expression 2 ;
означает «выполнить some expression 2 только если some expression 1 вернуло FALSE »
Теперь вернемся к
$variable = some expression 1 OR some expression 2;
вот что называется приоритетом операторов : = имеет более высокий приоритет, чем OR и поэтому он будет выполнен первым. Таким образом, это выражение можно записать в виде
($variable = some expression 1) OR some expression 2;
Итак, теперь вы можете сделать вывод, как это работает (мои извинения, предыдущая версия была в основном неправильной):
some expression 1 сначала оценивается. = operator выполняется, а результат some expression 1 присваивается $variable . OR и здесь идет трюк:
TRUE , тогда PHP не будет запускать самый правый. FALSE , выполняется самое правильное выражение, и наш скрипт скончался. На стороне примечания, поэтому мы используем || вместо OR когда нам нужен логический результат, но не трюк. || имеет меньший приоритет, чем = и, следовательно,
$variable = some expression 1 || some expression 2;
будет выполняться прямолинейно – сначала мы получаем результат || а затем этот результат присваивается $variable . Но, конечно, мы всегда можем использовать () фигурные скобки для управления приоритетом вручную – поскольку фигурные скобки имеют самый высокий приоритет для всех, все внутри них будет оцениваться в первую очередь.
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 , что почти наверняка вызовет проблемы.