Question

Je me demande quelle est la déclaration du type de données dans bindParam ( ) (ou bindValue () ) est utilisé pour ...

Je veux dire, je pensais que si je définissais un argument entier ( PDO :: PARAM_INT ), l'argument devait être converti en entier, comme

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

ou du moins jetter une erreur si l'argument n'est pas du type déclaré. Mais ce n’est pas le cas.

En cherchant sur Google, j'ai trouvé que dans les archives php.net:

  

Bonjour à tous,

     

Je travaille actuellement sur PDO. Exactement   sur la fonction bindParam (). Le troisième   paramètre data_type semble être ici   forcer le type de la valeur? Mais   quand j'essaye:

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

Je m'attendais à avoir soit un PHP   erreur ou un entier dans ma base de données.   Mais dans ma base de données, j'ai:

     

22 Testarossa Ferrari 23 250 GTO   Ferrari

     

Cela signifie que cela n’a pas changé si je   avoir le troisième paramètre ou non. Ou   peut-être me manque quelque chose. Quelqu'un peut-il   tole moi plus? Ou juste peut quelqu'un   m'a dit où je peux trouver des informations   à ce sujet.

     

Cordialement,

     

Cyruss

C'est exactement ma situation. Où est-ce que mes pensées vont mal?

Était-ce utile?

La solution

Dans d’autres frameworks d’abstraction de base de données dans d’autres langues, il peut être utilisé, par exemple, pour vous assurer que vous utilisez le bon échappement pour les valeurs in-lining (pour les pilotes ne prenant pas en charge les paramètres liés appropriés) et pour améliorer l’efficacité du réseau en rendant certains nombres sont correctement binaires emballés (support du protocole donné). On dirait qu’en AOP, cela ne fait pas grand chose.

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

Donc, si vous dites que c'est un STR (ou si vous ne dites rien du tout, car c'est la valeur par défaut) et que le type interne de vos données est un double, il le transformera en chaîne à l'aide d'une méthode, si ce n'est pas un double alors il va convertir en une chaîne en utilisant une autre méthode.

Si vous dites que c'est un int mais que c'est vraiment un bool, il le convertira en long.

Si vous dites que c'est un bool mais que c'est vraiment un nombre, il le convertira en un vrai booléen.

C’est vraiment tout ce que j’ai vu (rapidement) en regardant la source stmt. J'imagine que dès que vous transmettez les paramètres au pilote, ils peuvent créer une magie supplémentaire. Donc, je suppose que tout ce que vous obtenez est un peu de bien faire et beaucoup d’ambiguïté de comportement et de variance entre les conducteurs.

Autres conseils

J'ai donc décidé de plonger dans le code source PHP et voici ce que j'ai trouvé.

static int really_register_bound_param dans ext / pdo / pdo_stmt.c à la ligne 329 de la 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);
}

Il s’agit des conversions effectuées par PDO lors de la liaison.

  • PDO :: PARAM_STR convertit tout ce que vous lui donnez en chaîne sauf null.
  • PDO :: PARAM_INT convertit les bools en longs
  • PDO :: PARAM_BOOL convertit les longs en bools

C'est ça. Rien d'autre n'est converti. PDO utilise les indicateurs PARAM pour formater SQL afin de ne pas transtyper les types de données.

Il existe au moins un effet que PDO :: PARAM_INT a sur les requêtes INSERT : les valeurs booléennes sont converties en 0 ou 1. Comme dans

$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);
}

J'ai essayé la même chose avec BindValue et obtenu le même résultat. Le comportement que vous observez n'est donc pas limité à 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(); 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top