絞込み検索を行うSELECT文の実行
次に、http://localhost/codezine7/search2.phpにアクセスしてみてください。こちらのプログラムでは、実際に絞込み検索機能を実装してあります。まずは、エリアや予算で絞込み検索を行ってみましょう。
設定した絞込み条件に一致している検索結果が表示されたら、「search2.php」をメモ帳などで開き、「search1.php」との違いを確認してみてください。「search2.php」の$sql
変数を作る箇所が、「search1.php」と大分違うことに気付くはずです。
絞込み検索は、テキストボックスの入力値を基にSQLのWHERE
条件を追加することで実現します。テキストボックスの入力値は第5回で説明したとおり、$_REQUEST
という特殊な連想配列に入ります。
例えば、49行目にある下記のソース部分を見てください。
if( $_REQUEST["address"] != "" ) { $sql = $sql . " AND address = '" . $_REQUEST["address"] . "'"; }
$_REQUEST[“address”]
に、ブラウザ画面上の「エリア」セレクトボックスで選択された値がに入ります。また、セレクトボックスで[全て]が選択された場合は、13行目にある <option value="">全て</option>
を見れば分かるように、「value=””
」の部分が空のため、$_REQUEST[“address”]
に何も値が入りません。
したがって前述の49行目の部分では、これを利用して「もしも$_REQUEST[“address”]
が空でなければ、AND address = ‘選択された地域’
という絞込み条件を追加する」ということを行っています。ここでもドット記号(.
)が登場していますが、これは既存の$sql
という変数に対して「AND address = ‘xxx’
」という条件を付加し、変数の内容を上書き保存していると考えてください。
また、WHERE 1 = 1
の部分ですが、1と1は必ず等しいですから、この条件は絞込みには生かされず、一見無意味なように思えます。実はこの条件は、プログラムを効率良く書くためにあえて記述しています。このアプリケーション上で可能な検索パターンを考えてみてください。
・絞込み条件無しの場合( WHERE 条件無し ) ・エリアによる絞込みのみ ( WHERE エリア条件 ) ・最低価格による絞込みのみ( WHERE 最低価格条件 ) ・エリア及び最低価格による絞込み( WHERE エリア条件 AND 最低価格条件) ・最低価格及び最高価格による絞込み ( WHERE 最低価格条件 AND 最高価格条件 ) … 以下、様々な組み合わせが存在する
例えば最低価格条件1つを見ても、「WHERE 最低価格条件
」となる場合もあれば「AND 最低価格条件
」となることもあり、WHERE
とAND
を使い分けるには煩雑な書き方になりそうです。
サンプルソースのsearch3.phpはWHERE 1 = 1
を使わずに記述したPHPの例です。$is_where_exists
という変数は初期値が0で、初めて検索条件が現れた時に1になります。$is_where_exists
が0か1かをif
文で判定し、WHERE
またはAND
のいずれかを選択する処理を記述しています。逆に、WHERE 1 = 1
というダミーの検索条件をあらかじめ設定しておけば、絞込み検索をするための条件を指定するときに「WHERE
の直後を書き換えずに、全てAND
以降に追加すれば良い」ということになります。
・絞込み条件無しの場合( WHERE 1 = 1 ) ・エリアによる絞込みのみ( WHERE 1 = 1 AND エリア条件 ) ・最低価格による絞込みのみ( WHERE 1 = 1 AND 最低価格条件) ・エリア及び最低価格による絞込み( WHERE 1 = 1 AND エリア条件 AND 最低価格条件) ・最低価格及び最高価格による絞込み( WHERE 1 = 1 AND 最低価格条件 AND 最高価格条件 ) … 検索条件により、SQLのAND以降が変わる
このように、変数$sql
にWHERE 1 = 1
をあらかじめ設定しておくことで、条件を追加する際はAND
以降を付加すれば、思いどおりの検索結果が表示されます。
それでは、$sql
がどのように組み立てられているかを見るために、mysql_query
命令を実行する直前、例えば60行目に下記の命令を追加して、再度画面で検索してみましょう。
print($sql);
エリアや平均予算の検索項目が、設定されている場合と設定されていない場合とで$sql
の内容が異なることが分かるはずです。