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

UPDATE と DELETE

テクノロジ系 / db (PDO / SQL / マルチDB)

UPDATE と DELETE

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 忘れは全行に影響する事故だと理解した

→ ドリルへ

考えてみよう

既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。

ドリル 01 — WHERE で 1 件 UPDATE

問題

users テーブルの 花子 の年齢を 26 に書き換えてから、

id 昇順で全件を "{id}: {name} ({age})" 形式で出力してください。

初期データ:

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

期待される出力:

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

採点

php scripts/grade.php topics/db/ch06-update-delete/drill/01-update-age/

ヒント

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

ドリル 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)

採点

php scripts/grade.php topics/db/ch06-update-delete/drill/02-delete-with-rowcount/

ヒント

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