error_reporting

(PHP 4, PHP 5, PHP 7)

error_reporting设置应该报告何种 PHP 错误

说明

error_reporting ([ int $level ] ) : int

error_reporting() 函数能够在运行时设置 error_reporting 指令。 PHP 有诸多错误级别,使用该函数可以设置在脚本运行时的级别。 如果没有设置可选参数 levelerror_reporting() 仅会返回当前的错误报告级别。

参数

level

新的 error_reporting 级别。 可以是一个位掩码也可以是一个已命名的常量。 强烈建议使用已命名的常量,以确保兼容将来的版本。 由于错误级别的添加、整数取值范围的增加, 较久的基于整数的错误级别不会总是和预期的表现一致。

可用的错误级别常量及其实际含义描述在了 predefined constants 中。

返回值

返回旧的 error_reporting 级别,或者在 level 参数未给出时返回当前的级别。

更新日志

版本 说明
5.4.0 E_STRICT 成为 E_ALL 的一部分
5.3.0 引入 E_DEPRECATEDE_USER_DEPRECATED
5.2.0 引入 E_RECOVERABLE_ERROR
5.0.0 引入 E_STRICT (但不包括在 E_ALL 之内)。

范例

Example #1 error_reporting() 范例

<?php

// 关闭所有PHP错误报告
error_reporting(0);

// Report simple running errors
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 错误 (参见 changelog)
error_reporting(E_ALL);

// 报告所有 PHP 错误
error_reporting(-1);

// 和 error_reporting(E_ALL); 一样
ini_set('error_reporting'E_ALL);

?>

注释

Warning

虽然 error_reporting 增强了 包含 E_STRICT 错误的能力(反之亦然),但大多数 E_STRICT 的错误是在编译时被评估的, 所以不会在文件中被报告。

Tip

传入 -1 的值将尽可能显示所有错误, 甚至包括将来 PHP 可能加入的新的错误级别和常量。 至 PHP 5.4,常量 E_ALL 有同样的行为。

参见

User Contributed Notes

sasarohde14 at gmail dot com 29-Sep-2018 10:10
If you are looking for Mcafee antivirus activation key then just contact or visit the page for all support https://mcafeeactivate.co/mcafee-business-support/
sasarohde14 at gmail dot com 29-Sep-2018 10:10
If you are looking for Mcafee antivirus activation key then just contact or visit the page for all support https://mcafeeactivate.co/mcafee-business-support/
Anonymous 29-Sep-2018 10:08
this node is not so important please upload a video tutorial for it https://mcafeeactivate.co/mcafee-business-support/
huhiko334 at yandex dot ru 23-Sep-2018 02:20
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
saimlocus1234 at gmail dot com 14-Sep-2018 10:20
The error reporting purpose requires which boo-boos are conveyed. PHP has countless levels of wrongness and using this occupation sets that level for the contemporary calligraphy.
<?php
// Turn off error reporting
error_reporting(0);

// Report runtime errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Report all errors
error_reporting(E_ALL);

// Same as error_reporting(E_ALL);
ini_set("error_reporting", E_ALL);

// Report all errors except E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
?>
http://playstation.gamesupportonline.com/
nancysinger259 at outlook dot com 22-Jun-2018 06:53
Call us for Gateway Computers Tech Support with Toll Free Number in USA and Canada. This is 24*7 Customer Support Service for Gateway Computer or Laptop.  https://www.getcontactnumber.com/computer/gateway-support-service/
nancyanderson152 at gmail dot com 16-Jun-2018 07:52
https://newtechnical.net/pc-matic-customer-service-phone-number-usa/
https://newtechnical.net/trust/

Call PC matic helpline
nancyanderson152 at gmail dot com 16-Jun-2018 07:48
Contact Pc Matic customer service for issues related to your pc matic...
https://newtechnical.net/pc-matic-customer-service-phone-number-usa/
https://newtechnical.net/trust/
luisdev 29-May-2018 12:26
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.
alovesdalot at gmail dot com 16-Apr-2018 05:38
The Apple iMac Customer Support is extraordinary compared to other administrations gives on the planet. They give an overall to email your pc Help the issues identified with iMac Customer Service Number you can tackle any issue with the iMac Customer Service Number than just you can reach us.
http://newtechnical.net
kevinson112 at yahoo dot com 16-Apr-2018 05:34
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.

https://techysupport.co/norton-tech-support/
nikhildawed2773 at gmail dot com 10-Mar-2018 10:07
The Apple iMac Customer Support is one of the best services provides in the world. They provide an all-around for email your pc Help the issues related to iMac Customer Service Number you can solve any problem with the iMac Customer Service Number than just you can contact us.
https://babasupport.org/apple/imac-customer-service-number/345
iMac Customer Service Number 10-Mar-2018 10:04
As for the iMac, Customer Service Number is the best feature of remote access iMac Customer Support Number is not editable during use of the remote access application on Microsoft Windows than can you help with the contact us. If you are facing any issue related to iMac Support Number, it is good service provide 24*7 hours anytime problem with our contact us.
https://babasupport.org/apple/imac-customer-service-number/345
adam at adamhahn dot com 14-Mar-2017 09:35
To expand upon the note by chris at ocproducts dot com. If you prepend @ to error_reporting(), the function will always return 0.

<?php
error_reporting
(E_ALL);
var_dump(
   
error_reporting(), // value of E_ALL,
   
@error_reporting() // value is 0
);
?>
chris at ocproducts dot com 12-Nov-2016 12:55
The error_reporting() function will return 0 if error suppression is currently active somewhere in the call tree (via the @ operator).
qeremy ! gmail 10-Apr-2015 11:44
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.

<?php
if (substr($_SERVER['SERVER_NAME'], -6) == '.local') {
   
ini_set('display_errors', 1);
   
ini_set('error_reporting', E_ALL);
   
// or error_reporting(E_ALL);
}
?>
Rash 03-Jan-2015 05:18
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.
Marc17 07-Jan-2014 09:30
To not display the E_DEPRECATED errors (for example) without changing the rest of the configuration :
error_reporting(error_reporting() & (-1 ^ E_DEPRECATED));
forcemdt 01-Oct-2013 07:56
Php >5.4

Creating a Custom Error Handler

set_error_handler("customError",E_ALL);
function customError($errno, $errstr)
  {
  echo "<b>Error:</b> [$errno] $errstr<br>";
  echo "Ending Script";
  die();
  }
teynon1 at gmail dot com 09-Feb-2012 08:50
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:
<?php
  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.

<?php
  error_reporting
(E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
?>
ywarnier at beeznest dot org 03-Aug-2011 08:56
Setting error_reporting in your VirtualHost has to be done through a numerical value which is the result of the options you choose summed up from the values of these options, as defined on the constants page for the error management functions: http://www.php.net/manual/en/errorfunc.constants.php

As a result, E_ALL & ~E_NOTICE would be set this way (this automatically excludes E_DEPRECATED AND E_USER_DEPRECATED):

  php_value error_reporting 6135

whereas E_ALL (excluding the deprecated levels) would be set this way:

  php_value error_reporting 6143

The difference between those two values is 8, which is the value of the constant for E_NOTICE.
rojaro at gmail dot com 06-Dec-2010 02:55
To enable error reporting for *ALL* error messages including every error level (including E_STRICT, E_NOTICE etc.), simply use:

<?php error_reporting(-1); ?>
keithm at aoeex dot com 14-Jun-2010 10:23
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:

<?php
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.
roberto at spadim dot com dot br 29-Jan-2010 01:00
see more information about php 5.3 deprecated errors

http://php.net/manual/en/migration53.deprecated.php
misplacedme at gmail dot com 09-Jun-2009 02:25
I always code with E_ALL set.
After a couple of pages of
<?php
$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.

<?php
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.
?>
ecervetti at orupaca dot fr 25-Mar-2009 01:54
It could save two minutes to someone:
E_ALL & ~E_NOTICE  integer value is 6135
Daz Williams (The Northeast) 18-Feb-2009 06:03
Only display php errors to the developer...

<?php
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.
info at hephoz dot de 14-Aug-2008 06:34
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:

<?php
 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!
kc8yds at gmail dot com 10-Aug-2008 11:45
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

<?php
ini_set
('error_reporting', version_compare(PHP_VERSION,5,'>=') && version_compare(PHP_VERSION,6,'<') ?E_ALL^E_STRICT:E_ALL);
?>
derek at darkcolors dot com 27-May-2008 01:12
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.
antickon AT gmail.com 04-Apr-2007 05:21
regarding what vdephily at bluemetrix dot com said ( see http://be.php.net/manual/en/function.error-reporting.php#50228 )

<?php
echo $foobar->field;
?>

also initializes $foobar (as an instance of stdClass), so this code will not cause any notices.
Alex 19-Jan-2007 03:43
error_reporting() may give unexpected results if the @ error suppression directive is used.

<?php
 
@include 'config.php';
 include
'foo.bar';        // non-existent file
?>

config.php
<?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.
silvan at NOSPAM dot example dot com 04-Oct-2006 06:38
On a shared debugging and production server it is convenient to use
<?php error_reporting(E_ALL); ?>
for debugging.

This will not help in case of parsing errors, so make sure you enable at least E_PARSE in your php.ini. Parse errors should not exist in production scripts.

Still, sometimes your script will not get executed even though no parse error is displayed (just a blank page/ no output at all). As far as I know this only happens when you redeclare a user function or class.

eg.
<?php
error_reporting
(E_ALL);

function
a(){}
function
a(){}
?>

This prevents your script from running like a parse error, but is in fact a fatal run-time error (E_ERROR). Other fatal run-time errors will allow your script to apply the error_reporting, when it is executed before the
error occurs (eg. put error_reporting on the first line of code.)
Chris 09-May-2006 01:32
I found some simple mistakes in the functions I posted yesterday, so here are the corrected versions.
And a good advice: never code in the middle of the night ;)

<?php
function error2string($value)
{
   
$level_names = array(
       
E_ERROR => 'E_ERROR', E_WARNING => 'E_WARNING',
       
E_PARSE => 'E_PARSE', E_NOTICE => 'E_NOTICE',
       
E_CORE_ERROR => 'E_CORE_ERROR', E_CORE_WARNING => 'E_CORE_WARNING',
       
E_COMPILE_ERROR => 'E_COMPILE_ERROR', E_COMPILE_WARNING => 'E_COMPILE_WARNING',
       
E_USER_ERROR => 'E_USER_ERROR', E_USER_WARNING => 'E_USER_WARNING',
       
E_USER_NOTICE => 'E_USER_NOTICE' );
    if(
defined('E_STRICT')) $level_names[E_STRICT]='E_STRICT';
   
$levels=array();
    if((
$value&E_ALL)==E_ALL)
    {
       
$levels[]='E_ALL';
       
$value&=~E_ALL;
    }
    foreach(
$level_names as $level=>$name)
        if((
$value&$level)==$level) $levels[]=$name;
    return
implode(' | ',$levels);
}
?>

<?php
function string2error($string)
{
   
$level_names = array( 'E_ERROR', 'E_WARNING', 'E_PARSE', 'E_NOTICE',
       
'E_CORE_ERROR', 'E_CORE_WARNING', 'E_COMPILE_ERROR', 'E_COMPILE_WARNING',
       
'E_USER_ERROR', 'E_USER_WARNING', 'E_USER_NOTICE', 'E_ALL' );
    if(
defined('E_STRICT')) $level_names[]='E_STRICT';
   
$value=0;
   
$levels=explode('|',$string);
    foreach(
$levels as $level)
    {
       
$level=trim($level);
        if(
defined($level)) $value|=(int)constant($level);
    }
    return
$value;
}
?>
dave at davidhbrown dot us 06-Apr-2006 08:51
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:

<?php
//....
$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.
DarkGool 19-Aug-2005 10:30
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

<?php
$bit
= ini_get('error_reporting');
while (
$bit > 0) {
    for(
$i = 0, $n = 0; $i <= $bit; $i = 1 * pow(2, $n), $n++) {
       
$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
...
fredrik at demomusic dot nu 22-Jul-2005 04:24
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:

<?php
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

in httpd.conf

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?
phpfanat at yandex dot ru 22-Feb-2005 09:03
If you get a weird mysql warnings like "Warning: mysql_query() [http://www.mysql.com/doc]: 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

And, as of my opinion, it should be NOTICE, not WARNING level.
vdephily at bluemetrix dot com 22-Feb-2005 03:40
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 :
<?php
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
?>
Fernando Piancastelli 13-Dec-2004 01:23
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.
ferozzahid [at] usa [dot] com 08-Sep-2004 04:31
To be enable to switch between error_reporting during development and release phases, one can define say 'php_error_reporting' in the main configuration file (ini like file: no PHP) for the application as:

# config.ini
# PHP error reporting. supported values are given below.
# 0 - Turn off all error reporting
# 1 - Running errors
# 2 - Running errors + notices
# 3 - All errors except notices and warnings
# 4 - All errors except notices
# 5 - All errors

php_error_reporting=4

# config.ini ends

Setting error_reporting in PHP files would be something like the code below, assuming the function getinivar() returns the variable value from the configuration file.

<?php
// setting PHP error reporting
switch(getinivar('php_error_reporting')) {
case
0: error_reporting(0); break;
case
1: error_reporting(E_ERROR | E_WARNING | E_PARSE); break;
case
2: error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); break;
case
3: error_reporting(E_ALL ^ (E_NOTICE | E_WARNING)); break;
case
4: error_reporting(E_ALL ^ E_NOTICE); break;
case
5: error_reporting(E_ALL); break;
default:
   
error_reporting(E_ALL);
}
?>

Feroz Zahid.
j dot schriver at vindiou dot com 02-Oct-2000 11:37
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:

if (!($type & error_reporting())) return;

 -zak@php.net]