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'

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'

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.


@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();

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


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]); 

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.