topic: db (PDO / SQL / マルチDB) / ch04 — WHERE / プレースホルダ / prepare + execute / 演習 01
📝 ドリル 01 — `age = ?` で特定年齢の名前を出力
問題
users テーブル (id, name, age) には次の 3 行が入っています。
| id | name | age |
|---|---|---|
| 1 | 太郎 | 20 |
| 2 | 花子 | 25 |
| 3 | 次郎 | 30 |
age がちょうど 25 の人の名前 を、id 昇順で 1 行ずつ出力してください。
期待される出力:
花子
必須ルール
- 値を SQL に 文字列連結してはいけません
?プレースホルダ +prepare()+execute()を使うこと
採点
php scripts/grade.php topics/11-db/ch04-select-where/drill/01-where-equals/
ヒント
$stmt = $pdo->prepare('SELECT name FROM users WHERE age = ? ORDER BY id');
$stmt->execute([25]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);テストケース
期待される出力
花子
📄 starter.php(雛形)
このコードから書き始めてください。
<?php
$pdo = new PDO('sqlite:' . getenv('DOJO_DB_PATH'));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// TODO: age = 25 の人の name を取り出して出力する
// ヒント:
// $stmt = $pdo->prepare('SELECT name FROM users WHERE age = ? ORDER BY id');
// $stmt->execute([25]);
// $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
// foreach ($rows as $row) { echo $row['name'] . "\n"; }
//
// ⚠ 文字列連結 ("WHERE age = $x" など) で書かないこと。必ず ? プレースホルダを使う。
// $stmt = $pdo->prepare('SELECT ...');
// $stmt->execute([...]);
// $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
// foreach ($rows as $row) { echo $row['name'] . "\n"; }
✅ 解答例を見る(自分で解いてから)
<?php
$pdo = new PDO('sqlite:' . getenv('DOJO_DB_PATH'));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('SELECT name FROM users WHERE age = ? ORDER BY id');
$stmt->execute([25]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $row) {
echo $row['name'] . "\n";
}