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


回答:


190

答えはドキュメントにあります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'

667

以下からのマニュアルのエントリ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'

9
素晴らしい、ありがとう!質問-なぜ一方を他方に使用したいのですか?バインドパラメータをexecute()時にのみ評価するのが便利または必要になるのはいつですか?
Coldblackice 2013

32
@Coldblackice異なるデータでクエリを複数回実行した場合。ではbindValue、あなたは再びバインドデータたびにする必要があると思います。ではbindParam、あなただけの変数を更新する必要があると思います。使用bindValueする主な理由は、リテラル文字列や数値などの静的データです。
lonesomeday 2013

1
たとえば、関数の戻り値でbindValueを使用したい場合:$ stmt-> bindValue( ':status'、strtolower($ status)、PDO :: PARAM_STR);
payforbychrist 2018


219

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

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

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

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


@PascalMartin私が知りたかっただけのことですが、bindParamで値をバインドできますか。乾杯。
イェフダ2012年

1
それが正確に何を意味するのか、正確には何が変数で何が値なのか、私にはまだ手がかりがありません。bindParamを使用して値をプレースホルダーにバインドし、bindValueでも同じことができます!-私の例では少なくとも...
リチャード

29

以下からのプリペアドステートメントおよびストアドプロシージャ

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

最も一般的な目的では、を使用する必要があります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


4

これをやる方法が存在するとき、あなたはもはや苦労する必要はありません:

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

4

これを(PHPの観点から)動作ごとに暗記するための最も簡単な方法:

  • bindParam: 参照
  • bindValue: 変数
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.