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

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

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

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

PHP

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

Q&A

解決済

2回答

5477閲覧

様々な検索条件に対応するプリペアドステートメント

jk233

総合スコア55

MySQL

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

PHP

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

0グッド

0クリップ

投稿2016/10/27 04:57

分類と色を検索条件とする場合は以下のコード

PHP

1$stmt = $pdo->prepare("SELECT * FROM table WHERE 分類=? AND 色=?");

色だけを検索条件とする場合は以下のコード

PHP

1$stmt = $pdo->prepare("SELECT * FROM table WHERE 色=?");

分類だけを検索条件とする場合は以下のコード

PHP

1$stmt = $pdo->prepare("SELECT * FROM table WHERE 分類=?");

といった具合に、複数のプリペアドステートメントを用意しています。

いまは分類と色という2つの検索条件しかありませんが、今後もっと増えていくことを考えると、
(2^検索条件数-1)個のプリペアドステートメントを用意しないといけなくなります。

それでは管理が大変になるのでナントカしたいです。
どのようにするのが良いでしょうか。

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

何かの雑誌に、以下のようなテクニックが紹介されていました。


例えば
「バインドするパラメータが NULL であれば、検索条件に含めない」
ことが決まっているなら、以下のようなSQL文を用意します。

php

1$stmt = $pdo->prepare(' 2 SELECT * FROM table 3 WHERE (`分類` = :category OR :category IS NULL) 4 AND (`色` = :coler OR :coler IS NULL) 5'); 6 7// PDO::PARAM_INT 部分は、実際の型に合わせる 8$stmt->bindValue(':category', $category, is_null($category) ? PDO::PARAM_NULL : PDO::PARAM_INT); 9$stmt->bindValue(':coler', $coler, is_null($coler) ? PDO::PARAM_NULL : PDO::PARAM_INT);

こうしておけば、例えば$category = nullの場合、パラメータをバインドした後のSQL文は

sql

1SELECT * FROM table 2WHERE (`分類` = NULL OR NULL IS NULL) 3 AND (`` = ? OR ? IS NULL)

となり、実質、'分類'カラムに対する検索条件を指定しなかったことと同じ意味になります。


一応、私が手元の環境 (CentOS6.5, MySQL5.6) で簡単に検証した限りでは、インデックスも正常に使用できました(※)が、これに関しては、必ずご自分の環境で確かめてみてください。

※おそらく、OR ? IS NULLという条件には「定数条件の削除」という最適化が働くためと推測します

投稿2016/10/27 06:23

KiyoshiMotoki

総合スコア4791

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

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

jk233

2016/10/27 23:49

ありがとうございます。 SQL文全体が把握しやすいのでこの方法でやってみようと思います。 性能に影響でないか確認しつつやってみます。
guest

0

条件は随時足していけばよいでしょう

PHP

1<?PHP 2$sql="SELECT * FROM table WHERE 1 "; 3$data=[]; 4if(!is_null($category)){ 5 $sql.="AND 分類=? "; 6 $data[]=$category; 7} 8if(!is_null($color)){ 9 $sql.="AND 色=? "; 10 $data[]=$color; 11} 12$stmt = $pdo->prepare($sql); 13$stmt->execute($data);

投稿2016/10/27 05:24

編集2016/10/27 05:25
yambejp

総合スコア114583

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

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

jk233

2016/10/27 23:52

ありがとうございます。 教えていただいた方法は正統派な気がしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問