Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mieux vaut utiliser bindValue() ou bindParam() ?

    23 septembre 2011 à 21:36:30

    Bonsoir,

    En lisant le cours Concevez votre site web avec PHP et MySQL, je suis tombé sur cela : http://s3.noelshack.com/old/up/global-886e9bf727.png

    J'aimerais savoir quelle est cette meilleure méthode dont parle l'auteur, afin d'utiliser la connexion à la BDD en passant par le design pattern singleton.

    Et autre chose, bindParam() est utilisé au lieu de bindValue(). J'ai bien compris la différence entre les deux et si je me souviens bien, il est conseillé d'utiliser bindValue() si on ne compte pas ré-exécuter la requête en changeant les paramètres. Or là la requête n'est en effet exécutée qu'une seule fois et pourtant c'est bindParam() qui est utilisé...

    Encore quelque chose, une requête préparée est utilisée, seulement quelle en est l'utilité étant donné que les deux paramètres passés ne sont pas entrés par l'utilisateur ? Du coup, même en utilisant query(), aucune chance d'injection SQL. Alors pourquoi avoir préféré une requête préparée ? Faut-il partir du principe qu'à chaque fois qu'il y a un paramètre dans la requête, on utilise une requête préparée, même si aucun paramètre n'est saisi par l'utilisateur ?

    Et enfin toute dernière question, avec fetch() on peut préciser si on veut un objet (PDO::FETCH_OBJ), or avec fetchAll() cela me renvoit une erreur. Est-il possible d'obtenir des objets de fetchAll(), du genre $donnees->nom_auteur ?

    Tant de questions auxquelles je souhaite sincèrement avoir des réponses.

    Merci.
    • Partager sur Facebook
    • Partager sur Twitter
      23 septembre 2011 à 22:02:55

      Citation : Lunz

      J'aimerais savoir quelle est cette meilleure méthode dont parle l'auteur, afin d'utiliser la connexion à la BDD en passant par le design pattern singleton.


      Un singleton, c'est un peu plus propre et certainement plus pratique/transparent à l'usage qu'une variable globale.

      Citation : Lunz

      Et autre chose, bindParam() est utilisé au lieu de bindValue(). J'ai bien compris la différence entre les deux et si je me souviens bien, il est conseillé d'utiliser bindValue() si on ne compte pas ré-exécuter la requête en changeant les paramètres. Or là la requête n'est en effet exécutée qu'une seule fois et pourtant c'est bindParam() qui est utilisé...


      La différence ne réside pas réellement sur leur usage, elle n'est pas véritablement lié au nombre d'exécutions de la requête préparée mais dans la nature de ce que l'on binde avant tout. bindValue = une valeur quand bindParam = une variable. Cependant, il est vrai que bindParam prend tout son sens dans une exécution multiple surtout à contexte identique (une boucle, par exemple, sur un import de document XML via SimpleXML).

      Citation : Lunz

      Encore quelque chose, une requête préparée est utilisée, seulement quelle en est l'utilité étant donné que les deux paramètres passés ne sont pas entrés par l'utilisateur ?


      En effet, à moins qu'elles ne soient exécutées plusieurs fois (avec des valeurs différentes), ça n'a pas vraiment d'intérêt (au sens où, théoriquement, niveau performance, le temps de la préparation de la requête n'est pas amorti).

      Citation : Lunz

      Du coup, même en utilisant query(), aucune chance d'injection SQL. Alors pourquoi avoir préféré une requête préparée ?


      Si on n'utilise pas une requête préparée (méthode query ou exec), il faut échapper les données (outre les injections, la syntaxe de la requête doit être valide - quid des apostrophes/quotes dans vos données ?).

      Citation : Lunz

      Faut-il partir du principe qu'à chaque fois qu'il y a un paramètre dans la requête, on utilise une requête préparée, même si aucun paramètre n'est saisi par l'utilisateur ?


      A mon sens, comme écrit ci-dessus, ça n'a pas réellement d'intérêt si elle ne sert pas plusieurs fois. Dans le cas contraire, une requête non préparée et les échappements qu'il faut, suffit.

      Citation : Lunz

      Et enfin toute dernière question, avec fetch() on peut préciser si on veut un objet (PDO::FETCH_OBJ), or avec fetchAll() cela me renvoit une erreur. Est-il possible d'obtenir des objets de fetchAll(), du genre $donnees->nom_auteur ?


      C'est parfaitement possible d'indiquer le mode en paramètre à fetchAll. Et, oui, vous pouvez instancier des objets de vos propres classes (mode PDO::FETCH_CLASS - tout aussi valable pour fetch). (par ailleurs, il existe des options complémentaires à PDO::FETCH_CLASS)

      PS : à quoi bon ouvrir plusieurs sujets ?
      • Partager sur Facebook
      • Partager sur Twitter
        24 septembre 2011 à 12:12:01

        Et donc concrètement pour le singleton, je dois faire quoi ?

        Pour bindValue() et bindParam(), je dois utiliser lequel dans quel cas au final ?

        Pour fetchAll(), comme je l'ai dit, ça me renvoie une erreur quand je fais fetchAll(PDO::FETCH_OBJ), donc de quelle manière dois-je procéder ?
        • Partager sur Facebook
        • Partager sur Twitter

        Mieux vaut utiliser bindValue() ou bindParam() ?

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown