DBに登録してある個人情報を部分一致で検索できる機能の実装。
※HTMLとPHPの記述の組み合わせが汚いなー笑
今回のポイントは
・検索窓に入力したKWがそのまま保持される
・曖昧検索
です。
特に曖昧検索では「%」を入力すると全データ引っ張ってきてしまうので
エスケープ処理をしなければいけません。
※参考にさせていただいた方のURLは後ほど記載します。
select.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>名前検索機能</title>
</head>
<body>
<form action="" method="post">
<p>検索したい人の名前を入力してください</p>
<input type="search" name="search" placeholder="キーワードを入力" value="
<?php
if (!empty($_POST['search'])) {
echo $_POST['search'];
}
?>">
<input type="submit" name="submit" value="検索">
</form>
<?php
$db = 'mysql:host=hogehoge; dbname=hogehoge-hogehoge';
$user = 'hogehoge';
$password = 'xxxxxx';
$dbh = new PDO($db, $user, $password);
try {
if (!empty($_POST['search'])) {
?>
<?php
$dbh = new PDO($db, $user, $password);
$stm = $dbh->prepare("SELECT * FROM user WHERE name LIKE :user_name");
$stm->bindValue(":user_name", '%' . addcslashes($_POST['search'], '\_%') . '%');
$stm->execute();
if ($stm->rowCount()) {
?>
<table border='1'>
<tr>
<th>id</th>
<th>名前</th>
<th>身長</th>
<th>誕生日</th>
<th>趣味</th>
</tr>
<?php
foreach ($stm as $value) {
echo '<tr>';
echo '<td>' . $value['id'] . '</td>';
echo '<td>' . $value['name'] . '</td>';
echo '<td>' . $value['height'] . '</td>';
echo '<td>' . $value['birthday'] . '</td>';
echo '<td>' . $value['hobby'] . '</td>';
echo '<tr>';
}
} else {
echo '該当するユーザーがいません';
}
} else {
echo '文字を入力してください';
}
} catch (PDOException $e) {
echo 'エラーです!';
}
?>
</body>
</html>
この部分がエスケープ処理の該当箇所
select.php
$stm->bindValue(":user_name", '%' . addcslashes($_POST['search'], '\_%') . '%');