Видаліть попереджувальні повідомлення в 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

120

Ви можете поставити @ перед своїм викликом функції, щоб придушити всі повідомлення про помилки.

@yourFunctionHere();

4
Це просто приховує помилку, вона все ще відбувається. Помилки PHP сповільнюються, тому краще виправити помилку, якщо це можливо. Використання @ навіть уповільнює код, коли немає помилки. vega.rd.no/articles/php-performance-error-suppression
dprevite

46
Іноді (на жаль) у вас справді немає вибору. Наприклад, функція PHP parse_url () генерує попередження для "сильно сформованих" URL-адрес - що, можливо, є помилкою, оскільки функція повертає помилкове значення в цьому випадку. Таким чином, ви повинні або терпіти ці попередження PHP у виході програми (може бути неприйнятним для програм аналізатора / валідатора), придушувати попередження якось, або обходити порушену поведінку PHP, написавши власний парсер / валідатор для URL-адрес. У цьому випадку я вибираю @.
Петро

1
ВАЖЛИВО: Використовуючи цей метод iff (1) ви не зможете вирішити проблему, яка генерує попередження, а також (2) приховувати свої попередження від кінцевих користувачів за допомогою php error_reporting ... Приховування попереджень від розробників НЕ є рішенням.
Джошуа Кіссон

3
Дозвольте мені пояснити, чому це критично. Деякі функції, такі як dns_get_recordкидають попередження. Ваш код може компенсувати попередження, але він все-таки видає їх. Вимкнення повідомлень про помилки працює на виробничому сервері, але не на сервері розробок. Якщо ви генеруєте XML-вміст, попередження призведе до того, що браузер не відображатиметься, оскільки сервер надсилає неправильну XML, спричинену попередженням. Іноді ви хочете, що це на розробці, але не для чогось, викликаного тимчасовим збоєм пошуку DNS, який ви вже компенсуєте.
Аліса Чудо

2
Дозвольте мені пояснити, чому це корисно, коли замість усіх попереджувальних повідомлень саме ви хочете обробити попередження як помилку та створити власне повідомлення про помилку
Даніель Н.

43

Щоб придушити попередження, залишаючи ввімкнено всі інші повідомлення про помилки:

error_reporting(E_ALL ^ E_WARNING); 


18

Якщо ви хочете придушити попередження та деякі інші типи помилок (наприклад, повідомлення) під час відображення всіх інших помилок, ви можете зробити:

error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);

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

Попередження все ще було у джерелі сторінки як нагадування для мене, але невидиме для клієнта.


5
Особисто я б використовував ob_start()і ob_end_clean()замість цього. Таким чином, матеріал навіть не надсилається до браузера (що він робить тут).
h2ooooooo

6
Тому я включив "деякі ситуації", "попередження не слід придушувати" та "нагадування мені".
DaveWalley

1
Перш ніж проголосувати мені більше, будь ласка, прочитайте мою відповідь. Зауважте "стороннє", "компромісне" та коментар вище. Я додав цю відповідь у випадку, якщо хтось інший опинився в тій же ситуації, в якій я був, і в цій конкретній ситуації це врятувало мене, тоді як усі інші відповіді не були б такими хорошими. Наступного разу я подумаю два рази про те, щоб бути корисним.
DaveWalley

Дякую, що не знімали цю геніальну ідею. У своїй системі я зберігаю всі помилки та попередження, що надсилаються від клієнтів, і коли адміністратор заходить у систему, вони негайно оповіщаються про будь-яку таку діяльність, щоб вони могли порадити екіпаж з обслуговування. Сайт призначений для навчальних ігор, тому це не є великим, якщо щось піде не так протягом години.
cneeds

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
Сафаалі, бачачи, як у вас є певний інтерес до PHP, зробіть собі прихильність і погляньте на виправлення цього сценарію.
Pekka

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

0

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

error_reporting(0);

І чим відрізняється ваша відповідь від прийнятої відповіді?
endo64
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.