Frage

Ich frage mich, was die Deklaration des Datentyps in bindParam() (oder bindValue() ) wird verwendet für ...

Ich meine, ich dachte, wenn ich ein Integer-Argument (PDO::PARAM_INT) definieren, muss das Argument auf eine ganze Zahl, so etwas wie

umgewandelt werden
$delete->bindParam(1, $kill, PDO::PARAM_INT);
// should work like
$delete->bindParam(1, (int)$kill);

oder zumindest einen Fehler aus, wenn das Argument nicht von dem deklarierten Typ ist. Aber dies ist nicht der Fall.

googeln herum, fand ich, dass in dem php.net Archiv:

  

Hallo,

     

Zur Zeit arbeite ich auf PDO. Genau   auf der bindParam () Funktion. Der dritte   Parameter data_type scheint hier zu sein   die Art des Wertes zu erzwingen? Aber   wenn ich versuche:

$sql = "INSERT INTO produit (idproduit, nom, marque) VALUES (NULL, :nom, :marque)";
$stmt = $dbh->prepare($sql);
$nom = 'Testarossa'; $marque = 'Ferrari' ;
$stmt->BindValue(':marque',$marque) ;
$stmt->BindParam(':nom',$nom,PDO::PARAM_INT) ;

$stmt->execute(); $nom = '250 GTO' ;
$stmt->execute(); ?>
     

Ich habe erwartet, entweder eine PHP haben   Fehler oder eine ganze Zahl in meiner Datenbank.   Aber in meiner DB hat ich:

     

22 Testa Ferrari 250 GTO 23   Ferrari

     

Es bedeutet, dass es nicht wenn ich nicht ändern   haben den dritten Parameter oder nicht. Oder   vielleicht fehlt mir etwas. Kann jemand   Tole mir mehr? Oder einfach kann jemand   sagte mir, wo ich Informationen finden   über sie.

     

Grüße,

     

Cyruss

Das ist genau meine Situation. Wo sind falsch meine Gedanken gehen?

War es hilfreich?

Lösung

In anderer DB Abstraktion Frameworks in anderen Sprachen kann es für Dinge verwendet werden, wie dafür, dass Sie die richtigen tun Flucht in-Futter-Werte (für Fahrer, die keine richtigen gebunden Parameter unterstützen) Netzwerkeffizienz und Verbesserung, indem sicher Zahlen sind binär in geeigneter Weise verpackt (gegebene Protokollunterstützung). Es sieht aus wie in PDO, es nicht viel tun.

   if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && param->max_value_len <= 0 && ! ZVAL_IS_NULL(param->parameter)) {
                if (Z_TYPE_P(param->parameter) == IS_DOUBLE) {
                        char *p;
                        int len = spprintf(&p, 0, "%F", Z_DVAL_P(param->parameter));
                        ZVAL_STRINGL(param->parameter, p, len, 0);
                } else {
                        convert_to_string(param->parameter);
                }
        } else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && Z_TYPE_P(param->parameter) == IS_BOOL) {
                convert_to_long(param->parameter);
        } else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_BOOL && Z_TYPE_P(param->parameter) == IS_LONG) {
                convert_to_boolean(param->parameter);
        }

Also, wenn Sie sagen, es ist ein STR (oder, wenn Sie nichts sagen, überhaupt so, dass der Standard ist) und interne Typ der Daten ist ein doppelter, dann wird es in eine Zeichenfolge mit einer bestimmten Methode drehen, wenn es nicht ein ist verdoppeln, dann wird es wandelt es in eine Zeichenfolge, die eine andere Methode verwendet wird.

Wenn Sie sagen, es ist ein int, aber es ist wirklich ein Bool dann wird es in eine lange umwandeln.

Wenn Sie sagen, dass es ein Bool ist, aber es ist wirklich eine Zahl, dann wird es zu einem echten boolean konvertieren.

Das ist wirklich alles, was ich (schnell) sah in der Anw Quelle suchen, ich stelle mir vor, wenn Sie die Parameter in den Treiber übergeben sie zusätzliche Magie tun. Also, ich würde vermuten, dass alles, was Sie bekommen, ist ein wenig das Recht zu tun und eine ganze Menge Verhalten Mehrdeutigkeit und die Varianz zwischen den Fahrern.

Andere Tipps

So entschied ich mich in den PHP-Quellcode zu tauchen und das ist, was ich gefunden habe.

static int really_register_bound_param in ext / gU / pdo_stmt.c auf Linie 329 von Version 5.2.9

if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && param->max_value_len <= 0 && ! ZVAL_IS_NULL(param->parameter)) {
    if (Z_TYPE_P(param->parameter) == IS_DOUBLE) {
        char *p;
        int len = spprintf(&p, 0, "%F", Z_DVAL_P(param->parameter));
        ZVAL_STRINGL(param->parameter, p, len, 0);
    } else {
        convert_to_string(param->parameter);
    }
} else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && Z_TYPE_P(param->parameter) == IS_BOOL) {
    convert_to_long(param->parameter);
} else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_BOOL && Z_TYPE_P(param->parameter) == IS_LONG) {
    convert_to_boolean(param->parameter);
}

Dies sind die Umwandlungen PDO hat während der Bindung.

  • PDO :: PARAM_STR konvertiert, was auch immer Sie es in einen String außer null geben.
  • PDO :: PARAM_INT wandelt bools in longs
  • PDO :: PARAM_BOOL wandelt longs in bools

Das ist es. Nichts anderes umgewandelt wird. PDO verwendet die PARAM Flags SQL formatiert werden nicht Datentypen zu werfen.

Es gibt mindestens einen Effekt PDO :: PARAM_INT hat auf INSERT Abfragen: Boolesche Werte umgewandelt werden, auf 0 oder 1. Wie in

$i = true;
$stmt->bindParam(':i', $v, PDO::PARAM_INT);

pdo_stmt.c:

else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && Z_TYPE_P(param->parameter) == IS_BOOL) {
        convert_to_long(param->parameter);
}

habe ich versucht, das Gleiche mit bindValue und bekam das gleiche Ergebnis, so das Verhalten auf Sie sehen nicht beschränkt auf bindParam.

$stmt->BindValue(':marque', $marque) ;
$stmt->BindValue(':nom', $nom, PDO::PARAM_INT) ;

$stmt->execute();
$nom = '250 GTO';
$stmt->BindValue(':nom', $nom, PDO::PARAM_INT) ;
$stmt->execute(); 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top