topic: db (PDO / SQL / マルチDB) / ch11 — MySQL 固有の文法と運用 / 演習 01
📝 ドリル 01 — AUTO_INCREMENT で連番 ID を自動採番する
問題
items テーブル (採点ランナーが空で用意) に対して、PDO の prepared statement で次の 3 件を順番に INSERT する。
りんごみかんぶどう
INSERT 後に SELECT id, name FROM items ORDER BY id で取り出し、{id}: {name} の形式で 1 行ずつ出力する。
期待される出力
1: りんご
2: みかん
3: ぶどう
ヒント
scripts/shared/db-connect.phpのdojo_db_connect()を使うと driver を意識せず接続できるINSERT INTO items (name) VALUES (?)を 1 本だけprepare()し、execute()を 3 回呼ぶidは採点ランナーが用意したテーブルが SQLite ならAUTOINCREMENT、MySQL ならAUTO_INCREMENT、PostgreSQL ならSERIALで勝手に振られる- 取得時のソートは
ORDER BY idを必ず付ける (順序を担保するため)
採点
php scripts/grade.php topics/11-db/ch11-mysql-specific/drill/01-auto-increment/
採点ランナーは tests/setup.sql (driver に応じて setup.mysql.sql / setup.pgsql.sql) を流し込み、items テーブルを空で用意してから採点する。
学ぶこと
- MySQL の
AUTO_INCREMENT、SQLite のAUTOINCREMENT、PostgreSQL のSERIALは 文法は違うが結果は同じ - PDO 側からは「id を指定せず INSERT すれば勝手に振られる」だけを知っていれば良い
テストケース
期待される出力
1: りんご
2: みかん
3: ぶどう
📄 starter.php(雛形)
このコードから書き始めてください。
<?php
require __DIR__ . '/../../../../../scripts/shared/db-connect.php';
$pdo = dojo_db_connect();
// TODO:
// 1) prepare("INSERT INTO items (name) VALUES (?)") を 1 本作る
// 2) execute() を 3 回呼んで 'りんご' / 'みかん' / 'ぶどう' を順に INSERT
// 3) SELECT id, name FROM items ORDER BY id で全件取り出す
// 4) 各行を "{id}: {name}\n" の形式で出力する
✅ 解答例を見る(自分で解いてから)
<?php
require __DIR__ . '/../../../../../scripts/shared/db-connect.php';
$pdo = dojo_db_connect();
$stmt = $pdo->prepare("INSERT INTO items (name) VALUES (?)");
$stmt->execute(['りんご']);
$stmt->execute(['みかん']);
$stmt->execute(['ぶどう']);
foreach ($pdo->query("SELECT id, name FROM items ORDER BY id") as $row) {
echo "{$row['id']}: {$row['name']}\n";
}