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]);テストケース
期待される出力
太郎
太田
📄 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";
}