• ベストアンサー

連動させたいセレクトボックスについて。

こんにちは。DB+PHPが初心者のものです。 前にもここで質問させていただきましたが、 自分なりにコードを書いてみたので コードの訂正、ご教授をよろしくお願いいたします。 セレクトボックス1には、[table 1]の、種類が入り れレクトボックス2には、[table 1]の種類に連動して、[table 2]の名前が選択できるようにする。 下記のようにソースを書いてみましたが、 table1の値は、セレクトボックスでちゃんと表示されますが、table2はセレクトボックスは表示されるものの、何も値がありません(T_T) 動きとしては、table1のセレクトボックスで選択したら、その項目をDBへ問い合わせ、その項目に対応した、DBに登録されているtable2の値を二つ目のセレクトボックスに表示させたいです。 <html> <body> <select name="mkoumoku"> <option selected>-------------</option> <?php //DB接続 $dbcon=mysql_connect("localhost","abcd","defg"); //DB選択 mysql_select_db("zozozo"); //table1を取得 $res=mysql_query("select distinct * from table1"); while ($rows=mysql_fetch_array($res)) { echo "<option value=\"".$rows['id']."\">".$rows['kind']."\n"; } echo "</select>"; ?> <select name="skoumoku"> <option selected>-------------</option> <? //table1に連動して項目を変えたいところのコード $res1=mysql_query("select * from table2 where key =$_POST[mkoumoku] order by id"); while ($rows=mysql_fetch_array($res1)) { echo "<option value=\"".$rows['id']."\">".$rows['name']."\n"; } //Dbクローズ mysql_close($dbcon); ?> </body> </html>

質問者が選んだベストアンサー

  • ベストアンサー
回答No.7

#5です。 > <form method="post" action="a.php"> > がありますが、この中の「action=」で指定される > ファイルは、もう一回自分自身を呼び出すため?コード> と同じものでよいのでしょうか? そうです。まずは1つ目のコンボは何を選ばれたかを自分自身 にページ遷移して$_POSTで受け取り、2つ目のコンボの内容を 決定しています。 >「登録ボタン」を押してDBへ登録するようにしたいので><input type="submit" value="登録"> OnChangeなどの部分で「submit()」ってするとページ遷移するっぽいです^^; JavaScriptとして動作しているのかどうか知りませんが、 そのままform送信処理するようです。 初めて知りました(笑) 以下のコードでは上記内容にも対応する為、変更しています。 ついでなので、ミスやら面倒な記述をしていたのを変えました。 あと、MySQLはテーブル名、項目は大文字・小文字を区別して記述しないとダメですよ。 登録は2つ目のコンボが選択されなければ動作しません。 <?php //DB接続 $dbcon=mysql_connect("localhost","abcd","defg"); //DB選択 mysql_select_db("zozozo"); if (isset($_POST['skoumoku']) And $_POST['skoumoku'] <> "none") { //登録処理 regist(); exit; } ?> <html> <body> <form method="post" name="frm" action="a.php"> <select name="mkoumoku" onChange="submit()"> <?php $slctd = ((!isset($_POST['mkoumoku']) Or $_POST['mkoumoku'] == "none")?" selected":""); echo '<option value="none"'.$slctd.'>-------------</option>'."\n"; //table1を取得 $res=mysql_query("select distinct * from table1"); while ($rows=mysql_fetch_array($res)) { $slctd = (($_POST['mkoumoku'] == $rows['id'])?" selected":""); echo '<option value="'.$rows['id'].'"'.$slctd.'>'.$rows['kind'].'</option>'."\n"; } echo "</select>"; ?> <select name="skoumoku"> <option value="none" selected>-------------</option> <?php //table1に連動して項目を変えたいところのコード $res1=mysql_query("select * from table2 where table2.key='{$_POST['mkoumoku']}' order by id"); while ($rows=mysql_fetch_array($res1)) { echo '<option value="'.$rows['id'].'">'.$rows['name'].'</option>'."\n"; } echo "</select>"; //Dbクローズ mysql_close($dbcon); ?> <input type="submit" value="登録"> </form> </body> </html> <?php function regist() { //登録処理 print <<< registed <html> <head> <title>.....</title> </head> <body> 登録完了<br> <p> <a href="a.php">戻る</a> </body> </html> registed; } ?> あと、思い通りの動作や表示がされなかった場合、 その状態のソースを見る事で原因がわかる場合もありますので、 状態が表示されている時に、ブラウザからソースの表示を行ってみて下さい。

bacon_001
質問者

お礼

naktak様、再度、ご回答ありがとうございます。 説明が分かりやすいので、大変助かりました。 その後、色々と改良して試してみましたところ、 2つのセレクトボックスは連動して、動作いたしました。原因は、 $res1=mysql_query("select * from table2 where table2.key='{$_POST['mkoumoku']}' order by id"); このソースのtable2.key='{$_POST['mkoumoku']}'の部分を、table2.key=".$_POST['mkoumoku']"に変えましたら正常に動作いたしました! 本当にありがとうございました。 今から、ここでセレクトした値を あらかじめ用意してある、空のテーブルにinsertして 表示する処理を頑張ってみようと思います。 またgooさんの方へお世話になりそうですが・・・(^^ゞありがとうございました。

その他の回答 (6)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.6

「<<<」は「ヒアドキュメント」といいます。 便利なので是非ご利用ください。 文法的にはまずはご自身で調べて頂く方がよいと思いますが、 端的に申し上げると終端子(この場合「eof」)まで文字列 が続いていることを示しています。 ちなみに「eof」は別に「hoge」でも「aaa」でも何でも いいんです。 (※本来eofとはファイルの終わりを意味します) print <<<eof aaa bbb ccc eof; とするとソース的には「aaa改行bbb改行ccc」が表示されます。 (htmlでは改行は無視されますが・・・) $x .=<<<eof aaa bbb ccc eof; とすると「aaa改行bbb改行ccc」が$xに追加記入されます。 それと前のコードに記載ミスがあったので訂正しておきます。 <?php $dbcon=mysql_connect("localhost","abcd","defg"); mysql_select_db("zozozo"); $res=mysql_query("select distinct * from table1"); while ($rows=mysql_fetch_array($res)) { $flg=(($rows['id']==$_POST['mkoumoku'])?"selected":""); $select_mkoumoku.=<<<eof <option value="{$rows[id]}" $flg>{$rows[kind]}</option> eof; } $res=mysql_query("select * from table2 where key ='{$_POST[mkoumoku]}' order by id"); while ($rows=mysql_fetch_array($res)) { $select_skoumoku.=<<<eof <option value="{$rows[id]}">{$rows[name]}</option> eof; } mysql_close($dbcon); print <<<eof <html> <body> <form action="$PHP_SELF"> <select name="mkoumoku" onChange="this.form.submit()"> <option value="">-------------</option> $select_mkoumoku </select><br> <select name="skoumoku"> <option value="">-------------</option> $select_skoumoku </select><br> <input type="submit" value="実行"> </form> </body> </html> eof; ?>

bacon_001
質問者

お礼

yambejp様。 再度回答をありがとうございました。 無事、解決いたしましたのでご報告いたします。 大変、助かりましたm(__)m そして、ヒアドキュメントについて また知識が一つ増えたので、嬉しかったです。 ありがとうございました(*^_^*)

回答No.5

こんな感じでどうでしょうか。 【a.php】 <?php //DB接続 $dbcon=mysql_connect("localhost","abcd","defg"); //DB選択 mysql_select_db("zozozo"); ?> <html> <body> <script language="javascript"> function submit() { document.forms.submit(); } </script> <form method="post" action="a.php"> <select name="mkoumoku" onChange="submit()"> <?php if (! isset($_POST['mkoumoku']) Or $_POST['mkoumoku'] == "none") { echo '<option value="none" selected>-------------</option>'; } else { echo '<option value="none">-------------</option>'; } //table1を取得 $res=mysql_query("select distinct * from table1"); while ($rows=mysql_fetch_array($res)) { if ($_POST['mkoumoku'] == $rows['id']) { echo '<option value="'.$rows['id'].'" selected>'.$rows['kind']; } else { echo '<option value="'.$rows['id'].'">'.$rows['kind']; } } echo "</select>"; ?> </form> <select name="skoumoku"> <option selected>-------------</option> <? //table1に連動して項目を変えたいところのコード $res1=mysql_query("select * from table2 where table2.key={$_POST['mkoumoku']} order by id"); while ($rows=mysql_fetch_array($res1)) { echo '<option value="'.$rows['id'].'">'.$rows['name']; } echo "</select>"; //Dbクローズ mysql_close($dbcon); ?> </body> </html> SQLで文法エラーを起こしています。 「key」という項目名は、SQL上の文法になりますので (PRIMARY KEY ~など)、 項目名「key」としてしまっている時点でエラーになってしまっています。 上記プログラムでは「key」を「table2.key」と 明示的にtable2の項目だよと示して動作させています。

bacon_001
質問者

お礼

naktak様、ご回答ありがとうございますm(__)m 早速、自分のDBと照らし合わせて試してみました。 そこでまた質問が浮上してきたのですが、 お付き合いくださいませ。 コードの中に <form method="post" action="a.php"> がありますが、この中の「action=」で指定される ファイルは、もう一回自分自身を呼び出すため?コードと同じものでよいのでしょうか? (a.phpだったら、action="a.php"に。) また、試してみたのですが、 2つ目のセレクトが、連動してくれません(T_T) ふと思ったのですが、私のmysqlのDBのkeyの登録の仕方もあるのでしょうかね。。疑問です。。 ご丁寧にご教授いただいたので頑張ってみます。。 また、2つのセレクトを選択した一番最後に 「登録ボタン」を押してDBへ登録するようにしたいので<input type="submit" value="登録"> を最後に付け足してみましたが。。 「key」についてもSQLで構文法があることを知らなかったのでとても勉強になりました^^

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

#3補足です htmlのoptionについているselectedははずして ください。別途処理入れてありますので

bacon_001
質問者

お礼

yambejp様、ご回答ありがとうございます。 すごく困っているので助かりました・・・。 そして試してみたのですが、 一つ目のセレクトの項目が セレクトボックスの外に出て表示されてしまいます・・・。原因を突き止めるため、またもコードと格闘していますが・・・。???? そこで、気がついたのですが、 ちなみに、コードの中にある、 「eof;」や、「print <<<eof」は これはどういった意味というか、処理なのでしょうか? またソースの書き方について、色々とアドバイスくださりありがとうございましたm(__)m 試行錯誤でやっているので、自分でもコメントを入れておかないとよく分からなくなってきます(苦笑)。 勉強になりました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

#1さんの言うとおり$_POST[mkoumoku]が問題です。 コーテーションの中でやるなら {$_POST[mkoumoku]}とする必要があります。 さもなくば1度コーテーションの外で "文字".$_POST['mkoumoku']."文字"としてください。 しかも$_POST['mkoumoku']がヌルのときには SQLのエラーになるので、かならずSQL文の中では シングルコーテーションで囲みましょう。 さて、前の書き込みに真っ先に回答つけましたが 本質的にajaxなどで処理しない限りこの手のことは できません。ただ単なるjavascriptでも以下のように すればいけます。ちゃんとsubmitを用意すれば、 javascriptが使えない環境の人でも使えます。 ユーザビリティを常にあたまにいれておきましょう。 それと素人にありがちなのですが、コードを埋め込み すぎです。自分で書いてて何がなんだかわからなく なりませんか? DBによる検索部分と、HTMLの表示部分はヒア ドキュメントをつかって極力処理をわけたほうが よいと思います。 以下未検証なので動く保証はありませんが・・・ <?php $dbcon=mysql_connect("localhost","abcd","defg"); mysql_select_db("zozozo"); $res=mysql_query("select distinct * from table1"); while ($rows=mysql_fetch_array($res)) { $flg=(($rows['id']==$_POST['mkoumoku'])?"selected":""); $select_mkoumoku.=<<<eof <option value="{$rows[id]}" $flg>{$rows[kind]} eof; } $res=mysql_query("select * from table2 where key ='".$_POST['mkoumoku']."' order by id"); while ($rows=mysql_fetch_array($res)) { $select_skoumoku.=<<<eof <option value="{$rows[id]">{$rows[name]} eof; } mysql_close($dbcon); print <<<eof <html> <body> <form action="$PHP_SELF"> <select name="mkoumoku" onChange="this.form.submit()"> <option selected>-------------</option> {$select_mkoumoku} </select><br> <select name="skoumoku"> <option selected>-------------</option> {$select_skoumoku} </select><br> <input type="submit" value="実行"> </form> </body> </html> eof; ?>

  • kusukusu
  • ベストアンサー率38% (141/363)
回答No.2

これって多分思っている以上にやっかいですよ。 というのもPHPはサーバーサイドプログラムなので、クライアントクライアントが何らかのアクションをサーバーに送らない限り、関与できません。 ですからPHPだけで行いたければ、 table1のデータを選択したという情報をサーバーに送らなければなりません(POSTする) そこで初めてtable2のデーターをDBから取得できます。 こういう場合はJavaScriptと連動して行うのが普通ですが、大変失礼ですが、おそらくスキル的に厳しいと思います。 概要だけ説明しますと、 1.ページ表示時に、table2で選択できる要素を全てDBから引いて、JavaScriptの関数にセットする。 2.document.form.elementで、table1により選択された値と連動する値をtable2にセットする こんな感じです。

bacon_001
質問者

お礼

早速の回答、ありがとうございますm(__)m kusukusu様のおっしゃる方法で table1のデータを選択したという情報をサーバにPOSTするには、このコードから改良は可能でしょうか? そうなんですよね、私がやろうと思っていることは、自分のスキル的に厳しいのは十分分かっているんですが、PHPを使ってとされているので・・・ そして、その後table2のデータを取得できるのですね。まずは、サーバにPOSTすることが最初のステップということですね。 また、よろしければ、このコードからどう改良すればよいか、ご教授していただければと思います。 よろしくお願いいたしますm(__)m

回答No.1

1つ目のコンボを選んだらどうなるのですか? PHPでは一度サーバに送信しないと処理は出来ませんよ。 それが嫌なら、コンボを変化させるJavaScriptを生成するような PHPコーディングをしなければなりません。 このプログラムでは、$_POST[mkoumoku]は常に空だと思います。

bacon_001
質問者

お礼

早速の回答をありがとうございます。 一つ目をセレクトしたら PHPでDBへ問い合わせるようにしたいと思っています。 そして、一つ目で選んだ項目に応じて 二つ目のセレクトの項目を変える形を目標としているのですが、なんせ、初心者なもので、 その問い合わせの仕方も悩んでおります・・・。 やはり、今の現状では、$_POST[mkoumoku]は空の状態ですよね・・・だから、値が空のまま表示されてしまっていたのですね・・・。このコードからどのように改良したらよいか、ご教授お願いできませんでしょうか?

関連するQ&A

専門家に質問してみよう