回答:
答えはドキュメントにありますbindParam
:
PDOStatement :: bindValue()とは異なり、変数は参照としてバインドされ、PDOStatement :: execute()が呼び出されたときにのみ評価されます。
そして execute
PDOStatement :: bindParam()を呼び出して、PHP変数をパラメーターマーカーにバインドします。バインドされた変数は、その値を入力として渡し、関連するパラメーターマーカーの出力値(ある場合)を受け取ります。
例:
$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindParam(':baz', $value); // use bindParam to bind the variable
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foobarbaz'
または
$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindValue(':baz', $value); // use bindValue to bind the variable's value
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foo'
以下からのマニュアルのエントリPDOStatement::bindParam
:
[あり
bindParam
]とは異なりPDOStatement::bindValue()
、変数は参照としてバインドされ、PDOStatement::execute()
呼び出されたときにのみ評価されます。
したがって、たとえば:
$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindParam(':sex', $sex); // use bindParam to bind the variable
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'female'
または
$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindValue(':sex', $sex); // use bindValue to bind the variable's value
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'male'
bindValue
、あなたは再びバインドデータたびにする必要があると思います。ではbindParam
、あなただけの変数を更新する必要があると思います。使用bindValue
する主な理由は、リテラル文字列や数値などの静的データです。
ここに私が考えることができるいくつかがあります:
bindParam
、変数のみを渡すことができます。値ではないbindValue
、両方を渡すことができます(値、明らかに、変数)bindParam
"参照" (および値はPHPでは有効な "参照"ではありません)によって入力/出力としてパラメーターを指定できるので、変数でのみ機能します。これは、ドライバーで役立ちます(マニュアルを引用):出力パラメーターとしてデータを返すストアード・プロシージャーの呼び出しをサポートします。また、データを送信し、データを受信するために更新される入出力パラメーターとしての呼び出しもサポートします。
一部のDBエンジンでは、ストアドプロシージャに、入力(PHPからプロシージャに値を渡す)と出力(ストアドプロシージャからPHPに値を返す)の両方に使用できるパラメータを含めることができます。これらのパラメーターをバインドするには、bindValueではなくbindParamを使用する必要があります。
以下からのプリペアドステートメントおよびストアドプロシージャ
bindParam
一度のバインディングで複数の行を挿入するために使用します:
<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();
// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
最も一般的な目的では、を使用する必要がありますbindValue
。
bindParam
2つのトリッキーまたは予期しない動作があります。
bindParam(':foo', 4, PDO::PARAM_INT)
(参照として)変数を渡す必要があるため、機能しません。bindParam(':foo', $value, PDO::PARAM_INT)
を$value
実行すると、文字列に変わりますexecute()
。もちろん、これは捕らえにくいかもしれない微妙なバグにつながる可能性があります。ソース:http : //php.net/manual/en/pdostatement.bindparam.php#94711