ch06 12章中 6章目

ch06 — UPDATE と DELETE

スライドで見る

この章を AI と学ぶ

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

    ChatGPT Claude Gemini

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

    ChatGPT Claude Gemini

  3. 「ch06 — UPDATE と DELETE」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    ChatGPT Claude Gemini

概要

既存行の 書き換え削除 を担うのが UPDATEDELETE。書き換えは UPDATE users SET age = ? WHERE id = ?、削除は DELETE FROM users WHERE id = ? で、SET で更新内容、WHERE で対象範囲を指定。値の埋め込みは prepare + execute の組み合わせ。

実行後の 結果確認fetchAll() ではなく $stmt->rowCount() で「影響を受けた行数」を取る。1 なら期待通り 1 件更新、0 なら該当行が無くて何も変わっていない、と判断できる。「該当行が無ければ 404 を返す」「複数行更新が起きたら警告ログ」などの分岐に使う。

このトピックで最重要の警告が 「WHERE を忘れると全行が対象になる」 こと。UPDATE users SET age = 0 は全ユーザーの年齢を 0 にする破壊的な文、DELETE FROM users はテーブルを空にする。SQL を書くときは「WHERE を書いたか?」を必ず指差し確認するクセを付ける。怖ければ、本番では先に同じ WHERE で SELECT して件数を確認してから実行するのが定石。

学習目標

  • UPDATE ... SET ... WHERE ... で既存行を書き換えられる
  • DELETE FROM ... WHERE ... で行を消せる
  • rowCount() で影響を受けた行数を取れる
  • WHERE を忘れると 全行が対象 になる怖さを理解する

ドリル

no 内容
01 WHERE で 1 件 UPDATE → SELECT で結果確認
02 DELETE 後に rowCount を出力 + 残った行を確認

解説スライド 全 7 枚

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

  1. UPDATE と DELETE

    Lesson 11 / Chapter 6

  2. UPDATE は「書き換える」

    UPDATE users SET age = 26 WHERE name = '花子';
    • SET 列 = 値 で書き換える列を指定
    • WHERE 条件必ず 付ける
    • WHERE を忘れると 全行が書き変わる (事故)
  3. PHP からも prepare + execute

    <?php
    $pdo = new PDO('sqlite:' . getenv('DOJO_DB_PATH'));
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->prepare("UPDATE users SET age = ? WHERE name = ?");
    $stmt->execute([26, '花子']);
    • INSERT と同じ書き方
    • ? は SET の値、WHERE の値、両方に使える
  4. DELETE は「消す」

    DELETE FROM users WHERE id = 2;
    • DELETE FROM テーブル の後に WHERE 条件
    • これも WHERE を忘れると 全行消える
    <?php
    $stmt = $pdo->prepare("DELETE FROM users WHERE id = ?");
    $stmt->execute([2]);
  5. 影響行数は rowCount()

    <?php
    $stmt = $pdo->prepare("DELETE FROM users WHERE age >= ?");
    $stmt->execute([25]);
    
    echo "削除した件数: " . $stmt->rowCount() . "\n";
    • 直前の UPDATE / DELETE が 何件に影響したか を返す
    • 「該当 0 件だった」のチェックに使える
    • SELECT の件数を取るのには 使わない (SELECT は環境差あり)
  6. 確認は SELECT で

    <?php
    // DELETE 実行後…
    foreach ($pdo->query("SELECT id, name, age FROM users ORDER BY id") as $row) {
        echo "{$row['id']}: {$row['name']} ({$row['age']})\n";
    }
    • UPDATE / DELETE 自体は画面に何も出さない
    • 結果を確認するには SELECT で読む
  7. このチャプターでできるようになること

    UPDATE ... SET ... WHERE ... で書き換えられる ✅ DELETE FROM ... WHERE ... で消せる ✅ rowCount() で影響行数を取れる ✅ WHERE 忘れは全行に影響する事故だと理解した

    → ドリルへ

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

Lesson 11 / Chapter 6


UPDATE は「書き換える」

UPDATE users SET age = 26 WHERE name = '花子';
  • SET 列 = 値 で書き換える列を指定
  • WHERE 条件必ず 付ける
  • WHERE を忘れると 全行が書き変わる (事故)

PHP からも prepare + execute

<?php
$pdo = new PDO('sqlite:' . getenv('DOJO_DB_PATH'));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->prepare("UPDATE users SET age = ? WHERE name = ?");
$stmt->execute([26, '花子']);
  • INSERT と同じ書き方
  • ? は SET の値、WHERE の値、両方に使える

DELETE は「消す」

DELETE FROM users WHERE id = 2;
  • DELETE FROM テーブル の後に WHERE 条件
  • これも WHERE を忘れると 全行消える
<?php
$stmt = $pdo->prepare("DELETE FROM users WHERE id = ?");
$stmt->execute([2]);

影響行数は rowCount()

<?php
$stmt = $pdo->prepare("DELETE FROM users WHERE age >= ?");
$stmt->execute([25]);

echo "削除した件数: " . $stmt->rowCount() . "\n";
  • 直前の UPDATE / DELETE が 何件に影響したか を返す
  • 「該当 0 件だった」のチェックに使える
  • SELECT の件数を取るのには 使わない (SELECT は環境差あり)

確認は SELECT で

<?php
// DELETE 実行後…
foreach ($pdo->query("SELECT id, name, age FROM users ORDER BY id") as $row) {
    echo "{$row['id']}: {$row['name']} ({$row['age']})\n";
}
  • UPDATE / DELETE 自体は画面に何も出さない
  • 結果を確認するには SELECT で読む

このチャプターでできるようになること

UPDATE ... SET ... WHERE ... で書き換えられる ✅ DELETE FROM ... WHERE ... で消せる ✅ rowCount() で影響行数を取れる ✅ WHERE 忘れは全行に影響する事故だと理解した

→ ドリルへ

この章で取り組む 演習問題の流れ (2ステップ)
  1. 01 ドリル 01 — WHERE で 1 件 UPDATE README.md starter.php answer.php
  2. 02 ドリル 02 — DELETE + rowCount README.md starter.php answer.php

演習問題の詳細

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

ドリル 01 — WHERE で 1 件 UPDATE

問題

users テーブルの 花子 の年齢を 26 に書き換えてから、 id 昇順で全件を "{id}: {name} ({age})" 形式で出力してください。

初期データ:

1: 太郎 (20)
2: 花子 (25)
3: 次郎 (30)

期待される出力:

1: 太郎 (20)
2: 花子 (26)
3: 次郎 (30)

ヒント

  • $pdo->prepare("UPDATE users SET age = ? WHERE name = ?") を使う
  • $stmt->execute([26, '花子']) で値を渡す
  • WHERE を絶対に書く (忘れると全行が 26 になる)

🧪 ブラウザで試す

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

PHP ランタイム未読込

          

        

ドリル 02 — DELETE + rowCount

問題

users テーブルから age >= 25 の行を全部削除してから、

  1. "削除した件数: {n}" の形で rowCount() の値を出す
  2. 続いて、残った行を id 昇順で "{id}: {name} ({age})" 形式で出す

初期データ:

1: 太郎 (20)
2: 花子 (25)
3: 次郎 (30)
4: 三郎 (40)

age >= 25 に該当するのは 3 行 (花子・次郎・三郎)。

期待される出力:

削除した件数: 3
1: 太郎 (20)

ヒント

  • $pdo->prepare("DELETE FROM users WHERE age >= ?") を使う
  • $stmt->execute([25]) で値を渡す
  • $stmt->rowCount() で削除件数を取得
  • 続けて SELECT で残った行を foreach で出力

🧪 ブラウザで試す

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

PHP ランタイム未読込

          

        

演習問題(2問)

  1. ドリル 01 — WHERE で 1 件 UPDATE

    README.md starter.php answer.php

  2. ドリル 02 — DELETE + rowCount

    README.md starter.php answer.php

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

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