🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

ドロップダウンメニュー

GUIを操作するユーザーインターフェイスで、リストボックスに似ており、ユーザーがリストから値を選べるようにするものです。ドロップダウンのリストが非アクティブの場合は、単体の値を表示します。アクティブ化されると、ユーザーが選択可能な値のリスト一覧を表示(ドロップダウン)します。

HTML

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

Q&A

解決済

1回答

1680閲覧

二段階プルダウンメニューでのGET送信方法

退会済みユーザー

退会済みユーザー

総合スコア0

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

ドロップダウンメニュー

GUIを操作するユーザーインターフェイスで、リストボックスに似ており、ユーザーがリストから値を選べるようにするものです。ドロップダウンのリストが非アクティブの場合は、単体の値を表示します。アクティブ化されると、ユーザーが選択可能な値のリスト一覧を表示(ドロップダウン)します。

HTML

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

0グッド

0クリップ

投稿2019/12/06 07:08

編集2019/12/06 07:39

前提・実現したいこと

二段階プルダウンメニューでの選択をGETでHTMLからPHPに送信したい。

発生している問題・エラーメッセージ

問題としては、二段階目で一つのselect文にnameを入れてGETで送信することまではできるのですが、複数のselect文になると送信できなくなります。

該当のソースコード

HTML

1<form method="GET" action="buisearch.php"> 2<div class="mainclass cityward"> 3 <select class="mainselect"> 4 <option value="">エリアを選択</option> 5 <option value="東北">東北地方</option> 6 <option value="関東">関東地方</option> 7 <option value="中部">中部地方</option> 8 <option value="近畿">近畿地方</option> 9 <option value="中国">中国地方</option> 10 <option value="四国">四国地方</option> 11 <option value="九州">九州地方</option> 12 </select> 13 14 <select id="東北" name="ken" class="subbox"> 15 <option value="">東北地方を選択</option> 16 <option value="北海道">北海道</option> 17 <option value="青森">青森県</option> 18 <option value="岩手">岩手県</option> 19 <option value="秋田">秋田県</option> 20 <option value="宮城">宮城県</option> 21 <option value="山形">山形県</option> 22 <option value="福島">福島県</option> 23 </select> 24 <select id="関東" name="ken" class="subbox"> 25 <option value="">関東地方を選択</option> 26 <option value="茨城">茨城県</option> 27 <option value="栃木">栃木県</option> 28 <option value="群馬">群馬県</option> 29 <option value="埼玉">埼玉県</option> 30 <option value="千葉">千葉県</option> 31 <option value="東京">東京都</option> 32 <option value="神奈川">神奈川県</option> 33 </select> 34 35 <select id="中部" name="ken" class="subbox"> 36 <option value="">中部地方を選択</option> 37 <option value="新潟">新潟県</option> 38 <option value="富山">富山県</option> 39 <option value="石川">石川県</option> 40 <option value="福井">福井県</option> 41 <option value="山梨">山梨県</option> 42 <option value="長野">長野県</option> 43 <option value="岐阜">岐阜県</option> 44 <option value="静岡">静岡県</option> 45 <option value="愛知">愛知県</option> 46 </select> 47 48 <select id="近畿" name="ken" class="subbox"> 49 <option value="">近畿地方を選択</option> 50 <option value="三重">三重県</option> 51 <option value="滋賀">滋賀県</option> 52 <option value="京都">京都府</option> 53 <option value="大坂">大阪府</option> 54 <option value="兵庫">兵庫県</option> 55 <option value="奈良">奈良県</option> 56 <option value="和歌山">和歌山県</option> 57 </select> 58 59 <select id="中国" name="ken" class="subbox"> 60 <option value="">中国地方を選択</option> 61 <option value="鳥取">鳥取県</option> 62 <option value="島根">島根県</option> 63 <option value="岡山">岡山県</option> 64 <option value="広島">広島県</option> 65 <option value="山口">山口県</option> 66 </select> 67 68 <select id="四国" name="ken" class="subbox"> 69 <option value="">四国地方を選択</option> 70 <option value="徳島">徳島県</option> 71 <option value="香川">香川県</option> 72 <option value="愛媛">愛媛県</option> 73 <option value="高知">高知県</option> 74 </select> 75 76 <select id="九州" name="ken" class="subbox"> 77 <option value="">九州地方を選択</option> 78 <option value="福岡">福岡県</option> 79 <option value="佐賀">佐賀県</option> 80 <option value="長崎">長崎県</option> 81 <option value="熊本">熊本県</option> 82 <option value="大分">大分県</option> 83 <option value="宮崎">宮崎県</option> 84 <option value="鹿児島">鹿児島県</option> 85 <option value="沖縄">沖縄県</option> 86 </select><br> 87 <script type="text/javascript"> 88 89 // HTMLの読み込み直後に実行: 90 document.addEventListener('DOMContentLoaded', function() { 91 92 // ▼とりあえずサブBOXを全て非表示にする(CSSで書けば早いが) 93 var allSubBoxes = document.getElementsByClassName("subbox"); 94 for( var i=0 ; i<allSubBoxes.length ; i++) { 95 allSubBoxes[i].style.display = 'none'; 96 } 97 98 // ▼全てのプルダウンボックスごとに処理 99 var mainBoxes = document.getElementsByClassName('mainclass'); 100 for( var i=0 ; i<mainBoxes.length ; i++) { 101 102 var mainSelect = mainBoxes[i].getElementsByClassName("mainselect"); // メインのプルダウンメニュー(※後でvalue属性値を参照するので、select要素である必要があります。) 103 mainSelect[0].onchange = function () { 104 105 // 同じ親要素に含まれている全サブBOXを消す 106 var subBox = this.parentNode.getElementsByClassName("subbox"); // 同じ親要素に含まれる.subbox(※select要素に限らず、どんな要素でも構いません。) 107 for( var j=0 ; j<subBox.length ; j++) { 108 subBox[j].style.display = 'none'; 109 } 110 111 // 指定されたサブBOXを表示する 112 if( this.value ) { 113 var targetSub = document.getElementById( this.value ); // 「メインのプルダウンメニューで選択されている項目のvalue属性値」と同じ文字列をid属性値に持つ要素を得る 114 targetSub.style.display = 'inline'; 115 } 116 } 117 118 } 119 120 }); 121 </script> 122<input type="submit" value="検索"> 123</form>

PHP

1<?php 2 3//データベース接続 4$server = **** 5$userName = **** 6$password = **** 7$dbName = **** 8 9$mysqli = new mysqli($server, $userName, $password,$dbName); 10 11if ($mysqli->connect_error){ 12 echo $mysqli->connect_error; 13 exit(); 14}else{ 15 $mysqli->set_charset("utf-8"); 16} 17 18$sql = "SELECT gymname,gymzipcode,gymaddress,gymtel,gymholiday,gymtime,gymurl FROM sportgym A,gymmachin B,machin C,bui D WHERE D.buiname='{$_GET['bui']}' and D.buinumber=C.buinumber and C.machinnumber=B.machinnumber and B.gymnumber=A.gymnumber and A.gymaddress like '{$_GET['ken']}%'"; 19 20$result = $mysqli -> query($sql); 21 22//クエリー失敗 23if(!$result) { 24 echo $mysqli->error; 25 exit(); 26}

試したこと

name="ken"のところをselect文ごとに変更(name="ken1",name="ken2"など)してPHP側のSQL文でOR条件で試したりしたのですが駄目でした

補足情報(FW/ツールのバージョンなど)

一度ちゃんとGET送信ができているか、二段階目のselect文を一つにして試したところ、ちゃんと送信されていたのでDB接続やHTML、PHP自体は問題ありません。
PHPのSQL文に$_GET['bui']などがありますが、こちらは別にラジオボタンでの絞り込みなので関係がありません。
二段階目のselect文で都道府県を選択した際にその選択された都道府県の名前をPHPの方に送信して、SQLでDBに入っている住所と前方一致検索をしたいと考えています。

よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2019/12/06 07:10

提示したhtmlだけ見るとなにしたいのかわかりません。 「二段階」と仰っていますが、操作や全体の流れを説明願えますか? 要件不明瞭と感じています
XNXSXMXR

2019/12/06 07:24

・formタグ(<form>~</form>)の外にselectタグが書かれていないか。 ・北海道を選択して試したが、北海道のoptionタグのvalue属性の値が空なので取得した値も空だった。 ・GETのつもりがPOSTしていた。 ・どこかに別のHTMLタグがあり、その名前が「ken」だった。 などなど、確認してみてください。
退会済みユーザー

退会済みユーザー

2019/12/06 07:32

m.ts10806様>>申し訳ございません。Javascriptの部分が抜けていたため追記させていただきました。 二段階プルダウンメニューについてですが、まず最初に一つだけプルダウンメニューが表示されており、地方を選択できるようになっています。(東北・関東・中部など) 地方を選択するとその横に新しいプルダウンメニューが表示され、その地方にある都道府県が選択できるようになります。(関東を選択した場合、東京都・埼玉県・神奈川県・千葉県などです) そのあとに検索ボタンを押した場合、選択した都道府県の名前をGETで送信し、SQLのほうで$_GETで取得し、DBにあります住所と前方部分一致をしてその都道府県と一致するデータを出したいと考えております。
退会済みユーザー

退会済みユーザー

2019/12/06 07:39

XNXSXMXR様>>formタグ等を書くのを忘れていたため修正いたしました。申し訳ございません。 提示したhtml以外にはkenを使用していないのです・・・。結果として今提示しているHTML文ではプルダウンメニューでの絞りがうまくいっておらず、都道府県を選択しても全ての都道府県がでてきてしまう始末です。また都道府県を絞らずに検索を押したら何一つ出てこないという形になっています。 また北海道が2行あるのはこちらのミスでしたので修正させていただきます。
guest

回答1

0

ベストアンサー

画面上ではJavaScriptによって非表示にしていますが、これは見えないだけでselectタグは機能しています。
なので、ボタン押して送信した際にURLには「ken=&ken=北海道&ken=.....」となっているかと思います。

同じ名前のパラメータがある場合は後優先なので、$_GET['ken']は空になったのではないかと思います。

投稿2019/12/06 07:43

XNXSXMXR

総合スコア239

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

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

退会済みユーザー

退会済みユーザー

2019/12/06 07:48

仰る通り、URLはそのようになってしまっています。 その場合、select文のnameを一つずつ変えて、PHPのSQL文の方でORで一致するかどうかを繰り返したら良いのでしょうか?
XNXSXMXR

2019/12/06 07:57

案1:JavaScriptで非表示(displayスタイルを 'none'にしているところ)の他に「disabled」 をつけて無効にする。 案2:各都道府県のselectタグのnameをそれぞれ変えて、PHP側で入力値チェックを行ってからSQL文に組み込む。 私は愚直にisset()を使って$_GETに存在しているかチェックしていましたが、他の質問の回答で「filter_input()」という標準関数があることを知りました。 https://qiita.com/mgng/items/901cf7f50a224b19335b SQL文でOR条件を付けて一致するか繰り返すよりも、PHPのコードで入力値チェックを行ったほうがいいと思います。
退会済みユーザー

退会済みユーザー

2019/12/06 08:29

案2の方を実行してみました。 $ken1 = filter_input( INPUT_GET, "ken1" ); $ken2 = filter_input( INPUT_GET, "ken2" ); $ken3 = filter_input( INPUT_GET, "ken3" ); $ken4 = filter_input( INPUT_GET, "ken4" ); $ken5 = filter_input( INPUT_GET, "ken5" ); $ken6 = filter_input( INPUT_GET, "ken6" ); $ken7 = filter_input( INPUT_GET, "ken7" ); $sql = "SELECT gymname,gymzipcode,gymaddress,gymtel,gymholiday,gymtime,gymurl FROM sportgym A,gymmachin B,machin C,bui D WHERE D.buiname='{$_GET['bui']}' and D.buinumber=C.buinumber and C.machinnumber=B.machinnumber and B.gymnumber=A.gymnumber and A.gymaddress like '{$_GET['ken1']}%' and A.gymaddress like '{$_GET['ken2']}%' and A.gymaddress like '{$_GET['ken3']}%' and A.gymaddress like '{$_GET['ken4']}%' and A.gymaddress like '{$_GET['ken5']}%' and A.gymaddress like '{$_GET['ken6']}%' and A.gymaddress like '{$_GET['ken7']}%'"; 入力値チェックを初めてしたのであってるかどうか分からないのですが、このようにしたところ無事に出ました!ありがとうございました!
m.ts10806

2019/12/06 08:51

そこまでするならDBに投げるSQLはプリペアドステートメント使ってほしい…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問