概要
既存行の 書き換え と 削除 を担うのが UPDATE と DELETE。書き換えは 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 を出力 + 残った行を確認 |
📝 演習: ドリル 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 になる)
📝 演習: ドリル 02 — DELETE + rowCount
問題
users テーブルから age >= 25 の行を全部削除してから、
"削除した件数: {n}"の形でrowCount()の値を出す- 続いて、残った行を
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 で出力