61

bindParamPDO を使用したりPDOを使用したコードをよく見かけますbindValue。なんらかの理由で単に引数を渡すだけで眉をexecuteひそめていますか?

bindParam実際に変数にバインドされ、両方のメソッドでバインドされるパラメーターのタイプを設定できることは理解していますがbind、文字列のみを挿入する場合はどうなるでしょうか?

$query = "SELECT col1 FROM t1 WHERE col2 = :col2 AND col3 = :col3 AND col4 = :col4";
$pdo->bindValue(':col2', 'col2');
$pdo->bindValue(':col3', 'col3');
$pdo->bindValue(':col4', 'col4');

上記はよく見かけますが、個人的には以下が好きです。

$pdo->execute(array(':col2' => 'col2', ':col3' => 'col3', ':col4' => 'col4'));

それほど冗長ではなく、視覚的には、入力を一緒にクエリに「入力」する方が理にかなっています。でも、使っているところはほとんど見ません。

前者の特別な動作を利用する必要がない場合に、bindパラメーターを渡すよりもメソッドを好む理由はありますか?execute

4

3 に答える 3

70

bindParam変数参照をクエリのパラメーターにバインドしたいだけで、何らかの操作を行う必要があり、クエリの実行時に計算された変数の値のみが必要な場合に使用される場合があります。また、パラメーターをストアド プロシージャ呼び出しにバインドし、戻り値をバインドされた変数に更新するなど、より複雑なことを行うこともできます。

詳細については、bindParam のドキュメントbindValue のドキュメントexecute のドキュメントを参照してください。

例えば

$col1 = 'some_value';
$pdo->bindParam(':col1', $col1);
$col1 = 'some_other_value';
$pdo->execute(); // would use 'some_other_value' for ':col1' parameter

bindValue配列を渡してexecute、パラメーター値がその時点で固定され、それに応じて SQL が実行されるのとほぼ同じように動作します。

上記と同じ例に従いますが、bindValue

$col1 = 'some_value';
$pdo->bindValue(':col1', $col1);
$col1 = 'some_other_value';
$pdo->execute(); // would use 'some_value' for ':col1' parameter

値を直接渡す場合、executeすべての値は文字列として扱われます (整数値が指定されている場合でも)。したがって、データ型を強制する必要がある場合は、常にbindValueorを使用する必要がありますbindParam

パラメーター宣言でデータ型を明示的に定義する方がより良いコーディング手法であると考えているbind*以上に、多くの人が使用していると思います。execute(array)

于 2012-09-12T16:25:42.857 に答える
10

メソッドとともにパラメーターを渡すことにより、関数を使用したステートメントと$pdo->execute()同様に、配列内のすべての値が渡されます。PDO::PARAM_STR$pdo->bindParam()

私が今見ることができる主な違いは、関数を使用すると、 PHP.net マニュアルで説明されているように、定数を$pdo->bindParam()使用して渡されるデータ型を定義できることです。PDO::PARAM_*

于 2012-09-12T16:26:53.850 に答える
4

シンプルに、bindParam の値は変更される可能性がありますが、bindValue の値は変更できません。例:

$someVal=10;
$someVal2=20;
/* In bindParam, the value argument is not bound and 
will be changed if we change its value before execute.
*/
$ref->bindParam(':someCol',$someVal);
$someVal=$someVal2;
$ref->execute();
//someCol=20
/* In bindValue, the value argument is bound and 
never changed if we change its value before execute.
*/
$ref->bindValue(':someCol',$someVal);
// here assignment is referral (&$someVal)
$someVal=$someVal2;
$ref->execute();
//someCol=10
于 2015-08-01T07:12:11.247 に答える