第9章 データベース連携 / 第1回 模擬試験
PHPのプリペアドステートメントに関する次の記述のうち、正しいものはどれか。
SQLインジェクション攻撃を防ぐ効果はない。
SQL文とパラメータを分離して扱う。
正解
`bindValue()`と`bindParam()`は全く同じ機能を持つ。
プレースホルダは、名前付きプレースホルダのみが使用できる。
解説
プリペアドステートメントは、SQL文の雛形とパラメータを別々にデータベースサーバへ送信する仕組みです。パラメータが文字列としてそのままSQLに埋め込まれないため、値がSQLの構文として解釈されることがなく、SQLインジェクションを防げます。
他の選択肢が誤りである理由は次の通りです。
・プリペアドステートメントはSQLインジェクション対策として広く使われる基本的な手法であり、「防ぐ効果はない」は誤りです。
・`bindValue()`は値を即座にバインドするのに対し、`bindParam()`は変数への参照を保持し、`execute()`実行時点の変数の値を使う点が異なります。ループ内で変数を使い回す場合などに挙動の差が影響します。
・プレースホルダには`:name`形式の名前付きプレースホルダと、`?`形式の疑問符プレースホルダの両方が使用できます。
例:
```
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->execute(['id' => $userId]);
```
(参照: 独習PHP 第4版 第9章 データベース連携 9.5節 SQLクエリの発行 / 9.7節 パラメーター値のバインド p.438〜464)