433 Stimmen

Was ist der Unterschied zwischen bindParam und bindValue?

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

721voto

lonesomeday Punkte 224087

De der manuelle Eintrag für PDOStatement::bindParam :

[Mit bindParam ] Im Gegensatz zu PDOStatement::bindValue() ist die Variable als Referenz gebunden und wird nur zu dem Zeitpunkt ausgewertet, zu dem 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'

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'

232voto

Pascal MARTIN Punkte 384469

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.

230voto

acrosman Punkte 12575

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'

34voto

Nezar Fadle Punkte 1225

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();

30voto

Denilson Sá Maia Punkte 43844

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 er execute() . Dies kann natürlich zu subtilen Fehlern führen, die schwer zu erkennen sind.

出典 http://php.net/manual/en/pdostatement.bindparam.php#94711

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X