getimagesize($img)
を実行しようとしていて、画像が存在しない場合、エラーが発生します。最初にファイルが存在するかどうかを確認するのではなく、エラーを処理するだけです。
どうやってtry catch
は機能しますが、次のようなことをしたいと思います。
try: getimagesize($img) $works = true
catch: $works = flase
あなたが言ったように、存在しないファイルで使用された場合、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
、それについて;-)地獄に行くダーティハッカーゾンビと呼んでください。しかし、私は通常、警告出力を出力バッファにキャッチし、バッファをチェックすることでこの問題を回避します。これを試して:
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"
}
私が言ったように、プログラマーの天国で居心地の良い場所を取得する方法ではありませんが、機能不全のエラー処理に関しては、男性は男性がしなければならないことをしなければなりません。
そのような古い話題を提起してすみません。最近同様の問題が発生し、代わりにこのトピックが解決策であることがわかりました。宗教上の理由から、「@」は悪い決断だと思います。そして、私は別の解決策を見つけました、それは次のようになります:
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;
}