目が覚める
昨日のバグ。
例えば、inputタグのnameの属性を定めるときに、複数同じ名前があるときは
と、名前にをつけておけば、$_POST["name"][0],$_POST["name"][1]……と配列でその値を受け取ることが出来る。
この機能のおかげでリストの動的生成によるフォームの作成が非常に楽になる。
例えば、no番目のnameを変更するプログラムを書くときに、この機能を用いなかったら下のように書かないといけなくなる。
<form action="regist.php" method="post">
<input type="hidden" name="no" value="1">
<input type="text" name="name" value="Mike">
<input type="submit">
</form>
<form action="regist.php" method="post">
<input type="hidden" name="no" value="2">
<input type="text" name="name" value="Tom">
<input type="submit">
</form>
<form action="regist.php" method="post">
<input type="hidden" name="no" value="3">
<input type="text" name="name" value="Jane">
<input type="submit">
</form>
regist.php側でnoの数字を見て、登録処理を行うことにより実現する。
しかし、この機能を用いると
<form action="regist.php" method="post">
<input type="text" name="name" value="Mike">
<input type="text" name="name" value="Tom">
<input type="text" name="name" value="Jane">
<input type="submit">
</form>
と簡単に記述でき、それぞれの値は$_POST["name"][0],$_POST["name"][1],$_POST["name"][2]に格納される。この機能は今回の開発では非常に重宝した。
さて、本題である今回のバグではこの機能を用いて以下のような実装を行った。
<form action="regist.php" method="post">
<input type="checkbox" name="check" value="y">
<input type="checkbox" name="check" value="y">
<input type="checkbox" name="check" value="y">
<input type="submit">
</form>
このとき、$_POST["check"][0]以下に値が入るので、それに合わせて処理を書けばいいはずである。
しかし、ここで問題が発生する。例えば2番目のcheckboxにだけチェックを入れた場合、1番目と3番目のチェックボックスには値が入らない。つまり2番目に入った「y」は、$_POST["check"][0]に格納され、どこのチェックボックスに値が格納されたか分からないのである。この処理は削除、その他フラグのいたるところに書き込まれていたため、気づいたときには既にあちこちにこのバグが埋め込まれていた。
結局この問題は、以下のようにして解決した。
<form action="regist.php" method="post">
<input type="checkbox" name="check" value="0">
<input type="checkbox" name="check" value="1">
<input type="checkbox" name="check[]" value="2">
<input type="submit">
</form>
こうすることにより何番目にチェックを入れたかが分かるので、処理できるようになる。