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'
bindValuemüssten Sie die Daten jedes Mal neu binden. Mit bindParammüssten Sie nur die Variable aktualisieren. Der Hauptgrund für die Verwendung bindValuewären statische Daten, z. B. Literalzeichenfolgen oder Zahlen.
Hier sind einige, über die ich nachdenken kann:
bindParamkönnen Sie nur Variablen übergeben. keine WertebindValuekönnen Sie beide übergeben (Werte natürlich und Variablen)bindParamfunktioniert 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 bindParamdiese 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 $valuenach 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]);