ch09 — SQL インジェクション / プリペアド vs 連結
スライドで見るこの章を AI と学ぶ
演習問題の詳細
この章の演習問題の内容を読めます。実際に手元で解くには教材リポジトリを clone してください。
ドリル 01 — 連結をプレースホルダに直す
問題
starter.php はわざと 文字列連結 で SQL を組み立てている。これだと ' (シングルクォート) を含む名前を入れた瞬間に SQL 構文エラーで落ちる。
ターゲット名:
O'Brien
users テーブルに O'Brien (id=1) が登録されている。標準入力からこの名前を受け取り、
1: O'Brien
と出力するように プレースホルダ + prepare/execute で書き直してほしい。
期待される出力
1: O'Brien
ヒント
$pdo->prepare("SELECT id, name FROM users WHERE name = ?")の?がプレースホルダ$stmt->execute([$name])で値を渡す- 連結 (
"... WHERE name = '$name'") は禁止 PDO::ATTR_ERRMODEをPDO::ERRMODE_EXCEPTIONにする習慣を付けておく
🧪 ブラウザで試す
スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。
PHP ランタイム未読込
ドリル 02 — LIKE 検索もプレースホルダで
問題
ユーザーが入力したキーワードで users.name を 部分一致検索 (LIKE) するコードを書きたい。
- 標準入力からキーワードを 1 行受け取る
nameにそのキーワードを含むユーザーをid昇順で全件出力する%(ワイルドカード) は PHP 側 で付け、プレースホルダには値だけ渡す
users テーブルには次が入っている (setup.sql 参照):
| id | name |
|---|---|
| 1 | 山田太郎 |
| 2 | 鈴木花子 |
| 3 | 山本次郎 |
| 4 | O'Brien |
期待される入力
山
期待される出力
1: 山田太郎
3: 山本次郎
ヒント
WHERE name LIKE ?でプレースホルダ- 値の側で
'%' . $keyword . '%'を作って渡す - SQL の中に
'%$keyword%'のように埋め込むのは NG ORDER BY idで並び順を固定
🧪 ブラウザで試す
スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。
PHP ランタイム未読込
演習問題(2問)
サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリを clone してください。
完了にすると進捗に反映されます