Ответ 1
Нужно ли умирать
Совсем наоборот, он не должен die()
когда-либо.
PHP - это язык плохой наследственности. Очень плохая наследственность. Эта вещь or die()
является одним из худших зачатки:
- die выдает сообщение об ошибке, раскрывая некоторые внутренние системы потенциальному злоумышленнику
- он пугает невинных пользователей странными сообщениями. "Что это? Это моя вина? Или, может быть, это вирус? Лучше оставьте этот сайт сейчас!" - они могут подумать.
- он убивает script посередине, так что это может привести к разрыву дизайна (или вообще отсутствию дизайна) (то есть неполной визуализации страницы, которую запросил пользователь)
- убить script безвозвратно. В то время как исключенное исключение можно поймать и изящно обработать.
-
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!
Итак, это трюк:
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
сначала оценивается. - выполняется оператор
=
, а результатsome expression 1
назначен$variable
. - тогда PHP переходит к выполнению инструкции
OR
, и здесь идет трюк:- Если результат выражения leftomst равен
TRUE
, тогда PHP не будет запускать самый правый из них. - но если он оценивается как
FALSE
, выполняется самое правильное выражение, и наш script умер.
- Если результат выражения leftomst равен
На стороне примечания, поэтому мы используем ||
вместо OR
, когда нам нужен логический результат, но не трюк. ||
имеет меньший приоритет, чем =
и, следовательно,
$variable = some expression 1 || some expression 2;
будет выполнен путь stright - сначала мы получаем результат ||
, а затем этот результат присваиваем $variable
. Но, конечно, мы всегда можем использовать привязки ()
для управления приоритетом вручную - поскольку фигурные скобки имеют самый высокий приоритет для всех, все внутри них будет оцениваться в первую очередь.