[PHP] 文字列のつもりだったのに

PHPのとあるプログラムにバグが見つかったのですが、解決は簡単だったものの、原因が何なのかがなかなかわからずに頭を悩ませました。

バグというのは、文字列4桁で持っているIDがあるのですが、とあるIDに別のIDのデータが上書きされてしまうという状態。

具体的に書くと、

ID:0055
値:55番目の摩天楼

ID:55E0
値:55E0番目の摩天楼

となるはずが、ID:0055に「55E0番目の摩天楼」がセットされてしまうという。

ついでに、ID:0550にはID:55E1の値が、ID:5500にはID:55E2の値が、というように、何となく規則性がある感じ。

雰囲気的に、55E1=55E^1と展開されてしまい、0550とイコールになっているのはわかったのですが、さて、どうして55E1が55E^1に展開されてしまうのか。

ソースのIDを比較している部分を見てみると、

if ($fileId == $dbId) {

という記述。一見問題ないように見えるけど、この条件文だと、Eの後に数字が来たときだけべき乗として判断されてしまい(暗黙の型変換)、問題が発生する模様。11A1とか22B2などは問題なし。

本来、文字列の比較にはstrcmp()を使うか、または型まで厳密に見てくれる === を使うべきだと思うので、明らかにコーディングミスだったのかも。

変数の型を柔軟に見てくれるPHPの長所でもあり短所でもある部分なので、こういう比較部分では型を厳密に見るようにしないと、こういうバグが簡単に生まれてしまうんだな、と勉強になりました(´Д`)

コメント

タイトルとURLをコピーしました