PDOStatement::bindParam()
と PDOStatement::bindValue()
の違いは何ですか?
答えは 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'
ここに私が考えることができるいくつかがあります:
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)
は、execute()
の実行後に$value
を文字列に変更します。これは、もちろん、キャッチするのが難しいかもしれない微妙なバグにつながる可能性があります。ソース: http://php.net/manual/en/pdostatement.bindparam.php#94711
このような方法があれば、もう苦労する必要はありません。
$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]);
振る舞い(PHPの観点から)を暗記するための最も簡単な方法:
bindParam:
参照bindValue:
変数