前提・実現したいこと
テキストを基にショッピングサイトを試作しています。カートに入った商品の一覧ページで、商品の数量を変更する方法で悩んでいます。
select/optionを使い、例えば1から5までの選択肢からそれぞれの商品の購入数をユーザーに選んでもらい、配列で別のファイルに一旦post送信し、header(“Location: xxx”)ですぐに一覧ページに戻して変更された数量を反映させます。
発生している問題・エラーメッセージ
お聞きしたいことは2つあります。
ひとつは、一覧ページに戻って来た数量の配列を表示させる方法を次のように考えたのですが、これで問題無いかという点です。考えたのはソースコードにあるように、selectの中に<option value=”$qty[$i]”>$qty[$i]</option>を追加してselectedをつけ、またこれでは既存のoptionの中にある同じ数字とダブってしまうのでhiddenで消すというものです。一応思った通りに動きますが、疑問に思うのは、selectedが付いた追加optionはhiddenによって表示されていないはずなので、選んだ数字が表示されているのはselectedが付いていない同じ数字のoptionの方だと思われ、何故selectedが無いのに表示されるのかという点です。
もうひとつは、上記の自分が考えた方法だとカートに入った商品すべての数量を選ばなければならないことです。数量を変えたくない商品も、一度同じ数量を選ばないと数字の値を保持してくれず、配列に空要素が入ってしまいます。毎回すべての数量を選ぶのではユーザビリティが悪すぎます。変更したい数量だけ変更し、それ以外はそのままsubmitすれば、その変更した値が反映するようにしたいのですが、良い方法はありますか。
select/optionはselectされた値が保持されると理解していますが、配列で商品ページに渡ってきた数字が<option value=”$qty[$i]” selected>$qty[$i]</option>に入ることによりselectされたということにはなっていないのでしょうか。
さらに欲を言えば、数量を選んだ後わざわざsubmitボタンを押して反映することなく、amazonのカートのようにselect/optionで数量を選択しただけで即反映されるような仕組みにしたいのですが、今の知識では出来そうにありません。
下のコードは要点のみ残し、分かりやすいように簡略化してあります。
よろしくお願い致します。
該当のソースコード
PHP
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Shop</title> </head> <body> <?php $cart=$_SESSION['cart'];/*カートに入った各商品のcodeが配列で入っている*/ $qty=$_SESSION['qty'];/*カートに入った各商品の数量が配列で入っている。 数量変更後は、変更された数量が配列で入ってくる。*/ $max=count($cart);/*カートに入った商品点数*/ $dbh=new PDO('mysql:host=localhost;dbname=shop;charset=utf8',$user='root',$pass=''); $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); foreach($cart as $key => $val) { $sql='SELECT name,price FROM table WHERE code=?'; $stmt=$dbh->prepare($sql); $data[0]=$val; $stmt->execute($data); $rec=$stmt->fetch(PDO::FETCH_ASSOC); $name[]=$rec['name']; $price[]=$rec['price']; } $dbh=null; ?> <form method="post" action="qty_change.php"> <?php for($i=0;$i<$max;$i++) { ?> 商品名: <?php print $name[$i]; ?><br> 価格: <?php print $price[$i]; ?>円<br> 数量: <select name="qty<?php print $i; ?>"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="<?php $qty[$i] ?>" selected hidden><?php print $qty[$i] ?></option> </select> <input type="hidden" name="max" value="<?php print $max; ?>"> <?php } ?> <input type="submit" value="数量変更"> </form> </body> </html>
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー