2017年12月6日水曜日

whileの条件に !feof は注意

とある国産オープンソースで見つけました。

while (!feof($fp)) {...}
この処理の前に、$fpが正常かのチェックがされていません。
これではファイルオープン失敗時に無限ループしてしまいます。 怖いですね。
ファイルオープン失敗なんて、バグでよくあること。

ファイルオープンに失敗していると、$fp に false が入っています。
feof(false)は、 false になります。
したがって、無限ループします。

正しいやりかたは、

エラー時に何かしたいことがあれば、
if ($fp !== false)  { while(!feof($fp)) {....}}else {...}

単純にスキップしていいなら

while ($fp && !feof($fp)) {...}
 でもいいね。 ※毎回$fpの判定という無駄があるけど、どうでもいいでしょう。










2017年12月4日月曜日

パスに日本語が含まれる場合の $_SERVER問題

パスに日本語(エンコードされたリンクURLではなく、デコード後文字列)が含まれる場合、$_SERVER の中身に問題が発生します。

REQUEST_URIはエンコードされたままの文字列が入るので、問題ありません。
しかし、その他はデコード後のURLが入ります。
SCRIPT_NAME, PHP_SELF, PATH_INFO です。
特に SCRIPT_NAME はよく使う物なので、非常にやっかいです。

簡単に対応させる方法は2つ

その1:explode('/', $_SERVER['SCRIPT_NAME']) で分解し、ループでエンコードして再度結合させる。
その2:REQUEST_URIの?以降を削除して使う。

その2が簡単で良いと思います。
REQUEST_URIはブラウザから送られてきた値なので、扱いには注意してくださいね。


ちゃんとエンコードしないと、用法と文字の組み合わせ次第でエラーになるので気を付けましょう。