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);
$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
違い 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);
$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();
insert into tabletest(id,name) values(1,'张三');
insert into tabletest(id,name) values('男','男');
上記は、PHP PDO の PDOStatement クラスの bindingParam メソッドと bindingValue メソッドの違いを、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。