Обработка ошибок и продолжение выполнения в PHP-скрипте

#php #execution #die

#php #выполнение #die

Вопрос:

Я не хочу «die()», когда это касается только небольшой части скрипта, и я попытался:

 $result = mysql_query($sql) or echo("error with responses");
  

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

Комментарии:

1. Заголовок вопроса чуть не довел меня до аневризмы.

2. Смотрите, теперь это заголовок для получения просмотров / ответов. Как правило, только фатальная ошибка (часто синтаксические ошибки и тому подобное) должна привести к завершению работы скрипта. Какое конкретное сообщение об ошибке вы получили?

3. на самом деле, забавно, я не обратил внимания на свой заголовок после того, как посмотрел список заданных вопросов, а затем спросил. lol Я не хотел завершать работу скрипта только из-за ошибки mysql. Я хотел продолжить выполнение остальной части скрипта, даже если ему не удастся получить данные из базы данных.

4. Я обновил заголовок, поскольку предыдущий показался (в лучшем случае) неактуальным. 🙂

Ответ №1:

 $result = mysql_query($sql);
if(mysql_error()) {
  echo "Error: " . mysql_error();
}
  

Комментарии:

1. @netrox Итак, примите этот ответ, ваш коэффициент принятия будет выше.

2. я жду истечения 10 минут :/

Ответ №2:

С точки зрения вашего первоначального названия вопроса — вы не можете. Цель die и exit — завершить обработку скрипта. Если вы не хотите завершать обработку скрипта, не вызывайте die or exit .

Что касается подавления вывода ошибок, это возможно с использованием оператора управления ошибками ( @ ), но нецелесообразно. (Вы должны самостоятельно проверить состояние ошибки, если вы подавляете ошибки таким образом.)

Например, вы могли бы использовать:

 $result = @mysql_query($sql);
if(is_resource($result)) {
    // The query worked...

}
else {
   // Handle error state, perhaps using mysql_error
}
  

Однако, чтобы внести ясность, НИКОГДА случайно не добавляйте средство подавления ошибок в вызов функции. Вы ДОЛЖНЫ убедиться, что сами правильно обрабатываете любые потенциальные ошибки.

Ответ №3:

 $result = mysql_query($sql) or print("error with responses");
  

Echo нельзя использовать в логических сравнениях, таких как то, что вы пытаетесь сделать. Вместо этого вы должны использовать print, это не вызовет ошибок PHP.

Ответ №4:

Проверьте тип возвращаемого mysql_query

 $result = mysql_query($sql);
if ($result===false) {

 echo 'The Query failed';
}

//> Continue
  

Ответ №5:

Вам не обязательно использовать die в качестве второго вызова функции, это просто используется в качестве соглашения почти в каждом mysql_query учебном пособии.

Все, что мы делаем, это вычисляем логическое выражение. $result = $a OR $b . Если значение $a равно true, то мы никогда не выполняем $b , потому что нам это не нужно. Мы удовлетворили логику OR , поскольку одна сторона оператора является true, и это все, что нам нужно.

Функция die() немедленно завершает работу скрипта с сообщением. Вы могли бы заменить его своей собственной функцией, чтобы напечатать красивое сообщение об ошибке и продолжить выполнение скрипта без выхода., например:

 function my_error_function($status) {
    echo "ERROR: $status";
}

$result = mysql_query($sql) or my_error_function("Uhoh.  There was a problem executing $sql.");
  

Ответ №6:

Вы можете отключить отчеты об ошибках, которые вы в любом случае хотите выполнять в производственной среде.

 error_reporting(0);
  

Он по-прежнему будет выдавать ошибку, но она больше не будет отображаться.

Однако это очень необычно. Я не могу придумать причину, по которой кто-то хотел бы принять ошибку MySQL — если проблема в неработающем SQL, вы обычно обнаруживаете это заранее.

Комментарии:

1. Ошибки MySQL могут быть полезны — например, если вы получаете ошибку с дубликатом ключа, вы должны предоставить пользователю сообщение о том, что его имя пользователя / URL / что угодно уже существует, и продолжить.

2. @ceejayoz Я бы, как правило, хотел перехватить это заранее. Мне не нравится показывать конечным пользователям необработанные сообщения об ошибках SQL, даже если сервер недоступен.

3. Вам не обязательно показывать необработанное сообщение об ошибке. Используйте mysql_errno() , чтобы выяснить, в чем заключалась ошибка, затем обработайте ее.

4. @ceejayoz да, тогда мы на одной странице. Я думал, вы имели в виду передачу ошибок непосредственно пользователю

Ответ №7:

Вам следует обратить внимание на try / catch not die() или exit

Комментарии:

1. Увы, ветхое расширение mysql не выдает исключений, поэтому нечего пытаться / перехватывать. Это было бы правильно, если бы использовался PDO.

2. @charles: еще одна причина использовать слой-оболочку, чтобы заставить его генерировать исключения или использовать errorexceptions. Итак, есть способы заставить это работать…