概要
SELECT * FROM users は全件取れるが、実用では 「条件に合う行だけ」 が欲しい。これを担うのが WHERE 句 で、SELECT * FROM users WHERE age >= 25 のように「列に対する条件」を書く。比較演算子 (= >= < !=)、論理結合 (AND OR)、あいまい検索 (LIKE 'A%') を組み合わせて絞り込む。
ここで最重要なのが、値を SQL に直接書かず、必ず ? プレースホルダを使う こと。"WHERE name = '$name'" のように文字列連結すると、入力に ' や ; が混ざった瞬間に SQL が壊れる (= SQL インジェクションの入り口)。PHP では「SQL の 形 を先に登録 → 値は後から 別ルート で渡す」という 2 段階で書く。これが prepare と execute の役割。
リズムは $stmt = $pdo->prepare("SELECT * FROM users WHERE age >= ?") で型紙を作り、$stmt->execute([25]) で値を埋め込み、$stmt->fetchAll() で結果を受ける。? は左から順に配列要素と対応。複数条件でも値の配列を渡すだけ。このリズムが INSERT / UPDATE / DELETE すべての基本形になる。
学習目標
WHERE句で行を絞り込める- 値を埋め込むときは 必ず
?プレースホルダ を使う (SQL インジェクション対策の入口) $pdo->prepare($sql)→$stmt->execute([...])→$stmt->fetchAll()の流れを書ける- 複数条件 (
AND) とLIKEの基本を扱える
ドリル
| no | 内容 |
|---|---|
| 01 | age = ? で特定年齢の名前を出力 |
| 02 | age >= ? で 25 以上の人を出力 |
| 03 | name LIKE ? AND age < ? で 2 条件検索 |
📝 演習: ドリル 01 — `age = ?` で特定年齢の名前を出力
問題
users テーブル (id, name, age) には次の 3 行が入っています。
| id | name | age |
|---|---|---|
| 1 | 太郎 | 20 |
| 2 | 花子 | 25 |
| 3 | 次郎 | 30 |
age がちょうど 25 の人の名前 を、id 昇順で 1 行ずつ出力してください。
期待される出力:
花子必須ルール
- 値を SQL に 文字列連結してはいけません
?プレースホルダ +prepare()+execute()を使うこと
ヒント
$stmt = $pdo->prepare('SELECT name FROM users WHERE age = ? ORDER BY id');
$stmt->execute([25]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);📝 演習: ドリル 02 — `age >= ?` で 25 以上の人を出力
問題
users テーブル (id, name, age) には次の 3 行が入っています。
| id | name | age |
|---|---|---|
| 1 | 太郎 | 20 |
| 2 | 花子 | 25 |
| 3 | 次郎 | 30 |
age が 25 以上の人の名前 を id 昇順で 1 行ずつ出力してください。
期待される出力:
花子
次郎必須ルール
- 値を SQL に 文字列連結してはいけません
?プレースホルダ +prepare()+execute()を使うこと
ヒント
$stmt = $pdo->prepare('SELECT name FROM users WHERE age >= ? ORDER BY id');
$stmt->execute([25]);📝 演習: ドリル 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のワイルドカード%は 渡す値 の側に入れる (例:'太%')
ヒント
$sql = 'SELECT name FROM users WHERE name LIKE ? AND age < ? ORDER BY id';
$stmt = $pdo->prepare($sql);
$stmt->execute(['太%', 30]);🤖 この章を AI に聞く
-
「ch04 — WHERE / プレースホルダ / prepare + execute」のつまずきやすいポイントを、初学者向けに3つ教えてください
-
「ch04 — WHERE / プレースホルダ / prepare + execute」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)
-
「ch04 — WHERE / プレースホルダ / prepare + execute」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください