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

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

Ответы

Ответ 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 умер.

На стороне примечания, поэтому мы используем || вместо OR, когда нам нужен логический результат, но не трюк. || имеет меньший приоритет, чем = и, следовательно,

$variable = some expression 1 || some expression 2;

будет выполнен путь stright - сначала мы получаем результат ||, а затем этот результат присваиваем $variable. Но, конечно, мы всегда можем использовать привязки () для управления приоритетом вручную - поскольку фигурные скобки имеют самый высокий приоритет для всех, все внутри них будет оцениваться в первую очередь.

Ответ 2

or - это просто оператор (очень похожий на ||).

Синтаксис or die() работает, потому что or short-circuit, что означает, что если первое утверждение истинно, True or X всегда будет истинным, поэтому X не будет оценен, а ваш script t die.

Ответ 3

Да, вы можете предоставить другую функцию после (или). Я протестировал следующее:

mysqli_query($sel_db,'what!') or some_func(mysqli_error($sel_db));

function some_func($str) {
    die("ERROR: ".$str);
}

Ответ 4

Это не должно быть die() в частности, но это должно быть то, что сделает остановку script, вызвав exit() или die(), или что-то, что выдает исключение. В противном случае script будет продолжать возвращать значение этой функции (которое, вероятно, является нулевым или каким-то нежелательным) в $update_result, что почти наверняка вызовет проблемы.