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

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

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

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

SQL

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

PHP

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

Q&A

解決済

2回答

4334閲覧

チェックボックスにて複数指定して、データベースから任意のデータを取得する方法

nyanmaru

総合スコア13

MySQL

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

SQL

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

PHP

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

0グッド

0クリップ

投稿2019/01/27 10:11

前提・実現したいこと

チェックボックスにて複数選択したものを、PHPを使用して、データベース(MySQL)から取得する方法を調べています。

お店の定休日を検索するために、下記のような【チェックボックス】と【regular_holidayテーブル】を作成しました。


【チェックボックス】
□月 □火 □水 □木 □金 □土 □日 検索する

【regular_holidayテーブル】

idnamemontuewedthufrisatsun
1ANULLNULLNULLNULLNULLNULL
2BNULLNULLNULLNULLNULLNULL
3CNULLNULLNULLNULLNULLNULL
4DNULLNULLNULLNULLNULLNULLNULL

以下のように検索して、任意のデータを取得できるようにしたいです。

1.□月 □火 ☑水 □木 □金 □土 □日 で検索
⇒ A、C

2.□月 □火 ☑水 ☑木 □金 □土 □日 で検索
⇒ A、B、C

3.□月 □火 □水 □木 □金 □土 □日 で検索
⇒ D

どなたか、ご教授ください。

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

現状、それぞれ検索すると以下のとおりとなります。 1.については、達成。 2.については、結果がBとなり、AとCが取得できない。 3.については、「Notice: Undefined index」となる。

該当のソースコード

HTML

1<form class="" action="shops.php" method="post"> 2<p>【定休日】</p> 3<input type="checkbox" name="holiday" value="mon">月 4<input type="checkbox" name="holiday" value="tue">火 5<input type="checkbox" name="holiday" value="wed">水 6<input type="checkbox" name="holiday" value="thu">木 7<input type="checkbox" name="holiday" value="fri">金 8<input type="checkbox" name="holiday" value="sat">土 9<input type="checkbox" name="holiday" value="sun">日 10<input type="submit" value="検索する"> 11</form> 12

SQL

1SELECT * FROM regular_holiday 2WHERE ".$_POST['holiday']." IS NOT NULL

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

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

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

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

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

guest

回答2

0

同じnameで複数送る(チェックボックスなど)場合は配列にして送ってください。
name=holiday[]

ただ、動的にカラム名を変動させるのはよろしくないです。そうでなくても入力された情報をそのままSQLに突っ込むのはセキュリティリスクがあります(SQLインジェクション)
SQLのエスケープは必ずいれてください。

また、これだけnullが多いテーブルはあまり良いとは言えません。
月~日など形式が決まっているのでしたらもう少しスッキリ組まれた方が良いです。
カラムに入力値を持ってくるのではなく、値に入力値を持ってこれるようにしたほうが inなど使えるのでSQLも書きやすくなります。

投稿2019/01/27 12:07

編集2019/01/27 12:07
m.ts10806

総合スコア80765

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

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

nyanmaru

2019/02/10 00:47

反応が遅くなり、申し訳ありません。配列にするという送り方を知りませんでした... そのあとに書かれていることがより重要なことだと感じましたので勉強します! ご回答ありがとうございました!
m.ts10806

2019/02/10 01:59

何かのヒントになれば幸いです
guest

0

ベストアンサー

まずテーブル構成から、テーブルは2つにわけます

SQL

1create table shop(sid int primary key,sname varchar(29)); 2insert into shop values(1,'A'),(2,'B'),(3,'C'),(4,'D'); 3create table holiday(hid int,sid int,hweekday int,unique(sid,hweekday)); 4insert into holiday values(1,1,3),(2,2,4),(3,3,3);

ここから全データをとるとこう

SQL

1select t2.sid,t2.sname 2,case hweekday when 1 then '○' else null end as mon 3,case hweekday when 2 then '○' else null end as tue 4,case hweekday when 3 then '○' else null end as wed 5,case hweekday when 4 then '○' else null end as thu 6,case hweekday when 5 then '○' else null end as fri 7,case hweekday when 6 then '○' else null end as sat 8,case hweekday when 7 then '○' else null end as sun 9from holiday as t1 10right join shop as t2 on t1.sid=t2.sid

(命題のデータ表示のとおり)

PHP側はこう

PHP

1<?PHP 2$h=filter_input(INPUT_POST,'h',FILTER_VALIDATE_INT,["options"=>["min_range"=>1,"max_range"=>7],"flags"=>FILTER_REQUIRE_ARRAY]); 3 4$sql=<<<eof 5select t2.sid,t2.sname 6,case hweekday when 1 then '○' else null end as mon 7,case hweekday when 2 then '○' else null end as tue 8,case hweekday when 3 then '○' else null end as wed 9,case hweekday when 4 then '○' else null end as thu 10,case hweekday when 5 then '○' else null end as fri 11,case hweekday when 6 then '○' else null end as sat 12,case hweekday when 7 then '○' else null end as sun 13from holiday as t1 14right join shop as t2 on t1.sid=t2.sid 15where 1 16 17eof; 18 19$data=[]; 20if(!is_null($h)){ 21 if(in_array(false,$h)!==false){ 22 $sql.="and 0 "; 23 }else{ 24 $sql.="and hweekday in(".implode(",",array_fill(0,count($h),"?")).") "; 25 } 26} 27 28print $sql."<br>"; 29var_dump($data); 30 31/* 32try{ 33 $pdo = new PDO($dsn, $user,$password); 34 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 35 $stmt = $pdo->prepare($sql); 36 $stmt->execute($data); 37 $rows=$stmt->fetchAll(PDO::FETCH_ASSOC); 38 print_r($rows); 39}catch(PDOException $e){ 40 die($e->getMessage()); 41} 42 */ 43?> 44 45 46<form method="post"> 47<p>【定休日】</p> 48<label><input type="checkbox" name="h[]" value="99">test用不正データ</label> 49<label><input type="checkbox" name="h[]" value="1"></label> 50<label><input type="checkbox" name="h[]" value="2"></label> 51<label><input type="checkbox" name="h[]" value="3"></label> 52<label><input type="checkbox" name="h[]" value="4"></label> 53<label><input type="checkbox" name="h[]" value="5"></label> 54<label><input type="checkbox" name="h[]" value="6"></label> 55<label><input type="checkbox" name="h[]" value="7"></label> 56<input type="submit" value="検索する"> 57</form>
  • or検索
  • 検索データがないときは全データを表示
  • 不正なデータが送られてきたときは表示しない

投稿2019/01/28 01:25

yambejp

総合スコア114583

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

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

nyanmaru

2019/02/10 00:44

反応が遅くなり申し訳ありません。参考にさせていただき、イメージに近いものを作ることができました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問