データベースの特定のカラムに挿入されたフィールドデータのあいまい検索について考えていきます。9月25日記事

目次





テーブル構造

テーブル構造は以下のものと仮定します。

mysql> desc information;
+-----------+--------------+------+-----+------------+----------------+
| Field     | Type         | Null | Key | Default    | Extra          |
+-----------+--------------+------+-----+------------+----------------+
| id        | int(11)      | NO   | PRI | NULL       | auto_increment |
| info_date | date         | NO   | MUL | 0000-00-00 |                |
| title     | varchar(255) | NO   |     | NULL       |                |
| comment   | text         | NO   |     | NULL       |                |
| url       | varchar(255) | NO   |     | NULL       |                |
+-----------+--------------+------+-----+------------+----------------+



同一の語句を検索する方法

SQL文

SELECT * FROM information WHERE comment = 'キーワード';

PDOのクエリ

PDOの場合は以下です。

$keyword = $_POST["keyword"];
SELECT * FROM information WHERE comment = :keyword;

この方法であると、commentにキーワードという文字が全文一致でなければ検索できません。

あいまいな語句を検索する方法

SQL文

あいまい検索の場合LIKE句を使い、%で語句を挟みます。「%をいれると任意の0文字以上の文字列」、「_を入れると任意の1文字以上の文字列」が検索対象になります。

SELECT * FROM information WHERE comment LIKE '%キーワード%';



PDOのクエリ

PDOで処理する際には先に変数に%ではさんだものを入れておき、それを挿入していきます。

$keyword = $_POST["keyword"];
$keyword = '%'.$keyword.'%';// %ではさむところがポイント
SELECT * FROM information WHERE comment LIKE :keyword;


コード

検索ページ

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>検索ページ</title>
</head> 
<body>
<form action="result.php" method="post">
	<label for="search">検索</label>
    <input type="search" name="keyword">
    <input type="submit" name="submit" value="検索">	
</form>
</body>
</html>



結果ページ

※configファイルの状況についてはphpのconfigファイルをご参照ください。

<?php
require ('config.php');

$dsn = 'mysql:dbname='.DB_NAME.';host='.DB_HOST.';port='.DB_PORT.'';
$user = DB_USER;
$password = DB_PASSWORD;
$keyword = $_POST["keyword"];
 

try{
	$dbh = new PDO($dsn, $user, $password); 
}catch(PDOException $e){
	print 'Connection failed:'.$e->getMessage();
	die();
}
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title><?php echo htmlspecialchars($_POST["keyword"],ENT_QUOTES,'UTF-8')."の検索結果";?></title>
</head>
<body>
<?php

$keyword = '%'.$keyword.'%';// %ではさむところがポイント
$stmt = $dbh->prepare("SELECT * FROM information WHERE title LIKE :keyword");
//二つのカラムを同時に検索したい場合は以下
//$stmt = $dbh->prepare("SELECT * FROM information WHERE title LIKE :keyword OR comment LIKE :keyword");
$stmt->bindParam( ':keyword' ,$keyword, PDO::PARAM_STR);
$stmt->execute();

while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
        print '<p>'.htmlspecialchars($result['title'],ENT_QUOTES,'UTF-8').'</p>';
        print '<p>'.htmlspecialchars($result['comment'],ENT_QUOTES,'UTF-8').'<br></p>';
}


?>
</body>
</html>



まとめ

まずは簡単な検索の仕組みについて考えていきました。しかし、この方法はスペースを開けたりする検索はできません。 その場合は全文検索などの処理が必要になってきます。MySQLで全文検索FULLTEXTインデックス編1で記述していきたいと思います。

以上

最終更新:2015年09月26日 10:57