IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

PDO : Quel intérêt du pdo::param_* dans un bindValue() -> Requête préparé [PDO]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 18
    Points : 28
    Points
    28
    Par défaut PDO : Quel intérêt du pdo::param_* dans un bindValue() -> Requête préparé
    Bonjour, bon bon petite question du soir :)

    Cet après midi j'ai effectué quelques test, pour voir l'utilité de PDO::PARAM_INT/PDO::PARAM_STR/PDO::PARAM_BOOL etc.
    Je me suis dit, "ah tient je vais essayer de faire passer une chaine de caractère tout en lui imposant un PDO::PARAM_INT", et au final, ça passe quand même.

    Alors j'aimerais savoir a quoi sert réellement cet attribut ? Car sans, ça reviens au même, mais je dois me tromper ? :o

    exemple d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    /* Exécute une requête préparée en associant des variables PHP */
    $calories = 150;
    $couleur = 'rouge';
    $sth = $dbh->prepare('SELECT nom, couleur, calories
        FROM fruit
        WHERE calories < :calories AND couleur = :couleur');
    $sth->bindValue(':calories', $calories, PDO::PARAM_INT);
    $sth->bindValue(':couleur', $couleur, PDO::PARAM_STR);
    $sth->execute();
    ?>

    source : http://www.php.net/manual/fr/pdostatement.bindvalue.php

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    C'est au cas ou le sgdb le gère.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 18
    Points : 28
    Points
    28
    Par défaut
    Merci pour ta réponse, mais peux tu m'en dire un peu plus ?

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Ça a tout son sens pour des clauses comme LIMIT, par exemple (un bind en non int, déclenchera une erreur de syntaxe).
    Et encore faudrait-il ne pas se baser sur une expérimentation sur des pilotes PDO mal-conçus ou "spécifiques". Exemple : celui de MySQL, qui considère avant tout le type de la variable PHP plutôt que la constante PDO::PARAM_* (bien qu'en réalité ce soit un peu plus complexe, car la base - pdo - peut d'abord assurer une partie du travail sur la base de la constante - conversion vers string notamment).

    Illustration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $select = $dbh->prepare('SELECT * FROM utilisateurs ORDER BY login ASC LIMIT :offset, :row_count');
    // ...
    $select->execute(array(..., 'offset' => 10)); // bindé comme string : erreur de syntaxe
    $select->bindValue('offset', 10/*, PDO::PARAM_STR*/); // idem
    $select->bindValue('offset', $_GET['offset'], PDO::PARAM_INT); // insuffisant, serait bindé comme string (toute variable externe est une chaîne)
    $select->bindValue('offset', intval($_GET['offset']), PDO::PARAM_INT); // cast nécessaire pour pdo_mysql pour avoir un type int à la base

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 18
    Points : 28
    Points
    28
    Par défaut
    Bonsoir et merci, tes exemples sont compréhensible mais ça ne me réponds pas trop à ma question.

    Dans ce cas là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $select->bindValue('offset', intval($_GET['offset']));
    Est-ce qu'il fonctionnerais ? Si on met le intval, je trouve un peu inutile de préciser le bindParam_INT ?
    Peux tu m'expliquer ceci ?

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Non, ça, ce serait bindé comme une string, quel que soit le SGBD. A cause de la valeur par défaut du troisième paramètre (PDO::PARAM_STR - cf doc). Et, comme je le disais, c'est l'extension pdo même qui ferait alors la conversion vers string.
    1. Tout d'abord, pdo, du fait du type indiqué PDO::PARAM_STR effectuerait la conversion en string
    2. Ensuite, passant après, le pilote (pdo_xxx) ne verra donc pas un type int mais string, pour la donnée, qu'il respectera

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    static int really_register_bound_param(struct pdo_bound_param_data *param, pdo_stmt_t *stmt, int is_param TSRMLS_DC)
    /* ... */
    if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && param->max_value_len <= 0 && ! ZVAL_IS_NULL(param->parameter)) {
    /* ... */
    	convert_to_string(param->parameter);
    /* ... */
     
    /* puis transmission au pilote */

    Justement, en théorie, ce n'est pas [le type de] la valeur PHP qui dicte le type SQL mais bien la constante PDO::PARAM_* indiquée en troisième paramètre. Après ça dépend du SGBD, de son API et de comment est codé le pilote.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 18
    Points : 28
    Points
    28
    Par défaut
    D'accords, je viens de faire un petit test, et dans mon gdbd la convertion ce fait toute seule apparemment, même qu'il y est un param_str.

    Merci pour ces explications !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quels sont les intérêts d'intégrer spring dans struts 2
    Par tamildark dans le forum Struts 2
    Réponses: 1
    Dernier message: 09/12/2010, 17h19
  2. Réponses: 1
    Dernier message: 14/11/2005, 11h04
  3. Attribut public, quel intérêt?
    Par FCDB dans le forum Langage
    Réponses: 6
    Dernier message: 18/09/2005, 00h44
  4. Quels sont les caracteres interdits dans ACCESS?
    Par DocA dans le forum Access
    Réponses: 14
    Dernier message: 17/06/2005, 14h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo