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 :

Quand faut-il préparer une requête ?


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 4
    Par défaut Quand faut-il préparer une requête ?
    Bonjour,

    Je développe en procédurale depuis plusieurs années et je me suis récemment mit à la POO et à PDO. Il y a quelque chose que je ne saisi pas, c'est quand faut-il utiliser les requêtes préparés.

    Partout sur internet ont peut lire "elles doivent êtres utilisés pour les requêtes qui sont utilisés plusieurs fois mais avec des paramètres différents". Tant mieux si vous comprenez, mais moi je ne comprend pas si la requête doit être exécuté plusieurs fois dans le même script avec des paramètres différents, ou si c'est une seule requête dans un script dont les paramètres changent en fonction de l'internaute par exemple.

    Si je prend un exemple, une requête qui liste les sujets d'un forum, il y a au moins un paramètre qui change en fonction du forum demandé, c'est dans ce cas là qu'il faut préparer ?

    Je vous remercie d'avance.

  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
    Par défaut
    Sous toute réserve des mécanismes de mysql, l'effet de la préparation n'est valable que sur le script en cours.

    La préparation sert également à protéger les chaînes.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    En mettant le coté protection des chaines (ce qui en soit, suffit à utiliser la préparation tout le temps ou presque), voici un exemple ou la préparation sera réellement efficace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $sql->prepare('UPDATE users SET champs = :val WHERE id = :idUser');
    foreach($users as $user)
        $sql->execute(array(':val'=>rand(0,5000),':idUser'=>$user->id);
    Tu prépares une fois ta requêtes , puis pour chaque utilisateur on l'exécute avec des paramètres différents.

    Personnellement , à partir du moment ou ma requête comporte des entrée utilisateurs , c'est une requête préparé. Je reste sur un simple query lorsque je fait des requêtes sans paramètres , voir des paramètres interne à mon appli dont je suis absolument certains.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    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
    Par défaut
    En fait j'ai la même démarche que Grunk.
    La préparation étant plus lente qu'une execution directe pour une requête seule.

    - requête avec données externes -> préparation
    - requête repétée -> préparation
    - requête avec données internes -> execution directe
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre chevronné
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Par défaut
    En cas de doute: prépare !

    ... et si jamais tu éprouve des problèmes de performances ( chose très théorique ), et bien tu pourra exécuter directement.


    Pour ma part s'il n'y a pas de paramètre, j'exécute directement. Sinon, interne ou externe, je prépare.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je n'aimes pas beaucoup l'expression: protection, bien sur nous sommes nombreux(ses) a comprendre ce dont il sagit, mais sur les trois forum ou je suis fréquement j'ais trop lue,
    "Alors Mon POST ou mon GET sont securisés ?"

    Je dis cela juste parcequ'il nous appartient de ne pas laisser se répendre tel confusion

  7. #7
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    Comment est gérée la transaction avec une requete préparée?

    Je veux dire est-ce que ça démarre une transaction au moment de la préparation ou la préparation reste de la sauce interne au driver?

    Si la transaction est démarré au moment de la préparation à quel moment s'arrete-t'elle?

    Est-ce qu'il est possible que ma question soit completement stupide? faut dire que j'utilise le pilote historique de mysql surcouche maison qui ne gère pas les préparations de requetes à ma connaissance.

  8. #8
    Membre chevronné
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Par défaut
    Excellente question.
    Mais que la préparation soit faite ou pas, ca ne change strictement rien car préparer une requête ne modifie aucune donnée.

    C'est seulement lorsque tu exécute une requête préparée que des données sont modifiés.

    Par curiosité, pourrais-tu nous donner un exemple d'un cas pratique où il est utile de démarrer une transaction entre la préparation et l'exécution...

  9. #9
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    je ne prépare pas mes requetes, je viens d'une époque ou PDO n'existait pas.

    j'imagine qu'il y a des contextes massivement concurrent ou ça peut être utile.

    j'imagine aussi une requete préparée, et une exception PHP levée entre le prépare et le execute, si ya une transaction qui démarre, des connexions persistantes...

    C'est aussi parce qu'il m'arrive d'ecrire LOCK TABLES table1 READ, table2 READ.. (ok 1 fois dans une vie) dans mon code. Si je prépare et que j'execute j'aimerai avoir la compréhension de savoir à quelle ligne de code commence mon verrou et ou il se termine.

  10. #10
    Membre chevronné
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Par défaut
    La préparation ne sert qu'à demander au serveur de préparer un plan d'exécution logique pour l'exécution. Sauf erreur de ma part, je pense pas qu'il y ai de verrou pendant la préparation puisqu'il n'y a aucune données de modifié ou de lus.

    Pour vulgariser, avant, tu faisais un mysql_query() qui "préparait et exécutait". Maintenant tu as la possibilité de séparer les deux afin de ne préparer qu'une seule fois une exécution multiple, et accessoirement de "protéger" (voir les notice à ce sujet) les valeurs de la requête.

    Personnellement, je n'ai jamais eu à intéragir avec la base de données entre le prepare() et le execute(). C'est un peu plus clair ou je ne fais qu'embrouiller les choses ?

Discussions similaires

  1. quand faut il ferme une socket systeme
    Par ikuzar dans le forum Réseau
    Réponses: 1
    Dernier message: 23/02/2011, 18h13
  2. [AJAX] Que se passe t'il quand une requête est envoyé ?
    Par whitespirit dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 31/07/2008, 08h28
  3. Quand faut-il creer une autre instance ?
    Par flatron dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/02/2008, 20h34
  4. Requête sélection ID quand un champ a une valeur
    Par thegreatbato dans le forum SQL
    Réponses: 3
    Dernier message: 20/11/2007, 14h23
  5. [MySQL] Pb d'une requête insert quand il y a un ' dans un champs de texte
    Par Lolie11 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 11/06/2007, 10h57

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