9
6

More than 3 years have passed since last update.

PHP掲示板に検索機能の実装

Last updated at Posted at 2020-08-24

PHPで作成した掲示板に、検索機能を実装したので振り返りつつ。

参考にした記事はこちら

具体的な機能は、
名前を検索すると、それに紐づいたIDと発言内容を表示する
という形。

トップページに検索内容の入力フォーム→別ファイル検索機能(search.php)の作成
で行った。

検索内容の入力フォームの作成

TOPページにこんな感じで作成した。
実際に機能が動くのはsearch.php
ここでは入力フォームで文字を受け取り、search_nameという名前で受け取る。

index.php
<h2>検索</h2>
<form action="search.php" method="post">
    <!-- 任意の<input>要素=入力欄などを用意する -->
    <input type="text" name="search_name">
    <!-- 送信ボタンを用意する -->
    <input type="submit" name="submit" value="名前を検索する">
</form>

検索機能の作成

検索機能に関して、DB接続の前半部と、検索されてきた文字を表示する後半部に分けて説明。

DBから任意のデータを検索する前半部。

search.php
<?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接続に関しては割愛。
大事なのは

search.php
    $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で記述して画面に表示する。
コードはこんな感じになっている。

search.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で記述し、foreachstmtのオブジェクトから値を取り出しています。

  • $row[0]でIDを、
  • $row[1]で名前を、
  • $row[2]で投稿内容を

それぞれ表示します。

あとはテーブルの形になるようにtableタグが使われています。

以上です。

9
6
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6