第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)