Developer

【PHP応用】PDO⑧ SELECT文(サンプルプログラム)
2021.08.31
Lv1

【PHP応用】PDO⑧ SELECT文(サンプルプログラム)

PDO⑧ SELECT文

今回は検索機能のサンプルを作成してみます。

■仕様

  • IDによる検索ができるシステム
  • フォームにIDを入力し検索ボタンを押すと、検索結果が表示される
  • 検索結果がなかった場合は「検索結果はありません」と表示

■プログラム

search.php

<?php
    if (isset($_GET['id'])) {
        try {
    
            // 接続処理
            $dsn = 'mysql:host=localhost;dbname=sample_db';
            $user = 'root';
            $password = '';
            $dbh = new PDO($dsn, $user, $password);
    
            // SELECT文を発行
            $sql = "SELECT * FROM members WHERE id = :id";
            $stmt = $dbh->prepare($sql);
            $stmt->bindValue(':id', $_GET['id'], PDO::PARAM_INT);
            $stmt->execute();
            $member = $stmt->fetch(PDO::FETCH_OBJ); // 全てのレコードを取得
    
            // 接続切断
            $dbh = null;
    
        } catch (PDOException $e) {
            print $e->getMessage() . "<br/>";
            die();
        }

    }
?>


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>PDO SELECT文</title>
</head>
<body>
    <form action="" method="GET">
        <div>検索したいIDを入力してください</div>
        <div>
            <input type="text" name="id" size="3" value="<?php isset($_GET['id']) ? print($_GET['id']) : print("") ?>"/>
            <button type="submit">検索</button>
        </div>
    </form>

<?php if (isset($_GET['id'])) { 
    if ($member) {
?>
    <hr>
    <strong>検索結果</strong>
    <table>
        <tr>
            <th>ID : </th>
            <td><?php print($member->id) ?></td>
        </tr>
        <tr>
            <th>名前 : </th>
            <td><?php print($member->name) ?></td>
        </tr>
        <tr>
            <th>年齢 : </th>
            <td><?php print($member->age) ?></td>
        </tr>
        <tr>
            <th>住所 : </th>
            <td><?php print($member->address) ?></td>
        </tr>
    </table>
<?php
    } else {
?>
    <hr>
    <div>検索結果はありません</div>
<?php
    }
?>
<?php
}
?>
</body>
</html>

■解説

まずポイントは16行目です。

$member = $stmt->fetch(PDO::FETCH_OBJ); // 全てのレコードを取得

IDによる検索のため、検索結果は0または1件です。したがってfetchAllではなくfetchを使用しています。
また、引数にPDO::FETCH_OBJを渡し、結果セットをオブジェクトとして取得しています。

続いて53、57、61、65行目。

<td><?php print($member->id) ?></td>
<td><?php print($member->name) ?></td>
<td><?php print($member->age) ?></td>
<td><?php print($member->age) ?></td>

結果セットをオブジェクトとして取得したため、->(アロー演算子)を使用してプロパティを取得しています。

また46行目ではif文の条件に$memberを指定しています。

if ($member)

検索結果がない場合はfalseとなり、72行目の検索結果はありませんと出力されます。

■まとめ

  • 結果セットが2件以上にならない場合はfetchメソッドを使用
  • 結果セットが2件以上になる可能性がある場合はfetchAllメソッドを使用
  • 結果セットをオブジェクトとして取得したい場合は、それぞれのメソッドの引数にPDO::FETCH_OBJを渡す