But des requêtes préparées ?

Rechercher

But des requêtes préparées ?

Par Tef  -  4 reponses  -  Le 25/01/2009 14:26  -  Editer  - 

Re à tous.

Me revoilà avec ma nouvelle question. Je n'arrive pas à comprendre le but des requêtes préparées. Apparement, beaucoup semble dire que c'est pour une question de performance mais pas mal d'articles semble aussi dire que le gain de temps d'execution n'est pas vraiment flagrant.

Alors ma question est la suivante : Je parcours ton tuto sur le Guestbook et je vois que tu utilises dans ton controleur une requête préparée :

// Création d'une requête préparée$oPDOStatement = $oPDO->prepare('INSERT INTO '. DB_GUESTBOOK_TABLE .' (pseudo, message, note, creation) VALUES(:pseudo, :message, :note, NOW())');

Quelle est sont utilitée ? Pourquoi ne pas avoir faire de suite un :

$oPDOStatement = $oPDO->exec('INSERT INTO '. DB_GUESTBOOK_TABLE .' (pseudo, message, note, creation) VALUES(:pseudo, :message, :note, NOW())');

J'ai mis exec() et non query() car un simple INSERT n'attends rien en retour à contrario de SELECT.

J'ai bien compris la différence entre exec() et query() mais je ne comprends pas malgré mes recherches sur le net à quoi sert prepare()

Merci par avance d'éclairer ma lanterne ;)

A+

Stéphane

 

Réponses apportées à cette discussion

Par Emacs  -  Le 25/01/2009 14:39  -  Haut de page  - 

La requête préparée est effectivement plus performante à condition qu'elle soit exécutée au moins 2 fois dans la même page. En effet, une requête préparée est stockée du côté de MySQL. Elle est analysée et compilée une seule fois. De ce fait, lorsqu'elle doit être exécutée une seconde fois lors de la connexion, elle est directement utilisée avec les nouveaux paramètres. Elle n'est pas analysée à nouveau et recompilée puisque seuls les paramètres ont changé. Ainsi, son exécution est beaucoup plus rapide. On peut grosso modo comparer une requête préparée à un cache de pages web. Quand la page Web HTML est a été générée et cachée sur le serveur une première fois, alors à la seconde demande de la page, c'est ce fichier HTML qui est directement restitué, ce qui évite un nouveau process de calcul et de génération côté PHP.

Dans le cadre du tutoriel, nous ne gagnons rien en performance puisque chaque requête est exécutée une seule fois dans le script. On les utilise pour une autre raison tout aussi importante : la sécurité. En effet, les requêtes préparées sont beaucoup plus sûres que les requêtes écrites à la main car les données sont échappées correctement côté MySQL et non côté PHP. Cela permet ainsi de s'assurer que les données qui seront intégrées dans la requêtes sont sûres et ne risquent pas de causer d'injection SQL.

Pour plus d'informations sur les requêtes préparées, tu peux jeter un oeil ici (en anglais) : http://fr2.php.net/pdo.prepared-statements

++

 
Par Tef  -  Le 25/01/2009 14:45  -  Haut de page  - 

Super j'ai tout compris ! T'es bon pédagogue je te confirme ;) Je me suis tapé pas mal de site et chacun y va de ses mots plus où moins compliqué (surement pour se la péter...non j'suis méchant là ^__^) alors qu'avec des mots simples c'est tellement plus facile :)

...ou alors je suis pas fûte-fûte :)

Sinon je ne vais pas recréer un topic pour cela. Tu utilises sizeof au lieu de count. Une différence ? sizeof est un alias de count donc j'en déduis que ça fait exactement la même chose.

Merci Hugo ;)

 
Par Emacs  -  Le 25/01/2009 14:48  -  Haut de page  - 

Oui sizeof() est un alias de count(). J'utilise l'un ou l'autre selon mon humeur à vrai dire. J'aime bien sizeof() car pour un tableau on parle en général de "taille", ce qui a plus de sens (sémantiquement parlant) que "count". Mais bon après c'est une question de choix personnel.

 
Par Tef  -  Le 25/01/2009 14:50  -  Haut de page  - 

Oui effectivement ça parait logique :)

Merci pour tout ces éclaircissements !

P.S : j'ai répondu au post d'avant car je ne sais pas si tu t'es trompé dans ton tuto lors du copié/collé

Résolu ! ;)

Stéphane

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !

Identifiez-vous
Join |  ID/MDP? |