SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

プログラミング未経験から始めるPHP入門

ECサイトの商品一覧画面を作成しよう!
プログラミング未経験から始めるPHP入門~応用編(2)

第9回


ダウンロード サンプルソース (4.8 KB)

絞込み検索に対応する(設計)

 それでは、次は画面左側の「商品検索」エリアの開発に取り掛かります。「商品名」および「カテゴリ」での絞込み条件を追加しましょう。まずは設計です。絞込み検索に対応した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行目などに

変数$sqlの中身を画面に表示するprint文
print($sql);

 と記述して、ファイル名をitem_list.phpに変更後保存し、商品一覧画面で実際に検索してみましょう。図2のように、検索結果の画面右上に変数$sqlの中身が表示されます。

図2:検索結果の画面右上に$sqlの中身が表示されます
図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文の条件に合致した場合、

m_itemsテーブル内で、del_flagが0のものを表示
SELECT * FROM m_items WHERE del_flag = '0'

 というSQLに商品名での絞込みが追加され、

m_itemsテーブル内で、del_flagが0のもの、かつ入力値に一致する部分があるものを表示
SELECT * FROM m_items WHERE del_flag = '0' AND item_name LIKE '%<入力値>%'

 のようなSQLが実行されることになります。

 C:\xampp\htdocs\ec\item_list.phpに上書き保存し、動作を確認してみましょう。

まとめ

 今回は、商品一覧ページの実装を行いました。解読にかなりの労力を要した方も多いかと思います。

 今回のような検索機能は、実際のサイトでも頻繁に見かけるので、一度経験しておくと同種のサイトの実装が今後、非常に楽にできるはずです。プログラム内部では、考えるべき例外ケースも意外と多いことに注意しましょう。今回新たに学習した技術要素は以下となります。

今回の新たに覚えたこと
  • あるカラムにいずれかの値が入っているかを確認するために、SQLのINキーワードを使うことができる。
  • ループで囲まれた部分にHTMLを直接記述することで、そのHTMLをループの回数だけ、画面に表示できる。
修正履歴

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
プログラミング未経験から始めるPHP入門連載記事一覧

もっと読む

この記事の著者

大家 正登(オオイエ マサト)

デジタルハリウッド『PHP 講座』講師。学生時代、スペイン語を専攻していたものの何故かプログラム言語に心が傾き、近所のフリープログラマーに弟子入り修行。その後中堅 SIer に 3 年間所属し、現在はフリーエンジニア。仕事の傍らジャズを演奏し、コントラバス 2 台と同居中。(ITエンジニア・大家正登のWeb...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3982 2010/02/08 19:49

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー