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);
▶ 3v4l で実行

テストケース

期待される出力

花子

📄 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";
}