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の長所でもあり短所でもある部分なので、こういう比較部分では型を厳密に見るようにしないと、こういうバグが簡単に生まれてしまうんだな、と勉強になりました(´Д`)
コメント