最近、仕事中にちょっとハマった話です。
案件でCodeIgniter3を使っていて、一括登録する処理を実装していました。
insert_batchを使ってデータをまとめて登録する、というよくあるパターンです。
通常insert_batchを使用するときは2次元の連想配列の変数を引数として渡します。
この変数の中に「特定の条件に当てはまった人を追加で変数に入れていく」ということをしていました。
登録時に例外が発生
処理を実行すると、なぜか例外エラーで落ちる。
ただ、登録しようとしているデータを目視で確認しても、特におかしなところは見当たらない。
テストデータを変えても同じ結果で、2時間ほど原因がわからず頭を抱えていました…。
ようやく見つけた原因
最終的にWinMergeで比較してみたところ、原因はまさかのこれでした。
$test[0] = [
"test " => "test"
];
$test[1] = [
"test" => "test"
];
キー "test" の後に、半角スペースが1つ入っていました。
このため、CodeIgniterのinsert_batch()内部で配列を整形するときに、
キーが揃わず不正な配列として扱われ、例外エラーが出ていたようです。
目視では完全に見落としていました…。
見た目は同じ「test」なのに、スペースひとつで別のキー扱い。
地味だけど厄介な落とし穴です。
しかも、2000行くらいあるソースのなかで処理が離ればなれになっているから別の何かのツールを使わないと気づきにくいし、中身の情報量も大量にあるとさらにその分気づきにくい。。
再発防止にやったこと
今回の反省を踏まえて、次のような設定・習慣を取り入れました。
- VSCodeで半角スペースを可視化
"editor.renderWhitespace": "all"を設定して、目に見えるようにする
- WinMergeなどの比較ツールで差分確認
- 見た目では気づけない差分を一発で発見できる
ちょっとした工夫ですが、こうした設定でミスを未然に防げます。
まとめ
「スペース1個で登録できない」なんて、一見くだらない話ですが、
こういう“人間の目では気づきにくいバグ”って意外と多いです。
今回の件で改めて感じたのは、
「コードレビューやテストでは“見た目の正しさ”だけで判断しないこと」。
ツールの力を借りることで、こうした地味なミスを確実に防げると実感しました。
👀 教訓
エラーの原因は、意外と「見えていない1文字」にあるかもしれない。
