views:

876

answers:

2

PHP's mkdir function only returns true and false. Problem is when it returns false.

If I'm running with error reporting enabled, I see the error message on the screen. I can also see the error message in the Apache log. But I'd like to grab the text of the message and do something else with it (ex. send to myself via IM). How do I get the error text?

Update: Following Ayman's idea, I came to this:

function error_handler($errno, $errstr) {
    global $last_error;
    $last_error = $errstr;
}

set_error_handler('error_handler');
if (!mkdir('/somedir'))
    echo "MKDIR failed, reason: $last_error\n";
restore_error_handler();

However, I don't like it because it uses global variable. Any idea for a cleaner solution?

+5  A: 

You can suppress the warning and make use of error_get_last():

if (!@mkdir($dir)) {
    $error = error_get_last();
    echo $error['message'];
}
soulmerge
+1, but it's worth noting that this is potentially fragile if another error occurs between mkdir() and error_get_last(), which may well happen when your code gets more complex (as an extreme, unrealistic example, a tick function could run and generate an error before your error_get_last() call). This is always a risk any time you're using any sort of get-last-error function.
Frank Farmer
+2  A: 

You could use exceptions:

Setup some code like so:

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");

And then just do:

try {
   mkdir('/somedir');
} catch(ErrorException $ex) {
   echo "Error: " . $ex->getMessage();
}

That should do what you want.

If you want to preserve the php error handler, then after that try catch block, just call:

restore_error_handler()
Kazar
+1I like this approach, I have not tested it but it feels solid. Also it looks more oo-friendly ;)
Daniel Persson