質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1762閲覧

コードを書いていて、よくわからなくなってしまいました SELECTBOXの作成とonChange

Z-TALBO

総合スコア525

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2016/10/26 09:16

編集2016/10/27 08:12

###はじめに
今回、とりあえず質問を書きましたが、やはりいろいろ細かな部分でわかりづらさが目立ちましたのと、ご指摘いただいた内容として、一度質問を書き直しております。
当然、質問の書き直しは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。。。
ご指摘、不足した情報等ありましたら、お知らせくださればと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

今回は、解決を見送ります。

投稿2016/11/06 04:24

Z-TALBO

総合スコア525

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

select_staff_db()の仕様が抜けていてちょっとわかりづらいです

投稿2016/10/26 10:06

yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Z-TALBO

2016/10/27 00:32

一応、現在のfunctionの部分とDBの部分を追記してみました。
yambejp

2016/10/27 02:03

全体のフォーマットがわからないのですが、 スタッフ選択セレクトボックスが3つある? 打刻選択セレクトボックスが3つある? それぞれの相関関係がわかりません 一度HTMLベースでベタに書き出して挙動の説明をして頂いたほうがよいかもしれません。
Z-TALBO

2016/10/27 08:15

遅くなりましたが、質問内容を改めて書かせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問