Was ist der Unterschied zwischen PDOStatement::bindParam()
und PDOStatement::bindValue()
?
Was ist der Unterschied zwischen bindParam und bindValue?
koen
Von die manuelle Eingabe für PDOStatement::bindParam
:
[With
bindParam
] nicht wiePDOStatement::bindValue()
die Variable wird als Referenz gebunden und nur zu diesem Zeitpunkt ausgewertetPDOStatement::execute()
wird genannt.
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'
-
Genial, danke! Frage – warum möchten Sie vielleicht eine über der anderen verwenden? Wann wäre es zum Beispiel sinnvoll oder notwendig, den Bind-Parameter nur zum Zeitpunkt execute() auszuwerten?
– Coldblackice
17. Juli 2013 um 19:18 Uhr
-
@Coldblackice Wenn Sie die Abfrage mehrmals mit unterschiedlichen Daten ausgeführt haben. Mit
bindValue
Sie müssten die Daten jedes Mal neu binden. MitbindParam
Sie müssten nur die Variable aktualisieren. Der Hauptgrund für die VerwendungbindValue
wären statische Daten, zB wörtliche Zeichenfolgen oder Zahlen.– einsamer Tag
17. Juli 2013 um 20:53 Uhr
-
Beispielsweise möchten Sie bindValue mit Funktionsrückgabewerten verwenden: $stmt->bindValue(‘:status’, strtolower($status), PDO::PARAM_STR);
– von Christus bezahlt
20. Dezember 2018 um 0:10 Uhr
-
wollte upvoten, aber da es 666 ist, werde ich es belassen
– Wirbel147
31. März 2020 um 13:35 Uhr
Hier sind einige, an die ich denken kann:
- Mit
bindParam
, Sie können nur Variablen übergeben ; nicht Werte - mit
bindValue
Sie können beide übergeben (Werte natürlich und Variablen) bindParam
funktioniert nur mit Variablen, da Parameter per “Referenz” als Ein-/Ausgabe angegeben werden können (und ein Wert ist keine gültige “Referenz” in PHP) : Es ist nützlich bei Treibern, die (unter Angabe des Handbuchs) :
unterstützen den Aufruf gespeicherter Prozeduren, die Daten als Ausgabeparameter zurückgeben, und einige auch als Eingabe-/Ausgabeparameter, die sowohl Daten einsenden als auch aktualisiert werden, um sie zu empfangen.
Bei einigen DB-Engines können gespeicherte Prozeduren Parameter haben, die sowohl für die Eingabe (ein Wert von PHP an die Prozedur übergeben) als auch für die Ausgabe (Rückgabe eines Werts von der gespeicherten Prozedur 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.
– Jehuda
28. März 2012 um 20:25 Uhr
-
Ich habe immer noch keine Ahnung, was das genau bedeutet, was genau die Variablen sind und was die Werte sind. Ich verwende bindParam, um einen Wert an einen Platzhalter zu binden, und mit bindValue kann ich dasselbe tun! – zumindest in meinem Beispiel…
– Richard
23. August 2012 um 6:28 Uhr
-
@Richard Variablen:
$stmt->bindParam(':id', $id);
Werte:$stmt->bindValue(':id', 1);
. Beachten Sie, wenn wir ersetzen$id
mit1
inbindParam
es wird ein Fehler ausgegeben.– Regen
16. Oktober 2021 um 12:54 Uhr
akrosmann
Die Antwort ist in der Dokumentation für bindParam
:
Im Gegensatz zu PDOStatement::bindValue() wird die Variable als Referenz gebunden und erst 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 den Ausgabewert, falls vorhanden, ihrer 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'
-
👌👌👌👌👌👌👌👌👌👌👌👌
– Ajmal Praveen
29. Mai 2021 um 22:20 Uhr
Von Vorbereitete Anweisungen und gespeicherte Prozeduren
Verwenden bindParam
So fügen Sie mehrere Zeilen mit einmaliger Bindung ein:
<?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();
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 sich verändern$value
nach dem Laufen zu bespannenexecute()
. 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
Du musst nicht länger kämpfen, wenn es einen Weg wie diesen gibt:
$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]);
Der einfachste Weg, dies für das Auswendiglernen durch Verhalten (in Bezug auf PHP) zu relativieren:
bindParam:
HinweisbindValue:
Variable
-
bindValue nimmt a Wert.
– Benutzer2864740
2. August 2020 um 19:33 Uhr