「WHERE 1=1」は条件付きSQL文が書きやすくなる魔法の言葉

2017年2月11日

今回で10記事目の投稿になります。

最初は検索エンジンに少しでも多くインデックスしてもらいたく、頑張って記事を量産している段階です!

 

話は変わりまして、今回はMySQLの記事になります。

仕事でも趣味でもWEBサービスを開発している僕ですが、基本的にLAMP環境の構築が多いです。

LAMPとは、データベース連動型のWebアプリケーションを開発するのに人気の高いオープンソースソフトの組み合わせ。OSにLinux、WebサーバにApache、データベースにMySQL、プログラミングにPHPかPerlかPythonを用いたシステムのこと。

IT用語辞典

 

ユーザーから送られてきた命令を、PHPで受け取り、MySQLに接続してデータベースから情報を取っています。

今回取り上げたいのは、「ユーザーの命令によって変わるSQL文の処理」

例えば、以下のような検索フォームがあったとします。

1

住民検索として、「都道府県」「名前」で、検索の絞込みが出来る検索フォームを作りたいとします。

この場合は、考えられる検索パターンは以下の4種類です。

  • 都道府県の指定なし、名前の入力なし(全件検索)
  • 都道府県を指定、名前の入力なし
  • 都道府県の指定なし、名前の入力
  • 都道府県を指定、名前の入力

なので、ユーザーの入力内容を判断し、SQL文を発行しなければいけないのですが、

ここで厄介になってくるのは、SQL文の検索条件指定の仕様なのです。

SQL文の条件指定は、書き出しは「WHERE」、2つ目以降は「AND」にしなくてはいけない

SQL文において、取得するデータの条件の設定は「WHERE句」で行います。

SELECT * 
FROM user 
WHERE user_area = '北海道'

そして、2つ以上の条件の指定を行いたい場合は、それ以降は書き出しを「AND」にしなくてはいけません。

SELECT * 
FROM user 
WHERE user_area = '北海道'
AND user_name LIKE '%田中%'

 

つまりは、ユーザーの入力内容によって、「WHEREだけでいいのか」「ANDも必要か」「WHEREもANDも必要ないのか」を判断しなくてはいけません。

これらの処理を、入力を受け取るPHPで判断するのは非常にめんどくさいです。

しかし、そんな面倒な条件分岐をなくす魔法の記述があります。

今回紹介する「WHERE 1=1」です。

 

WHERE 1=1 を使うことで、検索条件がすべて「AND」で繋げられる

「WHERE 1=1」とは必ず正であるという意味です。

何があっても通りますので、1=1自体に意味はないのですが、

大事なのは、「この記述でWHERE句を確定させられる」ことです。

「都道府県」「名前」で、もし検索をかけていれば「AND」で繋げて条件を指定すればOKです。

以下が、WHERE 1=1を使用した例です。(PDOクラスのオブジェクトの生成は省略します。)

//POSTで検索条件を受け取る
$area = $_POST['area'];
$name = $_POST['name'];

$sql = 'SELECT * FROM user WHERE 1=1';
//都道府県の検索条件
if($area) $sql .= ' AND user_area = :user_area';
//名前の検索条件(あいまい検索)
if($name) $sql .= ' AND user_name LIKE :user_name';

$sth = $pdo -> prepare($sql);
//プリペアドステートメントを実行する(インジェクション対策)
if($area) $sth -> bindValue(':user_area', $area, PDO::PARAM_STR);
if($name) $sth -> bindValue(':user_name', '%'.$name.'%', PDO::PARAM_STR);
$sth -> execute($sql);

 

このように記述することで、WHERE句の有無の判定をわざわざすることなく、コードがすっきりします。

検索条件が複数存在し、かつそれがユーザーの命令により変化する場合は、こちらの記述方法がかなりオススメです。

ここの判定に苦労していた方は是非試してみてください!

以上、「WHERE 1=1」は条件付きSQL文が書きやすくなる魔法の言葉、でした。