ch05 12章中 5章目

ch05 — INSERT で 1 件追加する

スライドで見る

この章を AI と学ぶ

💬 AI に聞く質問例 3 件
  1. 「ch05 — INSERT で 1 件追加する」のつまずきやすいポイントを、初学者向けに3つ教えてください

    ChatGPT Claude Gemini

  2. 「ch05 — INSERT で 1 件追加する」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    ChatGPT Claude Gemini

  3. 「ch05 — INSERT で 1 件追加する」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    ChatGPT Claude Gemini

概要

DB に新しい行を追加するのが INSERT INTO ... VALUES (...) 文。INSERT INTO users (name, age) VALUES (?, ?) のように「どのテーブルの・どの列に・何の値を入れるか」を書く。列名を明示する書き方を基本にする (テーブル設計が変わっても壊れにくい)。

値の渡し方は ch04 と同じ prepare + execute。INSERT でも文字列連結は厳禁で、ユーザー入力をそのまま VALUES (...) に埋めると SQL インジェクションの穴になる。

INSERT 特有のテーマが 採番された ID の取得id INTEGER PRIMARY KEY AUTOINCREMENT (SQLite) / AUTO_INCREMENT (MySQL) / SERIAL (PostgreSQL) のように DB に自動採番させる カラム設計が一般的で、その値は INSERT 直後に $pdo->lastInsertId() で取り出せる。「INSERT → ID 取得 → 関連テーブルにその ID で INSERT」という連鎖は頻出パターン。

学習目標

  • INSERT INTO ... VALUES (...) で 1 件追加できる
  • プレースホルダ (?) と prepare/execute で値を安全に渡せる
  • lastInsertId() で自動採番された ID を取り出せる

ドリル

no 内容
01 1 件 INSERT して、SELECT で全件確認
02 1 件 INSERT して、lastInsertId を出力

解説スライド 全 6 枚

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

  1. INSERT で 1 件追加する

    Lesson 11 / Chapter 5

  2. SELECT は「読む」、INSERT は「書く」

    INSERT INTO users (name, age) VALUES ('新人', 22);
    • INTO テーブル名 (列, 列) で対象を指定
    • VALUES (値, 値) で実際に入れる値を指定
    • 1 文で 1 行追加される
  3. PHP からは prepare + execute

    <?php
    $pdo = new PDO('sqlite:' . getenv('DOJO_DB_PATH'));
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->prepare("INSERT INTO users (name, age) VALUES (?, ?)");
    $stmt->execute(['新人', 22]);
    • ?プレースホルダ。値の置き場所
    • execute([...]) で順番に値を当てはめる
    • 値を SQL に直接埋め込まない → 安全 (ch09 で詳しく)
  4. 自動採番 ID は lastInsertId()

    <?php
    $stmt = $pdo->prepare("INSERT INTO users (name, age) VALUES (?, ?)");
    $stmt->execute(['新人', 22]);
    
    $id = $pdo->lastInsertId();
    echo "追加したIDは {$id}\n";
    • id 列が AUTOINCREMENT のとき、INSERT 後に自動採番された値を取れる
    • 直前の INSERT 1 件分の ID を返す
  5. 追加されたか確認は SELECT

    <?php
    $stmt = $pdo->prepare("INSERT INTO users (name, age) VALUES (?, ?)");
    $stmt->execute(['新人', 22]);
    
    foreach ($pdo->query("SELECT id, name, age FROM users ORDER BY id") as $row) {
        echo "{$row['id']}: {$row['name']} ({$row['age']})\n";
    }
    • INSERT 自体は何も画面に出さない
    • 「ちゃんと入ったか」を見るには SELECT で読む
  6. このチャプターでできるようになること

    INSERT INTO ... VALUES (?, ?) の形が書ける ✅ prepare + execute([...]) でプレースホルダに値を渡せる ✅ lastInsertId() で自動採番された ID を取り出せる ✅ INSERT 後に SELECT で結果を確認できる

    → ドリルへ

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

Lesson 11 / Chapter 5


SELECT は「読む」、INSERT は「書く」

INSERT INTO users (name, age) VALUES ('新人', 22);
  • INTO テーブル名 (列, 列) で対象を指定
  • VALUES (値, 値) で実際に入れる値を指定
  • 1 文で 1 行追加される

PHP からは prepare + execute

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

$stmt = $pdo->prepare("INSERT INTO users (name, age) VALUES (?, ?)");
$stmt->execute(['新人', 22]);
  • ?プレースホルダ。値の置き場所
  • execute([...]) で順番に値を当てはめる
  • 値を SQL に直接埋め込まない → 安全 (ch09 で詳しく)

自動採番 ID は lastInsertId()

<?php
$stmt = $pdo->prepare("INSERT INTO users (name, age) VALUES (?, ?)");
$stmt->execute(['新人', 22]);

$id = $pdo->lastInsertId();
echo "追加したIDは {$id}\n";
  • id 列が AUTOINCREMENT のとき、INSERT 後に自動採番された値を取れる
  • 直前の INSERT 1 件分の ID を返す

追加されたか確認は SELECT

<?php
$stmt = $pdo->prepare("INSERT INTO users (name, age) VALUES (?, ?)");
$stmt->execute(['新人', 22]);

foreach ($pdo->query("SELECT id, name, age FROM users ORDER BY id") as $row) {
    echo "{$row['id']}: {$row['name']} ({$row['age']})\n";
}
  • INSERT 自体は何も画面に出さない
  • 「ちゃんと入ったか」を見るには SELECT で読む

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

INSERT INTO ... VALUES (?, ?) の形が書ける ✅ prepare + execute([...]) でプレースホルダに値を渡せる ✅ lastInsertId() で自動採番された ID を取り出せる ✅ INSERT 後に SELECT で結果を確認できる

→ ドリルへ

この章で取り組む 演習問題の流れ (2ステップ)
  1. 01 ドリル 01 — INSERT して全件確認 README.md starter.php answer.php
  2. 02 ドリル 02 — lastInsertId を出力 README.md starter.php answer.php

演習問題の詳細

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

ドリル 01 — INSERT して全件確認

問題

users テーブルに 新人 (22 歳) を 1 件追加してから、 id 昇順で全件を "{id}: {name} ({age})" 形式で出力してください。

初期データは 太郎 (id=1, 20 歳) と 花子 (id=2, 25 歳) の 2 件。 INSERT 後は 3 件 出力されるはず。

期待される出力:

1: 太郎 (20)
2: 花子 (25)
3: 新人 (22)

ヒント

  • $pdo->prepare("INSERT INTO users (name, age) VALUES (?, ?)") を使う
  • $stmt->execute(['新人', 22]) で値を渡す
  • 確認は SELECT id, name, age FROM users ORDER BY idforeach で回す

🧪 ブラウザで試す

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

PHP ランタイム未読込

          

        

ドリル 02 — lastInsertId を出力

問題

users テーブルに 新人 (22 歳) を 1 件追加してから、 自動採番された ID を "追加したIDは {id}" の形で出力してください。

初期データは 太郎 (id=1) と 花子 (id=2) の 2 件なので、 追加した行の ID は 3 になるはず。

期待される出力:

追加したIDは 3

ヒント

  • INSERT は prepare + execute([...]) で実行
  • INSERT 直後に $pdo->lastInsertId() を呼ぶと自動採番された ID が取れる

🧪 ブラウザで試す

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

PHP ランタイム未読込

          

        

演習問題(2問)

  1. ドリル 01 — INSERT して全件確認

    README.md starter.php answer.php

  2. ドリル 02 — lastInsertId を出力

    README.md starter.php answer.php

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

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