ホームページ  >  記事  >  バックエンド開発  >  php pdoのPDOStatementクラスのbindParamメソッドとbindValueメソッドの違い

php pdoのPDOStatementクラスのbindParamメソッドとbindValueメソッドの違い

WBOY
WBOYオリジナル
2016-08-08 09:25:241207ブラウズ

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

しかし、bindValue を使用して変数をバインドした後、execute を実行する前に変数の値を変更しても、結果は変わりません。たとえば、上記の例では、$id を 2 に変更しても、bindValue は変数への参照にバインドされておらず、変数として変化しないため、最終的な実行結果は $id = 1 の結果を出力します。変化します。

どちらも 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('男','男');

その理由は、bindParamの変数が参照としてバインドされているため、各フィールドに挿入された値が最後のフィールドの値になるためです。現時点では、bindValue を使用すると、この問題は発生しません。この例で説明する必要があるもう 1 つの点は、疑問符プレースホルダーをインデックス配列と組み合わせて使用​​する場合、bindValue のパラメーター識別子 (このメソッドの最初のパラメーター) に特別な注意を払う必要があることです。デフォルトでは 0 から、bindValue パラメータの識別子は 1 から始まります。インデックス配列の添え字 0 を直接挿入すると、プログラムがエラーを報告するため、使用する場合は注意が必要です。

上記は、PHP PDO の PDOStatement クラスの bindingParam メソッドと bindingValue メソッドの違いを、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。