「MySQLであいまい検索パターンマッチの仕方(Like句の使い)初級編」の編集履歴(バックアップ)一覧はこちら
追加された行は緑色になります。
削除された行は赤色になります。
データベースの特定のカラムに挿入されたフィールドデータのあいまい検索について考えていきます。9月25日記事
~
~
目次
#contents
~
~
----
~
*テーブル構造
テーブル構造は以下のものと仮定します。
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>
~
~
*まとめ
まずは簡単な検索の仕組みについて考えていきました。しかし、この方法はスペースを開けたりする検索はできません。
その場合は全文検索などの処理が必要になってきます。それは後日記述していきます。
~
~
以上
データベースの特定のカラムに挿入されたフィールドデータのあいまい検索について考えていきます。9月25日記事
~
~
目次
#contents
~
~
----
~
*テーブル構造
テーブル構造は以下のものと仮定します。
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]]で記述していきたいと思います。
~
~
以上