実現したいこと
以下の画像のような、法人が商品を購入できるフォームを作成しています。
プルダウンの「選択してください」からは、DBに登録済みの購入者などの情報を表示します。
同じ購入者は何度でも選択可能です。
「オーダー内容を確認する」ボタンを押すと次のページで購入内容の確認が行えます。
最終的には購入データがDBに登録される流れになります。
「購入者」と「商品」のプルダウンメニューにはそれぞれ「購入者の名前と購入者コード」「商品の名前と商品コード」が
それぞれ表示されます。購入者と商品の名前は確認画面の確認用に表示し、DBに登録されるのは商品コードと
購入者コードだけにしたいです。

困っている事
いくつか分からないことがあります。
(1)選択した「購入者の名前と購入者コード」「商品の名前と商品コード」をそれぞれ確認画面に渡し、
DBにはコードのみ登録する方法。
→名前とコード両方を確認画面に渡すために、DBから情報を取得して
<option value="$p['person_code'],$p['person_name']">のように「,」で区切りました。
そして、確認画面でexplode()関数を使用して名前とコードを分割し、コードをDBに登録しようとしましたができませんでした。
中身を確認したところ以下のように表示されました。
PHP
1$person_code = $_POST['person_code'];
2foreach($person_code as $p){
3 print_r(explode(",", $p));
4}
5
6//実行結果
7Array ( [0] => 購入者コード購入者名 ) Array ( [0] => 購入者コード購入者名 )
8
9
なぜ一つ一つ配列で返されるのか、そしてexplode()で区切れないのかが分かりません。
(2)一つでもフォームに値を入力した場合、その行は全て入力必須にする仕組みの構築方法
例えば1行目の「購入者」をプルダウンメニューから選択した場合、
その行の「商品」と「個数」を入力しないと確認画面に飛べないようにしたいです。
コード
PHP
1
2<!------オーダー画面-------->
3<form method="post" action="order_confirmation.php">
4 <p style="padding-bottom: 30px;"><input type="submit" value="オーダー内容を確認する"></p>
5 <table border="1">
6 <tr><th></th><th>購入者</th><th>商品</th><th>個数</th></tr>
7 <?php
8 //データを全て配列で取得
9 $number = 1;
10 while($number<=15) :
11 ?>
12 <tr>
13 <td><?php echo $number ?></td>
14 <td>
15//foreachで取り出している情報はDBより取得したもの
16 <select name="person_code[]">
17 <option disabled selected>選択してください</option>
18 <option value="0"><?php echo sprintf("%04d", 0) . ':施設' ?></option>
19 <?php foreach($p_rows as $p) : //h()はhtmlspecialcharsを実行する ?>
20 <option value="<?php echo $p['person_code'],$p['person_name'] ?>"><?php echo h(sprintf("%04d", $p['person_code'])) . ':' . h($p['person_name']) ?></option>
21 <?php endforeach; ?>
22 </select>
23 </td>
24 <td>
25 <select name="item_code[]">
26 <option disabled selected>選択してください</option>
27 <?php foreach($i_rows as $i) : ?>
28 <option value="<?php echo $i['item_code'],$i['item_name'],$i['price'] ?>">
29<?php echo h($i['item_name']) . ':' . h($i['price']) . '円' ?></option>
30 <?php endforeach; ?>
31 </select>
32 </td>
33 <td><input type="text" name="quantity[]" maxlength="10" placeholder="例)1">個</td>
34 </tr>
35 <?php $number++; ?>
36 <?php endwhile; ?>
37 </table>
38 <input type="hidden" name="created_at">
39</form>
40
確認画面
PHP
1<?php
2
3$person_code = $_POST['person_code'];
4$item_code = $_POST['item_code'];
5
6$max_person_code = count($_POST['person_code']);
7$max_item_code = count($_POST['item_code']);
8
9$count_number = 0;
10?>
11
12<!------確認画面。作りかけ-------->
13 <section class="common_wrapper">
14 <h1>オーダー確認ページ</h1>
15 <div class="data_list_wrapper">
16 <table border="1">
17 <tr><th>名前</th><th>商品</th><th>金額</th></tr>
18 <?php while($count_number < $max_person_code) : ?>
19 <tr>
20<!--購入者の名前を$p['person_name']として表示したい -->
21 <td>
22 <?php foreach($person_name as $p) : ?>
23 <?php echo h($p['person_name']) ?>
24 <?php endforeach; ?>
25 </td>
26 <td><?php ?></td>
27 <td><?php ?></td>
28 </tr>
29 <?php $count_number++; ?>
30 <?php endwhile; ?>
31 </table>
32 </div><!--/.data_list_wrapper -->
33 </section><!--/.common_wrapper -->
34
2つ目の質問の「一つでもフォームに値を入力した場合、その行は全て入力必須にする仕組みの構築方法」について
質問1「選択した「購入者の名前と購入者コード」「商品の名前と商品コード」をそれぞれ確認画面に渡し、
DBにはコードのみ登録する方法」は解決しました。
質問2についてですが、ご回答頂いた内容を貼って動かしてみました。確かにその行のinputはrequiredが付与されて
意図したようになりました。しかしselectは選択せずとも先に進めてしまいます。
そこで自分なりに以下のようなコードを書いてみました。
やはりinputタグにはrequiredが付与されるのですが、selectタグは無反応です。
どのようにするとその行全てを選択しないと先に進めなくなる仕組みが構築できるでしょうか。
jQuery
1
2$("select").on('change', function(){
3 console.log('成功');
4 var parentTr = $(this).parents("tr");
5 parentTr.find("select").required;
6 parentTr.find("input").required;
7});
8
ご回答いただけると助かります。
よろしくお願い致します。