採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

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 の方が短く書ける