Gaʀʀʏ
Gaʀʀʏ

Reputation: 4540

PHP - error_get_last method for warnings?

I am using unlink on my PHP page. In some situations, Permission may be denied for deleting the directory. Instead of having

Warning: unlink(stuff/New folder) [function.unlink]: Permission denied in ... on line 30

show up on the rendered page, is there a way for me to do a "warning_get_last" that will capture the last given warning, so I can output it nicely? Or does error_get_last include these?

I know I can suppress the warnings with @unlink and that I can also check to see if unlink returns false, but I would like to know the error message that goes along with it if it does fail.

Upvotes: 8

Views: 9437

Answers (3)

Trott
Trott

Reputation: 70125

Use error_reporting(0) to not show the warning or any errors in the rendered page. It will still show up in your server error logs and you can still use error_get_last() to get the last error.

You can test it out with this:

error_reporting(0);
unlink('some file that does not exist'); // generates a warning
print_r(error_get_last());

EDITED: Please note that error_reporting(0) will affect subsequent code, so you'll want to set it back to the level you want after you're through the code where you want to suppress the error display.

Upvotes: 12

Erik Kaplun
Erik Kaplun

Reputation: 38227

I fail to see why the following is any worse than the 2 other proposals; in fact I'd say it's better because it's shorter than Robbie's answer and doesn't have a global effect unlike Trott's answer:

$ok = @unlink(...);
if ($ok === FALSE)
    throw new Exception(error_get_last()['message']);

Output when run:

PHP Fatal error:  Uncaught exception 'Exception' with message 'unlink(foobar.txt): No such file or directory' in /Users/erik/code/test.php:5
Stack trace:
#0 {main}
  thrown in /Users/erik/code/test.php on line 5

Upvotes: 0

Robbie
Robbie

Reputation: 17710

You write set your own error handler, enable it just before the call, and revert back to normal afterwards.

Use set-error-handler to turn on the error handler, save to a global variable (that's the simplest - perhaps not most "correct") and show if there was an error. Or user error_get_last() (as suggeted by Trott).

function myErrorHandler($errno, $errstr, $errfile, $errline) {
    global $lastErrorString;
    $lastErrorString = $errstr;
    return false;
}

// Calling function:
global $lastErrorString;
$lastErrorString=false;
$old_error_handler = set_error_handler("myErrorHandler");
unlink($file);
restore_error_handler();
if ($lastErrorString !== false) {
    echo 'Went wrong: ' . $lastErrorString;
}

Upvotes: 1

Related Questions