fetch のモード
テクノロジ系 / db (PDO / SQL / マルチDB)
fetch のモード
Lesson 11 / Chapter 7
取り出し方は 3 種類ある
| 関数 | 戻り値 | 用途 |
|---|---|---|
fetchAll() | 行の配列 | 全件まとめて欲しい |
fetch() | 1 行 (なければ false) | ループで 1 件ずつ処理 |
fetchColumn() | スカラ値 | COUNT(*) など 1 値だけ欲しい |
fetchAll(PDO::FETCH_ASSOC) — 全件・連想配列
<?php
$stmt = $pdo->query("SELECT id, name FROM users ORDER BY id");
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $row) {
echo "{$row['id']}: {$row['name']}\n";
}- 戻り値は
[['id' => 1, 'name' => '太郎'], ...] FETCH_ASSOCを付けると 連想配列だけ (数値キーが消えるのでメモリ節約)
fetch() — 1 件ずつループ
<?php
$stmt = $pdo->query("SELECT id, name FROM users ORDER BY id");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "{$row['id']}: {$row['name']}\n";
}- 1 行ずつ返す。なくなったら
false whileで回すパターンが定番- 件数が多いとき
fetchAllよりメモリに優しい
fetchColumn() — 1 つの値だけ欲しい
<?php
$stmt = $pdo->query("SELECT COUNT(*) FROM users");
$count = $stmt->fetchColumn();
echo "件数: {$count}\n";- 1 行目の 1 列目だけ を取る
COUNT(*)・MAX(age)・SUM(price)のような集計に最適- 連想配列を経由しないので
$rows[0]['COUNT(*)']みたいな冗長な書き方が要らない
使い分けの目安
- 件数が少ない・全部まとめて返したい →
fetchAll(PDO::FETCH_ASSOC) - 大量データ・1 件ずつ処理して捨てる →
while ($row = $stmt->fetch(...)) - 集計値が 1 つ欲しい →
fetchColumn()
このチャプターでできるようになること
✅ fetchAll(PDO::FETCH_ASSOC) で全件を連想配列の配列として取れる
✅ fetch() を while で回して 1 件ずつ処理できる
✅ fetchColumn() で COUNT(*) のような単一値を取れる
✅ 目的に応じて 3 つを使い分けられる
→ ドリルへ
考えてみよう
既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。
ドリル 01 — fetchAll(PDO::FETCH_ASSOC)
問題
users テーブルを id 昇順で fetchAll(PDO::FETCH_ASSOC) で取得して、
各行を "{id}: {name}" 形式で出力してください。
初期データ:
1: 太郎 2: 花子 3: 次郎
期待される出力:
1: 太郎 2: 花子 3: 次郎
採点
php scripts/grade.php topics/db/ch07-fetch-modes/drill/01-fetch-assoc/
ヒント
$stmt = $pdo->query("SELECT id, name FROM users ORDER BY id");$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);foreach ($rows as $row)で回す
ドリル 02 — fetchColumn で COUNT(*)
問題
users テーブルの 件数 を SELECT COUNT(*) FROM users で取得して、
"件数: {n}" の形式で出力してください。
取り出しには fetchColumn() を使うこと。
初期データは 4 件入っているので、出力は 4 になる。
期待される出力:
件数: 4
採点
php scripts/grade.php topics/db/ch07-fetch-modes/drill/02-fetch-column/
ヒント
$stmt = $pdo->query("SELECT COUNT(*) FROM users");$count = $stmt->fetchColumn();- 集計の単一値は fetchAll より fetchColumn の方が短く書ける