ch07 12章中 7章目

ch07 — fetch のモード

スライドで見る

この章を AI と学ぶ

💬 AI に聞く質問例 3 件
  1. 「ch07 — fetch のモード」のつまずきやすいポイントを、初学者向けに3つ教えてください

    ChatGPT Claude Gemini

  2. 「ch07 — fetch のモード」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    ChatGPT Claude Gemini

  3. 「ch07 — fetch のモード」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    ChatGPT Claude Gemini

概要

SELECT で取り出した結果セットの 読み出し方 には、目的別にいくつか手段がある。ここまでは fetchAll() だけ使ってきたが、PDO には用途別の関数があり、適切に選ぶとコードが短くなりメモリも節約できる。

主要な顔ぶれは 3 つ。fetchAll(PDO::FETCH_ASSOC)全行を連想配列の配列 で取る。fetch() は 1 回ごとに 1 行だけ 取り出すループ用で、while ($row = $stmt->fetch()) の形で何万件にも対応できる (全件をメモリに載せない)。fetchColumn() は最初の列の 単一値 を返す関数で、COUNT(*) などの集計や 1 項目取得にぴったり。

fetchAllFETCH モード には FETCH_ASSOC (連想配列) / FETCH_NUM (数値添字) / FETCH_OBJ (オブジェクト) などがあり、実務では FETCH_ASSOC 固定が多い。意識すべきは「件数が多いときは fetch でストリーミング」「単一値は fetchColumn」の使い分け。

学習目標

  • fetchAll(PDO::FETCH_ASSOC) で全件を 連想配列の配列 で取れる
  • fetch() で 1 件ずつ取り出すループが書ける
  • fetchColumn()COUNT(*) などの 単一値 を取れる
  • FETCH モードを目的別に使い分けられる

ドリル

no 内容
01 fetchAll(PDO::FETCH_ASSOC) で全件取得して表示
02 fetchColumn で COUNT(*) の単一値を取得

解説スライド 全 7 枚

右の ボタン キー(またはスワイプ)で次のスライドに進めます。 下の「縦表示」を開くと全スライドを一気に読めます。

  1. fetch のモード

    Lesson 11 / Chapter 7

  2. 取り出し方は 3 種類ある

    関数 戻り値 用途
    fetchAll() 行の配列 全件まとめて欲しい
    fetch() 1 行 (なければ false) ループで 1 件ずつ処理
    fetchColumn() スカラ値 COUNT(*) など 1 値だけ欲しい
  3. 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 を付けると 連想配列だけ (数値キーが消えるのでメモリ節約)
  4. 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 よりメモリに優しい
  5. 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(*)'] みたいな冗長な書き方が要らない
  6. 使い分けの目安

    • 件数が少ない・全部まとめて返したいfetchAll(PDO::FETCH_ASSOC)
    • 大量データ・1 件ずつ処理して捨てるwhile ($row = $stmt->fetch(...))
    • 集計値が 1 つ欲しいfetchColumn()
  7. このチャプターでできるようになること

    fetchAll(PDO::FETCH_ASSOC) で全件を連想配列の配列として取れる ✅ fetch() を while で回して 1 件ずつ処理できる ✅ fetchColumn() で COUNT(*) のような単一値を取れる ✅ 目的に応じて 3 つを使い分けられる

    → ドリルへ

1 / 7
📜 スライドを全部一気に読む(縦表示)

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 つを使い分けられる

→ ドリルへ

この章で取り組む 演習問題の流れ (2ステップ)
  1. 01 ドリル 01 — fetchAll(PDO::FETCH_ASSOC) README.md starter.php answer.php
  2. 02 ドリル 02 — fetchColumn で COUNT(*) README.md starter.php answer.php

演習問題の詳細

この章の演習問題の内容を読めます。実際に手元で解くには教材リポジトリを clone してください。

ドリル 01 — fetchAll(PDO::FETCH_ASSOC)

問題

users テーブルを id 昇順で fetchAll(PDO::FETCH_ASSOC) で取得して、 各行を "{id}: {name}" 形式で出力してください。

初期データ:

1: 太郎
2: 花子
3: 次郎

期待される出力:

1: 太郎
2: 花子
3: 次郎

ヒント

  • $stmt = $pdo->query("SELECT id, name FROM users ORDER BY id");
  • $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
  • foreach ($rows as $row) で回す

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

ドリル 02 — fetchColumn で COUNT(*)

問題

users テーブルの 件数SELECT COUNT(*) FROM users で取得して、 "件数: {n}" の形式で出力してください。 取り出しには fetchColumn() を使うこと。

初期データは 4 件入っているので、出力は 4 になる。

期待される出力:

件数: 4

ヒント

  • $stmt = $pdo->query("SELECT COUNT(*) FROM users");
  • $count = $stmt->fetchColumn();
  • 集計の単一値は fetchAll より fetchColumn の方が短く書ける

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

演習問題(2問)

  1. ドリル 01 — fetchAll(PDO::FETCH_ASSOC)

    README.md starter.php answer.php

  2. ドリル 02 — fetchColumn で COUNT(*)

    README.md starter.php answer.php

サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリを clone してください。

完了にすると進捗に反映されます