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 :

Utilisation PDO::ATTR_EMULATE_PREPARES dans une connexion PDO [PDO]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Profil pro
    enseignant
    Inscrit en
    Juillet 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : enseignant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 33
    Points : 36
    Points
    36
    Par défaut Utilisation PDO::ATTR_EMULATE_PREPARES dans une connexion PDO
    Bjr
    question
    doit-on mettre cette propriété pour PDO à savoir PDO::ATTR_EMULATE_PREPARES à false ou à true?
    du moins pour les versions récentes de php et mysql
    certains conseillent de mettre à false ...
    y a-t-il une influence sur la performance et/ou la sécurité?


    d'autre part,
    j'ai déjà eu des problèmes avec fetch et fetchAll pour un select ...
    récupération d'un champ primary key integer en string avec le statement ?
    influence de cet attribut PDO::ATTR_EMULATE_PREPARES sur un tel comportement ...
    merci d'avance
    A+

  2. #2
    Nouveau membre du Club
    Profil pro
    enseignant
    Inscrit en
    Juillet 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : enseignant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 33
    Points : 36
    Points
    36
    Par défaut complément d'informations
    je complète ce message
    dans mon cas
    en mettant PDO::ATTR_EMULATE_PREPARES à true
    et en faisant un fetch avec la paramètre FETCH_ASSOC (récupération d'un tableau associatif avec les index correspondant aux noms des champs de la table mysql)
    je récupère un tableau avec les données en type string aussi bien pour les keys (qui sont en integer dans la structure SQL)

    en mettant PDO::ATTR_EMULATE_PREPARES à false
    et en faisant à nouveau un fetch avec même paramètre
    je récupère un tableau et les types sont corrects int pour les keys et string pour des varchar par exemple
    et en faisant un test de performance
    requête un peu plus longue que pour ATTR_EMULATE_PREPARES à true
    (ce qui me paraît normal)

    explication?
    quelqu'un a eu le même cas ...

    Donc si je laisse ATTR_EMULATE_PREPARES à true
    je dois caster les valeurs récupérées dans le tableau
    ou utiliser FETCH_FUNC avec une fonction de remplacement/transformation
    ce qui est un peu plus lent niveau performance (ce qui est aussi normal)

    A+

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    En mettant à true, PDO effectue lui-même les substitutions et échappe les paramètres, puis envoie à la BDD une requête complète. False veut dire que PDO envoie séparément la requête et les variables. En utilisant false, tu peux profiter du système de cache de ta BDD, ce qui peut te faire gagner en performance (parfois) dans certains cas.

    True est légèrement plus rapide que false, mais cette différence est négligeable.

    En termes de sécurité, les deux en théorie sont censés être équivalents. Les anciennes versions de MySQL n'avaient pas de rêquete préparées, d'où le recours à cette émulation. Maintenant, à toi de te poser la question: fais-tu plus confiance à PDO pour échapper correctement tes variables en fonction des différentes types, versions et sous versions de bases de données? Ou vaut-il mieux laisser la BDD faire ça elle-même? Autant dire qu'il ne faut pas prendre de risque, et mieux vaut utiliser false.

    Et effectivement, l'utilisation de rêquetes préparées natives retourne des types natives (int, etc...) depuis PHP 5.3, tandis que l'émulation caste toutes les valeurs en string. À toi de voir si c'est bon ou pas pour toi (par ex si tu fais des comparaisons strictes ou pas). Après, est-ce que tu as vraiment besoin de les caster explicitement? Sauf si tu utilises PHP 7 et les strict types, PHP va les convertir implicitement pour toi.

  4. #4
    Nouveau membre du Club
    Profil pro
    enseignant
    Inscrit en
    Juillet 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : enseignant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 33
    Points : 36
    Points
    36
    Par défaut réponse au message
    un grand merci pour ton commentaire
    A+

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

Discussions similaires

  1. utilisation de getdate() dans une fonction ?
    Par devdev dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 08/03/2005, 17h40
  2. Utilisation de Getdate dans une fonction
    Par BaronSamdi dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/11/2004, 10h12
  3. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  4. [Applet]Utiliser plusieurs Applet dans une même classe
    Par BRAUKRIS dans le forum Applets
    Réponses: 5
    Dernier message: 11/06/2004, 15h27
  5. Réponses: 3
    Dernier message: 11/03/2004, 10h58

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