Если я использую такой код:
$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
, что почти наверняка вызовет проблемы.