SHOEISHA iD

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

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

特集記事

JavaScriptとPHPでつくるAjaxインクリメンタル検索

Ajaxとデータベースアプリケーション作成の基本

  • X ポスト
  • このエントリーをはてなブックマークに追加

PHPで検索処理を実装する

 ここからはPHPで検索処理を実装していきます。

検索キーワードを取得・加工する

 検索キーワードは複数指定することができ、半角スペース・全角スペース・カンマ(,)を区切り文字にする仕様とします。

検索キーワードを受け取ったあと分解する
$q = $_GET["q"];
//全角スペースを半角空白に置き換える
$q = mb_convert_kana($q, "s");
//半角スペースを半角空白に置き換える
$keywords = preg_split("'[\\s,]+'", $q, -1, PREG_SPLIT_NO_EMPTY);

 これで変数$keywordsにキーワードの配列が格納されます。

検索SQLを組み立てる

 検索キーワードを受け取ったあと、MySQLへの接続、SQL文の発行、MySQLの切断までを行います。

検索キーワードを受け取ったあと分解する
 //MySQL接続
 $connect = mysql_connect('localhost', 'dev', 'dev00');
 mysql_select_db( 'mydatabase', $connect );

 $kcnt = count($keywords); //キーワード数
 $query_w =  $kcnt > 0 ? ' where ' : '';
 for ($i=0; $i<count($keywords); $i++) {
   $keywords[$i] = mysql_real_escape_string($keywords[$i], 
                                                $connect);
   $query_w = $query_w . "name like '%" . $keywords[$i] . "%' ";
   if ($i < count($keywords) - 1) {
     $query_w .= "and ";
   }
 }
 $query = "select * from books" . $query_w;
 $result = mysql_query($query, $connect);
 $set = array();    //結果格納用
 $count = 0;        //全件数
 if ($result != FALSE) {
   while($row = mysql_fetch_assoc($result)) {
     array_push($set, $row);
     $count++;
   }
   mysql_free_result($result);
 }

 //MySQL切断
 mysql_close($connect);

 生成されるSQL文は、

ABC DEF

 とキーワードが指定された場合、

select * from books where name like '%ABC%' and name like '%DEF%'

 としています。

 キーワードが指定されていない場合は、

select * from books

 としています。

 これで、変数$setには検索結果が配列で、変数$countには検索された件数が格納されます。

検索結果をHTML形式で返す

 検索結果は、検索指示画面を構成するHTMLの一部として、HTML形式で返します。

検索結果をHTML形式に変換する
<hr />
<h2>Search Result (<?php print $count ?>)</h2>
<ol>
<?php
if (count($set) > 0) {
  foreach($set as $rec) {
    $name = to_highlight_keyword($keywords, h($rec["name"]));
?>
<li>
<?php print h($rec["isbn"]); ?> :
<a href="http://www.amazon.co.jp/dp/<?php print h($rec["isbn"]) ?>" 
  target="_blank">
<?php print $name; ?>(<?php print h($rec["publisher"]); ?>)
</a>
</li>
<?php
  }
} else {
?>
<li>No Data</li>
<?php
}
?>
</ol>

 ここで出てくるhという関数は独自に作成したもので、htmlspecialcharsのラッパーです。

h関数
/**
* 特殊文字を HTML エンティティに変換する。
* htmlspecialcharsのラッパー関数
*
* @param $str ハイライト変換対象文字列
* @return 変換後の文字列
*/
function h($str) { return htmlspecialchars($str); }

 また、to_highlight_keywordという関数は独自に作成したもので、検索結果をハイライト表示するための関数です。

 検索キーワードにマッチした部分を<strong>タグで囲む処理を担当します。

to_highlight_keyword関数
/**
* キーワードにマッチした部分をハイライト表示できる形式で返します。
*
* @param $arr キーワードが格納された配列
* @param $str ハイライト変換対象文字列
* @return ハイライト化(strongタグ)された文字列
*/
function to_highlight_keyword($arr, $str) { foreach ($arr as $val) { $val = preg_quote($val, '/'); $str = preg_replace_callback( "/<.*?>|($val)/i", create_function('$matches', 'return (substr($matches[0], 0, 1) == "<") ? ' . ' $matches[0] : "<strong>$matches[1]</strong>";'), $str ); } return $str; }

結果の確認

 ブラウザのアドレスバーに、

  • http://[servername]/search-ajax.php?p=web

 と入力して動作を確認してみて下さい。以下のような画面になれば検索処理は完成です。

検索処理の単体テスト結果
検索処理の単体テスト結果
PHPのインストールと設定
 このサンプルは、CentOS5.1上にインストールしたPHP 5.2.5で作成しています。
PHPのインストールと設定については、PHP5.2.5インストール方法 on CentOS5.1 を参考にして下さい。
PHPの関数を調べるには
 サンプルから関数の仕様を知るには、jp2.php.netの情報が便利です。
http://jp2.php.net/[関数名]というURLで関数リファレンスのページへアクセスすることができます。
下記は、今回使用した関数へのリンクです。

次のページ
JavaScriptでインクリメンタル検索を実装する

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

我妻 隆志(ワガツマ タカシ)

宮城県仙台市在住トライポッドワークス株式会社(本社:仙台市)に所属。JavaやPHP、データベースを利用したアプリケーション開発技術を生かし、製品開発・サポート業務に従事。

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2305 2010/11/01 16:26

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング