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を渡す


