2021.08.31
【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 } } ?> </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を渡す