Was ist der Unterschied zwischen PDOStatement::bindParam()
und PDOStatement::bindValue()
?
378
Was ist der Unterschied zwischen PDOStatement::bindParam()
und PDOStatement::bindValue()
?
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'
Aus dem manuellen Eintrag fürPDOStatement::bindParam
:
[Mit
bindParam
] Im Gegensatz dazuPDOStatement::bindValue()
ist die Variable als Referenz gebunden und wird nur zum Zeitpunkt des Aufrufs ausgewertetPDOStatement::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'
bindValue
müssten Sie die Daten jedes Mal neu binden. MitbindParam
müssten Sie nur die Variable aktualisieren. Der Hauptgrund für die VerwendungbindValue
wären statische Daten, z. B. Literalzeichenfolgen oder Zahlen.Hier sind einige, über die ich nachdenken kann:
bindParam
können Sie nur Variablen übergeben. keine WertebindValue
können Sie beide übergeben (Werte natürlich und Variablen)bindParam
funktioniert 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):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.
quelle
Aus vorbereiteten Anweisungen und gespeicherten Prozeduren
Verwenden Sie
bindParam
diese Option, um mehrere Zeilen mit einer einmaligen Bindung einzufügen:quelle
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$value
nach dem Ausführen in Zeichenfolge geändertexecute()
. 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
quelle
Sie müssen nicht länger kämpfen, wenn es einen Weg gibt, dies zu tun:
quelle
Der einfachste Weg, dies für das Auswendiglernen durch Verhalten (in Bezug auf PHP) ins rechte Licht zu rücken:
bindParam:
ReferenzbindValue:
Variablequelle