Was ist der Unterschied zwischen bindParam und bindValue?

Antworten:

190

Die Antwort finden Sie in der Dokumentation für bindParam:

Im Gegensatz zu PDOStatement :: bindValue () ist die Variable als Referenz gebunden und wird nur zum Zeitpunkt des Aufrufs von PDOStatement :: execute () ausgewertet.

Und execute

Rufen Sie PDOStatement :: bindParam () auf, um PHP-Variablen an die Parametermarkierungen zu binden: Gebundene Variablen übergeben ihren Wert als Eingabe und erhalten gegebenenfalls den Ausgabewert der zugehörigen Parametermarkierungen

Beispiel:

$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'

oder

$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'
Akrosman
quelle
667

Aus dem manuellen Eintrag fürPDOStatement::bindParam :

[Mit bindParam] Im Gegensatz dazu PDOStatement::bindValue()ist die Variable als Referenz gebunden und wird nur zum Zeitpunkt des Aufrufs ausgewertet PDOStatement::execute().

Also zum Beispiel:

$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'

oder

$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'
einsamer Tag
quelle
9
Genial, danke! Frage - warum möchten Sie vielleicht eine über die andere verwenden? Zum Beispiel, wann wäre es nützlich oder notwendig, den Bindungsparameter nur zur Ausführung () auswerten zu lassen?
Coldblackice
32
@Coldblackice Wenn Sie die Abfrage mehrmals mit unterschiedlichen Daten ausgeführt haben. Mit bindValuemüssten Sie die Daten jedes Mal neu binden. Mit bindParammüssten Sie nur die Variable aktualisieren. Der Hauptgrund für die Verwendung bindValuewären statische Daten, z. B. Literalzeichenfolgen oder Zahlen.
einsamer
1
Beispielsweise möchten Sie bindValue mit Funktionsrückgabewerten verwenden: $ stmt-> bindValue (': status', strtolower ($ status), PDO :: PARAM_STR);
bezahlt für Christ
1
wollte upvote, aber weil es 666 ist, werde ich es verlassen
eddy147
219

Hier sind einige, über die ich nachdenken kann:

  • Mit bindParamkönnen Sie nur Variablen übergeben. keine Werte
  • mit bindValuekönnen Sie beide übergeben (Werte natürlich und Variablen)
  • bindParamfunktioniert nur mit Variablen, da Parameter als Eingabe / Ausgabe durch "Referenz" angegeben werden können (und ein Wert in PHP keine gültige "Referenz" ist) : Dies ist nützlich bei Treibern, die (unter Angabe des Handbuchs):

Unterstützung des Aufrufs gespeicherter Prozeduren, die Daten als Ausgabeparameter zurückgeben, und einiger auch als Eingabe- / Ausgabeparameter, die Daten sowohl senden als auch zum Empfang aktualisieren.

Bei einigen DB-Engines können gespeicherte Prozeduren Parameter haben, die sowohl für die Eingabe (Angabe eines Werts von PHP an die Prozedur) als auch für die Ausgabe (Rückgabe eines Werts vom gespeicherten Prozess an PHP) verwendet werden können. Um diese Parameter zu binden, müssen Sie bindParam und nicht bindValue verwenden.

Pascal MARTIN
quelle
@PascalMartin Genau das, was ich wissen wollte, können Sie Werte mit bindParam binden. Prost.
Yehuda
1
Ich habe immer noch keine Ahnung, was das genau bedeutet, was genau die Variablen sind und was die Werte sind. Ich benutze bindParam, um einen Wert an einen Platzhalter zu binden, und mit bindValue kann ich dasselbe tun! - In meinem Beispiel zumindest ...
Richard
29

Aus vorbereiteten Anweisungen und gespeicherten Prozeduren

Verwenden Sie bindParamdiese Option, um mehrere Zeilen mit einer einmaligen Bindung einzufügen:

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

Für den häufigsten Zweck sollten Sie verwenden bindValue.

bindParam hat zwei knifflige oder unerwartete Verhaltensweisen:

  • bindParam(':foo', 4, PDO::PARAM_INT) funktioniert nicht, da eine Variable (als Referenz) übergeben werden muss.
  • bindParam(':foo', $value, PDO::PARAM_INT)wird $valuenach dem Ausführen in Zeichenfolge geändert execute(). Dies kann natürlich zu subtilen Fehlern führen, die möglicherweise schwer zu erkennen sind.

Quelle: http://php.net/manual/en/pdostatement.bindparam.php#94711

Denilson Sá Maia
quelle
4

Sie müssen nicht länger kämpfen, wenn es einen Weg gibt, dies zu tun:

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

Der einfachste Weg, dies für das Auswendiglernen durch Verhalten (in Bezug auf PHP) ins rechte Licht zu rücken:

  • bindParam: Referenz
  • bindValue: Variable
tfont
quelle