「WHERE 1=1」は条件付きSQL文が書きやすくなる魔法の言葉
今回で10記事目の投稿になります。
最初は検索エンジンに少しでも多くインデックスしてもらいたく、頑張って記事を量産している段階です!
話は変わりまして、今回はMySQLの記事になります。
仕事でも趣味でもWEBサービスを開発している僕ですが、基本的にLAMP環境の構築が多いです。
LAMPとは、データベース連動型のWebアプリケーションを開発するのに人気の高いオープンソースソフトの組み合わせ。OSにLinux、WebサーバにApache、データベースにMySQL、プログラミングにPHPかPerlかPythonを用いたシステムのこと。
ユーザーから送られてきた命令を、PHPで受け取り、MySQLに接続してデータベースから情報を取っています。
今回取り上げたいのは、「ユーザーの命令によって変わるSQL文の処理」。
例えば、以下のような検索フォームがあったとします。
住民検索として、「都道府県」「名前」で、検索の絞込みが出来る検索フォームを作りたいとします。
この場合は、考えられる検索パターンは以下の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文が書きやすくなる魔法の言葉、でした。
ディスカッション
コメント一覧
まだ、コメントがありません