2012-10-11 84 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