Удалить предупреждающие сообщения в PHP

228

У меня есть немного кода PHP. Когда я запускаю его, появляется предупреждение.

Как я могу удалить / подавить / игнорировать эти предупреждающие сообщения?

Алиреза
источник
Смотрите также: stackoverflow.com/questions/1087365
dreftymac

Ответы:

349

Вы действительно должны исправить все, что вызывает предупреждение, но вы можете контролировать видимость ошибок с помощью error_reporting(). Чтобы пропустить предупреждающие сообщения, вы можете использовать что-то вроде:

error_reporting(E_ERROR | E_PARSE);
Тату Ульманен
источник
53
E_ALL ^ E_WARNINGВключение всех отчетов об ошибках, кроме предупреждений, кажется лучшим выбором аргумента для error_reporting.
Марк Амери
1
В целом я согласен, что в моем случае создание предупреждающего сообщения было предполагаемым поведением, поскольку оно было частью моих модульных тестов.
pgee70
121

Вы можете поставить @ перед вызовом функции, чтобы подавить все сообщения об ошибках.

@yourFunctionHere();
PetPaulsen
источник
4
Это просто скрывает ошибку, это все еще происходит. Ошибки замедляют работу PHP, поэтому лучше, если это вообще возможно, исправить ошибку. Использование @ даже замедляет код, когда нет ошибки. vega.rd.no/articles/php-performance-error-suppression
dprevite
46
Иногда (к сожалению) у вас действительно нет выбора. Например, PHP-функция parse_url () генерирует предупреждения для «сильно искаженных» URL-адресов, что, возможно, является ошибкой, поскольку в этом случае функция возвращает false. Таким образом, вы должны либо терпеть эти предупреждения PHP в выходных данных вашей программы (это может быть неприемлемо для приложений парсера / валидатора), как-то подавлять предупреждения или обходить нарушенное поведение PHP, написав свой собственный парсер / валидатор для URL. В этом случае я выбираю @.
Питер
1
ВАЖНО: Используйте этот метод, если (1) вы не можете исправить проблему, которая генерирует предупреждение, и (2) скрыть свои предупреждения от конечных пользователей с помощью php error_reporting ... Скрытие предупреждений от ваших разработчиков НЕ является решением.
Джошуа Киссун
3
Позвольте мне объяснить, почему это важно. Некоторые функции, например, dns_get_recordбудут выдавать предупреждения. Ваш код может компенсировать предупреждение, но он все равно выбрасывает их. Отключение отчетов об ошибках работает на рабочем сервере, но не на сервере devel. Если вы генерируете XML-контент, предупреждение приведет к тому, что браузер не будет отображаться, поскольку сервер отправляет некорректный XML-код, вызванный предупреждением. Иногда вам нужно это на devel, но не для чего-то, вызванного временной ошибкой поиска DNS, которую вы уже компенсируете.
Алиса Уандер
2
Позвольте мне объяснить, почему это полезно, когда вместо всех предупреждающих сообщений именно вы хотите обработать предупреждение как ошибку и сгенерировать собственное сообщение об ошибке
Даниэль Н.
43

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

error_reporting(E_ALL ^ E_WARNING); 
Картик
источник
18

Если вы хотите подавить предупреждения и некоторые другие типы ошибок (например, уведомления) при отображении всех других ошибок, вы можете сделать:

error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
zstate
источник
15

в Core Php, чтобы скрыть предупреждающее сообщение, установите error_reporting (0) в верхней части общего включаемого файла или отдельного файла.

В Wordpress скрыть Предупреждения и Уведомления добавить следующий код в файле wp-config.php

ini_set('log_errors','On');
ini_set('display_errors','Off');
ini_set('error_reporting', E_ALL );
define('WP_DEBUG', false);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
Виджай Латия
источник
Это лучшее решение, когда дело доходит до сокрытия логов в Wordpress. Спасибо!!
Нео Морина
10

Не совсем отвечаю на вопрос, но я думаю, что это лучший компромисс в некоторых ситуациях:

У меня появилось предупреждающее сообщение в результате оператора printf () в сторонней библиотеке. Я точно знал, в чем причина - временное решение проблемы, пока сторонние исправили свой код. Я согласен с тем, что предупреждения не должны подавляться, но я не смог продемонстрировать свою работу клиенту с предупреждением, появляющимся на экране. Мое решение:

printf('<div style="display:none">');
    ...Third-party stuff here...
printf('</div>');

Предупреждение все еще было в источнике страницы как напоминание для меня, но невидимым для клиента.

DaveWalley
источник
5
Лично я бы использовал ob_start()и ob_end_clean()вместо этого. Таким образом, материал даже не отправляется в браузер (что он делает здесь).
h2ooooooo
6
Вот почему я включил «некоторые ситуации», «предупреждения не должны подавляться» и «напоминание мне».
DaveWalley
1
Прежде чем голосовать за меня больше, пожалуйста, прочитайте мой ответ. Обратите внимание на «сторонний», «компромисс» и комментарий выше. Я добавил этот ответ на случай, если кто-то другой окажется в той же ситуации, в которой я находился, и в этой конкретной ситуации это спасло меня, тогда как все остальные ответы были бы не такими хорошими. В следующий раз я дважды подумаю о том, чтобы быть полезным.
Дейв Уолли
Спасибо, что не удалили эту блестящую идею. В моей системе я сохраняю все ошибки и предупреждения, отправленные обратно от клиентов, и когда администратор входит в систему, они сразу же получают оповещение о любой такой деятельности, чтобы они могли сообщить об этом команде обслуживания. Сайт предназначен для образовательных игр, так что это не важно, если что-то пойдет не так в течение часа или около того.
снимается
8

Я делаю это следующим образом в моем php.ini :

error_reporting = E_ALL & ~E_WARNING  & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

Это регистрирует только фатальные ошибки и никаких предупреждений.

Навид
источник
7

Я думаю, что лучшим решением является конфигурация .htaccess. Таким образом, вам не нужно изменять код приложения. Вот директивы для Apache2

php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
php_value docref_root 0
php_value docref_ext 0
Себастьян Пискорский
источник
7

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

Если вы не знаете, как, отредактируйте свой вопрос и покажите нам соответствующую строку и отображаемое предупреждение.

Пекка
источник
7
Сафаали, ты должен решить проблемы, а не игнорировать их.
Сэмпсон
2
Safaali, видя, что у вас есть определенный интерес к PHP, сделайте себе одолжение и посмотрите на исправление этого скрипта.
Пекка
0

Уже есть ответ с оператором контроля ошибок, но в нем нет объяснения. Вы можете использовать @оператор с каждым выражением, и оно скрывает ошибки (за исключением фатальных ошибок).

@$test['test']; //PHP Notice:  Undefined variable: test

@(14/0); // PHP Warning:  Division by zero

//This is not working. You can't hide Fatal Errors this way.
@customFuntion(); // PHP Fatal error:  Uncaught Error: Call to undefined function customFuntion()

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

Вы должны рассмотреть вместо этого:

1. Настройки сообщений об ошибках, указанные в принятом ответе.

error_reporting(E_ERROR | E_PARSE);

или из настроек PHP INI

ini_set('display_errors','Off');

2. Ловля исключений

try {
    $var->method();
} catch (Error $e) {
    // Handle error
    echo $e->getMessage();
}
Tajni
источник
0

Для игнорирования всех предупреждений используйте этот пример в верхней части кода:

error_reporting(0);
Ada
источник
И в чем разница вашего ответа с принятым ответом?
endo64