第9章 データベース連携 / 第3回 模擬試験
PHPのPDOで名前付きパラメーターを使ったSQL実行に関する次の記述のうち、正しいものはどれか。
名前付きパラメーターは`:name`のようにコロンを付けて記述する。
正解
名前付きパラメーターは、疑問符(`?`)のパラメーターと混在させて使わなければならない。
名前付きパラメーターを使うと、SQLインジェクション対策の効果がなくなる。
名前付きパラメーターは一度しか使用できず、同じ名前を複数回使えない。
解説
名前付きパラメーターは、`:name`のようにコロン`:`に続けて識別子を書く形式で記述します(対応する値は`bindValue(':name', $value)`や`execute(['name' => $value])`で渡します)。
他の選択肢が誤りである理由は次の通りです。
・名前付きパラメーターと疑問符(`?`)の無名パラメーターは、通常どちらか一方の方式に統一して使い、同じSQL文の中で混在させることは推奨されません(「混在させなければならない」という記述自体も誤りです)。
・名前付きパラメーターも、SQL文とパラメータを分離して送信するプリペアドステートメントの一種であるため、SQLインジェクション対策としての効果があります。
・同じ名前のプレースホルダを、1つのSQL文の中で複数回使うことができます(例: `WHERE a = :x OR b = :x`)。
例:
```
$stmt = $pdo->prepare('SELECT * FROM t WHERE a = :x OR b = :x');
$stmt->execute(['x' => 3]);
```
(参照: 独習PHP 第4版 第9章 データベース連携 9.5.2節 名前付きパラメーターと名前なしパラメーター p.442〜443)