概要
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 を出力 |
📝 演習: ドリル 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 idをforeachで回す
📝 演習: ドリル 02 — lastInsertId を出力
問題
users テーブルに 新人 (22 歳) を 1 件追加してから、
自動採番された ID を "追加したIDは {id}" の形で出力してください。
初期データは 太郎 (id=1) と 花子 (id=2) の 2 件なので、
追加した行の ID は 3 になるはず。
期待される出力:
追加したIDは 3ヒント
- INSERT は
prepare+execute([...])で実行 - INSERT 直後に
$pdo->lastInsertId()を呼ぶと自動採番された ID が取れる