web-dev-qa-db-ja.com

getimagesizeがファイルを見つけられない場合のエラーの処理

getimagesize($img)を実行しようとしていて、画像が存在しない場合、エラーが発生します。最初にファイルが存在するかどうかを確認するのではなく、エラーを処理するだけです。

どうやってtry catchは機能しますが、次のようなことをしたいと思います。

try: getimagesize($img) $works = true
catch: $works = flase
19
Johan

あなたが言ったように、存在しないファイルで使用された場合、getimagesizeは警告を生成します:

このコード:

if ($data = getimagesize('not-existing.png')) {
    echo "OK";
} else {
    echo "NOT OK";
}

あなたを取得します

Warning: getimagesize(not-existing.png) [function.getimagesize]: 
  failed to open stream: No such file or directory 


解決策は、 @演算子 を使用して、そのエラーをマスクすることです。

if ($data = @getimagesize('not-existing.png')) {
    echo "OK";
} else {
    echo "NOT OK";
}

ファイルが存在しないため、$ dataは引き続きfalseになります。ただし、警告は表示されません。


別の解決策は、getimagesizeを使用する前に、 ファイルが存在するかどうかを確認する です。このようなことはするでしょう:

if (file_exists('not-existing.png') && 
    ($data = getimagesize('not-existing.png'))
   ) {
    echo "OK";
} else {
    echo "NOT OK";
}

ファイルが存在しない場合、getimagesizeは呼び出されません-これは警告がないことを意味します

それでも、このソリューションは、リモートサーバーへの2つの要求を意味するため、別のサーバー上にあり、HTTP経由でアクセスされるイメージに使用する必要があるソリューションではありません(この場合)。

ローカル画像の場合、それはまったく問題ないと思います;私が見る唯一の問題は、マスクされていない読み取りエラーがあるときに生成される通知です。


最後に :

  • 開発サーバーにエラーを表示できるようにしますが、
  • そして、それらを本番サーバーに表示しません display_errors 、それについて;-)
45
Pascal MARTIN

地獄に行くダーティハッカーゾンビと呼んでください。しかし、私は通常、警告出力を出力バッファにキャッチし、バッファをチェックすることでこの問題を回避します。これを試して:

ob_start();
$data = getimagesize('not-existing.png');
$resize_warning = ob_get_clean();
if(!empty($resize_warning)) {
  print "NOT OK";
  # We could even print out the warning here, just as PHP would do
  print "$resize_warning";
} else {
  print "OK"
}

私が言ったように、プログラマーの天国で居心地の良い場所を取得する方法ではありませんが、機能不全のエラー処理に関しては、男性は男性がしなければならないことをしなければなりません。

8
user212857

そのような古い話題を提起してすみません。最近同様の問題が発生し、代わりにこのトピックが解決策であることがわかりました。宗教上の理由から、「@」は悪い決断だと思います。そして、私は別の解決策を見つけました、それは次のようになります:

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

try {
    $imageinfo = getimagesize($image_url);
} catch (Exception $e) {
    $imageinfo = false;
}
7
Paul