topic: db (PDO / SQL / マルチDB) / ch11 — MySQL 固有の文法と運用 / 演習 01

📝 ドリル 01 — AUTO_INCREMENT で連番 ID を自動採番する

問題

items テーブル (採点ランナーが空で用意) に対して、PDO の prepared statement で次の 3 件を順番に INSERT する。

  1. りんご
  2. みかん
  3. ぶどう

INSERT 後に SELECT id, name FROM items ORDER BY id で取り出し、{id}: {name} の形式で 1 行ずつ出力する。

期待される出力

1: りんご
2: みかん
3: ぶどう

ヒント

  • scripts/shared/db-connect.phpdojo_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";
}