web-dev-qa-db-ja.com

bindParamとbindValueの違いは何ですか?

358
koen

答えは 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'
172
acrosman

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'
661
lonesomeday

ここに私が考えることができるいくつかがあります:

  • bindParamを使用すると、変数のみを渡すことができます。値ではない
  • bindValueを使用すると、両方(値、明らかに、変数)を渡すことができます
  • bindParamは変数でのみ機能します。これは、パラメータが「参照」によって入力/出力として与えられるためです。(および値はPHPの有効な「参照」ではありません):マニュアルを引用):

出力パラメータとしてデータを返すストアドプロシージャの呼び出しをサポートします。また、データを送信し、それを受信するために更新される入出力パラメータとしても使用します。

一部のDBエンジンでは、ストアドプロシージャに、入力(PHPから値をプロシージャに渡す)と出力(ストアドプロシージャから値をPHPに返す)の両方に使用できるパラメータを設定できます。これらのパラメーターをバインドするには、bindValueではなくbindParamを使用する必要があります。

216
Pascal MARTIN

From 準備済みステートメントとストアドプロシージャ

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();
27
Nezar Fadle

最も一般的な目的には、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

26

このような方法があれば、もう苦労する必要はありません。

$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]); 
3
Thielicious

振る舞い(PHPの観点から)を暗記するための最も簡単な方法:

  • bindParam:参照
  • bindValue:変数
2
tfont