第9章 データベース連携 / 第5回 模擬試験
PHPのbindValueメソッドとbindParamメソッドの違いに関する次の記述のうち、正しいものはどれか。
`bindValue()`は値を即座にバインドし、`bindParam()`は変数を参照渡しでバインドし実行時の値を使う。
正解
`bindValue()`と`bindParam()`は全く同じ動作をする、名前が違うだけの関数である。
`bindParam()`は数値型のみバインド可能で、文字列はバインドできない。
`bindValue()`はSQLインジェクション対策にはならない。
解説
`bindValue($param, $value)`は、呼び出した「その瞬間」の値をコピーしてバインドします。一方`bindParam($param, $var)`は変数への「参照」をバインドするため、実際に使われる値は`execute()`が呼ばれた時点での、その変数の値になります。
他の選択肢が誤りである理由は次の通りです。
・両者は挙動が異なります(値を即座に固定するか、実行時点の変数値を使うかという違いがあります)。「全く同じ動作」というのは誤りです。
・`bindParam()`は数値型に限らず、文字列・真偽値など任意の型の変数をバインドできます。
・`bindValue()`も、SQL文とパラメータを分離するプリペアドステートメントの一部であるため、SQLインジェクション対策としての効果があります。
例:
```
$name = 'Taro';
$stmt->bindValue(':name', $name); // この時点の 'Taro' が固定される
$name = 'Jiro'; // 後から変更しても影響しない
$stmt->bindParam(':name', $name); // $nameへの参照
$name = 'Jiro'; // execute()時点の 'Jiro' が使われる
$stmt->execute();
```
(参照: 独習PHP 第4版 第9章 データベース連携 9.7.2節 bindValueメソッドとbindParamメソッド p.461〜464)