Frage

Das Pdostatement :: bindValue () Die Methode bietet eine Möglichkeit, den Typ der Variablengrenze anzugeben:

Pdostatement :: bindValue ($ parameter, $ value [,, $ data_type = pdo :: param_str ] )

Ich frage mich, was ist der Zweck der Angabe des Datentyps, während Sie als Standard (standardmäßig) (PARAM_STR) Schließlich wird die Datenbank den Wert sowieso auf den richtigen Typ wirken, bevor sie sie verwenden?

Zum Beispiel, wenn Sie diese Fragen über eine haben INTEGER aufstellen:

INSERT INTO table (integerField) VALUES (?) ;
SELECT * FROM table WHERE integerField = ?  ;

Und Sie binden eine Ganzzahl in PHP. PDO wird sie standardmäßig als Zeichenfolge binden, was äquivalent ist wie bei:

INSERT INTO table (integerField) VALUES ("1") ;
SELECT * FROM table WHERE integerField = "1"  ;

Das wird einwandfrei funktionieren, da die SQL -Datenbank (zumindest MySQL, ich weiß nicht wirklich, wie dies auf anderen RDBMs funktionieren würde) weiß, wie man die Zeichenfolge vor dem Einsatz in eine Ganzzahl umwandeln.

Was sind die Anwendungsfälle, in denen sie einen Unterschied zu gebundenen typisierten Parametern im Vergleich zu Zeichenfolgen machen würden?

War es hilfreich?

Lösung

Ich bin kein PDO-Expert, aber ich kann mir ein paar Szenarien vorstellen, in denen der Parameter Data_type sowohl nützlich als auch benötigt ist.

Ausgabeparameter

Wenn Sie Ausgabe- oder Eingangs-/Ausgangsparameter definieren, müssen Sie sowohl die Art als auch die Länge des erwarteten Ausgangsparameters bereitstellen.

Ref: http://www.php.net/manual/en/pdo.prepared-statements.php

Beispiel #4

$stmt = $dbh->prepare("CALL sp_returns_string(?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); 

Beispiel #5

$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
$value = 'hello';
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); 

DBMs ohne implizites Casting

In einer anderen Antwort auf diese Frage erklärt ...

Wenn der Parameter nicht an gegossene Daten gebunden ist

Selbst Datenbanken mit Casting -Fähigkeiten können Sie nicht immer korrekt variablen.

Ref: Gründe, um Parameter in PDO stark einzuleiten?

$limit = 1;

$dbh->prepare("SELECT * FROM items LIMIT :limit");
$dbh->bindParam(":limit", $limit, PDO::PARAM_STR); 
// Will throw "You have an error in your SQL syntax..."

Andere Tipps

Dies dient hauptsächlich zum Interagieren mit Datenbanken, die eine korrekte Eingabe erfordern. Wenn Sie beispielsweise den strengen Modus in MySQL aktivieren, erhalten Sie Fehler (fehlgeschlagene Abfragen) anstelle von Warnungen, wenn Typenfehlanpassungen vorhanden sind.

Standardmäßig tut MySQL das Beste, um Daten ordnungsgemäß umzuwandeln. Wenn Sie jedoch in einem Datumsfeld 0000-00-00 gesehen haben, ist dies sehr wahrscheinlich das Ergebnis von MySQL, der versucht, eine Zeichenfolge in ein Datum umzuwandeln und fehlschlägt. Im strengen Modus würde die Abfrage fehlschlagen, anstatt zu versuchen, zu konvertieren und zu verwenden, was das Ergebnis ist.

Der Datentypparameter zu pdostatement :: bindValue () ist nicht besonders nützlich. Im Wesentlichen:

  • Wenn Sie es pdo :: param_str mitteilen, wandelt es Ihren Wert in eine Zeichenfolge um.
  • Wenn Sie es pdo :: param_int sagen und einen booleschen übergeben, wandelt es ihn in eine lange um.
  • Wenn Sie es pdo :: param_bool sagen und es lange übergeben, wandelt es es in einen Booleschen um.

Nichts anderes scheint konvertiert zu werden. Sehen hier Für einen kurzen Blick auf den Quellcode und eine etwas bessere Erklärung. Am wichtigsten ist vielleicht, dass PDO keine Ausnahme auswirft oder einen Fehler erzeugt, wenn Sie Daten mit einem Typ übergeben, der nicht mit dem von Ihnen bestandenen Datentyp übereinstimmt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top