2012-10-11 12 views
5

PHPページでunlinkを使用しています。状況によっては、ディレクトリを削除したときに許可が拒否されることがあります。代わりにPHP - warningのための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によってsuggeted)。

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

なぜ私は次の2つの他の提案より悪いのか分かりません。実行時に

$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