formタグを使った検索機能ーPHP
データベースに保存されているものをformタグを使用して検索する方法。
inputタグに入力された文字列を指定しているテーブルのカラムに対して検索をかけ、一致するものを表示させる。
今回は部分一致での検索。
例)
・田中
・佐藤
・鈴木
・木村
「木」という文字列を検索したときの結果は
「鈴木」「木村」が結果として返ってくる。
その他前方一致、後方一致、完全一致に関しては下記記事参考
https://alunote.hatenablog.com/entry/2018/09/12/143652
通常部分一致をの検索をかける際は下記の書き方で実行できる。
$search = $_GET['search'];
$sql = "SELECT * FROM users WHERE name LIKE '%$search%'";
この場合、「%」を入れて検索した場合、全件取得される。
文字列として「%」を含むものを検索できなくなってしまっている・
「%」も文字として検索するためにエスケープする必要がある。
select.php
<?php
$dbh = new PDO('mysql:host=localhost; dbname=xxxxxx; charset=utf8;', 'xxxxxx', 'xxxxxx');
$search = addslashes($_GET['search']);
//検索された文字列の前にバックスラッシュを入れてエスケープする
$sql = "SELECT * FROM 'テーブル名' WHERE 'カラム名' LIKE :search";
$stmt = $dbh->prepare($sql);
$stmt->bindValue(':search', '%' . addcslashes($search, '\_%') . '%', PDO::PARAM_STR);
//addcslashesの第二引数にエスケープの対象となる(バックスラッシュを入れる)文字列を入れる
$stmt->execute();
?>
addslashes関数
エスケープすべき文字の前にバックスラッシュを付けて返します。 エスケープすべき文字とは、シングルクォート('), ダブルクォート("),バックスラッシュ () ,NUL (NULL バイト) です。
addcslashes関数
第一引数にエスケープしたい文字列、第二引数にエスケープの対象となる文字列を入れる。
この方法で例えばデータベースに「%」や「_」を含むデータがあったとしても文字列を認識して検索することができる。