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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

checkbox

checkboxは、GUIのエレメントです。また、HTML<input>タグのtype属性で扱われる値を指します。

HTML

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

Q&A

1回答

14175閲覧

checkboxで複数選択して検索をする

twin_bird

総合スコア230

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

checkbox

checkboxは、GUIのエレメントです。また、HTML<input>タグのtype属性で扱われる値を指します。

HTML

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

0グッド

0クリップ

投稿2015/09/22 19:28

編集2015/09/23 07:22

PHPとMySQLを使って検索システムの作り方を勉強しています。

以下のようなhtmlとデータベースがあります。

html

1 <form action="index.php" method="POST"> 2 <input type="checkbox" name="pref[]" value="東京">東京 3 <input type="checkbox" name="pref[]" value="大阪">大阪 4 <input type="checkbox" name="pref[]" value="札幌">札幌 5 <input type="checkbox" name="pref[]" value="京都">京都 6 <input type="checkbox" name="pref[]" value="那覇">那覇 7 <input type="checkbox" name="pref[]" value="福岡">福岡 8 <input type="checkbox" name="pref[]" value="新宿">新宿 9 <input type="checkbox" name="pref[]" value="北京">北京 10 <input type="submit" value="検索"> 11 </form>

id pref
1 東京
2 大阪
3 札幌
4 京都
5 那覇
6 福岡

現在配列データをどのように加工して、SQL文を発行すればいいか悩んでいます。

php

1$check = $_POST['pref']; 2 3foreach($check as value){ 4 echo $value; 5

配列データを受け取り、それを表示させることや、単数選択の場合データベースから一致するデータを表示するというのはできるのですが、”複数選択された時に一致するデータを検索してすべて表示する” 方法が思いつきません。

単純にnameをすべて別の名前にすればいいと思ったのですが、データ量が多い場合非効率だと考え、別の効率的なやり方を模索しています。

配列でデータを受け取ったらそれをcount関数でカウントし、添字をうまく使って検索するワード(選択された値)を変数に格納、SQL文へ持っていくというやり方は可能でしょうか?

効率のよい方法やわかりやすいシンプルな方法があれば教えて下さい!

<現在取り組んでいるやり方>

php

1$check = $_POST['pref']; 2 3$imp = implode(",",$check); 4 5$sql = "SELECT * FROM checkbox_search WHERE pref IN ('$imp')"; 6$query = mysqli_query($connect,$sql);

php

1var_dump($imp); 2var_dump($query); 3var_dump($sql);

<複数選択した場合の検証結果>
string '那覇,福岡' (length=13)

object(mysqli_result)[2]
public 'current_field' => int 0
public 'field_count' => int 2
public 'lengths' => null
public 'num_rows' => int 0
public 'type' => int 0

string 'SELECT * FROM checkbox_search WHERE pref IN ('那覇,福岡')' (length=61)

<単数選択した場合の検証結果>
string '福岡' (length=6)
object(mysqli_result)[2]
public 'current_field' => int 0
public 'field_count' => int 2
public 'lengths' => null
public 'num_rows' => int 2
public 'type' => int 0
string 'SELECT * FROM checkbox_search WHERE pref IN ('福岡')' (length=54)

implode関数を使ったやり方がわかりやすいと思い、色々調べたのですが、どうにもSQL文がうまく機能しません。

単数選択した場合の方のSQL文,
SELECT * FROM checkbox_search WHERE pref IN ('福岡')
は正しいと思うのですが、検索結果を表示させるところまでいけません。

複数選択の方はお手上げです・・・

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

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

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

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

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

guest

回答1

0

SQL

1SELECT カラム名 FROM テーブル名 WHERE カラム名 IN(,,・・・);

を使うという事でしょうか?
このサイトが該当しますでしょうか。

投稿2015/09/22 19:36

Ken.sakanakana

総合スコア1768

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

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

twin_bird

2015/09/22 19:58

早速の回答ありがとうございます。 おそらくそのSQL文を使うと思います。 DBアクセスにはmysqliを使用しており、参考サイトとはほんのすこしずれています。 PHPにて配列の内容をどのように検索条件に持っていくかという部分でして、上記SQL文ですと、INの()内にはどのようにして配列データのそれぞれを挿入すれば良いのでしょうか?
Ken.sakanakana

2015/09/22 20:28

先程のURLのPDOの呼び出しの所をmysqliの呼び出しに変えるだけですね ;-) 以下検証しておりません。fetch部分はお任せします! $checkNum = count($check); if( $checkNum ){ $sql ="SELECT * FROM table WHERE "; $sql.=" AND pref IN(".substr(str_repeat(',?', $checkNum),1).")"; $stmt = $mysqli->prepare($sql); $stmt->bind_param('s', $check); $stmt->execute(); }
twin_bird

2015/09/23 07:15

返信ありがとうございます。 ご指摘頂いた方法が今ひとつ理解できなかったので、implodeを使ったやり方に挑戦してみました。 $check = $_POST['pref']; $imp = implode(",",$check); $sql = "SELECT * FROM checkbox_search WHERE pref IN ('$imp')"; $query = mysqli_query($connect,$sql); しかし、うまく行きませんでした。色々なサイトを見てimplode部分の書き方を工夫したりしたのですが、どうも配列データをSQLにうまく組み込めていないようで検索結果を表示することができません。
Ken.sakanakana

2015/09/23 12:06

出来上がった $sql を出力してみるとどうなっていますか? NG: SELECT * FROM checkbox_search WHERE pref IN ('"東京","大阪"');   → ('$imp') OK: SELECT * FROM checkbox_search WHERE pref IN ("東京","大阪");   → ($imp) あと、bind_paramを用いてプレースホルダによる安全なSQLにしておかなければ POSTされた値を鵜呑みにしてしまうと、SQLインジェクションにより、プログラムを 自由に改変実行されてしまいます。 例えば引数が東京・大阪の2つだとして $checkNum = count($check); $sql = 'SELECT * FROM checkbox_search WHERE pref IN ( ?, ? );'; $stmt = $mysqli->prepare($sql); $stmtParams = array( str_repeat( 's', $checkNum ) ); $stmt->bind_param('ss', '東京', '大阪'); $stmt->execute(); IN( ?, ? ) ← 左はbind_paramの一つ目=東京が代入される予定です、右は大阪 'ss' ← 左は 東京が文字列である事をしめしています。右は大阪も文字列である事を示しています。$stmtParamsに置き換えれば、可変に対応できそうです。 ここで、$sqlの IN( ? の ?の数と、bind_paramの 'ss'と その引数(?と対になる)が可変になるので、変数で事前に組み立てておこうという流れです。 (すみません、手元に動作確認環境が無いため、コードは試していません。。。)
twin_bird

2015/09/23 13:47

詳しく説明していただきありがとう御座います。 SQL文ですが、implode("','",$check)とすることでうまく組み込むことができました。 (var_dumpなどで確認しました。) しかし、SQL文を組めてもObject of class mysqli_result could not be converted to string〜 というエラーが出てしまい、立ち止まっていたのですが、以下のようにwhileの部分のコードを変えることで検索結果を表示することができました。 while ($row = $query->fetch_assoc()) { echo $row['pref']; } SQLインジェクションなど対策は後々組み込んでいきたいと思います。 ご指摘いただいた方法にも取り組んでみたいと思います。 勉強なりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問