Vous êtes sur la page 1sur 6

7/9/2014

Requte Prpare

Derniers jours : 3 mois offerts sur le Premium, jusqu'au 7 septembre seulement ! Franais
COURS

FORUMS

LIBRAIRIE

TUDES

EMPLOI

Devenez Premium

Rechercher
Accueil

Informatique

Connectez-vous

Requte Prpare

Requte Prpare

Moyen

Les requtes prpares (Anglais : prepared statements) sont des requtes qui, comme le nom l'indique sont prpares et
donc qui permettent d'automatiser une requte qui apparat souvent et ainsi allger le temps de traitement (ceci n'a
d'intrt que pour les requtes auxquelles fait souvent appel une session, nous verrons plus bas pourquoi).

Explication

Requte prpare : MySQL 4.1 et suprieur.

Avant de continuer dans les explications thoriques, prcisons ce que ne sont pas les requtes prpares. Les requtes
prpares ne sont pas des procdures stockes (Procdures stockes : en terme simple on peut comparer a des requtes
prpares mais globales, ainsi il est possible de prparer des procdures et de les appeler quelle que soit la session), en
termes simples cela veut dire que la requte qui sera stocke ne le sera que pour la session ('thread'), ainsi lors de
l'utilisation ou lors de la mise en place d'un systme se servant de ce systme, demandez-vous si cela correspond bien vos
besoins.
Schma d'une requte normale :
1 : envoi de la requte par le client vers le serveur
2 : compilation de la requte
3 : plan d'excution par le serveur
4 : excution de la requte
5 : rsultat du serveur vers le client
Schma d'une requte prpare :
Phase 1 :
http://fr.openclassrooms.com/informatique/cours/requete-preparee-1

1/6

7/9/2014

Requte Prpare

1 : envoi de la requte prparer


2 : compilation de la requte
3 : plan d'excution par le serveur
4 : stockage de la requte compile en mmoire
5 : retour d'un identifiant de requte au client
Phase 2 :
1 : le client demande l'excution de la requte avec l'identifiant
2 : excution
3 : rsultat du serveur au client
Comme nous le voyons, la requte prpare se fait avec plus d'tapes, ce qui explique qu'elle ne devient intressante que
dans le cadre d'une utilisation rpte d'une requte.

Cadre d'exploitation

Outre cet aspect purement technique, il existe deux autres raisons qui peuvent justifier l'utilisation d'une requte prpare :
- limiter la bande passante utilise entre le client et le serveur : d au fait que l'change d'informations est limit au strict
minimum.
- viter les injections Sql : cela concerne la scurit et vite que les informations rentres par un client ( travers un
formulaire par exemple) soient interprtes.

Comme nous l'avons vu ce type de requte est limit la session (voir thread) d'un utilisateur.
Afin de comprendre ce qui est mis en jeu, simulons une personne visitant une page crite en Php que nous appelerons
ma_page.php qui contiendra des requtes la base de donnes (les requtes faites dedans ont peu d'importance, l'intrt
tant d'ouvrir une connexion la base de donnes).
Bien sr afin de pouvoir effectuer les requtes contenues dans cette page, il sera ncessaire pour la page d'ouvrir une
connexion (en Php cela se fait l'aide de mysql_connect).
Lors de l'appel cette fonction, plusieurs paramtres vont tre fournis qui, s'ils sont corrects permettront la page d'ouvrir
une session. Cette session ouverte aura un numro au niveau de MySQL. Ainsi si plusieurs personnes consultent cette mme
page en mme temps, MySQL sera capable de les distinguer (si vous lancez MySQL en ligne de commande vous pourrez
d'ailleurs remarquer qu'un id de session vous est allou).
Cela implique donc que chaque session peut travailler en parallle des autres ce qui permet d'viter le chaos qu'il pourrait
rgner sans ce systme.

Utilisation

Voil pour la thorie mais pourquoi je vous explique cela me direz-vous ?


Tous simplement car il faut bien comprendre qu'une fois que cette connexion sera lance, une session sera cre et que
dans le cas de Php (avec un comportement par dfaut) la connexion se terminera soit avec la rencontre de la fonction
mysql_close, soit la fin de la page.
Ainsi durant cet intervalle, si une requte ayant toujours le mme aspect (dont seuls les paramtres changent) est rpte
plusieurs fois alors il est intressant d'utiliser ce systme.

Cette partie va vous montrer comment procder afin de mettre en place ce systme, lors de vos tests, je vous conseille
fortement de tester la requte directement en ligne de commande.
Prparation d'une procdure :
sql

1 PREPARE identifiant FROM 'requete' ;

Ceci est la forme de base pour dclarer une requte prpare, ceci dit ce n'est pas tout car bien sr l'intrt de ce type de
choses est de pouvoir dclarer des paramtres dans la requte mais rien de mieux qu'un exemple afin de vous faire
comprendre :
sql

1 PREPARE test FROM 'SELECT * FROM matable WHERE ID=?';


http://fr.openclassrooms.com/informatique/cours/requete-preparee-1

2/6

7/9/2014

Requte Prpare

Comme vous pouvez le remarquer la requte n'a rien d'exceptionnel si ce n'est le '?' qui apparat la place du numro d'id
auquel on pourrait s'attendre, et c'est ce '?' qui va vous permettre de rendre vos requtes paramtrables souhait.
Le '?' prsent dans la requte reprsente donc une variable.
Dclaration de la variable :
sql

1 SET @mavariable=X ;

Bien sr dans le cadre de l'exemple ci-dessus, le X vaudra un chiffre et 'mavariable' sera le nom de cette variable.
Excution de la requte :
sql

1 EXECUTE test USING @mavariable ;

On va demander l'excution de la requte prpare ayant en identifiant du nom de 'test' et on va lui assigner la variable
'@mavariable' (rappelons que le @ reprsente dans MySQL une variable utilisateur de session)
Comme vous le voyez l'utilisation est relativement simple cependant il vous appartient de faire attention dans le cas o vous
assigneriez une requte prpare avec un nom qui correspondrait une requte prpare dj existante, effectivement, si
cette nouvelle requte choue, alors l'ancienne requte prpare ne sera plus disponible (MySQL effectue un DROP
PREPARE identifiant ; avant de procder la mise en place de la nouvelle requte).
Suppression d'une requte :
Vous pouvez supprimer une requte prpare l'aide de :
sql

1 DROP PREPARE identifiant ;

ou
sql

1 DEALLOCATE PREPARE identifiant ;

Connatre les utilisateurs connects au serveur :


Une fois connect avec une session en ligne de commande, tapez :
sql

1 SHOW processlist;

Remarquez qu'il est possible de mettre plusieurs '?' afin de mettre plusieurs paramtres. En ce cas, l'appel se fera
sous la mme forme, la seule diffrence tant lors de l'appel qui comprendra chaque variable spare par une
virgule, et le nombre de variables devra tre gal au nombre de '?'.
Exemple :
sql

1 PREPARE test FROM 'SELECT * FROM matable WHERE ID = ? AND nombre > ?'

L'appel se fera alors par :


sql

Manipulation

1 EXECUTE test USING @mavariable , @mavariable2 ;

Ici nous allons un peu nous amuser en manipulant des sessions afin de voir exactement ce qu'il ce passe, ce qui permettra
ceux n'ayant pas tout compris de lever le voile travers une manipulation qui se veut simple mais nanmoins complte.
Ncessaire :
- 1 serveur MySQL 4.1 ou suprieur (disponible sur le site officiel www-fr.mysql.com) avec si possible une installation par
dfaut.
- la base de donnes WORLD en .sql disponible sur le site officiel MySQL.
Bien, maintenant que vous avez votre serveur MySQL install, il est temps de passer la manipulation proprement dite, pour
http://fr.openclassrooms.com/informatique/cours/requete-preparee-1

3/6

7/9/2014

Requte Prpare

cela nous allons ouvrir une premire fentre MySQL en ligne de commande (Dmarrer->Programmes->MySQL->MySQL
Server 4.1->MySQL Command Line Client.
L, si vous avez effectu correctement la manipulation, vous devriez avoir une petite fentre qui est ouverte vous
demandant un mot de passe (celui que vous avez mis l'installation), une fois le mot de passe accept, vous arrivez sur le
prompt de MySQL qui se prsente sous la forme : mysql>, ce prompt est juste l comme point de repre et n'implique rien,
vous pouvez donc le changer votre convenance, dans notre cas, nous allons le renommer afin de nous y retrouver parmi les
diffrentes fentres qui seront ouvertes en fin de manipulation.
Tapez =>prompt fenetre1> et validez.
Comme vous pouvez le remarquer, le prompt a chang
Maintenant que ceci est fait, ouvrez une deuxime fentre de la mme manire et changez-en le prompt en fenetre2>.
A ce point de la manipulation, nous avons deux fentres MySQL qui sont ouvertes si tout est correct.
Rendez-vous sur la premire fentre et tapez =>SHOW processlist; et validez.
Un tableau s'affiche vous rcapitulant des informations, en l'occurence, cela vous indique que vous avez deux sessions de
lances avec respectivement le numro de session, l'utilisateur connect, l'hte et son port de connexion, la base de
donnes o se trouve l'utilisateur (gale NULL pour le moment ce qui est normal), et diverses autres choses dont le info qui
vous permet de voir la session qui a effectu le SHOW processlist;.
A ce stade, nous voyons que chaque session est normalement indpendante de l'autre mais afin de nous en assurer, passons
la suite de la manipulation.
Bien maintenant dans une des deux fentres, entrez ceci :
sql

1 CREATE DATABASE world;


2 USE world;

et validez dans les deux fentres. Ceci nous a permis de crer une base de donnes appele world et de se rendre dessus.
Il est maintenant ncessaire de la remplir, pour cela nous allons avoir besoin du world.sql que vous avez normalement
rcupr (voir Ncessaire), ouvrez le rpertoire o il est stock.
Maintenant, tapez => source mais sans valider puis faites glisser le fichier world.sql dans la fentre ou vous avez tap ceci.
Vous devriez donc maintenant tre en prsence d'une chose dans ce genre :
source "lecteur:\repertoire\world.sql"
Bon ce n'est pas fini, virez les guillemets puis ajoutez ; la fin. Vous tes dsormais en prsence de quelque chose sous la
forme :
source lecteur:\repertoire\world.sql;
Validez et patientez un petit peu, les tables et les enregistrements sont en cours de cration.
Nous allons vrifier que tous s'est bien pass en tapant ceci :
SHOW TABLES;
l vous aurez 3 tables si tout s'est droul correctement (de toute faon dans le cas contraire vous aurez 1-N bips vous
signalant des erreurs, ce en quoi vous avez fait une mauvaise manipulation).
Bien passons maintenant la partie finale qui est notre but. Tester les requtes prpares (oui on y arrive enfin

).

Premire tape, une requte prpare qui nous permettra de rcuprer des pays.
Mettez-vous sur l'une des deux fentres sur laquelle vous resterez pour le moment et tapez ceci :
sql

1 PREPARE pays FROM 'SELECT Name FROM Country WHERE Name LIKE ?';
2 SET @p='%fr%';
3 EXECUTE pays USING @p;

puis validez.
Comme vous le voyez ceci vous sort la liste des pays contenant fr dans leur nom.
Vous pouvez bien sr remplacer la valeur de la variable afin de trouver autre chose et faire des tests par vous-mme. Ainsi,
une fois que vous aurez modifi la variable l'aide de SET, vous n'aurez plus qu' rappeler la requte avec EXECUTE.
Remarquez qu'un oubli du @ dans la requte EXECUTE ne provoquera qu'une erreur vous signalant une mauvaise syntaxe.

http://fr.openclassrooms.com/informatique/cours/requete-preparee-1

4/6

7/9/2014

Requte Prpare

Bien maintenant passez l'autre fentre et essayez de lancer une requte l'aide :
sql

1 EXECUTE pays USING @p;

Vous aurez alors l'erreur suivante :


ERROR 1243 (HY000): Unknown prepared statement handler (pays) given to EXECUTE
Ceci est d au fait que la requte prpare demande n'est pas trouve.
Conclusion, comme nous l'avons vu tout au long de ce tutorial, ceci est d au fait que si effectivement la requte existe dans
la session o elle a t dclare, dans une autre session elle ne sera pas accessible.

Dfinitions
Cette partie est l afin de dvelopper tous les termes qui peuvent paratre obscurs de prime abord.
Thread : on parle de thread (flux en Franais) dans ce cas afin de dsigner une session ouverte par un utilisateur. Cette
session est rgie par des rgles qui dpendent des paramtres du serveur mais aussi des moteurs de stockages utiliss
(sachant que ceci peut aussi tre rgl au niveau du serveur).

Moteur de Stockage : il existe 5 types disponibles avec MySQL qui sont MyISAM, InnoDB, BDB, MERGE, HEAP. Ces moteurs
ont des caractristiques qui leur sont propres et qui devront tre choisies en fonction des besoins de la personne qui met en
place la base de donnes.
Les spcificits de chaque moteur seront traites dans un futur tutoriel pour des raisons pratiques
Ligne de commande : on parle d'interface en ligne de commande afin de dsigner les processus sans interface et qui ne
proposent comme toute interactivit qu'un 'prompt'.
Par exemple une fois connect en ligne de commande MySQL, vous aurez le prompt : mysql>
Il est remarquer que sous WindowsXP, vous pouvez lancer l'interface en ligne de commande partir de : Dmarrer>Excuter->cmd et OK.
Variables spcifiques MySQL : MySQL possde deux types de variables qui peuvent intervenir.
Les variables porte globale, qui sont dsignes par @@ et les variables porte de sessions, qui comme le nom l'indique
ne sont valables que dans l'espace de la session et qui peuvent donc varier d'une connexion l'autre.
Exemples de variables pour changer l'heure selon le fuseau horaire :
- Changer le fuseau horaire pour toutes les sessions
sql

1 SET @@time_zone='+01:00';

- Changer le fuseau horaire pour la session courante


sql

1 SET @time_zone='+03:00';

Dans le cas ci-dessus, si l'utilisateur de la session qui a chang l'heure pour son fuseau souhaite savoir quel est son dcalage
avec le serveur, alors il saura qu'il a 2H d'avance (+03:00 - +01:00).
Finalement on s'aperoit que ce type de requtes peut s'avrer trs utile quand il s'agit d'optimiser des requtes qui seront
appeles plusieurs fois durant la session d'un utilisateur mais dont l'usage reste restreint.

Thmatiques du cours : Base de donnes - MySQL

L'auteur

Dcouvrez aussi ce cours en...

Yves
Astier
http://fr.openclassrooms.com/informatique/cours/requete-preparee-1

5/6

7/9/2014

Requte Prpare

Astier

PDF

Vous aimerez aussi :

L'incomparable
absentisme des
fonctionnaires
(Le Figaro)

Hayange: La premire
adjointe du maire FN
dmise de ses fonctions
(20 minutes)

Simplifiez vos runions grce


au Doodling Inscription au
Cours droulement d'un
(OpenClassrooms)
Recommand par

En ce moment sur OpenClassrooms

3 579 visiteurs en ligne Un visiteur sur cette page ! 7 858 855 messages sur le forum

Restez connect OpenClassrooms


OK

E-mail

Facebook

Twitter

Conditions Gnrales d'Utilisation

Youtube

Roadmap

Google

Nous recrutons

http://fr.openclassrooms.com/informatique/cours/requete-preparee-1

Instagram

Qui sommes-nous ?

Publicit

Blog

6/6