絞込み検索を行う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の内容が異なることが分かるはずです。



