PDOStatement クラスの 2 つのメソッドの具体的な説明は次のとおりです
bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )<pre name="code" class="php">bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )
違い 1:bindParam は指定された変数名にパラメーターをバインドすること、bindValue は値をパラメーターにバインドすることです
<pre name="code" class="php">$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('select * from tabletest where id = ?'); $id = 1; $st->bindParam(1,$id,PDO::PARAM_INT); //$st->bindValue(1,$id,PDO::PARAM_INT);上記のコードは、bindParamでもbindValueでも正常に実行できますが、以下のコードに置き換えると
$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('select * from tabletest where id = ?'); $st->bindParam(1,1,PDO::PARAM_INT); //$st->bindValue(1,1,PDO::PARAM_INT);
bindParam は次のエラーを報告しますが、bindValue は正常に実行できます
Fatal error: Cannot pass parameter 2 by reference要約:bindParam の 2 番目のパラメーターは変数名のみを持ち、変数名のみを指定できます。bindValue は変数名をバインドでき、変数をバインドできます。 value
違い 2: PDOStatement::bindValue() とは異なり、PDOStatement::bindParam() の変数は参照としてバインドされ、PDOStatement::execute() でのみ呼び出されます。値は
の場合にのみ取得されます。$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('select * from tabletest where id = ?'); $id = 1; $st->bindParam(1,$id,PDO::PARAM_INT); $id = 2; $st->execute(); $rs = $st->fetchAll(); print_r($rs);はまず $id に 1 の値を代入し、bindParam で変数をバインドしてから実行し、$id を 2 に変更して実行操作を実行します。このとき取得される結果セットは id=2 の場合です。クエリ結果は、 ID が 1 の場合のクエリ結果。参考として変数の説明を示します。実行前にこの変数を置き換えることができます。実行操作を実行するときに置き換えられる変数の値は、変数が最後に変更されたときの値です。
$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('select * from tabletest where id = ?'); $id = 1; $st->bindValue(1,$id,PDO::PARAM_INT); $id = 2; $st->execute(); $rs = $st->fetchAll(); print_r($rs);
どちらも SQL パラメーターのバインドを完了できますが、実際のアプリケーションでは、この 2 つにはまだ違いがあります。ここでは、bindParam の不適切な使用例を示します
データ テーブルがあるとします。シェーピングあり ID と文字列名の 2 つのフィールドがあり、前処理を使用して挿入できるデータの配列 $params = array(1,'Zhang San') があり、具体的なコードは次のとおりです
$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('insert into tabletest(id,name) values(?,?)'); $params = array(1,'张三'); foreach($params as $k => $v){ $index = $k + 1; $st->bindParam($index,$v); } $st->execute();への SQL ステートメント。通常の状況では実行されるはずです
insert into tabletest(id,name) values(1,'张三');実際、実際に実行されるSQL文は
insert into tabletest(id,name) values('男','男');
上記は、PHP PDO の PDOStatement クラスの bindingParam メソッドと bindingValue メソッドの違いを、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。