PHPで作成した掲示板に、検索機能を実装したので振り返りつつ。
参考にした記事はこちら。
具体的な機能は、
名前を検索すると、それに紐づいたIDと発言内容を表示する
という形。
トップページに検索内容の入力フォーム→別ファイル検索機能(search.php
)の作成
で行った。
#検索内容の入力フォームの作成
TOPページにこんな感じで作成した。
実際に機能が動くのはsearch.php
。
ここでは入力フォームで文字を受け取り、search_name
という名前で受け取る。
<h2>検索</h2>
<form action="search.php" method="post">
<!-- 任意の<input>要素=入力欄などを用意する -->
<input type="text" name="search_name">
<!-- 送信ボタンを用意する -->
<input type="submit" name="submit" value="名前を検索する">
</form>
#検索機能の作成
検索機能に関して、DB接続の前半部と、検索されてきた文字を表示する後半部に分けて説明。
##DBから任意のデータを検索する前半部。
<?php
try{
//DBに接続
$dsn = 'mysql:dbname=test_bbs2; host=localhost';
$username= 'root';
$password= 'root';
$pdo = new PDO($dsn, $username, $password);
//SQL文を実行して、結果を$stmtに代入する。
$stmt = $pdo->prepare(" SELECT * FROM contacts WHERE submit_name LIKE '%" . $_POST["search_name"] . "%' ");
//実行する
$stmt->execute();
echo "OK";
echo "<br>";
} catch(PDOException $e){
echo "失敗:" . $e->getMessage() . "\n";
exit();
}
?>
DB接続に関しては割愛。
大事なのは
$stmt = $pdo->prepare(" SELECT * FROM contacts WHERE submit_name LIKE '%" . $_POST["search_name"] . "%' ");
ここの部分。
SELECT * FROM contacts WHERE submit_name LIKE '%" . $_POST["search_name"] . "%'
ここのSQL文で
・contacts
テーブルから(FROM contacts)
・submit_name
の条件で(WHERE submit_name)
・$_POST["search_name"]
を含む値を取得する
$_POST["search_name"]
の前後の%や、LIKEがないと、
田中という名前があった時に、「田」一文字では田中をヒットできない。
「田中」という全部一致しないと検索されてこない、という状況が起こる。
%(ワイルドカード)の使い方の詳細については
こちらの記事を参考に。
LIKEによる検索はあいまい検索という。
#DBから取得したデータを画面に表示する後半部。
DBから取り出したデータを、HTMLとPHPで記述して画面に表示する。
コードはこんな感じになっている。
<html>
<body>
<table>
<tr><th>ID</th><th>Name</th><th>remark</th></tr>
<!-- ここでPHPのforeachを使って結果をループさせる -->
<?php foreach ($stmt as $row): ?>
<tr>
<td><?php echo $row[0]?></td>
<td><?php echo $row[1]?></td>
<td><?php echo $row[2]?></td>
</tr>
<?php endforeach; ?>
</table>
</body>
</html>
ここではhtmlで記述し、foreach
でstmt
のオブジェクトから値を取り出しています。
-
$row[0]
でIDを、 -
$row[1]
で名前を、 -
$row[2]
で投稿内容を
それぞれ表示します。
あとはテーブルの形になるようにtableタグが使われています。
以上です。