###はじめに
今回、とりあえず質問を書きましたが、やはりいろいろ細かな部分でわかりづらさが目立ちましたのと、ご指摘いただいた内容として、一度質問を書き直しております。
当然、質問の書き直しはNGかと思いましたが、基本的な内容は特に変更は無く、もう少しわかりやすく書き直すことが目的であることをはじめにご容赦ください。
###1.まずはHTMLでのコードで基本の表示をご覧ください
HTML
1<form action="" method="POST"> 2 <?php for($i = 0; $i < 3; $i++) { ?> 3 <select name="test[<?= $i; ?>][staff]"> 4 <?php 5 $staffs = select_staff_db(); 6 foreach($staffs as $staff) { 7 $staff_id = $staff['staff_id']; 8 $staff_name = $staff['staff_name']; 9 echo " 10 <option value=".$staff_id.">".$staff_name."</option>"; 11 } 12 ?> 13 </select> 14 <select name="test[<?= $i; ?>][dakoku]"> 15 <?php 16 $dakokus = select_dakoku_db(); 17 foreach($dakokus as $dakoku) { 18 $dakoku_id = $dakoku['dakoku_id']; 19 $dakoku_name = $dakoku['dakoku_name']; 20 echo " 21 <option value=".$dakoku_id.">".$dakoku_name."</option>"; 22 } 23 ?> 24 </select><br /> 25 <?php } ?> 26 <input type="submit" name="submit" value="送信"> 27 </form>
staffとdakokuを選択して、送信を押すという動作になります。
A - 1
B - 2
A - 3
というように、名前は重複してもOKだし、選択していなくてもOKです。
※現在はこれで動作しており、PHPで選択されてなかったら等条件で処理を分けるようにしております。
###2.やりたいこと
1のやり方で一応な動作はできておりますが、今回やりたいことは、、、
staffのSelectBoxを選択する
※ここではAを選択したとします。
↓
自動的にというか、Aの値を元にDBにアクセスします。
↓
DBに値が無かった場合
dakokuのSelectBoxは特にいじらずそのまま出力。
↓
DBに値があった場合
※ここはもう少し条件による振分はありますが、、、
dakokuのSelectBoxの値においてDBの値と一致した値はdisabledになり、選択できないようにする。
これが、今回やりたいことになります。
###3.とりあえず自分でやってみたこと
HTML
1<!-- staff側のSelectBoxにonChangeをつけてみた --> 2<form action="" method="POST"> 3 <?php for($i = 0; $i < 3; $i++) { ?> 4 <select name="test[<?= $i; ?>][staff]" onChange="this.form.submit()"> 5 <?php 6 $staffs = select_staff_db(); 7 foreach($staffs as $staff) { 8 $staff_id = $staff['staff_id']; 9 $staff_name = $staff['staff_name']; 10 echo " 11 <option value=".$staff_id.">".$staff_name."</option>"; 12 } 13 ?> 14 </select> 15 <select name="test[<?= $i; ?>][dakoku]"> 16 <?php 17 $dakokus = select_dakoku_db(); 18 foreach($dakokus as $dakoku) { 19 $dakoku_id = $dakoku['dakoku_id']; 20 $dakoku_name = $dakoku['dakoku_name']; 21 echo " 22 <option value=".$dakoku_id.">".$dakoku_name."</option>"; 23 } 24 ?> 25 </select><br /> 26 <?php } ?> 27 <!-- <input type="submit" name="submit" value="送信"> --> 28 </form>
この場合だと、<input type="submit">
のせい?でonChangeが動かない様だったので、無しにしました。
これで、とりあえずSelectBoxを変更するとPOSTされるようになりました。
###4.PHPで条件などを考えてみた
さて、上記まで、とりあえずsubmitされるようにはなりました。
次に、上記までの場合3行あっても無駄になる状況なのがわかります。
ですので、選択した値に関してはそのまま表示されるようにしたいという思いが出てきますので、次から、PHPにてその辺りを一気に書いてみました。
PHP
1<?php 2 $test = filter_input(INPUT_POST, 'test', FILTER_DEFAULT, array('flags' => FILTER_REQUIRE_ARRAY)); 3 $staffs = select_staff_db(); 4 $dakokus = select_dakoku_db(); 5 if(is_null($test)) { 6 for($i = 0; $i < 3; $i++) { 7 echo " 8 <select name='test[{$i}][staff]' onChange='this.form.submit()'>"; 9 foreach($staffs as $staff) { 10 $staff_id = $staff['staff_id']; 11 $staff_name = $staff['staff_name']; 12 echo " 13 <option value=".$staff_id.">".$staff_name."</option>"; 14 } 15 echo " 16 </select> 17 <select name='test[{$i}][dakoku]'>"; 18 foreach($dakokus as $dakoku) { 19 $dakoku_id = $dakoku['dakoku_id']; 20 $dakoku_name = $dakoku['dakoku_name']; 21 echo " 22 <option value=".$dakoku_id.">".$dakoku_name."</option>"; 23 } 24 echo " 25 </select>"; 26 } 27 } else { 28 for($i = 0; $i < 3; $i++) { 29 $post_staff = $test[$i]['staff']; 30 echo " 31 <select name='test[{$i}][staff]' onChange='this.form.submit()'>"; 32 foreach($staffs as $staff) { 33 $staff_id = $staff['staff_id']; 34 $staff_name = $staff['staff_name']; 35 if($staff_id == $post_staff) { 36 echo "<option value=".$staff_id." selected>".$staff_name."</option>"; 37 } else { 38 echo "<option value=".$staff_id.">".$staff_name."</option>"; 39 } 40 } 41 echo " 42 </select>"; 43 echo " 44 <select name='test[{$i}][dakoku]'>"; 45 $dakoku_date = date('Y-m-d'); 46 $dakoku_check = dakoku_check_db($dakoku_date, $post_staff); 47 if(empty($dakoku_check)) { 48 foreach($dakokus as $dakoku) { 49 $dakoku_id = $dakoku['dakoku_id']; 50 $dakoku_name = $dakoku['dakoku_name']; 51 echo "<option value=".$dakoku_id.">".$dakoku_name."</option>"; 52 } 53 } else { 54 foreach($dakoku_check as $check) { 55 $check_id = $check['dakoku_id']; 56 foreach($dakokus as $dakoku) { 57 $dakoku_id = $dakoku['dakoku_id']; 58 $dakoku_name = $dakoku['dakoku_name']; 59 if($check_id == $dakoku_id) { 60 echo "<option value=".$dakoku_id." disabled>".$dakoku_name."</option>"; 61 } else { 62 echo "<option value=".$dakoku_id.">".$dakoku_name."</option>"; 63 } 64 } 65 } 66 } 67 echo " 68 </select>"; 69 } 70 } 71 ?>
とりあえず、POSTが無い(最初にアクセスした時)は全て選択されていない状態で、SelectBoxがある状況にしつつ、選択されると、その名前は保持されたままにできるようになりました。
さらに、dakoku_checkを行い、データがあるか無いかを判定して、無ければ通常のSelectを表示させ、データがある場合にはそのデータの部分だけdisabledになるという最終的にやりたい部分を考えてみたのですが、、、、
###5.最後にできていない部分
確かに、disabledにはなりました!
が、、、、データがある分だけ回してしまっていると思うので、どうもうまく行っておりません。
症状としては、、、
dakokuが下記のようにあるとして、データがAだけだった場合
A disabled
B
C
D
E
のようになりました。
dakokuが下記のようにあるとして、データがAとBだった場合
A disabled
B
C
D
E
A
B disabled
C
D
E
のようになりました。
これはdakoku_checkをforeachで回しちゃってるからそりゃ回ってるんだろうとは思うのですが、、、この辺りの動かせ方がどうもぴんと来ていないのが実際です。。
できて欲しい形は
dakokuが下記のようにあるとして、データがAとBだった場合
A disabled
B disabled
C
D
E
です。
###6.DBやfunctionあたりの情報
最後になってしまい申し訳ありません。
DBのTableとしては、今回3つ使用します。
[staff]
staff_id,
staff_name
[dakoku]
dakoku_id,
dakoku_name
[dakoku_date]
table_id,
staff_id,
dakoku_id,
dakoku_time
PHP
1function select_staff_db() { 2 $dbh = connectDb(); 3 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 4 $sql = "SELECT staff_id, staff_name FROM staff"; 5 $stmt = $dbh->prepare($sql); 6 $stmt->execute(); 7 $staffs = $stmt->fetchAll(); 8 return $staffs; 9} 10 11function select_dakoku_db() { 12 $dbh = connectDb(); 13 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 14 $sql = "SELECT dakoku_id, dakoku_name FROM dakoku"; 15 $stmt = $dbh->prepare($sql); 16 $stmt->execute(); 17 $dakokus = $stmt->fetchAll(); 18 return $dakokus; 19} 20 21function dakoku_check_db($dakoku_date, $post_staff) { 22 $dbh = connectDb(); 23 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 24 $sql = "SELECT dakoku_id FROM dakoku_date WHERE staff_id = :post_staff AND CAST(dakoku_time as DATE) = :dakoku_date"; 25 $stmt = $dbh->prepare($sql); 26 $stmt->bindValue(':post_staff', $post_staff, PDO::PARAM_INT); 27 $stmt->bindValue(':dakoku_date', $dakoku_date, PDO::PARAM_STR); 28 $stmt->execute(); 29 $dakoku_check = $stmt->fetchAll(); 30 return $dakoku_check; 31}
###7.最後に
今回は、SelectBoxの部分についてだけを質問しておりますが、最終的にはそうやって選択したデータを送信して、登録するという作業があることはあります。。。
その部分については、またこの質問が解決しましたら質問させていただこうと思っております。
分かりづらい質問になってしまい大変申し訳ございませn。。。
ご指摘、不足した情報等ありましたら、お知らせくださればと思います。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。