views:

56

answers:

2

In my PHP error handler I want to do something like:

if (ini_get('display_errors') IS ON)) {
 // show debug info
} else {
 // show just "oops!"
}

I've look through the docs and stuff, but I can't really find out what the possible values for display_errors are (such as "on", 0, "Yes") and what it does for what value.

What should I put in place of the "IS ON" to reliably read this value?

+1  A: 

The default is '1' according to the documentation. However, you might want to check the inverse, that it isn't off:

!= FALSE or !empty()

if (ini_get('display_errors') != FALSE)) 
{
     // show debug info
} 
else 
{
     // show just "oops!"
}

Or as Anthony pointed out, you could just check for 1

if(ini_get('display_errors') == 1))

You might also want to check error_reporting, as it is another common setting that is used to control the displaying of errors, although its meaning is slightly different than display_errors

if(error_reporting() != 0)
Chacha102
@Chacha102 - `ini_get` returns a String, you were correct. :) but apparently it doesn't matter whether you compare `1` or `"1"`, I guess it just depends on the comparison operator.
Anthony Forloney
+1  A: 

You can get the string representation of the values through ini_get(), values that display_errors can be set to is either, true\false, 0\1 and On\Off. But when user's set their php.ini it is more common to use 1 or On

if (ini_get('display_errors') == "1") {
 // show debug info
}

or to check for ALL cases, you can perform a switch-case

ini_set('display_errors', 1);
switch (ini_get('display_errors')) {
  case "1":
  case "On":
  case "true":
    // show debug info
}

If you prefer the equality comparison approach, notice that ini_get returns a String value of 1, if you test the returned value with ini_get using the == with the int value 1, it becomes true. If you use the === it checks if both are equal and of the same type. String is not the same type as int so it would return false.

1 == "1"; // in PHP, this returns true, it doesn't check the type.
1 ===  "1"; // would be false, this however checks the type. 

Using ini_get('display_errors') you can check against values like, TRUE, FALSE, and even NULL. They will return a boolean value of either 0 which is false and anything other than 0 evaluates to true.

if (2) {
 echo "2 is true!"; // echos "2 is true!"
}

I saw your comment about a discrepancy so I decided to test it myself, here is what I used

<?php
  ini_set('display_errors', 1);
  $verbose = ini_get('display_errors');
  echo $verbose; // echo's 1

  // just to test its return values.
  if ($verbose) { 
     echo "verbose is true";  // echos "verbose is true"
  }

  ini_set('display_errors', 0);
  $verbose = ini_get('display_errors');
  echo $verbose; // echo's 0

  if ($verbose) {
     echo "verbose is not true"; // does not get evaluated
  }
?>

This answer is a bit lengthy, but I hope this is what you need.

Anthony Forloney
Technically it is a string, and some people set it to 'on' . So while you could just check if it is equal to 1, this won't work if you are working in a weird environment. Thus making it not reliable.
Chacha102
Too simple. >> ini_set('display_errors', 'On'); $verbose = ini_get('display_errors') == 1; << Verbose is now false, despite the "On".
Bart van Heukelom
It's set to On in php.ini but when you call `ini_get` it returns 1, whether its a string or an int
Anthony Forloney
Ahh, that makes sense @Anthony
Chacha102
I didn't know that until I read the documentation from my link, its one of the examples
Anthony Forloney
Thanks for the expansion, but about the discrepancy: You did not yet test setting it to 'On', which is what I did. Never mind though, I'm just checking for true and "On" now. If people set anything else, their fault it breaks.
Bart van Heukelom
I edited it yesterday with a switch-case to show all the values, which tests for either, `1`, `On` and `true` which are all legitimate values.
Anthony Forloney