PHP学習している時に、すごく単純なことで困った「if文でプルダウンの値が保持されない」話しを備忘録として書いておきます。
単純な話しなのですぐに終わります。
プルダウンで実現したかったこと
プルダウンで実現したかったことは、ショッピングサイトのカート機能で商品の数量変更を実現したかった。
そのため、次のようなコードを書いていました。
<select name="number[<?php echo $i?>]"> <?php for($j=1; $j<=10; $j++): ?> <option value="<?php echo $j ?>"<?php if($j === $number[$i]): ?> selected<?php endif ?>><?php echo $j ?></option> <?php endfor ?> </select>
- コードの説明
コード | 説明 |
number[i] | 数量が入ってます |
for($j=1; $j<=10; $j++) | プルダウンで1~10を表示させるため |
<?php if($j === $number[$i]): ?> selected<?php endif ?>> | プルダウンの数字と数量の値が同じであれば「selected」をつけて値を選択させる |
発生した事象
ここで問題が発生しました。
冒頭でも書いた「if文でプルダウンの値が保持されない」という事象です。
文字だけだとわかりずらいと思うので、実際の画像を以下に載せました。
画像の赤枠の部分ですが、数量を「人参:7、レタス:5」として、数量変更ボタンを押すと画像の通り「1」に戻ってしまうという事象です。画像の上の「array」は送信された値を表示してます。
原因
プログラムと「array」の中身を見てもらってピンと来る方もいると思いますが、原因は単純で型の不一致でした。
もっと具体的にいうと、if文の「$j」はint型、「$number[$i]」はstring型、要するに文字列と数値を比較していたため、常に「false」になっていたということです。
すごい単純な話しですが初心者の自分ではわかりませんでした。。
調べてみるとPOSTで送信したものはstring型(文字列)になるみたいです。
補足
if文で比較する時に「===」にすると厳密な比較(型が一致するとか)をするため「==」で確認すると思い通りの動作をしました。
参考URL
$_POSTで送られた値は、全て文字列型として扱われるのでしょうか?
対処法
原因は分かったので対処は簡単です。
文字列を整数型に変えてあげるだけなので、キャストを使えばいいだけです。
公式サイト:型の相互変換
修正したプログラムはこちらです。
<select name="number[<?php echo $i?>]"> <?php for($j=1; $j<=10; $j++): ?> <option value="<?php echo $j ?>"<?php if($j === (int)$number[$i]): ?> selected<?php endif ?>><?php echo $j ?></option> <?php endfor ?> </select>
if文比較の「$number[$i]」の前に「(int)」をつけてあげるだけです。
そうすると、同じint型で比較してくれるので思った通り値は保持されたままになりました。
初心者なら誰もがぶつかる壁なんですかねぇ。。
以上です。ありがとうございました。
コメント