|
|
 |
error_reporting (PHP 3, PHP 4, PHP 5) error_reporting -- Sets which PHP errors are reported Descriptionint error_reporting ( [int level] )
The error_reporting() function sets the
error_reporting
directive at runtime. PHP has many levels of errors, using
this function sets that level for the duration (runtime) of
your script.
Parameters
- level
The new error_reporting
level. It takes on either a bitmask, or named constants. Using named
constants is strongly encouraged to ensure compatibility for future
versions. As error levels are added, the range of integers increases,
so older integer-based error levels will not always behave as expected.
The available error level constants are listed below. The actual
meanings of these error levels are described in the
predefined constants.
Table 1. error_reporting() level constants and bit values
Examples
Example 1. error_reporting() examples |
<?php
error_reporting(0);
error_reporting(E_ERROR | E_WARNING | E_PARSE);
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
error_reporting(E_ALL ^ E_NOTICE);
error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);
?>
|
|
Notes| Warning |
With PHP > 5.0.0 E_STRICT with value 2048 is
available. E_ALL does NOT
include error level E_STRICT.
Most of E_STRICT errors are evaluated at the
compile time thus such errors are not reported in the file where
error_reporting is enhanced
to include E_STRICT errors.
|
User Contributed Notes
error_reporting
rsterbin at stwing dot org
13-Apr-2005 10:52
When called with no arguments, error_reporting() returns the current error level. A line of the type "if ($errno & error_reporting())" caused me much undue stress, as this behaviour is not explicitly stated in the documentation.
See:
1.135 zeev Feb 28 1998 * Made error_reporting() with no arguments return the current error reporting level
http://bonsai.php.net/cvslog.cgi?file=php3/functions/basic_functions.c
supergoku123 at hotmail dot com
28-Mar-2005 11:09
Here is a file check without the error then turning back on the error for other mistakes throughout the page.
<?
error_reporting(0);
if(file($filename.".php") == true) {
echo "good";
} else {
echo "<font color=red>False.</font>";
}error_reporting(E_ALL);
?>
phpfanat at yandex dot ru
22-Feb-2005 11: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 05: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; $bar['foo'] = 'hello'; $bar = array('foobar' => 'barfoo');
$foo = $bar['foobar'] $foo = $bar['nope'] ?>
info at darkrealm dot nl
12-Feb-2005 06:28
in reponce to
Fernando Piancastelli note on 13-Dec-2004 10:23
If the php.ini has display_errors turned of, you can always use the ini_set command to change it at runtime.
ini_set("display_errors","1");
should do the trick nicely.
10-Feb-2005 11:55
Under jjuffermans' note, the editors posted the following:
"Instead of using @ to suppress errors if the file does not exist you should do a conditional include:
if (is_file("nosuchfile.php")) {
include_once("nosuchfile.php");
}"
This is rather obvious, but has an even more obvious problem: is_file doesn't check on the include_path, which one assumes include_once is highly likely to be using.
While there are any number of kludgy workarounds which can be employed to overcome this problem, it's a structural problem in PHP and should be fixed. Preferably @ should only suppress a file not found error, but not any errors inside the included file if it is found, or failing that at the least is_file or file_exists should have the option to look on the include_path for the file.
Fernando Piancastelli
13-Dec-2004 03: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.
dnirvine[at]gmail[dot]com
14-Nov-2004 02:21
<?php
php_error_reporting=4
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.
[code]
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);
}
[/code]
?>
I'll have to start using this from now on! Be much easier than having error_reporting(0) and trying to switch to find errors. Thanks.
ferozzahid [at] usa [dot] com
08-Sep-2004 06: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.
[code]
// 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);
}
[/code]
Feroz Zahid.
simon at firepages dot com dot au
23-Nov-2003 03:04
I needed to get a string representation of the integer value returned by ini_get( 'error_reporting' ) ;& this is what I ended up with if its of any use ... It appears to work ok.
<?
$err=array(1 => 'E_ERROR' , 2 => 'E_WARNING' , 4 => 'E_PARSE' , 8 => 'E_NOTICE' ,16 => 'E_CORE_ERROR' ,
32 => 'E_CORE_WARNING' ,64 => 'E_COMPILE_ERROR' ,128 => 'E_COMPILE_WARNING' ,
256 => 'E_USER_ERROR' ,512 => 'E_USER_WARNING' ,1024 => 'E_USER_NOTICE' ,2047 => 'E_ALL ');
function foo( &$intval ){
$x=2047;
while( $x > 0 ){
if( $x < $intval ){
$intval = $intval - abs( $x ) ;
return abs( $x ) ;
}
$x = ceil( $x / 2 ) ;
}
}
function bar( $intval ,$err ){
while( $intval > 0 ){
if( isset( $err[$intval] ) ){
$array[] = $err[$intval];
break;
}
$rets = foo( $intval ) ;
$array[] = $err[$rets];
}
return $array ;
}
$intval = 2047 - (int)ini_get( 'error_reporting' ) ;
echo 'E_ALL & ~ ( ' .@implode( ' | ' , bar( $intval , $err ) ) . ' ) ';
?>
hughjonesd at yahoo dot co dot uk
04-Sep-2003 11:49
In response to peterdodge below: sometimes it's a good idea to throw errors, because they warn the developer (or user) that something is wrong. It might be better to throw an error, but to set up a good error handler in order to display a useful error page or message to the reader. If you're clever, you can even set up a stack of error handlers, and have errors "thrown" and "caught" at different points in your script.
peterdodge at liquidfirestudios.com
21-May-2003 02:33
Try to avoid the use of E_USER_* errors when you can, as the script can better handle bad input better with conditional branching:
# e.g. user entered "foo"
$bad_data = "foo";
if ($input == $bad_data)
{
myErrorHandler("Gave bad data $input");
}
else
{
processData($input);
}
Also, as a programming practice try to use E_NOTICE whenever possible to catch undefined variables.
jernberg at fairytale dot se
27-Feb-2003 05:27
tip: if you want your error_reporting()-setting to work with your own error handler you could simply check the error number against the current error bitmask.
function myErrorHandler( $errno, $errstr, $errfile, $errline )
{
$replevel = error_reporting();
if( ( $errno & $replevel ) != $errno )
{
// we shall remain quiet.
return;
}
echo( "error....." );
}
ronald at segment dot info
11-Feb-2003 10:09
Function translateErrorReportingConstant2String()
{
$current = error_reporting();
$out = "";
if (($current & E_ERROR ) == E_ERROR ){ $out .=" E_ERROR | "; }
if (($current & E_WARNING ) == E_WARNING ){ $out .=" E_WARNING | "; }
if (($current & E_PARSE ) == E_PARSE ){ $out .=" E_PARSE | "; }
if (($current & E_NOTICE ) == E_NOTICE ){ $out .=" E_NOTICE | "; }
if (($current & E_CORE_ERROR ) == E_CORE_ERROR ){ $out .=" E_CORE_ERROR | "; }
if (($current & E_CORE_WARNING ) == E_CORE_WARNING ){ $out .=" E_CORE_WARNING | "; }
if (($current & E_COMPILE_ERROR ) == E_COMPILE_ERROR ){ $out .=" E_COMPILE_ERROR | "; }
if (($current & E_COMPILE_WARNING) == E_COMPILE_WARNING){ $out .=" E_COMPILE_WARNING | "; }
if (($current & E_USER_ERROR ) == E_USER_ERROR ){ $out .=" E_USER_ERROR | "; }
if (($current & E_USER_WARNING ) == E_USER_WARNING ){ $out .=" E_USER_WARNING | "; }
if (($current & E_USER_NOTICE ) == E_USER_NOTICE ){ $out .=" E_USER_NOTICE | "; }
if (($current & E_ALL ) == E_ALL ){ $out .=" E_ALL | "; }
return $out;
}
}
jjuffermans at chello dot com
04-Jan-2003 08:47
[Editor's Note]
Instead of using @ to suppress errors if the file does not exist you should do a conditional include:
if (is_file("nosuchfile.php")) {
include_once("nosuchfile.php");
}
Note that when you use the @ to suppress the error of an include file that couldn'd be found, like so:
@include("nosuchfile.php");
It also suppresses all the parse errors generated in "nosuchfile.php" if it does exist.
It took us a long time before we discovered why we weren't getting any parse errors... This is it.
Personally, I don't like this... Maybe it can be changed in a future php version? :)
Coditor
sreid at sea-to-sky dot net
18-Nov-2002 03:16
It seems that using E_NOTICE (included with E_ALL) is the only way to get warnings about undefined variables. For example, if you type $soemthing when you mean $something, you may not get any message about it unless you use E_NOTICE level reporting.
The problem is, at that level of reporting you also get notices about array indexes that have not been set. This means lots of warnings when using $_GET['formvariable'] and such. You can check isset($_GET['formvariable']) first, but that gets annoying, especially when it is redundant to stricter input validation you need to do anyway.
The only solution I have found is to use set_error_handler() to register a custom error reporting function to report everything except where the error string starts with "Undefined index:". Then I call error_reporting(E_ALL). This seems to be the best compromise.
function error_handler($errno, $errstr, $errfile, $errline, $errctx) {
if ($errno == E_NOTICE && substr($errstr, 0, 17) == "Undefined index: ") return;
echo "\nerror_handler:\n\terrno=$errno\n\terrstr=$errstr\n";
echo "\terrfile=$errfile\n\terrline=$errline\n";
if ($errno & (E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR)) die();
}
set_error_handler("error_handler");
error_reporting(E_ALL);
rbt at zort.ca
09-Feb-2002 10:25
It should be noted that in apache.conf files the defined values (constants) don't work. For E_ALL logging, one would use:
php_admin_value error_reporting 2047
25-Mar-2001 11:32
It seems that parse errors will be handled internally even if you've designated your own error handler; that is, your error-handling function will /not/ be called on a parse error.
cgi at harrison dot org
11-Dec-2000 05:59
[Editor's Note: The error suppression operator (@)can be used to suppress errors for a single expression. To use the operator, place it in front of the expression that you wish to suppress error reporting for. Basic use is:
$fp = @ fopen ('non-existant.file', 'r');
See the url below for details.]
Error Suppression Operator - Info
http://www.php.net/manual/language.operators.errorcontrol.php
j dot schriver at vindiou dot com
03-Oct-2000 01: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]
durchholz at sourceforge dot net
25-Aug-2000 05:13
Here's how to temporarily lower the error reporting level:
$old_error_reporting = error_reporting(E_ALL & ~(E_WARNING | E_NOTICE | ...));
... do whatever you want to do in less verbose mode
error_reporting($old_error_reporting);
03-Feb-2000 01:31
The E_NOTICE error reporting level reports the use of undefined variables as an error.
For example:
error_level (E_ALL); # Set error reporting to highest level
if ($foo) # This will generate an error
print "bar"; # because $foo is not defined
To avoid this behavior, use isset to test if the given
variable has been defined.
For example:
error_level (E_ALL);
if (isset ($foo))
print "bar";
webmaster at l-i-e dot com
21-May-1999 04:13
[Editor's Note: E_ALL will contain the result of OR'ing all of the applicable error constants together. For PHP 3, this will be the first 4 E_xxx constants. For PHP 4, this will be all constants. ]
There is also an E_ALL which is the first 4 E_xxx added up for you...
| |