topic: db (PDO / SQL / マルチDB) / ch04 — WHERE / プレースホルダ / prepare + execute / 演習 03

📝 ドリル 03 — `name LIKE ? AND age < ?` で 2 条件検索

問題

users テーブル (id, name, age) には次の 4 行が入っています。

id name age
1 太郎 20
2 花子 25
3 次郎 30
4 太田 22

次の 2 条件を両方 満たす人の名前を、id 昇順で 1 行ずつ出力してください。

  • name が「太」で始まる (LIKE '太%')
  • age が 30 より小さい (age < 30)

期待される出力:

太郎
太田

必須ルール

  • 値を SQL に 文字列連結してはいけません
  • ? プレースホルダを 2 つ使い、execute([...]) に 2 個の値を渡すこと
  • LIKE のワイルドカード %渡す値 の側に入れる (例: '太%')

採点

php scripts/grade.php topics/11-db/ch04-select-where/drill/03-multiple-params/

ヒント

$sql = 'SELECT name FROM users WHERE name LIKE ? AND age < ? ORDER BY id';
$stmt = $pdo->prepare($sql);
$stmt->execute(['太%', 30]);
▶ 3v4l で実行

テストケース

期待される出力

太郎
太田

📄 starter.php(雛形)

このコードから書き始めてください。

<?php

$pdo = new PDO('sqlite:' . getenv('DOJO_DB_PATH'));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// TODO: name LIKE '太%' AND age < 30 の人を id 昇順で出力する
//   ヒント:
//     $sql = 'SELECT name FROM users WHERE name LIKE ? AND age < ? ORDER BY id';
//     $stmt = $pdo->prepare($sql);
//     $stmt->execute(['太%', 30]);
//     foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) { echo $row['name'] . "\n"; }
//
// ⚠ ? は 2 個。execute に渡す配列も 2 要素。順番が ? の位置に対応する。
// ⚠ '%' は SQL ではなく、execute に渡す値の方に付ける。
✅ 解答例を見る(自分で解いてから)
<?php

$pdo = new PDO('sqlite:' . getenv('DOJO_DB_PATH'));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = 'SELECT name FROM users WHERE name LIKE ? AND age < ? ORDER BY id';
$stmt = $pdo->prepare($sql);
$stmt->execute(['太%', 30]);

foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
    echo $row['name'] . "\n";
}