php in_arrayで型判定を厳密にしてなかった件

2023年3月29日

PHP

eyecatch 先日仕事で、とある処理でエラーが出ている事に気がついた。 何かのサービスで何かしらの表示不具合が出ている時に、意外と全然別の箇所の不具合である場合ってあるよね〜。 今回もまさにそんなエラーだったので、そのやらかしちまった内容を恥を惜しんでブログに残しておこうと想います。

問題発覚

それは、とあるデータベースに登録をするシステムの管理画面の機能で、リストで並んでいる登録情報をチェックボックスをつけて内容を一括で編集できるという内容のシステムでした。 チェックを付けているある項目だけが、書き換わらない事に気が付きました。 調べてみたところ、データは次のようになっていました。
idmenu-idlabel
01free1.001ほげほげ
02free1.001ほげほげ
001free1.001ほげほげ
04free1.001ほげほげ
05free1.001ほげほげ
ん ??? 001 ??? このデータベースは、このデータベースを使っている会社さんが構築していたデータベースだったのですが、仕様はかなりブラックボックスになっていて、そのまま使うという仕様にしていました。 そもそも、idが文字列って・・・orz それに、01と001が混在する仕様って・・・orz どうやらこのIDの値が原因のような気がしていました。

原因発覚

同時登録する時に、登録したデータのIDを配列で保持しておいて、in_arrayで登録済みかどうかをチェックしていたんですが、どうやらin_arrayが型判定を行っておらず、数値判定をしているのではないか? という疑惑が浮上してきました。 リファレンスページを見てみたところ、次のように書かれていました。 なんと、第3の値に$strictというのがあり、これをtrueにしなければ、型判定はされないようですね。 ちなみに、自分が書いていたコードが、こちら。 function entry_check($entry_id=null){ foreach($datas as $data){ if(in_array(’02’ , $data[‘id’])){ return true; } else{ return false; } } } これを次のように書くことで、無事に不具合が解消されました。 function entry_check($entry_id=null){ foreach($datas as $data){ if(in_array(’02’ , $data[‘id’] , true)){ return true; } else{ return false; } } }

あとがき

分かった気になって使っていたPHP関数の設定が足りていなかったのがかなり恥ずかしい不具合でした。 これ、デフォルトでtrueにした方がいいと思ったんだが、型判定を厳密にしないでいい処理なんてどういう場合があるんだろう? というPHP言語の設計思考に疑問をもってしまった、今回の不具合体験でした。 そして、今回の不具合発覚から解消までの時間、1時間。 いい学習時間になりました!