絞込み検索に対応する(設計)
それでは、次は画面左側の「商品検索」エリアの開発に取り掛かります。「商品名」および「カテゴリ」での絞込み条件を追加しましょう。まずは設計です。絞込み検索に対応したSQL文を考えてみてください。
「商品名」および「カテゴリ」の組み合わせのバリエーションは、次のようになります。
SELECT * FROM m_items WHERE del_flag = '0'
SELECT * FROM m_items WHERE del_flag = '0' AND item_name LIKE '%YAMAHA%'
SELECT * FROM m_items WHERE del_flag = '0' AND category IN ('1', '3');
SELECT * FROM m_items WHERE del_flag = '0' AND item_name LIKE '%YAMAHA%'
AND category IN ('1', '3');
上記の「category IN (1,3)」の部分は、
category = '1' OR category = '3'
と同じ意味となります。今回はプログラムの記述の効率を考え、INを使った書き方で実装します。
それでは、上記の検索方法の全パターンをPHPで実現するためにはどのようにしたらよいか考えてみましょう。
実現方法は、例えば次のようになります。条件分岐を使用し、検索エリアの入力状態に応じて適宜、SQLの条件を追記していけば実現できそうです。
- 処理1)「商品名」テキストボックスに、何か文字が入力されているかを判断する。
- 処理2)もし入力されていれば、
item_nameカラムで絞り込む条件を付加する。 - 処理3)「管楽器」「弦楽器」「打楽器」のチェックボックスのいずれかに、チェックが入っているかを判断する。
- 処理4)もし1つでもチェックされていれば、SQLの条件に
categoryカラムで絞込む条件を付加する。
テキストボックスやチェックボックスの入力値は、$_REQUESTという特殊な変数に格納されていることを思い出してください。
絞込み検索に対応する(実装)
それでは、PHPプログラムの条件分岐をうまく利用し、上記の全パターンに対応できるように、絞込み検索を実装してみましょう。
まず、item_list_ver2.phpを開いてください。このプログラムは「管楽器」「弦楽器」「打楽器」での絞込み条件には対応していますが、「商品名」での絞込みには対応していない状態です。
40行目の「以下、商品名で絞込み検索を行うために、SQL文に条件を追加しましょう。」と書かれている箇所に、商品名での絞込み処理を記述してみてください。
もし、実行しているSQLの中身を見たい場合は、item_list_ver2.phpの63行目などに
print($sql);
と記述して、ファイル名をitem_list.phpに変更後保存し、商品一覧画面で実際に検索してみましょう。図2のように、検索結果の画面右上に変数$sqlの中身が表示されます。
うまく動作しましたか? それでは、解答です。item_list_ver2.phpの39行目に、以下のプログラムを追記してください。
if( $_REQUEST["item_name"] != "" )
{
$sql = $sql . " AND item_name LIKE '%" . $_REQUEST["item_name"] . "%' ";
}
商品名のテキストボックスはHTMLの
<input type="text" name="item_name" class="text" value="<?php print($_REQUEST["item_name"])?>"/>
の部分を見れば分かるとおり、「item_name」という名前が付いているので、$_REQUEST["item_name"]という変数にその入力値が格納されています。従って、上記のif文は、「もしitem_name(商品名)テキストボックスが未入力でなければ」という意味です。
このif文の条件に合致した場合、
SELECT * FROM m_items WHERE del_flag = '0'
というSQLに商品名での絞込みが追加され、
SELECT * FROM m_items WHERE del_flag = '0' AND item_name LIKE '%<入力値>%'
のようなSQLが実行されることになります。
C:\xampp\htdocs\ec\item_list.phpに上書き保存し、動作を確認してみましょう。
まとめ
今回は、商品一覧ページの実装を行いました。解読にかなりの労力を要した方も多いかと思います。
今回のような検索機能は、実際のサイトでも頻繁に見かけるので、一度経験しておくと同種のサイトの実装が今後、非常に楽にできるはずです。プログラム内部では、考えるべき例外ケースも意外と多いことに注意しましょう。今回新たに学習した技術要素は以下となります。
- あるカラムにいずれかの値が入っているかを確認するために、SQLの
INキーワードを使うことができる。 - ループで囲まれた部分にHTMLを直接記述することで、そのHTMLをループの回数だけ、画面に表示できる。

