Was ist der Unterschied zwischen bindParam und bindValue?

Lesezeit: 4 Minuten

Was ist der Unterschied zwischen bindParam und bindValue
koen

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

Von die manuelle Eingabe für PDOStatement::bindParam:

[With bindParam] nicht wie PDOStatement::bindValue()die Variable wird als Referenz gebunden und nur zu diesem Zeitpunkt ausgewertet PDOStatement::execute() wird genannt.

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'

  • Genial, danke! Frage – warum möchten Sie vielleicht eine über der anderen verwenden? Wann wäre es zum Beispiel sinnvoll oder notwendig, den Bind-Parameter nur zum Zeitpunkt execute() auszuwerten?

    – Coldblackice

    17. Juli 2013 um 19:18 Uhr

  • @Coldblackice Wenn Sie die Abfrage mehrmals mit unterschiedlichen Daten ausgeführt haben. Mit bindValue Sie müssten die Daten jedes Mal neu binden. Mit bindParam Sie müssten nur die Variable aktualisieren. Der Hauptgrund für die Verwendung bindValue wären statische Daten, zB wörtliche Zeichenfolgen oder Zahlen.

    – einsamer Tag

    17. Juli 2013 um 20:53 Uhr

  • Beispielsweise möchten Sie bindValue mit Funktionsrückgabewerten verwenden: $stmt->bindValue(‘:status’, strtolower($status), PDO::PARAM_STR);

    – von Christus bezahlt

    20. Dezember 2018 um 0:10 Uhr

  • wollte upvoten, aber da es 666 ist, werde ich es belassen

    – Wirbel147

    31. März 2020 um 13:35 Uhr

Hier sind einige, an die ich denken kann:

  • Mit bindParam, Sie können nur Variablen übergeben ; nicht Werte
  • mit bindValueSie können beide übergeben (Werte natürlich und Variablen)
  • bindParam funktioniert nur mit Variablen, da Parameter per “Referenz” als Ein-/Ausgabe angegeben werden können (und ein Wert ist keine gültige “Referenz” in PHP) : Es ist nützlich bei Treibern, die (unter Angabe des Handbuchs) :

unterstützen den Aufruf gespeicherter Prozeduren, die Daten als Ausgabeparameter zurückgeben, und einige auch als Eingabe-/Ausgabeparameter, die sowohl Daten einsenden als auch aktualisiert werden, um sie zu empfangen.

Bei einigen DB-Engines können gespeicherte Prozeduren Parameter haben, die sowohl für die Eingabe (ein Wert von PHP an die Prozedur übergeben) als auch für die Ausgabe (Rückgabe eines Werts von der gespeicherten Prozedur an PHP) verwendet werden können; Um diese Parameter zu binden, müssen Sie bindParam und nicht bindValue verwenden.

  • @PascalMartin Genau das, was ich wissen wollte, können Sie Werte mit bindParam binden. Prost.

    – Jehuda

    28. März 2012 um 20:25 Uhr

  • Ich habe immer noch keine Ahnung, was das genau bedeutet, was genau die Variablen sind und was die Werte sind. Ich verwende bindParam, um einen Wert an einen Platzhalter zu binden, und mit bindValue kann ich dasselbe tun! – zumindest in meinem Beispiel…

    – Richard

    23. August 2012 um 6:28 Uhr


  • @Richard Variablen: $stmt->bindParam(':id', $id); Werte: $stmt->bindValue(':id', 1);. Beachten Sie, wenn wir ersetzen $id mit 1 in bindParam es wird ein Fehler ausgegeben.

    – Regen

    16. Oktober 2021 um 12:54 Uhr


Was ist der Unterschied zwischen bindParam und bindValue
akrosmann

Die Antwort ist 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

Rufen Sie PDOStatement::bindParam() auf, um PHP-Variablen an die Parametermarkierungen zu binden: Gebundene Variablen übergeben ihren Wert als Eingabe und erhalten den Ausgabewert, falls vorhanden, ihrer 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'

  • 👌👌👌👌👌👌👌👌👌👌👌👌

    – Ajmal Praveen

    29. Mai 2021 um 22:20 Uhr

Von Vorbereitete Anweisungen und gespeicherte Prozeduren

Verwenden bindParam So fügen Sie mehrere Zeilen mit einmaliger Bindung 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 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 sich verändern $value nach dem Laufen zu bespannen 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

Du musst nicht länger kämpfen, wenn es einen Weg wie diesen gibt:

$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]); 

Der einfachste Weg, dies für das Auswendiglernen durch Verhalten (in Bezug auf PHP) zu relativieren:

  • bindParam: Hinweis
  • bindValue: Variable

  • bindValue nimmt a Wert.

    – Benutzer2864740

    2. August 2020 um 19:33 Uhr

990650cookie-checkWas ist der Unterschied zwischen bindParam und bindValue?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy