Was ist der Unterschied zwischen bindParam und bindValue?
Frage
Was ist der Unterschied zwischen PDOStatement::bindParam()
und PDOStatement::bindValue()
?
Lösung
Die Antwort ist in der Dokumentation zu bindParam
:
Im Gegensatz zu PDOStatement :: bindValue () wird die Variable als Referenz gebunden und wird nur zu dem Zeitpunkt ausgewertet werden, dass PDOStatement :: execute () aufgerufen wird.
Und execute
Anruf PDOStatement :: bindParam () PHP Variablen auf die Parameter-Markierungen zu binden: gebundene Variablen ihren Wert als Eingabe übergeben, und um den Ausgabewert erhalten, wenn überhaupt, von ihren zugeordneten Parametermarken
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'
Andere Tipps
PDOStatement::bindParam rel="noreferrer">:
[Mit
bindParam
] Im Gegensatz zuPDOStatement::bindValue()
wird die Variable als Referenz gebunden und wird nur zu dem Zeitpunkt ausgewertet werden, dassPDOStatement::execute()
genannt wird.
So 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'
Hier sind einige, die ich denken kann:
- Mit
bindParam
, können Sie nur Variablen übergeben; nicht Werte - mit
bindValue
, können Sie passieren beide (Werte, natürlich, und Variablen) -
bindParam
funktioniert nur mit Variablen, weil sie Parameter gegeben werden als Ein- / Ausgang, durch „Referenz“ (und ein Wert ist keine gültige „Referenz“ in PHP) können: ist es sinnvoll, mit Treiber, die (unter Angabe der Anleitung):
unterstützen den Aufruf der gespeicherten Verfahren, die Daten als Ausgabe zurück Parameter, und einige auch als Eingabe / Ausgabe-Parameter, die sowohl senden in Daten und aktualisiert sie zu empfangen.
DB Bei einigen Motoren, Stored Procedures kann Parameter hat, die sowohl für Eingabe verwendet werden kann (mit einem Wert von PHP zu dem Verfahren ergeben) und ouput (Wert aus der gespeicherten proc zu PHP zurückkehren); diese Parameter zu binden, du hast bindParam zu verwenden, und nicht bindValue.
Prepared Statements und Stored Procedures
Verwenden bindParam
auf mehrere Zeilen mit einer Zeitbindung 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 die gebräuchlichste Zweck sollten Sie bindValue
verwenden.
bindParam
hat zwei heikeles oder unerwartetes Verhalten:
-
bindParam(':foo', 4, PDO::PARAM_INT)
nicht funktioniert, da es eine Variable mit (als Referenz) erfordert. -
bindParam(':foo', $value, PDO::PARAM_INT)
wird nach dem Ausführen$value
execute()
bespannen ändern. Dies kann natürlich zu subtilen Bugs führen, die schwierig sein könnte, zu fangen.
Quelle: http://php.net/manual/en/pdostatement.bindparam.php#94711
Sie müssen länger nicht kämpfen, wenn es einen Weg, wie diese vorhanden ist:
$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]);
Die einfachste Art und Weise durch das Verhalten für das Auswendiglernen dieses in Perspektive zu setzen (in Bezug auf PHP):
-
bindParam:
Hinweis -
bindValue:
Variable