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 :

Requêtes préparées [PDO]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Par défaut Requêtes préparées
    Bonjour,

    Je ne suis pas sûre d'avoir compris le principe des requêtes préparées.
    Dans un tuto sur le PHP Orienté Objet, j'ai trouvé cet exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public FUNCTION ADD(Personnage $perso){
        $q = $this->_db->prepare('INSERT INTO personnages SET nom = :nom, forcePerso = :forcePerso, degats = :degats, niveau = :niveau, experience = :experience');
     
        $q->bindValue(':nom', $perso->nom());
        $q->bindValue(':forcePerso', $perso->forcePerso(), PDO::PARAM_INT);
        $q->bindValue(':degats', $perso->degats(), PDO::PARAM_INT);
        $q->bindValue(':niveau', $perso->niveau(), PDO::PARAM_INT);
        $q->bindValue(':experience', $perso->experience(), PDO::PARAM_INT);
     
        $q->execute();
    }
    Cette fonction ajoute un personnage a la base de données. Pas de soucis je comprends le code, mais je ne vois pas pourquoi il utilise une requête préparée.
    Parce que s'il veut ajouter plusieurs Personnage, la fonction sera appelée plusieurs fois, et donc le requête sera préparée plusieurs fois donc ça n'optimise rien au contraire, non ?

    Ce que je pense après avoir lu dans les doc, tuto et forum, c'est que ce serait uniquement pour une question de sécurité (pour éviter les injections PHP) et que ça optimiserait seulement si on avait plusieurs Personnage en argument

    Non ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 84
    Par défaut
    Hello,


    Comme dirait monsieur php.net :

    La plupart des bases de données supportent le concept des requêtes préparées. Qu'est-ce donc ? Vous pouvez les voir comme une sorte de modèle compilé pour le SQL que vous voulez exécuter, qui peut être personnalisé en utilisant des variables en guise de paramètres. Les requêtes préparées offrent deux fonctionnalités essentielles :

    La requête ne doit être analysée (ou préparée) qu'une seule fois, mais peut être exécutée plusieurs fois avec des paramètres identiques ou différents. Lorsque la requête est préparée, la base de données va analyser, compiler et optimiser son plan pour exécuter la requête. Pour les requêtes complexes, ce processus peut prendre assez de temps, ce qui peut ralentir vos applications si vous devez répéter la même requête plusieurs fois avec différents paramètres. En utilisant les requêtes préparées, vous évitez ainsi de répéter le cycle analyse/compilation/optimisation. Pour résumer, les requêtes préparées utilisent moins de ressources et s'exécutent plus rapidement.
    Les paramètres pour préparer les requêtes n'ont pas besoin d'être entre guillemets ; le driver le gère pour vous. Si votre application utilise exclusivement les requêtes préparées, vous pouvez être sûr qu'aucune injection SQL n'est possible (Cependant, si vous construisez d'autres parties de la requête en vous basant sur des entrées utilisateurs, vous continuez à prendre un risque).
    Les requêtes préparées sont tellement pratiques que c'est l'unique fonctionnalité que PDO émule pour les drivers qui ne les supportent pas. Ceci assure de pouvoir utiliser la même technique pour accéder aux données, sans se soucier des capacités de la base de données.
    RTFM

    ++
    zwaldo

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Par défaut
    Oui, mais ça ne répond pas à ma question -__-

    Je l'ai lu le manuel!
    Je sais que c'est génial quand on l'utilise plusieurs fois à la suite, qu'on gagne du temps parce qu'il n'y a plus tous les allers-retours client-serveur

    Ma question c'était pas "qu'est ce que c'est ? A quoi ça sert".

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 84
    Par défaut
    Re,

    Ce sont des requêtes déjà préparées en base, qui n'ont plus qu'a s'auto exécuter qd tu les appels, ça permet de gagner du temps sur l’exécution.
    Sur de grosses requêtes le temps gagné peu s’avérer énorme.
    Puisque les requêtes sont déjà préparées coté SQL, impossible de modifier cette requête pour faire de l'injection SQL.

    Je ne sais pas quoi te dire de plus ...

    zwaldo

  5. #5
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    Globalement je pense que préparer le même sql plusieurs fois conduit à une perte de performances (voire à une mauvaise conception).
    Maintenant, je sais qu'Oracle DB utilise un système capable de détecter si un même SQL est re-préparé. Dans ce cas, il utilise son système de cache pour y répondre au plus vite. Donc tu as effectivement une légère perte de perf mais c'est rien comparé à un moteur qui est dépourvu de ce genre de détecteur.

    Tu vas trouver la doc ici

    Par contre, je ne sais pas si MySQL est équipé de ça.

    Pour en revenir à ton code, c'est clair qu'il y a moyen de rendre ça plus optimal et éviter la re-préparation à chaque appel (d'autant plus qu'aucun paramètre ne change)

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Tu poses une bonne question, mais si j'ais une ou plusieurs requêtes à réaliser, de toute façon je ferais un prépare, car le fait d'utiliser les BIND-VALUE te sécurise de façon extra ! n'oublies pas cet aspect

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

Discussions similaires

  1. [PDO] Affichage d'une requête préparée
    Par Tchupacabra dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 25/02/2010, 03h48
  2. [PDO] Requête préparée
    Par Yoshio dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 16/10/2007, 12h07
  3. [PDO] Requête préparée, retour d'erreur à masquer
    Par speedev dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 20/06/2007, 10h39
  4. [PDO] Problème de requête préparée (à n'y rien comprendre?)
    Par waldo2188 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 20/03/2007, 21h53
  5. [PDO] Ma requêtes préparées me retourne false
    Par jeff_! dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 03/05/2006, 22h07

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