Was ist der Unterschied zwischen PDOStatement::bindParam()
und PDOStatement::bindValue()
?
Was ist der Unterschied zwischen PDOStatement::bindParam()
und PDOStatement::bindValue()
?
Antworten:
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. Mit bindParam
müssten Sie nur die Variable aktualisieren. Der Hauptgrund für die Verwendung bindValue
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):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.
Aus vorbereiteten Anweisungen und gespeicherten Prozeduren
Verwenden Sie bindParam
diese 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();
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ä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
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]);