Frage

Was ist der Unterschied zwischen PDOStatement::bindParam() und PDOStatement::bindValue() ?

War es hilfreich?

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 zu PDOStatement::bindValue() wird die Variable als Referenz gebunden und wird nur zu dem Zeitpunkt ausgewertet werden, dass PDOStatement::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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top