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); 

Каковы другие варианты после «или»? Я не нашел его в документации, любые подсказки оценены.

Нужно ли умирать

Совсем наоборот, он не должен 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 для записи журналов ошибок и регулярно их проверяйте.

О синтаксисе.

Выражение

 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 сначала оценивается.
  • then = operator выполняется, а результат some expression 1 присваивается $variable .
  • то PHP переходит к выполнению инструкции OR и здесь идет трюк:
    • если результат выражения leftomst равен 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 , что почти наверняка вызовет проблемы.