このページは、PHPの PDOStatement::bindParam() の注意点をまとめたページです。
目次
補足
- このページの結果は下記の環境で検証したものです。別のバージョンや組み合わせでは違う動作になるかもしれません。
(基本的にはここで検証した範囲のbindParam()
の動作はPHP 5から変わっていません)
bindParam()
, bindValue()
, execute()
ともプレースホルダに疑問符形式 (「?」) と名前形式 (「:name」) の両方が使用できますが、ここでは名前形式を使用しています。(結果は変わりません)
bindParam()
, bindValue()
, execute()
ともパラメータ名にコロン (「:」) があってもなくても動作するためここではコロンを除いていますが、コロンがある場合でも動作は同じです。(SQL側にはコロンが必要です)
PDOStatement::bindParam() の注意点
変数しかバインドできない
bindParam()
は変数のバインド用のメソッドのため、リテラル (そのままの値) などをバインドできません。
execute()実行時に値が評価されるため意図しない動作になることがある
bindParam()
は変数の参照をバインドしているため、反復処理中などで値が変わる変数に使用すると意図しない動作になることがあります。
bindValue()
, execute()
の場合は問題ありません。
変数の値や型が変更されることがある
bindParam()
で変数をバインドすると、実行結果によって値や型が変更されることがあります。
(bindParam()
はもとからストアドプロシージャのOUT, INOUTパラメータなどに適用してSQLの実行結果の値を受け取ることが想定されたメソッドですが、そのようなSQLでなくてもPDO内部の処理によって型が変更されます)
bindValue()
, execute()
の場合は問題ありません。
- 補足
- MySQLでは
PDO::PARAM_INPUT_OUTPUT
の出力側 (値の受け取り) がサポートされていないため、bindParam
を使用しないといけない状況がほとんどありません。
- SQL Serverでは出力パラメータを使用することができます。(4番目の引数に長さの指定が必要)