Как вывести ошибки php на экран
Перейти к содержимому

Как вывести ошибки php на экран

  • автор:

Как вывести ошибки php на экран

PHP поддерживает один оператор управления ошибками: знак @ . В случае если он предшествует какому-либо выражению в PHP-коде, любые сообщения об ошибках, генерируемые этим выражением, будут подавлены.

Если пользовательская функция обработчика ошибок установлена функцией set_error_handler() , она всё равно будет вызываться, даже если диагностика была подавлена.

Внимание

До версии PHP 8.0.0 функция error_reporting() , вызываемая внутри пользовательского обработчика ошибок, всегда возвращала 0 , если ошибка была подавлена оператором @ . Начиная с PHP 8.0.0 она возвращает значение этого (побитового) выражения: E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE .

Любое сообщение об ошибке, сгенерированное выражением, доступно в элементе массива с ключом «message» , возвращаемого функцией error_get_last() . Результат этой функции будет меняться при каждой ошибке, поэтому его необходимо проверить заранее.

/* Преднамеренная ошибка при работе с файлами */
$my_file = @ file ( ‘non_existent_file’ ) or
die ( «Ошибка при открытии файла: сообщение об ошибке было таким: ‘» . error_get_last ()[ ‘message’ ] . «‘» );

// работает для любых выражений, а не только для функций
$value = @ $cache [ $key ];
// В случае если ключа $key нет, сообщение об ошибке (notice) не будет отображено

Замечание: Оператор @ работает только с выражениями. Есть простое правило: если что-то возвращает значение, значит, можно указать перед ним оператор @ . Например, можно указать оператор @ перед именем переменной, произвольной функцией, вызовом выражения include и т. д. При этом нельзя указывать этот оператор перед определением функции или класса, условными конструкциями, например: if , foreach и т. д.

Внимание

До PHP 8.0.0 оператор @ мог подавлять критические ошибки, которые прерывали выполнение скрипта. Например, добавление оператора @ к вызову несуществующей функции, когда она недоступна или вызвана с опечаткой, приведёт к прерыванию выполнения скрипта без указания причины.

Смотрите также

  • error_reporting()
  • Обработка ошибок и функции логирования

User Contributed Notes 16 notes

15 years ago

I was confused as to what the @ symbol actually does, and after a few experiments have concluded the following:

* the error handler that is set gets called regardless of what level the error reporting is set on, or whether the statement is preceeded with @

* it is up to the error handler to impart some meaning on the different error levels. You could make your custom error handler echo all errors, even if error reporting is set to NONE.

* so what does the @ operator do? It temporarily sets the error reporting level to 0 for that line. If that line triggers an error, the error handler will still be called, but it will be called with an error level of 0

Hope this helps someone

14 years ago

Be aware of using error control operator in statements before include() like this:

(@include( «file.php» ))
OR die( «Could not find file.php!» );

?>

This cause, that error reporting level is set to zero also for the included file. So if there are some errors in the included file, they will be not displayed.

10 years ago
This operator is affectionately known by veteran phpers as the stfu operator.
12 years ago

If you’re wondering what the performance impact of using the @ operator is, consider this example. Here, the second script (using the @ operator) takes 1.75x as long to execute. almost double the time of the first script.

So while yes, there is some overhead, per iteration, we see that the @ operator added only .005 ms per call. Not reason enough, imho, to avoid using the @ operator.

function x () < >
for ( $i = 0 ; $i < 1000000 ; $i ++) < x (); >
?>

real 0m7.617s
user 0m6.788s
sys 0m0.792s

function x () < >
for ( $i = 0 ; $i < 1000000 ; $i ++) < @ x (); >
?>

real 0m13.333s
user 0m12.437s
sys 0m0.836s

14 years ago

Error suppression should be avoided if possible as it doesn’t just suppress the error that you are trying to stop, but will also suppress errors that you didn’t predict would ever occur. This will make debugging a nightmare.

It is far better to test for the condition that you know will cause an error before preceding to run the code. This way only the error that you know about will be suppressed and not all future errors associated with that piece of code.

There may be a good reason for using outright error suppression in favor of the method I have suggested, however in the many years I’ve spent programming web apps I’ve yet to come across a situation where it was a good solution. The examples given on this manual page are certainly not situations where the error control operator should be used.

7 years ago

There is no reason to NOT use something just because «it can be misused». You could as well say «unlink is evil, you can delete files with it so don’t ever use unlink».

It’s a valid point that the @ operator hides all errors — so my rule of thumb is: use it only if you’re aware of all possible errors your expression can throw AND you consider all of them irrelevant.

A simple example is

?>
There are only 2 possible problems here: a missing variable or a missing index. If you’re sure you’re fine with both cases, you’re good to go. And again: suppressing errors is not a crime. Not knowing when it’s safe to suppress them is definitely worse.

2 years ago

It’s still possible to detect when the @ operator is being used in the error handler in PHP8. Calling error_reporting() will no longer return 0 as documented, but using the @ operator does still change the return value when you call error_reporting().

My PHP error settings are set to use E_ALL, and when I call error_reporting() from the error handler of a non-suppressed error, it returns E_ALL as expected.

But when an error occurs on an expression where I tried to suppress the error with the @ operator, it returns: E_ERROR | E_PARSE | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR (or the number 4437).

I didn’t want to use 4437 in my code in case it changes with different settings or future versions of PHP, so I now use:

function my_error_handler ( $err_no , $err_msg , $filename , $linenum ) if ( error_reporting () != E_ALL ) return false ; // Silenced
>

// .
>
?>

If the code needs to work with all versions of PHP, you could check that error_reporting() doesn’t equal E_ALL or 0.

And, of course, if your error_reporting settings in PHP is something other than E_ALL, you’ll have to change that to whatever setting you do use.

4 years ago

Quick debugging methods :

@print($a);
is equivalent to
if isset($a) echo $a ;

@a++;
is equivalent to
if isset($a) $a++ ;
else $a = 1;

4 years ago

Please be aware that the behaviour of this operator changed from php5 to php7.

The following code will raise a Fatal error no matter what, and you wont be able to suppress it

function query ()
$myrs = null ;
$tmp = @ $myrs -> free_result ();

13 years ago

After some time investigating as to why I was still getting errors that were supposed to be suppressed with @ I found the following.

1. If you have set your own default error handler then the error still gets sent to the error handler regardless of the @ sign.

2. As mentioned below the @ suppression only changes the error level for that call. This is not to say that in your error handler you can check the given $errno for a value of 0 as the $errno will still refer to the TYPE(not the error level) of error e.g. E_WARNING or E_ERROR etc

3. The @ only changes the rumtime error reporting level just for that one call to 0. This means inside your custom error handler you can check the current runtime error_reporting level using error_reporting() (note that one must NOT pass any parameter to this function if you want to get the current value) and if its zero then you know that it has been suppressed.
// Custom error handler
function myErrorHandler ( $errno , $errstr , $errfile , $errline )
if ( 0 == error_reporting () ) // Error reporting is currently turned off or suppressed with @
return;
>
// Do your normal custom error reporting here
>
?>

For more info on setting a custom error handler see: http://php.net/manual/en/function.set-error-handler.php
For more info on error_reporting see: http://www.php.net/manual/en/function.error-reporting.php

13 years ago

Be aware that using @ is dog-slow, as PHP incurs overhead to suppressing errors in this way. It’s a trade-off between speed and convenience.

12 years ago

If you use the ErrorException exception to have a unified error management, I’ll advise you to test against error_reporting in the error handler, not in the exception handler as you might encounter some headaches like blank pages as error_reporting might not be transmitted to exception handler.

function exception_error_handler ( $errno , $errstr , $errfile , $errline )
throw new ErrorException ( $errstr , 0 , $errno , $errfile , $errline );
>

function catchException ( $e )
if ( error_reporting () === 0 )
return;
>

?>

It would be better to do :

function exception_error_handler ( $errno , $errstr , $errfile , $errline )
if ( error_reporting () === 0 )
return;
>

throw new ErrorException ( $errstr , 0 , $errno , $errfile , $errline );
>

function catchException ( $e )
// Do some stuff
>

Как включить отображение всех ошибок php при написании программы

Во время написания кода программы на языке программирования php хочется написать её не только быстро, но и правильно. Для этого можно поменять настройки отображения ошибок в конфигурационном файле php.ini . Но переключать каждый раз режим отображения ошибок и уровень их протоколирования накладно по времени, плюс нужно помнить, где на сервере лежит конфиг php. В этой статье рассмотрим простой и работающий способ переопределения констант, заданных в конфиге php.ini , в файле программы. Это позволит не только ускорить процесс написания кода, но и быстро отключать режим отладки, когда программа готова к запуску в продакшен.

Необходимый код для включения отображения всех ошибок и предупреждений php в работающей программе

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

'); ini_set('error_append_string', ''); /* тут собственно сам код программы на php */ error_reporting($errlevel); ini_set('display_errors','Off'); ?>

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

error_reporting() — функция работы с уровнем протоколируемых ошибок

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

$errlevel = error_reporting();

Во второй строчке меняем уровень протоколирования (вывода) ошибок на значение -1 , воспользовавшись советом из официальной документации:

Если передать -1 , будут отображаться все возможные ошибки , даже если в новых версиях PHP добавятся уровни или константы. В версии PHP 5.4. передача константы E_ALL дает тот же результат.

Это выглядит следующим образом:

error_reporting(-1);

В конце работы скрипта, требующего отладки, можно вернуть уровень протоколирования, заданный в php.ini , который мы заблаговременно сохранили в переменную $errlevel . Именно это и происходит в предпоследней строке:

error_reporting($errlevel);

Переопределение переменных конфигурационного файла php.ini с помощью функции ini_set()

После того, как мы включили режим отображения всех ошибок и предупреждений, их нужно выдать на экран при работе отлаживаемого скрипта. Этот режим отладки обычно выключен, поэтому его нужно включить, переопределив некоторые переменные конфигурационного файла php.ini с помощью функции ini_set() , которая устанавливает значения переменных настройки конфигурации работы php.

Включение/отключение отображения ошибок при выполнении скрипта директивой display_errors

Для того, чтобы увидеть отображение ошибок и предупреждений при выполнении скрипта, нужно выставить значение ‘On’ или 1 директиве display_errors :

ini_set('display_errors', 'On');

После того участка программы, которая требует отладки, можно снова отключить отображение ошибок php. Именно это и происходит в последней строке приведённого выше кода (возврат значения ‘Off’ , которое используется в конфиге php по умолчанию):

ini_set('display_errors','Off');

Подсветка отображаемых ошибок и предупреждений, выдаваемых при включенном display_errors

В принципе, приведённого кода, описанного выше, достаточно. Но мне удобнее, когда ошибки выводятся другим цветом, чем основой вывод, генерируемый при работе отлаживаемого скрипта. Для этого необходимо экранировать выводимые ошибки и предупреждения HTML-кодом. Для этого я использовал простейшее изменение цвета выводимого шрифта с помощью тега font , что конечно можно усложнить, вписав тот код, который наиболее подходит решаемой задаче, задав какие угодно css-стили для подсветки ошибок и предупреджений. Можно даже задать отдельный класс и выводить его из отдельного css-файла. Но, я решил не усложнять.

Директива error_prepend_string

Директива error_prepend_string задаёт строку, которая будет выводиться непосредственно перед сообщением об ошибке. В нашем коде она имеет вид:

ini_set('error_prepend_string', '');
Директива error_append_string

Директива error_append_string задаёт строку, которая будет выводиться после сообщения об ошибке. В нашем коде она имеет вид:

ini_set('error_append_string', '');

Резюме

Таким образом можно значительно упростить и ускорить написание правильно работающего php-кода. Важно помнить, что после отладки, лучше удалить все эти строки, отвечающие за отображение ошибок и предупреждений, из кода. То, как будет работать программа в продакшене, зависит от настроек того сервера, где она будет запускаться. У него собственный файл конфигурации php.ini и, наверняка, администратор сервера не зря их выставил так, чтобы они работали или были отключены. Не надо злить других админов, перепрописывая в своём коде заданные не вами значения. Если при этом все ошибки и предупреждения были исправлены, то вероятность того, что она будет глючить, — минимальна.

Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! 😉

Как в PHP 8 показать все ошибки

По умолчанию в PHP 8 отключён показ ошибок, поэтому если во время выполнения PHP скрипта возникла проблема, то на экран ничего не будет выведено. Если ошибка в программе произошла до вывода HTML кода, то вы увидите белый экран веб-браузера.

Где настраивается вывод ошибок в PHP

Вывод ошибок настраивается в:

  • коде скрипта
  • .htaccess файле
  • в конфигурационном файле PHP (например, в php.ini)

Настройке в коде скрипта влияют на поведение только программы, в которую внесены настройки.

Настройки в файле .htaccess влияют на все скрипты, находящиеся в данной директории и поддиректориях.

Настройки в конфигурационном файле php.ini влияют на все запускаемые PHP скрипты, если в них не переназначены настройки вывода ошибок.

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

Настройка вывода ошибок в PHP скрипте

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

ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL);

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

Будут выведены предупреждения об использовании устаревших конструкций.

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

Помните, что при возникновении фатальных ошибок, то есть когда скрипт даже не смог запуститься из-за неправильного синтаксиса PHP, то для вывода ошибок будут применяться правила, указанные в файле php.ini или .htaccess. Это обусловлено тем, что при неправильном синтаксисе интерпретатор PHP не понимает весь файл, в том числе и указанные выше директивы. То есть если в коде пропущена точка с запятой или фигурная скобка, то ошибки будут выводиться в соответствии с настройками в файле php.ini.

Настройка вывода ошибок PHP в файле .htaccess

Включение вывода ошибок в файле .htaccess выполняется следующими директивами:

php_flag display_startup_errors on php_flag display_errors on

Чтобы они сработали, необходимо, чтобы на веб-сервере была включена поддержка файлов .htaccess.

Вывод ошибок в журнал веб-сервера выполняется следующей директивой:

php_value error_log logs/all_errors.log

Настройка вывода всех ошибок в файле php.ini

Файл php.ini — это конфигурационный файл PHP.

При своей работе PHP может использовать более одного конфигурационного файла.

Расположение файла php.ini:

  • В Debian и производных дистрибутивах (Ubuntu, Linux Mint, Kali Linux и прочих) зависит от версии PHP, например, для PHP 8.1 путь до файла следующий: /etc/php/8.1/apache2/php.ini
  • В Arch Linux и производных дистрибутивах (Manjaro, BlackArch и прочих): /etc/php/php.ini

В файле php.ini вы найдёте следующие директивы:

display_errors = Off display_startup_errors = Off

Для включения вывода ошибок замените их на:

display_errors = On display_startup_errors = On

По умолчанию значение error_reporting установлено на:

error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

Это означает, что выводятся все ошибки, кроме предупреждений об устаревших конструкциях и предупреждения, вызванные строгой проверкой кода.

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

error_reporting = E_ALL
  • E_ALL (Показать все ошибки, предупреждения и уведомления, включая стандарты написания кода.)
  • E_ALL & ~E_NOTICE (Показать все ошибки, кроме уведомлений)
  • E_ALL & ~E_NOTICE & ~E_STRICT (Показать все ошибки, кроме уведомлений и предупреждений о стандартах написания кода.)
  • E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Показать только ошибки)

Для того, чтобы изменения, сделанные в файле php.ini, вступили в силу, необходима перезагрузка веб-сервера.

  • В Debian и производных дистрибутивах (Ubuntu, Linux Mint, Kali Linux и прочих) это делается командой:
sudo systemctl restart apache2.service
  • В Arch Linux и производных дистрибутивах (Manjaro, BlackArch и прочих) это делается командой:
sudo systemctl restart httpd.service

Чтобы проверить, что настройки файла php.ini действительно применяются, создайте файл, например, с именем info.php и скопируйте в него:

Если вы создали файл в корневой папке веб-сервера, то в веб-браузере откройте адрес http://localhost/info.php.

На следующем скриншоте показано, что вывод ошибок отключён в файле php.ini:

На этом скриншоте видно, что вывод ошибок включён в файле php.ini:

Вывод ошибок в журнал веб-сервера

Настройка вывода ошибок в журнал веб-сервера настраивается в файле php.ini.

Для этого используется следующая директива:

log_errors = On

Расположение файла с ошибка настраивается в конфигурации веб-сервера.

Директива «error_reporting(‘all’);» и ошибка «Uncaught TypeError: error_reporting()»

При попытке использовать следующую конструкцию:

error_reporting('all');

Вы столкнётесь с ошибкой Uncaught TypeError: error_reporting().

Полный лог ошибки:

[Wed Jul 06 07:29:19.410966 2022] [php:error] [pid 14101] [client 127.0.0.1:58402] PHP Fatal error: Uncaught TypeError: error_reporting(): Argument #1 ($error_level) must be of type ?int, string given in /srv/http/suip/index.php:3\nStack trace:\n#0 /srv/http/suip/index.php(3): error_reporting('all')\n#1 \n thrown in /srv/http/suip/index.php on line 3, referer: http://localhost/suip/

Вместо ‘all‘ вам нужно указать константу, выражающую уровень сообщения об ошибках. Допустимые значения провидены на этой страницы: https://www.php.net/manual/errorfunc.constants.php

Следующая запись является правильной для PHP 8 и означает показывать все ошибки, замечания и рекомендации:

error_reporting(E_ALL);

error_reporting

Функция error_reporting() задаёт значение директивы error_reporting во время работы (выполнения) программы. PHP содержит много уровней ошибок. Через эту функцию задают уровень ошибок на время работы (выполнения) скрипта, которые попадут в отчёт. Если необязательный аргумент error_level не задан, функция error_reporting() вернёт текущее значение уровня протоколирования ошибок.

Список параметров

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

Доступные константы уровней ошибок и их описания приведены в разделе «Предопределённые константы».

Возвращаемые значения

Возвращает значение директивы error_reporting, которое в ней хранилось до того, как оно было изменено на значение параметра error_level .

Замечание: Оператор управления ошибками ( @ ) изменяет значение параметра error_level во время обработки ошибки.

Список изменений

Версия Описание
8.0.0 Параметр error_level теперь может принимать значение null.

Примеры

Пример #1 Примеры использования функции error_reporting()

// Выключение протоколирования ошибок
error_reporting ( 0 );

// Включать в отчёт простые описания ошибок
error_reporting ( E_ERROR | E_WARNING | E_PARSE );

// Включать в отчёт E_NOTICE сообщения (добавятся сообщения о
// непроинициализированных переменных или ошибках в именах переменных)
error_reporting ( E_ERROR | E_WARNING | E_PARSE | E_NOTICE );

// Добавлять сообщения обо всех ошибках, кроме E_NOTICE
error_reporting ( E_ALL & ~ E_NOTICE );

// Добавлять в отчёт все ошибки PHP
error_reporting ( E_ALL );

// Добавлять в отчёт все ошибки PHP
error_reporting (- 1 );

// То же, что и error_reporting(E_ALL);
ini_set ( ‘error_reporting’ , E_ALL );

Примечания

Подсказка

Если передать значение -1 , будут отображаться все возможные ошибки, даже если в новых версиях PHP добавятся уровни или константы. Поведение эквивалентно передаче константы E_ALL .

Смотрите также

  • Директива display_errors
  • Директива html_errors
  • Директива xmlrpc_errors
  • Оператор управления ошибками
  • Функция ini_set() — Устанавливает значение настройки конфигурации — Устанавливает значение настройи конфигурации

User Contributed Notes 27 notes

15 years ago

If you just see a blank page instead of an error reporting and you have no server access so you can’t edit php configuration files like php.ini try this:

— create a new file in which you include the faulty script:

error_reporting ( E_ALL );
ini_set ( «display_errors» , 1 );
include( «file_with_errors.php» );
?>

— execute this file instead of the faulty script file

now errors of your faulty script should be reported.
this works fine with me. hope it solves your problem as well!

17 years ago

The example of E_ALL ^ E_NOTICE is a ‘bit’ confusing for those of us not wholly conversant with bitwise operators.

If you wish to remove notices from the current level, whatever that unknown level might be, use & ~ instead:

//.
$errorlevel = error_reporting ();
error_reporting ( $errorlevel & ~ E_NOTICE );
//. code that generates notices
error_reporting ( $errorlevel );
//.
?>

^ is the xor (bit flipping) operator and would actually turn notices *on* if they were previously off (in the error level on its left). It works in the example because E_ALL is guaranteed to have the bit for E_NOTICE set, so when ^ flips that bit, it is in fact turned off. & ~ (and not) will always turn off the bits specified by the right-hand parameter, whether or not they were on or off.

3 years ago

Under PHP 8.0, error_reporting() does not return 0 when then the code uses a @ character.

$a = $array [ 20 ]; // error_reporting() returns 0 in php =8

4 years ago

In php7, what was generally a notice or a deprecated is now a warning : the same level of a mysql error … unacceptable for me.

I do have dozen of old projects and I surely d’ont want to define every variable which I eventually wrote 20y ago.

So two option: let php7 degrade my expensive SSDs writing Gb/hours or implement smthing like server level monitoring ( with auto_[pre-ap]pend_file in php.ini) and turn off E_WARNING

Custom overriding the level of php errors should be super handy and flexible …

3 years ago
error_reporting(E_ALL);
if (!ini_get(‘display_errors’)) ini_set(‘display_errors’, ‘1’);
>
19 years ago

The error_reporting() function won’t be effective if your display_errors directive in php.ini is set to «Off», regardless of level reporting you set. I had to set

display_errors = On
error_reporting = ~E_ALL

to keep no error reporting as default, but be able to change error reporting level in my scripts.
I’m using PHP 4.3.9 and Apache 2.0.

6 years ago

To expand upon the note by chris at ocproducts dot com. If you prepend @ to error_reporting(), the function will always return 0.

error_reporting ( E_ALL );
var_dump (
error_reporting (), // value of E_ALL,
@ error_reporting () // value is 0
);
?>

14 years ago
It could save two minutes to someone:
E_ALL & ~E_NOTICE integer value is 6135
5 years ago

If you get a weird mysql warnings like «Warning: mysql_query() : Your query requires a full tablescan. «, don’t look for error_reporting settings — it’s set in php.ini.
You can turn it off with
ini_set(«mysql.trace_mode»,»Off»);
in your script
http://tinymy.link/mctct

18 years ago

Note that E_NOTICE will warn you about uninitialized variables, but assigning a key/value pair counts as initialization, and will not trigger any error :
error_reporting ( E_ALL );

$foo = $bar ; //notice : $bar uninitialized

$bar [ ‘foo’ ] = ‘hello’ ; // no notice, although $bar itself has never been initialized (with «$bar = array()» for example)

$bar = array( ‘foobar’ => ‘barfoo’ );
$foo = $bar [ ‘foobar’ ] // ok

$foo = $bar [ ‘nope’ ] // notice : no such index
?>

5 years ago

I had the problem that if there was an error, php would just give me a blank page. Any error at all forced a blank page instead of any output whatsoever, even though I made sure that I had error_reporting set to E_ALL, display_errors turned on, etc etc. But simply running the file in a different directory allowed it to show errors!

Turns out that the error_log file in the one directory was full (2.0 Gb). I erased the file and now errors are displayed normally. It might also help to turn error logging off.

5 years ago

This article refers to these two reporting levels:

// Report all PHP errors (see changelog)
error_reporting(E_ALL);

// Report all PHP errors
error_reporting(-1);

What is the difference between those two levels?

Please update this article with a clear explanation of the difference and the possible use cases.

13 years ago

Some E_STRICT errors seem to be thrown during the page’s compilation process. This means they cannot be disabled by dynamically altering the error level at run time within that page.

The work-around for this was to rename the file and replace the original with a error_reporting() call and then a require() call.

Ex, rename index.php to index.inc.php, then re-create index.php as:

error_reporting ( E_ALL & ~( E_STRICT | E_NOTICE ));
require( ‘index.inc.php’ );
?>

That allows you to alter the error reporting prior to the file being compiled.

I discovered this recently when I was given code from another development firm that triggered several E_STRICT errors and I wanted to disable E_STRICT on a per-page basis.

7 years ago

The error_reporting() function will return 0 if error suppression is currently active somewhere in the call tree (via the @ operator).

23 years ago

error_reporting() has no effect if you have defined your own error handler with set_error_handler()

[Editor’s Note: This is not quite accurate.

E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR and E_COMPILE_WARNING error levels will be handled as per the error_reporting settings.

All other levels of errors will be passed to the custom error handler defined by set_error_handler().

Zeev Suraski suggests that a simple way to use the defined levels of error reporting with your custom error handlers is to add the following line to the top of your error handling function:

8 years ago

If you want to see all errors in your local environment, you can set your project URL like «foo.com.local» locally and put that in bootstrap file.

if ( substr ( $_SERVER [ ‘SERVER_NAME’ ], — 6 ) == ‘.local’ ) ini_set ( ‘display_errors’ , 1 );
ini_set ( ‘error_reporting’ , E_ALL );
// or error_reporting(E_ALL);
>
?>

14 years ago

see more information about php 5.3 deprecated errors

13 years ago

To enable error reporting for *ALL* error messages including every error level (including E_STRICT, E_NOTICE etc.), simply use:

15 years ago

this is to show all errors for code that may be run on different versions

for php 5 it shows E_ALL^E_STRICT and for other versions just E_ALL

if anyone sees any problems with it please correct this post

ini_set ( ‘error_reporting’ , version_compare ( PHP_VERSION , 5 , ‘>=’ ) && version_compare ( PHP_VERSION , 6 , ‘ ?>

9 years ago

If you are using the PHP development server, run from the command line via `php -S servername:port`, every single error/notice/warning will be reported in the command line itself, with file name, and line number, and stack trace.

So if you want to keep a log of all the errors even after page reloads (for help in debugging, maybe), running the PHP development server can be useful.

18 years ago

In phpinfo() error reporting level display like a bit (such as 4095)

Maybe it is a simply method to understand what a level set on your host
if you are not have access to php.ini file

$bit = ini_get ( ‘error_reporting’ );
while ( $bit > 0 ) <
for( $i = 0 , $n = 0 ; $i $end = $i ;
>
$res [] = $end ;
$bit = $bit — $end ;
>
?>

In $res you will have all constants of error reporting
$res[]=int(16) // E_CORE_ERROR
$res[]=int(8) // E_NOTICE
.

18 years ago

Remember that the error_reporting value is an integer, not a string ie «E_ALL & ~E_NOTICE».

This is very useful to remember when setting error_reporting levels in httpd.conf:

Use the table above or:

ini_set ( «error_reporting» , E_YOUR_ERROR_LEVEL );
echo ini_get ( «error_reporting» );
?>

To get the appropriate integer for your error-level. Then use:

php_admin_value error_reporting YOUR_INT

I want to share this rather straightforward tip as it is rather annoying for new php users trying to understand why things are not working when the error-level is set to (int) «E_ALL» = 0.

Maybe the PHP-developers should make ie error_reporting(«E_ALL»); output a E_NOTICE informative message about the mistake?

12 years ago

It might be a good idea to include E_COMPILE_ERROR in error_reporting.

If you have a customer error handler that does not output warnings, you may get a white screen of death if a «require» fails.

Example:
error_reporting ( E_ERROR | E_WARNING | E_PARSE );

function myErrorHandler ( $errno , $errstr , $errfile , $errline ) // Do something other than output message.
return true ;
>

$old_error_handler = set_error_handler ( «myErrorHandler» );

require «this file does not exist» ;
?>

To prevent this, simply include E_COMPILE_ERROR in the error_reporting.

error_reporting ( E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR );
?>

15 years ago

Only display php errors to the developer.

if( $_SERVER [ ‘REMOTE_ADDR’ ]== «00.00.00.00» )
<
ini_set ( ‘display_errors’ , ‘On’ );
>
else
<
ini_set ( ‘display_errors’ , ‘Off’ );
>
?>

Just replace 00.00.00.00 with your ip address.

14 years ago

I always code with E_ALL set.
After a couple of pages of
$username = (isset( $_POST [ ‘username’ ]) && !empty( $_POST [ ‘username’ ])).
?>

I made this function to make things a little bit quicker. Unset values passed by reference won’t trigger a notice.

function test_ref (& $var , $test_function = » , $negate = false ) $stat = true ;
if(!isset( $var )) $stat = false ;
if (!empty( $test_function ) && function_exists ( $test_function )) $stat = $test_function ( $var );
$stat = ( $negate ) ? $stat ^ 1 : $stat ;
>
elseif( $test_function == ’empty’ ) $stat = empty( $var );
$stat = ( $negate ) ? $stat ^ 1 : $stat ;
>
elseif (! function_exists ( $test_function )) $stat = false ;
trigger_error ( » $test_function () is not a valid function» );
>
$stat = ( $stat ) ? true : false ;
return $stat ;
>
$a = » ;
$b = ’15’ ;

test_ref ( $a , ’empty’ , true ); //False
test_ref ( $a , ‘is_int’ ); //False
test_ref ( $a , ‘is_numeric’ ); //False
test_ref ( $b , ’empty’ , true ); //true
test_ref ( $b , ‘is_int’ ); //False
test_ref ( $b , ‘is_numeric’ ); //false
test_ref ( $unset , ‘is_numeric’ ); //false
test_ref ( $b , ‘is_number’ ); //returns false, with an error.
?>

17 years ago

error_reporting() may give unexpected results if the @ error suppression directive is used.

@include ‘config.php’ ;
include ‘foo.bar’ ; // non-existent file
?>

config.php
error_reporting ( 0 );
?>

will throw an error level E_WARNING in relation to the non-existent file (depending of course on your configuration settings). If the suppressor is removed, this works as expected.

Alternatively using ini_set(‘display_errors’, 0) in config.php will achieve the same result. This is contrary to the note above which says that the two instructions are equivalent.

10 years ago

Creating a Custom Error Handler

set_error_handler(«customError»,E_ALL);
function customError($errno, $errstr)
echo «Error: [$errno] $errstr
«;
echo «Ending Script»;
die();
>

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *