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形式で返します。
<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
のラッパーです。
/**
* 特殊文字を HTML エンティティに変換する。
* htmlspecialcharsのラッパー関数
*
* @param $str ハイライト変換対象文字列
* @return 変換後の文字列
*/ function h($str) { return htmlspecialchars($str); }
また、to_highlight_keyword
という関数は独自に作成したもので、検索結果をハイライト表示するための関数です。
検索キーワードにマッチした部分を<strong>
タグで囲む処理を担当します。
/**
* キーワードにマッチした部分をハイライト表示できる形式で返します。
*
* @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のインストールと設定については、PHP5.2.5インストール方法 on CentOS5.1 を参考にして下さい。
http://jp2.php.net/[関数名]というURLで関数リファレンスのページへアクセスすることができます。
下記は、今回使用した関数へのリンクです。