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

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

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

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

Q&A

解決済

1回答

6465閲覧

複数のセレクトボックスで1つ目を選択した後、2つ目のセレクトボックスを絞り込む

juriparu0411

総合スコア14

PHP

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

0グッド

0クリップ

投稿2016/11/11 09:10

編集2016/11/15 05:14

PHP初心者です。詳しい方がいらっしゃいましたらよろしくお願いいたします。

データベースをSELECT文でSUM集計して表示するプログラムを作成中ですが、セレクトボックスを4つ作成する必要があります。

一つの選択で、「検索」ボタンを押して、SUBMITするのはできたのですが、2つ以上のセレクトボックスがあった場合、1つ目の選択した条件で2つ目のセレクトボックスに表示する要素をSELECT文のWHEREで絞り込みDISTINCTしたいのですが、SUBMITをおこなわずに引き渡す方法がわかりません。

例)

セレクトボックス1
りんご
みかん
いちご
れもん

上で「みかん」をクリックしたら、「みかん」の仕入実績がある取引先のみをセレクトボックス2に表示する。

セレクトボックス2
岩井商店
鈴木商店
田中商店
和田商店

不慣れで申し訳ありません。

以下、ソースを記載いたします。

度々で申し訳ありません。ソースを修正してみましたが、画面には
大分類しか表示されませんでした。

HTML

1<?php 2ini_set('display_errors', 1); 3error_reporting(E_ALL); 4 5//データベースのインスタンス名を指定 6$serverName = ".\\SQLEXPRESS"; 7//接続情報を指定 8$connectionInfo = array("UID" => "test", 9 "PWD" => "test", 10 "Database" => "hattyuujisseki"); 11 12//コネクションを確立 13$conn = sqlsrv_connect($serverName, $connectionInfo) 14 or die(print_r(sqlsrv_errors(), true)); 15//dpt引き渡し 16//クエリー文を指定 17$tsql = "SELECT * from 大分類マスタ"; 18//クエリーを実行 19$result = sqlsrv_query($conn, $tsql); 20?> 21<html> 22 <meta HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=x-sjis"> 23 <head> 24 <title>発注実績</title> 25 </head> 26 <body> 27 <form action="" method="POST"> 28 <select name="dpt" > 29 <?php while ($row = sqlsrv_fetch_array($result)) : ?> 30 <?php if ($row['大分類コード'] == filter_input(INPUT_POST, 'dpt')): ?> 31 <option value="<?= $row['大分類コード'] ?>" selected="selected"> 32 <?= $row['大分類コード']; ?> <?= $row['大分類名_漢字'] ?> 33 </option> 34 <?php else : ?> 35 <option value="<?= $row['大分類コード']; ?>"> 36 <?= $row['大分類コード'] ?> <?= $row['大分類名_漢字'] ?> 37 </option> 38 <?php endif; ?> 39 <?php endwhile; ?> 40 41 </select> 42 <input type="submit" name="s" value="検 索" /> 43 </form> 44 <b>発注実績 &emsp;</b> 45 <table> 46 <thead> 47 <tr> 48 <th>中分類</th> 49 <th>取引先</th> 50 <th>週</th> 51 <th>発注数</th> 52 <th>発注原価</th> 53 <th>発注売価</th> 54 </tr> 55 </thead> 56 <tbody> 57 58 </tbody> 59 </table> 60 <script type="text/javascript" src="//code.jquery.com/jquery-2.2.4.min.js" charset="Shift-JIS"></script> 61 <script type="text/javascript" charset="Shift-JIS"> 62 // ここにJavaScript のコードを書く 63 $(function () { 64 var parent = $(".ajax-dpt"); 65 var child = $(".ajax-lin"); 66 parent.on("change", function () { 67 var selecteddptCode = $(this).val(); 68 var param = { 69 dpt: selecteddptCode 70 }; 71 child.html('<option value="-1">-- 中分類選択 --</option>'); 72 var defaultlinCode = ("" != child.attr("default")) ? child.attr("default") : -1; 73 74 if (-1 != selecteddptCode) { 75 $.getJSON("/ajax/getlin.php", param, function (json) { 76 $.each(json, function (i) { 77 child.append( 78 '<option value="' + json[i].code + '">' + 79 json[i].name + '</option>'); 80 }); 81 child.val(defaultlinCode); 82 }); 83 } 84 }).change(); 85 }); 86 // 発注実績 の検索は、ajaxで読み込むファイルで検索し、このファイル上では検索しない 87 </script> 88 </body> 89</html> 90<?php 91//クエリー結果の開放 92sqlsrv_free_stmt($result); 93//コネクションのクローズ 94sqlsrv_close($conn); 95?> 96 97```php 98
<?php $strdptfCode = filter_input(INPUT_GET, 'dpt'); var_dump($strdptfCode); $tsql = "SELECT * from 中分類マスタ where 大分類 = $strdptfCode"; //クエリーを実行 $result = sqlsrv_query($conn, $tsql); ?> <?php if (isset($_POST['dpt'])){ //クエリー文を指定 $tsql = "SELECT 大分類,中分類,週, SUM(発数) AS 発注数, SUM(発原額) AS 発注原価, SUM(発売額税抜) AS 発注売価 from dbo.VM_納品実績 where 大分類 = $dpt group by 大分類,中分類,週 order by 大分類,中分類,週"; //クエリーを実行 $result = sqlsrv_query($conn,$tsql); }?> <tbody> <?php //実行結果を描画 while($row = sqlsrv_fetch_array($result)) { printf("<tr><th>".$row['中分類']."</th>"); printf("<td >".$row['週']."</td>"); printf("<td >".number_format($row['発注数'])."</td>"); printf("<td >".number_format($row['発注原価'])."</td>"); printf("<td >".number_format($row['発注売価'])."</td></tr>"); } ?> </table> ```

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

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

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

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

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

guest

回答1

0

ベストアンサー

こちらの記事に書かれているコードが参考になると思います。
郵便番号データから都道府県・市町村リストを作成するためのスクリプト


html

1<?php 2ini_set('display_errors', 1); 3error_reporting(E_ALL); 4 5//データベースのインスタンス名を指定 6$serverName = ".\\SQLEXPRESS"; 7//接続情報を指定 8$connectionInfo = array("UID" => "test", 9 "PWD" => "test", 10 "Database" => "hattyuujisseki"); 11 12//コネクションを確立 13$conn = sqlsrv_connect($serverName, $connectionInfo) 14 or die(print_r(sqlsrv_errors(), true)); 15//dpt引き渡し 16//クエリー文を指定 17$tsql = "SELECT * from 大分類マスタ"; 18//クエリーを実行 19$result = sqlsrv_query($conn, $tsql); 20?> 21<html> 22 <meta HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=x-sjis"> 23 <head> 24 <title>発注実績</title> 25 </head> 26 <body> 27 <form action="" method="POST"> 28 <select name="dpt" > 29 <?php while ($row = sqlsrv_fetch_array($result)) : ?> 30 <?php if ($row['大分類コード'] == filter_input(INPUT_POST, 'dpt')): ?> 31 <option value="<?= $row['大分類コード'] ?>" selected="selected"> 32 <?= $row['大分類コード']; ?> <?= $row['大分類名_漢字'] ?> 33 </option> 34 <?php else : ?> 35 <option value="<?= $row['大分類コード']; ?>"> 36 <?= $row['大分類コード'] ?> <?= $row['大分類名_漢字'] ?> 37 </option> 38 <?php endif; ?> 39 <?php endwhile; ?> 40 41 </select> 42 <input type="submit" name="s" value="検 索" /> 43 </form> 44 <b>発注実績 &emsp;</b> 45 <table> 46 <thead> 47 <tr> 48 <th>中分類</th> 49 <th>取引先</th> 50 <th></th> 51 <th>発注数</th> 52 <th>発注原価</th> 53 <th>発注売価</th> 54 </tr> 55 </thead> 56 <tbody> 57 58 </tbody> 59 </table> 60 <script type="text/javascript" src="//code.jquery.com/jquery-2.2.4.min.js"></script> 61 <script type="text/javascript"> 62 // ここにJavaScript のコードを書く 63 // 発注実績 の検索は、ajaxで読み込むファイルで検索し、このファイル上では検索しない 64 </script> 65 </body> 66</html> 67<?php 68//クエリー結果の開放 69sqlsrv_free_stmt($result); 70//コネクションのクローズ 71sqlsrv_close($conn); 72?>

投稿2016/11/11 09:20

編集2016/11/13 10:32
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

juriparu0411

2016/11/11 12:57

早速のご回答ありがとうございます!JQUERYを勉強してみます。
juriparu0411

2016/11/13 04:45

サンプルスクリプト拝見させて頂きました。自分の場合、今のソースは、一つ目のリストボックスにPOSTしてsubmitしてしまっているのですが、これは、htmlのclassで記述し、2から4までは、jquery → php を繰り返し記述し、4つ目のリストボックスでsubmitするということになるのでしょうか? 応用がきかず、申し訳ありませんが、アドバイス頂けると助かります。
退会済みユーザー

退会済みユーザー

2016/11/13 05:47

ソースを提示してください。文章で説明されても誤謬が生じます。
juriparu0411

2016/11/13 07:32

はい。ソースは、以下になります。 <html> <meta HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=x-sjis"> <head> <title>発注実績</title> </head> <body> <?php //データベースのインスタンス名を指定 $serverName = ".\\SQLEXPRESS"; //接続情報を指定 $connectionInfo = array("UID"=>"test", "PWD"=>"test", "Database"=>"hattyuujisseki"); //コネクションを確立 $conn = sqlsrv_connect($serverName, $connectionInfo) or die(print_r(sqlsrv_errors(), true)); //dpt引き渡し //クエリー文を指定 $tsql = "SELECT * from 大分類マスタ"; //クエリーを実行 $result = sqlsrv_query($conn, $tsql); ?> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST"> <select name="dpt" > <?php while ($row = sqlsrv_fetch_array($result)) { if ((isset($_POST['dpt']))and($row['大分類コード'] == $_POST['dpt'])) { echo ' <option value="' . $row['大分類コード'] . '" selected="selected">' . $row['大分類コード'] . " ".$row['大分類名_漢字'] . '</option>' . "\n"; $dpt = $_POST['dpt']; $dptmei = $row['大分類名_漢字']; } else { if (isset($_POST['dpt'])) { var_dump($_POST['dpt']); } echo ' <option value="' . $row['大分類コード'] . '">' . $row['大分類コード'] ." ". $row['大分類名_漢字'] .'</option>' . "\n"; } } ?> </select> <input type="submit" name="s" value="検 索" /> </form> <b>発注実績 &emsp; <?php if (isset($_POST['dpt'])){ print("DPT ".$dpt ." ". $dptmei); } ?></b> <?php if (isset($_POST['dpt'])){ //クエリー文を指定 $tsql = "SELECT 大分類,中分類,取引先,週, SUM(発数) AS 発注数, SUM(発原額) AS 発注原価, SUM(発売額税抜) AS 発注売価 from dbo.VM_納品実績 where 大分類 = $dpt group by 大分類,中分類,取引先,週 order by 大分類,中分類,取引先,週"; //クエリーを実行 $result = sqlsrv_query($conn,$tsql); }?> <table> <style> </style> <thead> <tr> <th>中分類</th> <th>取引先</th> <th>週</th> <th>発注数</th> <th>発注原価</th> <th>発注売価</th> </tr> </thead> <tbody> <?php //実行結果を描画 while($row = sqlsrv_fetch_array($result)) { printf("<tr><th>".$row['中分類']."</th>"); printf("<td >".$row['取引先']."</td>"); printf("<td >".$row['週']."</td>"); printf("<td >".number_format($row['発注数'])."</td>"); printf("<td >".number_format($row['発注原価'])."</td>"); printf("<td >".number_format($row['発注売価'])."</td></tr>"); } ?> </table> <?php //クエリー結果の開放 sqlsrv_free_stmt($result); //コネクションのクローズ sqlsrv_close($conn); ?> </body> </html>
退会済みユーザー

退会済みユーザー

2016/11/13 07:38

恐れ入りますが、質問文に追記してください。
juriparu0411

2016/11/15 00:26

度々で申し訳ありません。ソースを修正してみましたが、画面には 2つ目のリストボックスが表示されませんでした。修正後のソースを貼り付けていますので、不備な個所がありましたら、ご指導お願いいたします。
退会済みユーザー

退会済みユーザー

2016/11/15 04:37 編集

私が追記したソース見ました? こちらの環境MacだからSqlServer の実行結果は確認できません。「うまくいかない」ではどこまで正常な動きがしていて、どの部分が動かないのかがわかりません。どこまではできたのかをお伝え下さい。 あと、どのファイル(ファイル名)が、どのソースコードなのかがわかるように記述してください。
juriparu0411

2016/11/15 05:06

お手数おかけし、申し訳ありません。 ご返信いただいたソースは、拝見させていただきました。 // ここにJavaScript のコードを書く // 発注実績 の検索は、ajaxで読み込むファイルで検索し、このファイル上では検索しない とのご指摘をいただいてましたので、都道府県の検索のソースを参考にJavaScript を記述いたしました。「発注実績 の検索」は、ajax/getlin.php に 別途作成しています。 画面は、「大分類」一覧は、表示され選択可能ですが、JavaScriptで記述したつもりの「中分類」の一覧が表示されません。また、検索ボタンを押しても、明細のデータの表示はされません。 尚、ベストアンサーを取り消したのは、回答に満足していないということではなく、Shibuyaさんに気付いていただいて、もう少し教えをいただければと思ったからであります。
退会済みユーザー

退会済みユーザー

2016/11/15 05:18 編集

まず、jQuery のコードについての理解ができていないようですね。 var parent = $(".ajax-dpt"); ここの部分ですが、 ドット + 名前 でセレクタを指定しているのですから、『ajax-dpt』というクラス名が「大分類のselect」につけなければ、jQuery部分のコードは動作しません。 ajax/getlin.php で検索した結果は getJSON で取りに行っているのですから、ajax/getlin.php が返す値は,、json 形式で結果を返さなくてはなりません。 あと、javascriptのでバッグはブラウザの「開発ツール」で動きを監視しながらデバッグして見てください。 > 尚、ベストアンサーを取り消したのは、回答に満足していないということではなく、Shibuyaさんに気付いていただいて、もう少し教えをいただければと思ったからであります。 大丈夫ですよ(笑)確かにそれで気付いたので ---- ただちょっときになるのが… この案件は SqlServer を使うことが前提条件なのでしょうかね… 文字コードが Shift-JIS となっている点、jQuery との相性が悪いというか、いまどき UTF-8 がデファクトなので、その点色々と厄介な問題がありますが。
juriparu0411

2016/11/15 05:22

質問するレベルでないのは、重々承知の上でなのですが、 header('Content-type: application/json'); echo json_encode($res); このあたりのコードを考慮すれば、良いのでしょうか?
退会済みユーザー

退会済みユーザー

2016/11/15 05:30

そこももちろん影響します。 <select name="dpt" > -> <select name="dpt" class="ajax-dpt"> にする必要があります。 実際に動くものを見ながらの方が理解しやすいとは思うのですが、MySQLが動作する環境はお持ちではないですよね?
juriparu0411

2016/11/15 05:40

色々アドバイスありがとうございます。環境ですが、XAMPPの環境もありますので、MYSQLで検証可能です。DBのコードもUTF-8ですので、ご指導いただければ、ありがたいです。本当に忙しいところ申し訳ありません。
退会済みユーザー

退会済みユーザー

2016/11/15 05:42

とりあえず、こちらの手元で、設置するだけで動きが確認できるサンプルコードを作成してますので、少々お待ちください。
juriparu0411

2016/11/15 05:51

ありがとうございます!!
退会済みユーザー

退会済みユーザー

2016/11/16 14:19 編集

こちらにソースを上げておきました。まずは動作させて見てください。
juriparu0411

2016/11/15 07:41

お手数おかけしました。現行の社内の環境ですと接続できないので、自宅で確認してみます。
juriparu0411

2016/11/19 05:21

見事に質問の回答が動きました。感動いたしました。ソースも大変美しくプロの技を感じました。Sqlite3は、コマンドツールで各テーブルを参照させていただきました。自分のコードに反映できるか挑戦してみます。本当に色々おしえていただきありがとうございました。
退会済みユーザー

退会済みユーザー

2016/11/19 11:19 編集

自分で書けるようになるともっと面白く感じると思いますし、感動すると思いますよ。頑張ってくださいね。
juriparu0411

2016/11/25 02:40

はげましのお言葉ありがとうございます。DB環境をSqlserverに移しても実装できました。このサイトのように、自分のかかえている問題を会ったこともない方にご指導いただけるのはすばらしいことですね。自分の使用環境のテーブルでもうまくいきましたが、日本語項目を持つテーブルの場合にうまくいかず、Teratailでまた、質問させていただきました。もし、お時間あれば、ご確認よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問