Was ist der Unterschied zwischen PDOStatement::bindParam()
y PDOStatement::bindValue()
?
Antworten
Zu viele Anzeigen?De der manuelle Eintrag für PDOStatement::bindParam
:
[Mit
bindParam
] Im Gegensatz zuPDOStatement::bindValue()
ist die Variable als Referenz gebunden und wird nur zu dem Zeitpunkt ausgewertet, zu demPDOStatement::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'
o
$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 mir einfallen:
- Mit
bindParam
können Sie nur Variablen übergeben, keine Werte. - mit
bindValue
können Sie beides übergeben (natürlich Werte und Variablen) bindParam
funktioniert nur mit Variablen, da es die Übergabe von Parametern als Eingabe/Ausgabe per "Referenz" ermöglicht (und ein Wert ist keine gültige "Referenz" in PHP) : Es ist nützlich bei Treibern, die (Zitat aus dem Handbuch) :
unterstützen den Aufruf von gespeicherten Prozeduren, die Daten als Ausgabeparameter zurückgeben Parameter zurückgeben, und einige auch als Eingabe-/Ausgabeparameter, die sowohl Daten senden Daten senden und aktualisiert werden, um sie zu empfangen.
Bei einigen DB-Engines können gespeicherte Prozeduren Parameter haben, die sowohl für die Eingabe (Übergabe eines Wertes von PHP an die Prozedur) als auch für die Ausgabe (Rückgabe eines Wertes von der gespeicherten Prozedur an PHP) verwendet werden können; um diese Parameter zu binden, müssen Sie bindParam und nicht bindValue verwenden.
Die Antwort finden Sie 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
PDOStatement::bindParam() aufrufen, um PHP-Variablen an die Parametermarken zu binden: gebundene Variablen übergeben ihren Wert als Eingabe und erhalten gegebenenfalls den Ausgabewert ihrer zugehörigen Parametermarken
例
$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'
o
$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'
De Vorbereitete Anweisungen und gespeicherte Prozeduren
Utilice bindParam
um mehrere Zeilen mit einer Zeitbindung 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 bindValue
.
bindParam
hat zwei schwierige oder unerwartete Verhaltensweisen:
bindParam(':foo', 4, PDO::PARAM_INT)
funktioniert nicht, da es die Übergabe einer Variablen (als Referenz) erfordert.bindParam(':foo', $value, PDO::PARAM_INT)
wird sich ändern$value
zu einer Zeichenkette, nachdem erexecute()
. Dies kann natürlich zu subtilen Fehlern führen, die schwer zu erkennen sind.
出典 http://php.net/manual/en/pdostatement.bindparam.php#94711
- See previous answers
- Weitere Antworten anzeigen