はじめてのHP
| 無料素材
| タグ辞典
| CSSガイドEX
| PHPを学ぼう!
◆Answer! - DB練習問題4の答え
【解答】
【sample_search.php】
01|<html lang="ja">
02|<head>
03|<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
04|<title>DB練習問題4のサンプルプログラムです。</title>
05|</head>
06|<body>
07|<?php
08| //actionのページ指定
09| $self_page = "./sample_search.php";
10|
11| //POSTの処理
12| $word =
13| isset($_REQUEST['word']) ? htmlspecialchars($_REQUEST['word']) : "";
14| $submit = isset($_REQUEST['submit']) ? $_REQUEST['submit'] : "";
15| $search_task =
16| isset($_REQUEST['search_task']) ? $_REQUEST['search_task'] : "";
17|
18| //データベースに接続する
19| try{
20|   $db = new PDO("sqlite:data/ejdict.sqlite3");
21|   $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
22| }catch(PDOException $e){
23|   echo "データベースにアクセスできません".$e->getMessage();
24|   exit;
25| }
26|?>
27|<form action="<?=$self_page;?>" method="POST" name="serach"
28| style="margin:0 0 0 20px; font-size:9pt">
29|<input type="text" name="word" value="" maxlength="16" size="20">
30|<input type="submit" name="submit" value="検索する">
31|</form>
32|<?php
33| if($submit == "検索する"){
34|   $mess="";
35|   $search_task = "off";
36|   if($word==""){
37|     $mess="*キーワードを入力してください。";
38|   }else{
39|     $search_task = "on";
40|     $mess=" ";
41|   }
42|   echo "<p style='font-size:11pt; color:red;'>".$mess."</p>\n";
43| }
44|
45| //データの表示
46| if($search_task == "on"){
47|   echo "<h3>【完全一致の検索結果】</h3>";
48|   $stmt = $db->prepare("SELECT * FROM items WHERE word LIKE ? LIMIT 20");
49|   $stmt->execute(array($word."%"));
50|   $i=0;
51|   foreach($stmt as $row){
52|     $word = htmlspecialchars($row["word"]);
53|     $mean = str_replace(" / ", "\n", $row["mean"]);
54|     $mean = nl2br(htmlspecialchars($mean));
55|     echo "<h4 style='margin:0; background:#eeeeee;'>$word</h4>\n";
56|     echo "<div style='margin:2px 6px 18px 6px;'>$mean</div>";
57|     $i++;
58|   }
59|   if($i<1){
60|     echo "<p style='margin:0 0 0 20px; font-cloro:red'>
61|     検索結果がありません。
62|     </p> ";
63|   }
64|
65|   //DBから切断する ( $db = null; も可能)
66|   unset( $db );
67| }
68|?>
69|</body>
70|</html>
48~49行の2行を少し改編するだけで曖昧(あいまい)検索ができるようになります。
48行目の "LIKE ?" 、LIKE 句を利用して曖昧検索を実現しています。
とはいっても何のヒントもなかったわけですから少し難しかったでしょう・・・
同じ行の "LIMIT" は検索する件数に制限をかけたものです。
例えば、"a" というキーワードで検索をすると膨大な数の検索結果を返すことになります。
その為、リミットを設けているのです。
49行目の
$stmt->execute(array($word."%"));
"$word" の後に "%" がついてます。
これはワイルドカードの様なもので以下の文字が利用できます。
文 字 | 意 味 |
% | 0文字以上の任意の文字列 |
_ | 任意の文字列 |
例えば、「book」を検索すると以下のクエリを実行することになります。
SELECT * FROM items WHERE word LIKE 'book%' LIMIT 20");
このクエリで前方一致で昇順で検索されるこになります。
例えばクエリを
SELECT * FROM items WHERE word LIKE '%book' LIMIT 20");
とすると後方一致検索になり、
SELECT * FROM items WHERE word LIKE '%book%' LIMIT 20");
とすると前方後方一致検索になります。
この曖昧検索(前方一致)の動作確認がサンプルページ で行えます。
|