2012-10-11 54 views
5

我在我的PHP页面上使用unlink。在某些情况下,可能会拒绝删除目录的权限。而不必PHP - 用于警告的error_get_last方法?

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

显示所呈现的页面上,是有我的方式做一个“warning_get_last”,将捕获的最后给予警告,这样我就可以输出好听?还是error_get_last包括这些?

我知道我可以@unlink抑制警告,而我也可以检查,看看是否unlink返回false,但我想知道,与它一起去如果它失败的错误消息。

回答

7

使用error_reporting(0)不显示警告或在所呈现的页面的任何错误。它仍会显示在您的服务器错误日志中,您仍然可以使用error_get_last()获取最后一个错误。

你可以用这个测试出来:

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

'的error_reporting(E_ERROR | E_WARNING) ' - 会导致error_get_last显示错误或警告?我可以使用@来阻止显示的警告。我只需要一种方法从他们那里得到消息。 –

+0

为了清晰起见,我已经更新了答案。 – Trott

+0

我已经更新了答案,但是如果我只是误解了这个问题或其他问题,请告诉我。 – Trott

1

你写设置自己的错误处理程序,只需调用之前启用,并恢复到正常之后。

使用set-error-handler打开错误处理程序,保存到全局变量(这是最简单的 - 也许不是最正确的),并显示是否有错误。或者用户error_get_last()(如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; 
} 
0

我不明白为什么下面的情况比其他两种方案都差;其实我会说这是更好,因为它比罗比的回答更短,并且没有不像特洛特的回答全局效果:运行时

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

输出:

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