Académique Documents
Professionnel Documents
Culture Documents
Concevez Votre Site Web Avec PHP Et MySQL
Concevez Votre Site Web Avec PHP Et MySQL
www.siteduzero.com
Sommaire
1/361
Sommaire
Sommaire ........................................................................................................................................... 1
Informations sur le tutoriel ................................................................................................................... 5
Concevez votre site web avec PHP et MySQL ................................................................................... 7
Informations sur le tutoriel ................................................................................................................................................. 7
17
17
17
17
22
26
30
31
35
36
37
38
39
41
41
42
43
44
44
45
45
47
47
49
50
www.siteduzero.com
63
63
63
65
66
Sommaire
2/361
111
112
112
114
114
115
116
117
117
118
119
119
121
123
124
125
www.siteduzero.com
136
136
137
137
139
141
141
142
144
Sommaire
3/361
145
147
148
149
149
Partie 3 : Stocker des informations dans une base de donnes ..................................................... 152
Prsentation des bases de donnes ............................................................................................................................. 152
Le langage SQL et les bases de donnes ..............................................................................................................................................................
Les SGBD s'occupent du stockage .........................................................................................................................................................................
Vous donnez les ordres au SGBD en langage SQL ...............................................................................................................................................
PHP fait la jonction entre vous et MySQL ...............................................................................................................................................................
Structure d'une base de donnes ...........................................................................................................................................................................
Mais o sont enregistres les donnes ? ................................................................................................................................................................
152
153
153
154
155
156
195
196
196
197
198
198
199
200
200
201
203
www.siteduzero.com
204
205
207
208
209
Sommaire
4/361
210
214
214
215
217
217
218
219
220
220
220
220
221
222
223
223
225
226
226
228
228
229
231
232
232
232
232
233
265
266
266
266
267
269
269
270
270
271
271
272
273
274
275
www.siteduzero.com
5/361
278
279
280
282
283
284
285
286
329
330
330
331
331
331
332
334
335
336
337
339
340
340
www.siteduzero.com
6/361
www.siteduzero.com
7/361
Le langage PHP a justement t conu pour crer des sites "vivants" (on
parle de sites dynamiques). Et si vous voulez apprendre crer vous aussi
des sites web dynamiques, c'est votre jour de chance : vous tes sur un cours pour vrais dbutants en PHP !
L'essentiel, c'est de lire en entier les chapitres dans l'ordre. Aprs, a passe tout seul et vous vous tonnerez bientt de ce que
vous tes capable de faire !
Pour utiliser PHP, il faut connatre au pralable les langages XHTML et CSS.
Comment a, ces langages ne vous disent rien ? Vous ne savez mme pas ce qu'est un "langage" ? Il faut donc que
vous lisiez d'abord mon cours de cration de site web en XHTML et CSS avant de revenir ici !
www.siteduzero.com
8/361
Introduction PHP
Ce qui fait le succs du Web aujourd'hui, c'est la fois sa simplicit et sa facilit d'accs. Un internaute lambda n'a pas besoin
de savoir "comment a fonctionne derrire". Et heureusement pour lui.
En revanche, un apprenti webmaster tel que vous doit, avant toute chose, connatre les bases du fonctionnement d'un site web.
Qu'est-ce qu'un serveur et un client ? Comment rend-on son site dynamique ? Que signifient PHP et MySQL ?
Ce premier chapitre est l pour rpondre toutes ces questions et vous montrer que vous tes capables d'apprendre crer des
sites web dynamiques. Tous les lecteurs seront la fin rassurs de savoir qu'ils commencent au mme niveau !
www.siteduzero.com
9/361
L'objectif de ce cours est de vous rendre capables de raliser des sites web dynamiques entirement par vous-mmes, pas pas.
En effet, ceux-ci peuvent proposer des fonctionnalits bien plus excitantes que les sites statiques. Voici quelques lments que
vous serez en mesure de raliser :
Un espace membres : vos visiteurs peuvent s'inscrire votre site et avoir accs des sections qui leur sont rserves.
Un forum : il est courant aujourd'hui de voir les sites web proposer un forum de discussion pour s'entraider ou
simplement pour passer le temps.
Un compteur de visiteurs : vous pouvez facilement compter le nombre de visiteurs qui se sont connects dans la
journe sur votre site, ou mme connatre le nombre de visiteurs en train de naviguer dessus !
Des actualits : vous pouvez automatiser l'criture d'actualits, en offrant vos visiteurs la possibilit d'en rdiger, de
les commenter, etc.
Une newsletter : vous pouvez envoyer un e-mail tous vos membres rgulirement pour leur prsenter les nouveauts
et les inciter ainsi revenir sur votre site.
Bien entendu, ce ne sont l que des exemples. Il est possible d'aller encore plus loin, tout dpend de vos besoins. Sachez par
exemple que la quasi-totalit des sites de jeux en ligne sont dynamiques. On retrouve notamment des sites d'levage virtuel
d'animaux, des jeux de conqute spatiale, etc.
Mais... Ne nous emportons pas. Avant de pouvoir en arriver l, vous avez de la lecture et bien des choses apprendre !
Commenons par la base : savez-vous ce qui se passe lorsque vous consultez une page web ?
www.siteduzero.com
10/361
Les serveurs : ce sont des ordinateurs puissants qui stockent et dlivrent des sites web aux internautes, c'est--dire aux
clients. La plupart des internautes n'ont jamais vu un serveur de leur vie. Pourtant, les serveurs sont indispensables au
bon fonctionnement du web. L'image ci-dessous reprsentera un serveur dans les schmas suivants :
La plupart du temps, le serveur est dpourvu d'cran : il reste allum et travaille tout seul sans intervention humaine,
24h/24, 7j/7. Un vrai forat du travail.
On rsume : votre ordinateur est appel le client, tandis que l'ordinateur qui dtient le site web est appel le serveur. Comment
les deux communiquent-ils ?
C'est justement l que se fait la diffrence entre un site statique et un site dynamique. Voyons voir ensemble ce qui change.
www.siteduzero.com
11/361
Sur un site statique, il ne se passe rien d'autre. Le serveur stocke des pages web et les envoie aux clients qui les demandent
sans les modifier.
La page web est gnre chaque fois qu'un client la rclame. C'est prcisment ce qui rend les sites dynamiques vivants : le
contenu d'une mme page peut changer d'un instant l'autre.
C'est comme cela que certains sites parviennent afficher par exemple votre pseudonyme sur toutes les pages. tant donn
que le serveur gnre une page chaque fois qu'on lui en demande une, il peut la personnaliser en fonction des gots et des
prfrences du visiteur (et afficher entre autres son pseudonyme).
www.siteduzero.com
12/361
CSS : c'est le langage de mise en forme des sites web. Tandis que le XHTML permet d'crire le contenu de vos pages
web et de les structurer, le langage CSS s'occupe de la mise en forme et de la mise en page. C'est en CSS que l'on choisit
notamment la couleur, la taille des menus et bien d'autres choses encore. Voici un code CSS :
Code : CSS
div.banner {
text-align: center;
font-weight: bold;
font-size: 120%;
}
Ces langages sont la base de tous les sites web. Lorsque le serveur envoie la page web au client, il envoie en fait du code en
langage XHTML et CSS.
www.siteduzero.com
13/361
sites dynamiques ! Pour ces derniers, il est ncessaire de manipuler d'autres langages en plus de XHTML et CSS.
La question qu'il faut vous poser est donc : connaissez-vous XHTML et CSS ?
Si oui, c'est parfait, vous pouvez continuer car nous en aurons besoin par la suite. Si la rponse est non, pas de panique. Ces
langages ne sont pas bien difficiles, ils sont la porte de tous. Vous pouvez les apprendre en lisant mon cours sur XHTML et
CSS.
Sachez qu'apprendre ces langages n'est l'affaire que de quelques petites semaines, voire mme moins si vous avez suffisamment
de temps libre.
MySQL : c'est ce qu'on appelle un SGBD (Systme de Gestion de Base de Donnes). Pour faire simple, son rle est
d'enregistrer des donnes de manire organise afin de vous aider les retrouver facilement plus tard. C'est grce
MySQL que vous pourrez enregistrer la liste des membres de votre site, les messages posts sur le forum, etc. Le
langage qui permet de communiquer avec la base de donnes s'appelle le SQL. Voici un code en langage SQL :
Code : SQL
SELECT id, auteur, message, datemsg FROM livreor ORDER BY
datemsg DESC LIMIT 0, 10
PHP et MySQL sont ce qu'on appelle des logiciels libres. Entre autres choses, cela vous donne des garanties de
prennit : tout le monde peut contribuer leur dveloppement, vous ne risquez donc pas de voir tous les
webmasters se dsintresser du PHP et de MySQL du jour au lendemain, et a c'est trs important !
D'autre part, PHP et MySQL sont disponibles gratuitement. Cela signifie une chose essentielle : vous n'aurez pas
dbourser un centime pour construire votre site web !
PHP peut fonctionner seul et suffit crer un site dynamique, mais les choses deviennent rellement intressantes lorsqu'on le
combine un SGBD tel que MySQL. Cependant pour simplifier, oublions pour le moment MySQL et concentrons-nous sur
PHP.
www.siteduzero.com
14/361
Le rle de PHP est justement de gnrer du code XHTML (on peut aussi gnrer du CSS, mais c'est plus rare), code qui est
ensuite envoy au client de la mme manire qu'un site statique :
PHP dcide ce qui va tre affich sur la page web envoye au visiteur
PHP est un langage de programmation utilis sur de nombreux serveurs pour prendre des dcisions. Cest PHP qui dcide du
code XHTML qui sera gnr et envoy au client chaque fois.
Pour bien comprendre lintrt de tout cela, prenons un exemple. On peut crire en PHP : "Si le visiteur est membre de mon site
et quil sappelle Jonathan, affiche Bienvenue Jonathan sur la page web. En revanche, si ce nest pas un membre de mon site,
affiche Bienvenue la place et propose au visiteur de sinscrire."
C'est un exemple trs basique de site dynamique : selon que vous tes un membre enregistr ou pas, vous ne verrez pas les
mmes choses et n'aurez peut-tre pas accs toutes les sections.
www.siteduzero.com
15/361
Et la concurrence ?
XHTML et CSS n'ont pas de concurrents car ce sont des standards. Tout le monde est cens les connatre et les utiliser sur tous
les sites web.
En revanche, pour ce qui est des sites dynamiques, PHP et MySQL sont loin d'tre les seuls sur le coup. Je ne peux pas vous
faire une liste complte de leurs concurrents, ce serait bien trop long (et ennuyeux !). Cependant, pour votre culture gnrale il
faut au moins connatre quelques autres grands noms.
Tout d'abord, si on a souvent tendance combiner PHP et MySQL pour raliser de puissants sites dynamiques, il ne faut pas
mlanger les deux. Le premier a des concurrents diffrents du second.
Je ne peux pas prsenter ici tous les concurrents, mais ceci devrait dj vous donner une bonne ide. Pour information, il est
aussi possible d'utiliser par exemple le langage C ou le C++, bien que ce soit plus complexe et pas forcment toujours trs
adapt (en clair, je ne le recommande pas du tout
).
Lequel choisir dans le lot ? Lequel est le meilleur ?
tant donn l'objet de ce cours, vous vous attendez ce que je vous rponde instantanment "PHP !". Mais non. En fait, tout
dpend de vos connaissances en programmation. Si vous avez dj manipul le Java, vous serez plus rapidement l'aise avec
les JSP. Si vous connaissez Python, Django semble tout indiqu.
Quant PHP, il se dmarque de ses concurrents par une importante communaut qui peut vous aider rapidement sur internet si
vous avez des problmes. C'est un langage facile utiliser, idal pour les dbutants comme pour les professionnels :
Wikipdia et Facebook sont des exemples de sites clbres et trs frquents qui fonctionnent grce PHP.
Bref, il n'y a pas de meilleur choix. Je vous recommande le langage pour lequel vous serez le plus certain d'avoir quelqu'un
pour vous aider. Le PHP en ce sens est souvent un trs bon choix.
www.siteduzero.com
16/361
Oracle : c'est le SGBD le plus clbre, le plus complet et le plus puissant. Il est
malheureusement payant (et cher), ce qui le rserve plutt aux entreprises qui
l'utilisent dj massivement. Il existe cependant des versions gratuites d'Oracle
notamment pour ceux qui veulent apprendre s'en servir.
Microsoft SQL Server : dit par Microsoft, on l'utilise souvent en
combinaison avec ASP .NET, bien qu'on puisse l'utiliser avec n'importe quel autre langage. Il est payant, mais il existe
des versions gratuites limites.
PostgreSQL : il s'agit d'un SGBD libre et gratuit comme MySQL, qui propose des fonctionnalits plus avances.
Parfois compar Oracle, il lui reste cependant du chemin parcourir. Il dispose d'une communaut un peu moins
importante que MySQL et Oracle. Le Site du Zro utilise PostgreSQL.
SQLite : le SGBD le plus simple et le plus petit. Il est libre et gratuit mais dispose de trs peu de fonctionnalits (ce qui
suffit parfois). Son gros avantage est d'tre trs lger.
L encore, cette liste est loin d'tre exhaustive mais vous prsente au moins quelques grands noms.
Pour information, MySQL reste de loin le SGBD libre et gratuit le plus utilis. Parmi les solutions professionnelles payantes,
Oracle est le plus avanc et le plus rpandu mais son utilisation est surtout rserve aux grosses entreprises.
En fin de compte, si vos moyens sont limits, vous n'avez pas beaucoup de choix pour le SGBD. MySQL est le plus indiqu
car il est libre, gratuit, performant et utilis par de nombreuses personnes qui sont susceptibles de vous aider.
www.siteduzero.com
17/361
Tous ces lments qui vont nous aider crer notre site dynamique sont libres et gratuits. Certes, il en existe d'autres (parfois
payants), mais la combinaison Apache + PHP + MySQL est la plus courante sur les serveurs web, tel point qu'on a cr des
"packs" tous prts qui contiennent tous ces lments. Il est possible de les installer un un mais cela prend plus de temps et
vous n'allez rien y gagner (sauf si vous tes administrateur de serveur, ce qui ne devrait pas tre votre cas
).
Nous allons voir comment installer le "pack" qui convient en fonction de votre systme d'exploitation dans la suite de ce
chapitre.
www.siteduzero.com
18/361
Si une fentre apparat pour vous indiquer que le pare-feu bloque Apache, cliquez sur Dbloquer. Vous n'avez aucune raison
de vous inquiter, c'est parfaitement normal.
Par dfaut, WAMP est en anglais. Vous pouvez facilement le passer en franais en faisant un clic droit sur l'icne de WAMP
dans la barre des tches, puis en allant dans le menu Language / french.
www.siteduzero.com
19/361
Une page web similaire la capture ci-dessous devrait s'ouvrir dans votre navigateur favori (Firefox par exemple). Si la page
s'affiche chez vous, cela signifie qu'Apache fonctionne.
www.siteduzero.com
20/361
La page web que vous voyez l'cran vous a t envoye par votre propre serveur Apache que vous avez install en
mme temps que WAMP. Vous tes en train de simuler le fonctionnement d'un serveur web sur votre propre machine.
Pour le moment, vous tes le seul internaute pouvoir y accder. On dit qu'on travaille "en local ". Notez que l'URL
affiche par le navigateur dans la barre d'adresse est http://localhost/, ce qui signifie que vous naviguez sur
un site web situ sur votre propre ordinateur.
La section "Vos projets" de la page d'accueil de WAMP doit indiquer qu'aucun projet n'existe pour le moment. Considrez que
chaque site web que vous entreprenez de faire est un nouveau projet.
Nous allons crer un projet de test que nous appellerons tests. Pour ce faire, ouvrez l'explorateur Windows et rendez-vous
dans le dossier o WAMP a t install, puis dans le sous-dossier intitul www. Par exemple : c:\wamp\www. Vous pouvez
aussi faire clic gauche / rpertoire www sur l'icne de WAMP.
Une fois dans ce dossier, crez un nouveau sous-dossier que vous appellerez tests :
www.siteduzero.com
21/361
Retournez sur la page d'accueil de WAMP et actualisez la page (vous pouvez appuyer sur la touche F5). La section "Vos
projets" devrait maintenant afficher "tests" car WAMP a dtect que vous avez cr un nouveau dossier :
www.siteduzero.com
22/361
Si vous avez le mme rsultat, cela signifie que tout fonctionne. Bravo, vous avez install WAMP et il fonctionne
correctement. Vous tes prt programmer en PHP !
Vous pouvez passer les sections suivantes qui ne concernent que les utilisateurs sous Mac OS X et Linux.
www.siteduzero.com
23/361
Si vous avez une version de Mac OS X antrieure Mac OS X 10.4, vous devrez tlcharger une ancienne version de
MAMP grce aux liens prsents un peu plus bas sur la mme page.
Vous devriez avoir tlcharg une archive au format .dmg qui contient MAMP. Lorsque vous l'ouvrez, la fentre ci-dessous
apparat :
www.siteduzero.com
24/361
Vous devez tout simplement faire glisser le dossier MAMP en bas gauche vers le dossier Applications au-dessus.
MAMP est maintenant install. Vous le trouverez dans votre dossier "Applications". La fentre principale de MAMP indique
que les serveurs Apache et MySQL ont t correctement dmarrs. L'icne de chacun de ces lments doit tre verte :
www.siteduzero.com
25/361
Je vous invite configurer le rpertoire dans lequel Apache ira chercher les fichiers PHP de votre site web. Pour cela, cliquez
sur le bouton Prfrences de la fentre principale. Une bote de dialogue de configuration s'ouvre. Cliquez sur l'onglet Apache
en haut :
Cliquez sur le bouton "Choisir" pour slectionner le dossier dans lequel vous placerez les fichiers de votre site web. Sous Mac
OS, un dossier est dj cr : il s'agit de "Sites" dans votre rpertoire personnel.
Slectionnez ce rpertoire (notez que ce n'est pas une obligation : vous pouvez utiliser n'importe quel autre rpertoire si vous
www.siteduzero.com
26/361
MAMP est correctement install et configur. Vous tes maintenant prt travailler en PHP pour le chapitre suivant !
www.siteduzero.com
27/361
XAMPP est aussi disponible pour Windows et Mac OS X comme vous pourrez le constater sur le site. La mthode
d'installation est sensiblement diffrente, mais vous pouvez l'essayer si vous avez dj test WAMP (pour Windows)
ou MAMP (pour Mac OS X) et qu'il ne vous convient pas.
Sur la page qui s'affiche, recherchez le lien de tlchargement de XAMPP pour Linux un peu plus bas :
Une fois le tlchargement termin, ouvrez une console. L'installation et le lancement de XAMPP se font en effet uniquement
en console (allons allons, pas de chichis, vous n'allez pas me faire avaler que c'est la premire fois que vous ouvrez la console
).
Rendez-vous dans le dossier o vous avez tlcharg XAMPP. Par exemple dans mon cas, le fichier se trouve sur le bureau :
Code : Console
cd ~/Desktop
www.siteduzero.com
28/361
Vous devez maintenant extraire le dossier compress dans /opt. Pour ce faire, recopiez simplement la commande suivante :
Code : Console
tar xvfz xampp-linux-1.6.7.tar.gz -C /opt
Il se peut que le nom du fichier soit lgrement diffrent si le numro de version a chang. Adaptez le nom du fichier
en le compltant automatiquement l'aide de la touche Tabulation.
Lorsque la dcompression des fichiers est termine, c'est fait ! XAMPP est maintenant install.
Pour dmarrer XAMPP (et donc Apache, PHP et MySQL), tapez la commande suivante :
Code : Console
/opt/lampp/lampp start
N'oubliez pas que vous devez tre root lorsque vous dmarrez ou arrtez XAMPP.
La page principale de configuration de XAMPP s'affiche ensuite. Elle est plus complte que ses homologues WAMP et
MAMP, notamment parce que XAMPP contient plus de logiciels et propose donc plus de fonctionnalits (beaucoup plus
www.siteduzero.com
).
29/361
Vous pouvez vrifier si tout fonctionne correctement en allant dans le menu Statut :
Au minimum, les modules MySQL et PHP doivent tre en vert. Quant aux autres, nous ne les utiliserons pas donc peu importe.
Les fichiers PHP devront tre placs dans le rpertoire /opt/lampp/htdocs. Vous pouvez y crer un sous-rpertoire
tests pour vos premiers tests.
Code : Console
cd /opt/lampp/htdocs
mkdir tests
Une fois le dossier cr, vous pouvez y accder depuis votre navigateur l'adresse : http://localhost/tests
Vous devriez voir une page similaire ceci :
www.siteduzero.com
30/361
www.siteduzero.com
31/361
Je vous propose donc d'installer un logiciel qui va vous permettre d'diter vos fichiers source de manire efficace. Vous en
avez probablement dj install un si vous avez appris programmer en XHTML / CSS l'aide de mon cours, mais comme on
n'est jamais trop prudent, je vais rapidement vous en prsenter quelques-uns en fonction de votre systme d'exploitation.
Voici le code source XHTML que nous allons utiliser pour commencer en terrain connu. Copiez-collez ce code dans l'diteur
de texte que je vais vous faire installer :
Code : HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>Ceci est une page (x)HTML de test</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
<body>
<h2>Page de test</h2>
<p>
Cette page contient <strong>uniquement</strong> du code
(X)HTML.<br />
Voici quelques petits tests :
</p>
<ul>
<li style="color: blue;">Texte en bleu</li>
<li style="color: red;">Texte en rouge</li>
<li style="color: green;">Texte en vert</li>
</ul>
</body>
</html>
Il n'y a pas de PHP pour l'instant afin de commencer en douceur. Nous allons simplement essayer d'enregistrer un
fichier XHTML avec ce code pour nous chauffer.
Sous Windows
Il existe beaucoup de logiciels gratuits tlcharger pour diter du texte sous Windows. Il m'est impossible de tous vous les
prsenter donc je vais vous en recommander un qui est trs utilis et en lequel vous pouvez avoir confiance : Notepad++.
Ce logiciel est petit et rapide tlcharger. N'hsitez pas l'essayer :
Page de tlchargement de Notepad++
www.siteduzero.com
32/361
Lorsque Notepad++ s'ouvre, il prsente gnralement un fichier vide (vous pouvez en crer un nouveau au besoin en allant
dans le menu Fichier / Nouveau ) :
Copiez-collez le code XHTML que je viens de vous donner dans Notepad++. Vous devriez voir l'cran suivant :
www.siteduzero.com
33/361
Comme vous pouvez le voir, le code n'est pas color. La raison vient du fait que Notepad++ ne sait pas de quel type de code
source il s'agit. Vous devez au pralable enregistrer le fichier.
Allez dans Fichier / Enregistrer , puis choisissez le dossier o vous souhaitez enregistrer le fichier. Je vous conseille d'aller
dans le dossier C:\wamp\www\tests que vous avez cr l'installation de WAMP.
Choisissez le type de fichier .html (Hyper Text Markup Language File) puis donnez un nom votre fichier :
www.siteduzero.com
34/361
www.siteduzero.com
35/361
Vous pourrez suivre la mme procdure avec les fichiers PHP tout l'heure, condition d'enregistrer le fichier en .php. Ca vous
entranera vous verrez.
Sous Mac OS X
Si vous tes sous Mac, je peux vous recommander l'diteur TextWrangler qui est gratuit. Il existe aussi Fraise que vous pouvez
essayer.
D'autres diteurs de texte payants de qualit existent, notamment l'excellent TextMate.
www.siteduzero.com
36/361
Sous Linux
Sous Linux, les bons diteurs ne manquent pas. Si vous tes un habitu de la console, vous travaillerez srement avec plaisir
avec vim ou emacs.
Si vous recherchez un diteur graphique plus facile utiliser, je vous recommande gedit ou tout autre logiciel install avec
votre distribution Linux, cela fera l'affaire.
www.siteduzero.com
37/361
www.siteduzero.com
38/361
Comme vous pouvez le voir, on retrouve le code XHTML que l'on connat bien... et on insre en plus au milieu des donnes
dynamiques. Ici, par exemple, c'est le pseudonyme : il change en fonction du visiteur. La partie surligne en vert peut donc
changer selon les visiteurs.
Le Site du Zro fait la mme chose pour ses membres inscrits. Votre pseudonyme est affich en haut des pages lorsque
vous tes connect au Site du Zro.
www.siteduzero.com
39/361
On peut sans problme crire la balise PHP sur plusieurs lignes. En fait, c'est mme indispensable car la plupart du temps le
code PHP fera plusieurs lignes. Cela donnera quelque chose comme :
Code : PHP
<?php
/* Le code PHP se met ici
Et ici
Et encore ici */
?>
Il existe d'autres balises pour utiliser du PHP, par exemple <? ?>, <% %>, etc... Ne soyez donc pas tonns si vous
en voyez. Nanmoins, <?php ?> est la forme la plus correcte, vous apprendrez donc vous servir de cette balise et
non pas des autres.
</p>
<ul>
<li style="color: blue;">Texte en bleu</li>
<li style="color: red;">Texte en rouge</li>
<li style="color: green;">Texte en vert</li>
</ul>
<?php
/* Encore du PHP
Toujours du PHP */
?>
</body>
</html>
www.siteduzero.com
40/361
Bien entendu cette page ne fonctionne pas vu que nous n'avons pas encore crit de vrai code PHP (ce sont juste des balises
d'exemple). Tout ce qu'il vous faut retenir ici, c'est que ds que vous voulez mettre du code PHP, hop, vous ouvrez une balise
PHP : <?php ?>
On peut placer une balise PHP n'importe o dans le code ?
Oui ! Vraiment n'importe o. Pas seulement dans le corps de la page d'ailleurs : vous pouvez placer une balise PHP dans l'entte de la page.
Code : PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>Ceci est une page de test <?php /* Code PHP */ ?></title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
Plus fort encore, vous pouvez mme insrer une balise PHP au milieu d'une balise XHTML (bon ce n'est pas trs joli je vous
l'accorde) :
Code : PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>Ceci est une page de test</title>
<meta http-equiv="Content-Type" <?php /* Code PHP */ ?>
content="text/html; charset=iso-8859-1" />
</head>
Il faut se rappeler que le PHP gnre du code XHTML. Nous allons mieux comprendre le fonctionnement en apprenant
afficher du texte en PHP.
www.siteduzero.com
41/361
Afficher du texte
Bon tout a c'est bien beau, mais il est temps de commencer crire du code PHP non ?
Grande nouvelle : c'est maintenant que vous allez apprendre votre premire instruction en PHP.
Bon ne vous attendez pas quelque chose d'extraordinaire, votre PC ne va pas se mettre danser la samba tout seul.
Vous allez cependant comprendre un peu mieux comment le PHP fonctionne, c'est--dire comment il gnre du code XHTML.
Il est indispensable de bien comprendre cela, soyez donc attentifs !
L'instruction echo
Le PHP est un langage de programmation, ce qui n'tait pas le cas du XHTML (on parlait plutt de langage de description, car
il permet de dcrire une page web). Si vous avez dj programm dans d'autres langages comme le C ou le Java, cela ne devrait
pas vous surprendre. Nanmoins, dans ce cours, nous partons de Zro donc je vais supposer que vous n'avez jamais fait de
programmation auparavant.
Tout langage de programmation contient ce qu'on appelle des instructions. On en crit une par ligne en gnral, et elles se
terminent toutes par un point-virgule. Une instruction commande l'ordinateur d'effectuer une action prcise.
Ici, la premire instruction que nous allons dcouvrir permet d'insrer du texte dans la page web. Il s'agit de l'instruction echo,
la plus simple et la plus basique de toutes les instructions que vous devez connatre.
Voici un exemple d'utilisation de cette instruction :
Code : PHP
<?php echo "Ceci est du texte"; ?>
Comme vous le voyez, l'intrieur de la balise PHP on crit l'instruction echo suivie du texte afficher entre guillemets. Les
guillemets permettent de dlimiter le dbut et la fin du texte, cela aide l'ordinateur se reprer. Enfin, l'instruction se termine
par un point-virgule comme je vous l'avais annonc, ce qui signifie Fin de l'instruction.
Notez qu'il existe une instruction identique echo appele print, qui fait la mme chose. Cependant, echo est
plus couramment utilise.
Il faut savoir qu'on a aussi le droit de demander d'afficher des balises. Par exemple le code suivant fonctionne :
Code : PHP
<?php echo "Ceci est du <strong>texte</strong>"; ?>
Le mot "texte" sera affich en gras grce la prsence des balises <strong> et </strong>
Comment faire pour afficher un guillemet ?
Bonne question. Si vous mettez un guillemet, a veut dire pour l'ordinateur que le texte afficher s'arrte l. Vous risquez au
mieux de faire planter votre beau code et d'avoir une terrible "Parse error".
www.siteduzero.com
42/361
Vous savez que le code PHP s'insre au milieu du code XHTML. Alors allons-y, prenons une page basique en XHTML et
plaons-y du code PHP :
Code : PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>Notre premire instruction : echo</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
<body>
<h2>Affichage de texte avec PHP</h2>
<p>
Cette ligne a t crite entirement en (x)HTML.<br />
<?php echo "Celle-ci a t crite entirement en PHP."; ?>
</p>
</body>
</html>
Je vous propose de copier-coller ce code source dans votre diteur de texte et d'enregistrer la page. Nous allons l'essayer et
voir ce qu'elle produit comme rsultat.
Mais au fait, vous souvenez-vous comment vous devez enregistrer votre page PHP ?
Si vous utilisez Notepad++, slectionnez PHP Hypertext Preprocessor file (*.php) dans la fentre pour
enregistrer :
www.siteduzero.com
43/361
www.siteduzero.com
44/361
Si !
Mais vous verrez bientt l'intrt de cette fonction. Pour le moment, on constate juste que a crit du texte.
Je vous ai expliqu dans le tout premier chapitre que le PHP gnrait du code XHTML et renvoyait au visiteur uniquement du
code XHTML (accompagn de sa feuille de style CSS ventuellement) :
Le code PHP est excut en premier et l'ordinateur fait ce qu'on lui demande. Ici on lui a dit "Affiche ce texte ici".
Une fois toutes les instructions PHP excutes (ici c'tait simple, il n'y en avait qu'une), la page qui sort est une page qui ne
contient que du XHTML ! C'est cette page de "rsultat" qui est envoye au visiteur, car celui-ci ne sait lire que le XHTML.
Rappelez-vous, seul le serveur peut excuter du PHP. Le PHP n'est jamais envoy au visiteur. Pour que nous
puissions excuter du PHP sur notre ordinateur (afin de faire nos tests), nous avons d le transformer en mini-serveur
en installant un programme tel que WAMP.
www.siteduzero.com
45/361
Les commentaires
Bon, mine de rien je viens de vous apprendre pas mal de choses d'un coup, a doit vous faire un choc.
D'accord ce n'tait pas extraordinaire, mais vous n'allez pas tarder comprendre toute la subtilit de la chose.
Avant de terminer ce chapitre, je tiens vous parler de quelque chose qui mes yeux a une trs grande importance en PHP,
comme dans tout langage de programmation : les commentaires.
Un commentaire est un texte que vous mettez pour vous dans le code PHP. Ce texte est ignor, c'est--dire qu'il disparat
compltement lors de la gnration de la page. Il n'y a que vous qui voyez ce texte.
Mais alors quoi sert un commentaire ?
C'est pour vous. Cela permet de vous y retrouver dans votre code PHP, parce que si vous n'y touchez pas pendant des semaines
et que vous y revenez, vous risquez d'tre un peu perdu.
Vous pouvez crire tout et n'importe quoi, le tout est de s'en servir bon escient.
Il existe 2 types de commentaires :
Les commentaires monolignes
Les commentaires multilignes
Tout dpend si votre commentaire est court ou long. Je vais vous prsenter les deux.
www.siteduzero.com
46/361
des commentaires d'une seule ligne). Il faut commencer par crire /* puis refermer par */ :
Code : PHP
<?php
/* La ligne suivante indique mon ge
Si vous ne me croyez pas...
... vous avez raison ;o) */
echo "J'ai 92 ans.";
?>
Ici les commentaires n'ont pas grande utilit, mais vous verrez comment je les utilise dans les prochains chapitres pour vous
dcrire le code PHP. Vous aussi vous allez vite apprendre bien vous en servir
Vous devez tre en train de vous demander vraiment quoi peut bien servir PHP... Ici c'est vrai, a n'a pas l'air d'tre trs utile,
a complique plutt les choses.
Pourtant, vous allez voir trs bientt quel est l'intrt de l'instruction echo, et vous allez mme vous rendre compte quel
point cela permet de simplifier votre travail !
www.siteduzero.com
47/361
Le principe
La plupart des sites web sont gnralement dcoups selon le schma suivant (que je reprends honteusement de mon propre
cours sur le XHTML
):
www.siteduzero.com
48/361
Le problme
Jusqu'ici, vous tiez condamns copier sur chaque page l'identique :
L'en-tte
Le menu
Le pied de page
www.siteduzero.com
49/361
D'une page l'autre, ce site contiendra chaque fois le mme code pour l'en-tte, les menus et le pied de page ! En effet, seul le
contenu du corps change en temps normal.
La solution
En PHP, nous pouvons facilement insrer d'autres pages (ou morceaux de pages) l'intrieur d'une page.
Le principe de fonctionnement des inclusions en PHP est plutt simple comprendre. Vous avez un site web compos de
disons 20 pages. Sur chaque page, il y a un menu, toujours le mme. Pourquoi ne pas crire ce menu (et seulement lui) une
seule fois dans une page menu.php ?
En PHP, vous allez pouvoir inclure votre menu sur toutes vos pages. Lorsque vous voudrez modifier votre menu vous n'aurez
qu' modifier menu.php et l'ensemble des pages de votre site web sera automatiquement mis jour !
www.siteduzero.com
50/361
La pratique
Comme je vous le disais, je vous propose de crer un nouveau fichier PHP et d'y insrer uniquement le code XHTML
correspondant votre menu, comme ceci :
Code : PHP
<div id="menu">
<div class="element_menu">
<h3>Titre menu</h3>
<ul>
<li><a href="page1.html">Lien</a></li>
<li><a href="page2.html">Lien</a></li>
<li><a href="page3.html">Lien</a></li>
</ul>
</div>
</div>
Faites de mme pour une page entete.php et une page pied_de_page.php au besoin pour votre site.
Mais... la page menu.php ne contiendra pas le moindre code PHP... c'est normal ?
Une page dont l'extension est .php peut trs bien ne contenir aucune balise PHP (mme si c'est plutt rare). Dans ce cas, cela
redevient une page XHTML classique qui n'est pas modifie avant l'envoi.
En thorie, vous pourriez trs bien enregistrer votre page avec l'extension .html : menu.html. Nanmoins, afin d'viter de
mlanger des pages .php et .html sur votre site, je vous recommande de travailler uniquement avec l'extension .php
partir d'aujourd'hui.
Maintenant que vos "morceaux de pages" sont prts, reprenez les pages de votre site, par exemple la page d'accueil nomme
index.php. Remplacez le menu par le code PHP suivant :
Code : PHP
<?php include("menu.php"); ?>
Si nous reprenons le code que nous avons vu tout l'heure et que nous remplaons chaque code rptitif par un include,
cela donne le code source suivant :
Code : PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
www.siteduzero.com
51/361
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>Mon super site</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
<body>
<?php include("entete.php"); ?>
<?php include("menu.php"); ?>
<div id="corps">
<h1>Mon super site</h1>
<p>
Bienvenue sur mon super site !<br />
Vous allez adorer ici, c'est un site gnial qui va
parler de... heu... Je cherche encore un peu le thme de mon site :D
</p>
</div>
<?php include("pied_de_page.php"); ?>
</body>
</html>
Ce code suppose que votre page index.php et celles qui sont incluses (comme menu.php) sont dans le mme
dossier. Si le menu tait dans un sous-dossier appel includes, il aurait fallu crire :
<?php include("includes/menu.php"); ?>
C'est le mme principe que pour les liens relatifs, que vous connaissez dj dans le langage XHTML.
Nous avons vu que la page PHP tait gnre, donc la question que vous devez vous poser est : que reoit le visiteur ? Eh bien
il reoit exactement le mme code qu'avant !
Ce schma vous aidera comprendre comment les pages sont incluses :
www.siteduzero.com
52/361
La page finale que reoit le visiteur est identique celle que je vous ai montre au dbut du chapitre... mais vous, vous avez
gagn normment en flexibilit puisque votre code n'est plus recopi 150 fois inutilement.
Le nombre d'include par page n'est pas limit, par consquent vous pouvez dcouper votre code en sous-parties autant que
vous le souhaitez !
Comme vous avez pu le constater, tout a n'est absolument pas sorcier, et pourtant grce aux inclusions on peut dj rendre
son site bien plus agrable !
Notez qu'il existe une autre faon d'inclure des pages en faisant le raisonnement inverse : on cre une page qui contient tout
(en-tte, menus, pied de page) sauf le corps, et on inclut le corps de la page.
Pour raliser cela cependant, il faut savoir manipuler des notions que nous ne connaissons pas pour le moment... et il y a des
risques de provoquer des erreurs dangereuses pour votre site (a fait peur hein
). Nous n'en parlerons donc pas pour le
moment.
Les variables
Attention, chapitre fondamental !
Les variables sont un lment indispensable dans tout langage de programmation, et en PHP on n'y chappe pas. Ce n'est pas
un truc de programmeurs tordus, c'est au contraire quelque chose qui va nous simplifier la vie. Sans les variables, vous n'irez
pas bien loin.
Les variables nous permettent de retenir temporairement des informations en mmoire. Avec elles, nous allons pouvoir par
exemple retenir le pseudonyme du visiteur, effectuer des calculs et bien d'autres choses !
www.siteduzero.com
53/361
www.siteduzero.com
54/361
Rien (NULL) : aussi bizarre que cela puisse paratre, on a parfois besoin de dire qu'une variable ne contient rien. Rien
du tout. On indique donc qu'elle vaut NULL. Ce n'est pas vraiment un type de donnes, mais plutt l'absence de type.
En rsum, voici ce qu'il faut retenir des diffrents types d'informations qu'est capable de stocker PHP dans les variables :
Cela devrait vous donner une ide de tout ce qu'est capable de stocker PHP en mmoire. Ces types suffiront pour la cration de
notre site !
Maintenant, rentrons dans le concret. Comment crer une variable et comment afficher ce qu'elle contient ?
www.siteduzero.com
55/361
Notez qu'on ne peut pas mettre d'espaces dans un nom de variable. A la place, utilisez un underscore _ (c'est le
symbole sous le chiffre 8 sur un clavier AZERTY).
vitez aussi les accents, les cdilles et tout autre symbole pour le nom. PHP ne les apprcie pas trop...
echo, rien ne s'affiche. L, le serveur a juste cr la variable temporairement en mmoire, mais il n'a rien fait d'autre.
Que se passera-t-il ? La variable $age_du_visiteur va tre cre et prendre pour valeur, dans l'ordre : 17, 23, puis 55.
Tout cela va trs vite, l'ordinateur tant trs rapide vous n'aurez pas le temps de dire "ouf" que tout ce code PHP aura t
excut.
www.siteduzero.com
56/361
Comme tout l'heure, rien ne s'affiche. Seulement, quelque part dans la mmoire de l'ordinateur, une petite zone nomme
age_du_visiteur vient de prendre la valeur 17, puis 23, puis 55.
Attention petit pige : si vous voulez insrer un guillemet simple alors que le texte est entour de guillemets simples, il faut
l'chapper comme on l'a vu prcdemment en crivant un antislash devant. De mme pour les guillemets doubles. Voici un
exemple pour bien comprendre :
Code : PHP
<?php
$variable = "Mon \"nom\" est Mateo21";
$variable = 'Je m\'appelle Mateo21';
?>
En effet, si vous oubliez de mettre un antislash, PHP va croire que c'est la fin de la chane et il ne comprendra pas le texte qui
suivra (vous aurez en fait un message Parse error).
Vous pouvez en revanche insrer sans problme des guillemets simples au milieu de guillemets doubles et inversement :
Code : PHP
<?php
$variable = 'Mon "nom" est Mateo21';
$variable = "Je m'appelle Mateo21";
?>
La diffrence est subtile, faites attention. Il y a d'ailleurs une diffrence plus importante entre les deux types de guillemets dont
nous parlerons plus loin.
www.siteduzero.com
57/361
On vient de l'utiliser pour nos exemples prcdents. Il suffit tout simplement d'crire le nombre que vous voulez stocker, sans
guillemets.
Code : PHP
<?php
$age_du_visiteur = 17;
?>
Cela sert simplement indiquer que la variable ne contient rien, tout du moins pour le moment.
www.siteduzero.com
58/361
Comme vous le voyez, il suffit d'crire le nom de la variable que vous voulez afficher.
Au fait, on ne doit pas mettre de guillemets aprs le echo comme tu nous as appris ?
La concatnation
Non, ce n'est pas une insulte.
Cela signifie assemblage.
En fait, crire 17 tout seul comme on l'a fait n'est pas trs parlant. On aimerait crire du texte autour pour dire : "Le visiteur a
17 ans". La concatnation est justement un moyen d'assembler du texte et des variables.
Comment faire cela ? Les petits malins auront l'ide d'crire 3 instructions echo :
Code : PHP
<?php
$age_du_visiteur = 17;
echo "Le visiteur a ";
echo $age_du_visiteur;
echo " ans";
?>
www.siteduzero.com
59/361
Mais il y a plus malin. On peut tout faire sur une ligne. Pour cela, il y a 2 mthodes et c'est justement maintenant que le fait
d'utiliser des guillemets simples ou doubles va faire la diffrence.
Eh bien si ! Mais cette fois, il va falloir crire la variable en dehors des guillemets et sparer les lments entre eux l'aide d'un
point. Regardez :
Code : PHP
<?php
$age_du_visiteur = 17;
www.siteduzero.com
60/361
Dornavant, j'crirai toutes mes chanes de caractres entre guillemets simples ( de rares exceptions prs) et j'utiliserai la
seconde mthode de concatnation qu'on vient de voir. Prenez le temps de vous habituer l'utiliser et cela finira par devenir
compltement naturel pour vous.
www.siteduzero.com
61/361
Addition
Soustraction
Multiplication
Division
=
=
=
=
Allez quoi, boudez pas, un peu de calcul mental a n'a jamais fait de mal personne
Vrifiez mes calculs, comme vous pouvez le voir il n'y a rien de bien compliqu dans tout a.
Seulement, il ne faut pas avoir peur de "jongler" avec les variables.
Voici des calculs avec plusieurs variables :
Code : PHP
<?php
$nombre = 10;
$resultat = ($nombre + 5) * $nombre; // $resultat prend la valeur
150
?>
www.siteduzero.com
62/361
Le modulo
Il est possible de faire un autre type d'opration un peu moins connu : le modulo. Cela reprsente le reste de la division entire.
Par exemple, 6 / 3 = 2 et il n'y a pas de reste. En revanche, 7 / 3 = 2 (car le nombre 3 "rentre" 2 fois dans le nombre 7) et il reste
1. Vous avez fait ce type de calcul l'cole primaire, souvenez-vous !
Le modulo permet justement de rcuprer ce "reste". Pour faire un calcul avec un modulo, on utilise le symbole %.
Code : PHP
<?php
$nombre = 10 % 5; // $nombre prend la valeur 0 car la division tombe
juste
$nombre = 10 % 3; // $nombre prend la valeur 1 car il reste 1
?>
Les conditions
Ce chapitre est d'une importance capitale. En effet, vous serez trs souvent amens employer des conditions dans vos pages
web PHP.
A quoi servent les conditions ? On a parfois besoin d'afficher des choses diffrentes en fonction de certaines donnes. Par
exemple, si c'est le matin, vous voudrez dire "bonjour" votre visiteur, si c'est le soir il vaudrait mieux dire "bonsoir".
C'est l qu'interviennent les conditions. Elles permettent de donner des ordres diffrents PHP selon le cas. Pour notre
exemple, on lui dirait : Si c'est le matin, affiche "Bonjour". Sinon, si c'est le soir, affiche "Bonsoir". Vous allez le voir, les
conditions sont vraiment la base pour rendre votre site dynamique, c'est dire d'afficher des choses diffrentes en fonction du
visiteur, de l'heure de la journe, de la date, etc.
Voil pourquoi ce chapitre est si important !
Allez, on y va !
www.siteduzero.com
63/361
Est gal
>
Est suprieur
<
Est infrieur
>=
<=
!=
Est diffrent de
Il y a deux symboles "gal" (==) sur la premire ligne, et il ne faut pas confondre a avec le simple = que je vous ai
appris dans le chapitre sur les variables. Ici, le double gal sert tester l'galit, dire "Si c'est gal ..."
Dans les conditions, on utilisera toujours le double gal (==)
Les symboles "suprieur" (>) et "infrieur" (<) sont situs en bas gauche de votre clavier.
www.siteduzero.com
64/361
Code : PHP
<?php
$age = 8;
if ($age <= 12)
{
echo "Salut gamin !";
}
?>
Ici, on demande PHP : Si la variable $age est infrieure ou gale 12, affiche "Salut gamin !"
Vous remarquerez que dans la quasi-totalit des cas, c'est sur une variable qu'on fait la condition.
Dans notre exemple, on travaille sur la variable $age. Ce qui compte ici, c'est qu'il y a deux possibilits : soit la condition est
remplie (l'ge est infrieur ou gal 12 ans) et alors on affiche quelque chose ; sinon, eh bien on saute les instructions entre
accolades, on ne fait rien.
Bon on peut quand mme amliorer notre exemple. On va afficher un autre message si l'ge est suprieur 12 ans :
Code : PHP
<?php
$age = 8;
if ($age <= 12) // SI l'ge est infrieur ou gal 12
{
echo "Salut gamin ! Bienvenue sur mon site !<br />";
$autorisation_entrer = "Oui";
}
else // SINON
{
echo "Ceci est un site pour enfants, vous tes trop vieux pour
pouvoir entrer. Au revoir !<br />";
$autorisation_entrer = "Non";
}
echo "Avez-vous l'autorisation d'entrer ? La rponse est :
$autorisation_entrer";
?>
Essayer !
Bon comment marche ce code ? Tout d'abord, j'ai mis plusieurs instructions entre accolades (il ne faut pas oublier que vous
pouvez mettre plusieurs instructions).
Ensuite, vous avez remarqu que j'ai ajout le mot else, qui signifie en anglais "sinon". En clair, on demande : Si l'ge est
infrieur ou gal 12 ans, fais ceci, sinon fais cela.
Essayez ce bout de code chez vous, en vous amusant modifier la valeur de $age (sur la premire ligne). Vous allez voir que
le message qui s'affiche change en fonction de l'ge que vous indiquez !
Bien entendu, vous mettez les instructions que vous voulez entre accolades. Ici par exemple j'ai affich un message, et j'ai
donn une valeur diffrente la variable $autorisation_entrer, ce qui pourrait nous servir par la suite. Par exemple :
Code : PHP
<?php
if ($autorisation_entrer == "Oui") // SI on a l'autorisation
d'entrer
www.siteduzero.com
65/361
Voil, jusque-l rien d'extraordinaire. Vous avez vu que je n'ai pas mis de guillemets pour true et false (comme je vous l'ai
dit dans le chapitre sur les variables).
www.siteduzero.com
66/361
Mais un des avantages des boolens, c'est qu'ils sont particulirement adapts aux conditions.
Pourquoi ? Parce qu'en fait vous n'tes pas obligs d'ajouter le == true. Quand vous travaillez sur une variable boolenne,
PHP comprend trs bien ce que vous avez voulu dire :
Code : PHP
<?php
if ($autorisation_entrer)
{
echo "Bienvenue petit Zro :o)";
}
else
{
echo "T'as pas le droit d'entrer !";
}
?>
PHP comprend qu'il faut qu'il vrifie si $autorisation_entrer vaut true. Avantages :
C'est plus rapide crire pour vous.
Ca se comprend bien mieux.
En effet, si vous "lisez" la premire ligne, a donne : "SI on a l'autorisation d'entrer..." .
C'est donc un raccourci connatre quand on travaille sur des boolens.
Oui mais ta mthode "courte" ne marche pas si on veut vrifier si le boolen vaut faux. Comment on fait avec la
mthode courte hein ?
Il y a un symbole qui permet de vrifier juste si la variable vaut false : le point d'exclamation !. On crit :
Code : PHP
<?php
if (! $autorisation_entrer)
{
}
?>
C'est une autre faon de faire. Si vous prfrez mettre if ($autorisation_entrer == false) c'est tout aussi bien, mais la mthode
"courte" est plus lisible.
www.siteduzero.com
67/361
AND
Et
&&
OR
Ou
||
Le symbole quivalent pour OR est constitu de 2 barres verticales. Pour taper une barre verticale, appuyez sur la
touche "Alt Gr" et "6" en mme temps (clavier franais), ou "Alt Gr" et "&" (clavier belge).
La premire colonne contient le mot-cl en anglais, la troisime son quivalent en symbole. Les deux fonctionnent aussi bien,
mais je vous recommande d'utiliser le mot-cl de prfrence, c'est plus "facile" lire (j'espre que vous connaissez un peu
l'anglais quand mme
) Servez-vous de ces mots-cls pour mettre plusieurs conditions entre les parenthses. Voici un
premier exemple :
Code : PHP
<?php
if ($age <= 12 AND $sexe == "garon")
{
echo "Bienvenue sur le site de Captain Mgakill !";
}
elseif ($age <= 12 AND $sexe == "fille")
{
echo "C'est pas un site pour les filles ici, retourne jouer la
Barbie !";
}
?>
C'est tout simple en fait et a se comprend trs bien : si l'ge est infrieur ou gal 12 ans et que c'est un garon, on lui permet
d'accder au site de son superhro prfr.
Sinon, si c'est une fille dont l'ge est infrieur ou gal 12 ans, on l'envoie gentiment balader (hum hum, m'accusez pas de
sexisme hein, c'tait juste pour l'exemple
).
Bon allez, un dernier exemple avec OR pour que vous l'ayez vu au moins une fois, et on arrte l.
Code : PHP
<?php
if ($sexe == "fille" OR $sexe == "garon")
{
echo "Salut Terrien !";
}
else
{
echo "Euh, si t'es ni une fille ni un garon, t'es quoi alors ?
";
}
?>
L'astuce bonus
Avec les conditions, il y a une astuce connatre.
Sachez que les deux codes ci-dessous donnent exactement le mme rsultat :
Code : PHP
www.siteduzero.com
68/361
<?php
if ($variable == 23)
{
echo '<strong>Bravo !</strong> Vous avez trouv le nombre
mystre !';
}
?>
Code : PHP
<?php
if ($variable == 23)
{
?>
<strong>Bravo !</strong> Vous avez trouv le nombre mystre !
<?php
}
?>
Comme vous le voyez, dans la seconde colonne on n'a pas utilis de echo. En effet, il vous suffit d'ouvrir l'accolade ( {), puis
de fermer la balise php (?>), et vous pouvez mettre tout le texte afficher que vous voulez en HTML !
Rudement pratique quand il y a de grosses quantits de texte afficher, et aussi pour viter d'avoir se prendre la tte avec les
backslash devant les guillemets (" ou ').
Il vous faudra toutefois penser refermer l'accolade aprs ( l'intrieur d'une balise PHP bien entendu).
Et aprs a, ma foi, il n'y a rien de particulier savoir. Vous allez rencontrer des conditions dans la quasi-totalit des exemples
que je vous donnerai par la suite.
Vous ne devriez pas avoir de problmes normalement pour utiliser des conditions, il n'y a rien de bien difficile. Contentezvous de reprendre le schma que je vous ai donn pour la structure If... Else, et de l'appliquer votre cas. Nous aurons
d'ailleurs bientt l'occasion de pratiquer un peu, et vous verrez que les conditions sont souvent indispensables.
www.siteduzero.com
69/361
Pour vous faire comprendre l'intrt de switch, je vais vous donner un exemple un peu lourd avec les if et elseif que
vous venez d'apprendre :
Code : PHP
<?php
if ($note == 0)
{
echo "Tu es vraiment un gros Zro !!!";
}
elseif ($note == 5)
{
echo "Tu es trs mauvais";
}
elseif ($note == 7)
{
echo "Tu es mauvais";
}
elseif ($note == 10)
{
echo "Tu as pile poil la moyenne, c'est un peu juste...";
}
elseif ($note == 12)
{
echo "Tu es assez bon";
}
elseif ($note == 16)
{
echo "Tu te dbrouilles trs bien !";
}
elseif ($note == 20)
{
echo "Excellent travail, c'est parfait !";
}
else
{
echo "Dsol, je n'ai pas de message afficher pour cette
note";
}
?>
Comme vous le voyez, c'est lourd, long, et rptitif. Dans ce cas, on peut utiliser une autre structure plus souple : c'est
switch.
Voici le mme exemple avec switch (le rsultat est le mme, mais le code est plus adapt) :
www.siteduzero.com
70/361
Code : PHP
<?php
$note = 10;
switch ($note) // on indique sur quelle variable on travaille
{
case 0: // dans le cas o $note vaut 0
echo "Tu es vraiment un gros Zr0 !!!";
break;
case 5: // dans le cas o $note vaut 5
echo "Tu es trs mauvais";
break;
case 7: // dans le cas o $note vaut 7
echo "Tu es mauvais";
break;
case 10: // etc etc
echo "Tu as pile poil la moyenne, c'est un peu juste...";
break;
case 12:
echo "Tu es assez bon";
break;
case 16:
echo "Tu te dbrouilles trs bien !";
break;
case 20:
echo "Excellent travail, c'est parfait !";
break;
default:
echo "Dsol, je n'ai pas de message afficher pour cette note";
}
?>
www.siteduzero.com
71/361
contrairement aux elseif, PHP ne s'arrte pas l et continue lire les instructions des case qui suivent !
16 etc.
Pour empcher cela, utilisez l'instruction break;. L'instruction break demande PHP de sortir du switch. Ds que PHP
tombe sur break, il sort des accolades et donc il ne lit pas les case qui suivent. En pratique, on utilise trs souvent un
break car sinon PHP lit des instructions qui suivent et qui ne conviennent pas.
Essayez d'enlever les break dans le code prcdent, vous allez comprendre pourquoi ils sont indispensables !
Quand doit-on choisir if, et quand doit-on choisir switch ?
C'est surtout un problme de prsentation et de clart. Pour une condition simple et courte, on utilise le if, et quand on a une
srie de conditions analyser, on prfre utiliser switch pour rendre le code plus clair.
www.siteduzero.com
72/361
Prenons cet exemple base de if... else qui met un boolen $majeur vrai ou faux selon l'ge du visiteur :
Code : PHP
<?php
$age = 24;
if ($age >= 18)
{
$majeur = true;
}
else
{
$majeur = false;
}
?>
On peut faire la mme chose en une seule ligne grce une structure ternaire :
Code : PHP
<?php
$age = 24;
$majeur = ($age >= 18) ? true : false;
?>
Ici, tout notre test prcdent a t fait sur une seule ligne !
La condition teste est $age >= 18. Si c'est vrai, alors la valeur indique aprs le point d'interrogation (ici true) sera
affecte la variable $majeur. Sinon, c'est la valeur qui suit le symbole "deux points" qui sera affecte $majeur.
C'est un peu tordu mais a marche.
Si vous n'utilisez pas ce type de condition dans vos pages web, je comprendrai trs bien. Il faut avouer que les ternaires sont un
peu difficiles lire car ils sont trs condenss. Mais sachez les reconnatre et les comprendre si vous en rencontrez un jour en
lisant le code source de quelqu'un d'autre.
Vous tes en train d'assimiler sans le savoir les fondements de la programmation PHP qui dtermineront avec quel "style" vous
allez coder par la suite.
En effet, on peut parler de "style" de programmation car chaque programmeur va prsenter son code diffremment (le rsultat
est le mme mais la faon de faire est parfois diffrente). Ici, je vous prsente ma manire de faire, donc au dbut vous allez
avoir un peu mon style, mais rassurez-vous petit petit vous allez vous crer le vtre
Quoiqu'il en soit, c'est en ce moment-mme que vous apprenez le plus de choses, et il ne faut surtout pas dcrocher, car ces
connaissances de base vont vous tre indispensables par la suite !
www.siteduzero.com
73/361
Les boucles
Dans la srie des lments de base de PHP connatre absolument, voici les boucles ! Demander l'ordinateur de rpter des
instructions, a il sait faire (et en plus il ne bronche jamais) !
Imaginez par exemple que vous tes en train de crer le forum de votre site. Sur une page, on affiche par exemple une trentaine
de messages. Il serait bien trop long et rptitif de dire "Affiche le message 1 et le nom de son auteur", "Affiche le message 2 et
le nom de son auteur", "Affiche le message 3 et le nom de son auteur", etc. Pour viter d'avoir faire cela, on peut utiliser un
systme de boucle qui nous permettra de dire une seule fois : "Affiche 30 messages et le nom de leur auteur respectif chaque
fois".
Bien entendu, nous n'allons pas pouvoir apprendre crer le forum de votre site dans ce chapitre (il est encore trop tt).
Nanmoins, prenez bien le temps de comprendre le fonctionnement des boucles car nous en aurons besoin tout le long de ce
cours. Ce n'est pas bien compliqu vous allez voir !
www.siteduzero.com
74/361
Comme d'habitude, les instructions sont d'abord excutes dans l'ordre, de haut en bas (flche rouge)
A la fin des instructions, on retourne la premire (flche verte)
Et on recommence lire les instructions dans l'ordre (flche rouge)
Et on retourne la premire (flche verte)
etc etc...
Le seul hic dans ce schma, c'est que a ne s'arrte jamais ! Les instructions seraient rexcutes l'infini !
C'est pour cela que, quel que soit le type de boucle (while ou for), il faut indiquer une condition. Tant que la condition est
remplie, les instructions sont rexcutes. Ds que la condition n'est plus remplie, on sort enfin de la boucle (ouf !).
Voici comment faire avec une boucle simple : while.
Code : PHP
<?php
while ($continuer_boucle == true)
{
// instructions excuter dans la boucle
}
?>
While peut se traduire par "Tant que". Ici, on demande PHP : TANT QUE $continuer_boucle est vrai, excuter ces
instructions :
Les instructions qui sont rptes en boucle se trouvent entre les accolades { et }. Mais bon l je vous apprends rien, vous
commencez avoir l'habitude de voir des accolades de partout.
Ce n'est pas beaucoup plus compliqu que a, il n'y a gure plus de choses savoir. Cependant, je vais quand mme vous
montrer 1 ou 2 exemples d'utilisation de boucles, pour que vous voyiez quoi a peut servir...
Pour notre premier exemple, on va supposer que vous avez t punis et que vous devez recopier 100 fois "Je ne dois pas
regarder les mouches voler quand j'apprends le PHP."
Avant, il fallait prendre son mal en patience et a prenait des heuuuures. Maintenant, avec PHP, on va faire a en un clin d'oeil
!
Regardez ce code :
www.siteduzero.com
75/361
Code : PHP
<?php
$nombre_de_lignes = 1;
while ($nombre_de_lignes <= 100)
{
echo 'Je ne dois pas regarder les mouches voler quand
j\'apprends le PHP.<br />';
$nombre_de_lignes++; // $nombre_de_lignes = $nombre_de_lignes +
1
}
?>
Essayer !
La boucle pose la condition : TANT QUE $nombre_de_lignes est infrieur ou gal 100
Dans cette boucle, il y a 2 instructions :
Le echo, qui permet d'afficher du texte en PHP. A noter qu'il y a une balise HTML <br /> la fin : cela permet
d'aller la ligne. Vu que vous connaissez le HTML, a n'a rien de surprenant : chaque phrase sera crite sur une seule
ligne.
Une instruction bizarre ensuite : $nombre_de_lignes++; Ksako ? Regardez mon commentaire : c'est exactement
la mme chose. En fait, c'est une faon plus courte d'ajouter 1 la variable. On appelle cela l'incrmentation (ce nom
barbare signifie tout simplement que l'on a ajout 1 la variable
).
A chaque fois qu'on fait une boucle, la valeur de la variable augmente : 1, 2, 3, 4... 98, 99... Ds que la variable a atteint 100
puis qu'elle passe 101, la boucle s'arrte sans afficher l'echo. Et voil, on a crit 100 lignes en un clin d'oeil
Et si la punition avait t plus grosse, pas de problme ! Il suffirait de changer la condition (par exemple mettre "TANT que
c'est infrieur 500" pour l'crire 500 fois).
Il faut TOUJOURS s'assurer que la condition sera fausse au moins une fois. Si elle ne l'est jamais, alors la boucle
s'excutera l'infini !
PHP refuse normalement de travailler plus d'une quinzaine de secondes. Il s'arrtera tout seul s'il voit que son travail
dure trop longtemps et affichera un message d'erreur.
Nous venons donc de voir comment afficher une phrase plusieurs centaines de fois sans efforts.
Mais est-ce vraiment utile ? On n'a pas besoin de faire a sur un site web ?!
Pas vraiment, mais comme je vous l'ai dit en introduction, nous apprenons ici des techniques de base que l'on va pouvoir
rutiliser dans les prochains chapitres de ce cours. Imaginez la fin que ce systme de boucle va vous permettre de demander
PHP d'afficher d'une seule traite tous les messages de votre forum. Bien sr, il vous faudra d'autres connaissances pour y
parvenir, mais sans les boucles vous n'auriez rien pu faire !
Je vous demande pour le moment de pratiquer et de comprendre comment a marche.
Bon, un autre exemple pour le fun ?
On peut crire de la mme manire une centaine de lignes, mais chacune peut tre diffrente (on n'est pas obligs d'crire la
mme chose chaque fois).
Cet exemple devrait vous montrer que la valeur de la variable augmente chaque passage dans la boucle :
Code : PHP
<?php
$nombre_de_lignes = 1;
www.siteduzero.com
76/361
Essayer !
Voil, c'est tout bte, et cet exemple ressemble beaucoup au prcdent. La particularit l, c'est qu'on affiche chaque fois la
valeur de $nombre_de_lignes (a vous permet de voir que sa valeur augmente petit petit).
Pour information, l'astuce que je vous avais donne dans le chapitre sur les conditions marche aussi ici : vous pouvez
fermer la balise PHP ?>, crire du texte en HTML, puis rouvrir la balise PHP <?php. Cela vous vite d'utiliser une
ou plusieurs instructions echo au milieu. On aura l'occasion d'utiliser cette astuce de nombreuses fois dans la suite
du cours.
www.siteduzero.com
77/361
Les deux derniers codes donnent donc exactement le mme rsultat. Le for fait la mme chose que le while, mais rassemble
sur une seule ligne tout ce qu'il faut savoir sur le fonctionnement de la boucle.
Comment savoir lequel prendre quand je dois choisir entre un while et un for ?
La boucle while est plus simple et plus flexible, on peut faire tous les types de boucle avec mais on peut oublier de faire
certaines tapes comme l'incrmentation de la variable.
En revanche, for est bien adapt quand on doit compter le nombre de fois que l'on rpte les instructions et il permet de ne
pas oublier de faire l'incrmentation pour augmenter la valeur de la variable !
Croyez-moi, les boucles vont vraiment nous faire gagner un temps fou !
Grce elles, il y a des scripts PHP que l'on peut crire en quelques lignes de code et qui pourtant effectuent beaucoup de
calculs !
Vous aurez en particulier l'occasion de vous servir des boucles lorsque vous attaquerez l'tude de la base de donnes un peu
www.siteduzero.com
78/361
Les fonctions
En PHP, on n'aime pas avoir rpter le mme code plusieurs fois. Pour rpondre ce problme, nous avons dcouvert les
boucles qui permettent d'excuter des instructions plusieurs fois. Nous allons ici dcouvrir un autre type de structure trs
important connatre : les fonctions.
Comme les boucles, les fonctions permettent d'viter d'avoir rpter du code PHP que l'on utilise souvent. Mais alors que les
boucles sont de btes machines tout juste capables de rpter 200 fois la mme chose, les fonctions sont des robots
"intelligents" qui s'adaptent en fonction de ce que vous voulez faire et qui automatisent grandement la plupart des tches
courantes.
www.siteduzero.com
79/361
Vous ne savez pas ce qui se passe l'intrieur de ce robot, mais vous pouvez appuyer sur un bouton pour lui demander de
faire quelque chose de prcis. Avec les fonctions, c'est le mme principe !
Grce la fonction, vous n'avez pas eu besoin de vous souvenir comment on calcule le volume d'un cube. Bon ici c'tait assez
simple (il suffisait de faire 4*4*4), mais vous serez souvent amen faire des oprations de plus en plus complexes et les
fonctions vous permettront de ne pas avoir vous soucier des dtails des calculs.
Si vous aviez eu faire le calcul du volume du cube une seule fois, vous auriez pu chercher dans un livre comment on le
calcule (si vous ne vous en souveniez pas
) et crire la main le calcul. Mais si vous aviez le faire 5 fois ? 10 fois ? 100
fois ?
En quoi est-ce que c'est diffrent des boucles ? Avec les boucles on peut faire rpter le mme code plusieurs fois
aussi !
Oui, mais les fonctions sont capables de s'adapter en fonction des informations que vous leur envoyez. Par exemple dans notre
www.siteduzero.com
80/361
cas, il suffit d'envoyer la longueur de l'arte du cube notre fonction pour qu'elle nous retourne le rsultat. Ces informations
que l'on donne en entre la fonction sont appeles paramtres (un mot connatre !).
Les fonctions ne servent qu' faire des calculs mathmatiques ? Je veux juste crer un site web, pas faire des maths !
J'ai choisi un exemple mathmatique ici parce que je le trouve simple et parlant, mais dans la pratique on ne passe pas son
temps calculer des logarithmes et des exponentielles quand on cre un site web, je suis d'accord.
Concrtement, les fonctions peuvent permettre de rcuprer des informations comme la date et l'heure actuelles, de crypter des
donnes, d'envoyer des emails, de faire des recherches dans du texte, et bien d'autres choses encore !
La fonction calculCube est une fonction imaginaire, elle n'existe pas ( moins qu'on la cre nous-mmes). Par
consquent, n'essayez pas d'excuter ce code PHP chez vous car il ne fonctionnera pas. Lisez simplement pour bien
comprendre le fonctionnement, vous aurez ensuite l'occasion de pratiquer plus loin dans ce chapitre.
Comme vous le voyez, j'ai simplement crit le nom de la fonction, suivi de parenthses vides, puis de l'invitable pointvirgule. En faisant cela, j'appelle la fonction calculCube mais je ne lui envoie aucune information, aucun paramtre.
Certaines fonctions peuvent fonctionner sans paramtres, mais elles sont assez rares. Dans le cas de calculCube, a n'a pas
de sens de l'appeler sans lui donner la longueur de l'arte du cube pour faire le calcul !
Si on veut lui envoyer un paramtre (que ce soit un nombre, une chane de caractre, un boolen), il faut l'crire entre les
parenthses :
Code : PHP
<?php
calculCube(4);
?>
www.siteduzero.com
81/361
Code : PHP
<?php
fonctionImaginaire(17, 'Vert', true, 41.7);
?>
Cette fonction recevra 4 paramtres : 17, le texte "Vert", le boolen vrai et le nombre 41,7.
Si la fonction ne retourne aucune valeur, il n'y a rien de plus faire que dans les codes prcdents. La fonction est appele, fait
son travail et on ne lui demande rien de plus.
En revanche, si la fonction retourne une valeur, comme a devrait tre le cas pour calculCube, on la rcupre dans une
variable comme ceci :
Code : PHP
<?php
$volume = calculCube(4);
?>
Sur une ligne comme celle-ci, il se passe en fait 2 choses, dans l'ordre de droite gauche :
1. La fonction calculCube est appele avec le paramtre 4.
2. Le rsultat renvoy par la fonction (lorsqu'elle a termin) est stock dans la variable $volume.
La variable $volume aura donc pour valeur 64 aprs l'excution de cette ligne de code !
Bon savoir : on peut envoyer en entre plusieurs paramtres une fonction comme on l'a vu, mais en revanche la
fonction ne peut renvoyer en retour qu'une seule valeur. Il existe un moyen de contourner cette limitation en
combinant des variables au sein d'un tableau de variables (appel array) dont on parlera dans un prochain chapitre.
www.siteduzero.com
82/361
strlen
Cette fonction retourne la longueur d'une chane de caractres, c'est--dire le nombre de lettres et chiffres qu'il y a (espaces
compris). Exemple :
Code : PHP
<?php
$phrase = 'Bonjour les Zros ! Je suis une phrase !';
$longueur = strlen($phrase);
echo 'La phrase ci-dessous comporte ' . $longueur . ' caractres
:<br />' . $phrase;
?>
Essayez !
Mfiez-vous, il se peut que le nombre de caractres soit parfois inexact d un bug de PHP dans la gestion des
encodages de caractres. Cela sera corrig dans les prochaines versions de PHP.
www.siteduzero.com
83/361
str_replace
str_replace remplace une chane de caractres par une autre. Exemple :
Code : PHP
<?php
$ma_variable = str_replace('b', 'p', 'bim bam boum');
echo $ma_variable;
?>
Essayez !
On a besoin d'indiquer 3 paramtres :
1. La chane qu'on recherche. Ici, on recherche les "b" (on aurait pu rechercher un mot aussi).
2. La chane qu'on veut mettre la place. Ici, on met des "p" la place des "b".
3. La chane dans laquelle on doit faire la recherche.
Ce qui nous donne "pim pam poum"
str_shuffle
Pour vous amuser mlanger alatoirement les caractres de votre chane !
Code : PHP
<?php
$chaine = 'Cette chane va tre mlange !';
$chaine = str_shuffle($chaine);
echo $chaine;
?>
Essayez !
strtolower
strtolower met tous les caractres d'une chane en minuscule.
Code : PHP
<?php
$chaine = 'COMMENT CA JE CRIE TROP FORT ???';
$chaine = strtolower($chaine);
echo $chaine;
?>
www.siteduzero.com
84/361
Essayez !
A noter qu'il existe strtoupper qui fait la mme chose en sens inverse : minuscules => majuscules.
Rcuprer la date
Nous allons dcouvrir la fonction qui renvoie l'heure et la date. Il s'agit de date (un nom facile retenir, avouez !). Cette
fonction peut donner beaucoup d'informations. Voici les principaux paramtres connatre :
Attention ! Respectez les majuscules/minuscules, c'est important !
Paramtre Description
H
Heure
Minute
Jour
Mois
Anne
Essayez !
www.siteduzero.com
85/361
www.siteduzero.com
86/361
Essayer !
Vous voyez, c'est un peu fatigant la longue... Alors nous allons crer une fonction qui le fait toute seule notre place !
Code : PHP
<?php
function DireBonjour($nom)
{
echo 'Bonjour ' . $nom . ' !<br />';
}
DireBonjour('Marie');
DireBonjour('Patrice');
DireBonjour('Edouard');
DireBonjour('Pascale');
DireBonjour('Franois');
DireBonjour('Benot');
DireBonjour('Pre Nol');
?>
www.siteduzero.com
87/361
Essayer !
Alors qu'y a-t-il de diffrent ici ? C'est surtout en haut qu'il y a une nouveaut : c'est la fonction. En fait, les lignes en haut
permettent de dfinir la fonction (son nom, ce qu'elle est capable de faire etc...). Elles ne font rien de particulier, mais elles
disent PHP : "Une fonction DireBonjour existe maintenant".
Pour crer une fonction, vous devez taper function (a veut dire fonction en anglais
A vous d'essayer ! Crez une page avec cette fonction et dites bonjour qui vous voulez, vous verrez : a marche !
(encore
heureux :p)
Un conseil pour que vous vous entrainiez sur les fonctions : basez-vous sur mes exemples et essayez de les retoucher
petit petit vous-mmes pour voir ce que a donne. Il peut y avoir des fonctions trs simples comme des fonctions
trs compliques, alors allez-y prudemment.
www.siteduzero.com
88/361
Vous tes capables de comprendre le code ci-dessous normalement, si vous avez bien suivi dans le chapitre prcdent. Seul
problme si on a le faire plusieurs fois, c'est vite rptitif regardez :
Code : PHP
<?php
// calcul du volume d'un cne de rayon 5 et de hauteur 2
$volume = 5 * 5 * 3.14 * 2 * (1/3);
echo 'Le volume du cne de rayon 5 et de hauteur 2 est : ' . $volume
. ' cm<sup>3</sup><br />';
// calcul du volume d'un cne de rayon 3 et de hauteur 4
$volume = 3 * 3 * 3.14 * 4 * (1/3);
echo 'Le volume du cne de rayon 3 et de hauteur 4 est : ' . $volume
. ' cm<sup>3</sup><br />';
?>
Essayer !
Nous allons donc crer une fonction VolumeCone, qui va calculer le volume du cne en fonction du rayon et de la hauteur.
Cette fonction ne va rien afficher, on veut juste qu'elle nous renvoie le volume qu'on cherche.
Regardez attentivement le code ci-dessous, il prsente 2 nouveauts :
Code : PHP
<?php
// Ci-dessous, la fonction qui calcule le volume du cne
function VolumeCone($rayon, $hauteur)
{
$volume = $rayon * $rayon * 3.14 * $hauteur * (1/3); // calcul du
volume
return $volume; // indique la valeur renvoyer, ici le volume
}
$volume = VolumeCone(3, 1);
www.siteduzero.com
89/361
Ensuite, on peut afficher ce que contient la variable l'aide d'une instruction echo.
Les possibilits de cration de fonctions sont quasi-infinies. Il est clair que normalement vous n'allez pas avoir crer de
fonction qui calcule le volume d'un cne (qui est assez fou pour faire a ?
). Tout ce que je vous demande en fait ici, c'est
de comprendre qu'une fonction c'est trs pratique et a peut vous faire gagner du temps.
Accessoirement, si vous comprenez un peu comment fonctionne mon code c'est bien, si vous essayez de crer une ou deux
fonctions de test chez vous c'est encore mieux.
Vous en savez suffisamment sur les fonctions ! Il y aurait d'autres choses apprendre mais vous connaissez les bases.
D'ailleurs en parlant de bases, vous tes de moins en moins un dbutant total en PHP, nous avons bientt fini de couvrir les
bases !
Les tableaux
Nous entamons ici un aspect trs important du PHP : les array.
Vous allez voir qu'il s'agit de variables "composes", que l'on peut imaginer sous la forme de tableau.
On peut faire normment de choses avec les array et leur utilisation n'est pas toujours trs facile. Cependant, ils vont trs
rapidement nous devenir indispensables et vous devez bien comprendre leur fonctionnement. Si vous y parvenez, nous aurons
fait le tour des bases du PHP et vous serez fin prts pour la suite, qui s'annonce concrte et passionnante.
Mais trve de bavardages, l'abordaaaage !
www.siteduzero.com
90/361
Valeur
$prenom Nicole
Ici, nous allons voir qu'il est possible d'enregistrer de nombreuses informations dans une seule variable (bien plus que
"Nicole") grce aux tableaux. On distingue deux types de tableaux :
Les tableaux numrots
Les tableaux associatifs
Franois
Michel
Nicole
Vronique
Benot
...
...
$prenoms est un array : c'est ce qu'on appelle une variable "tableau". Elle n'a pas qu'une valeur mais plusieurs valeurs (vous
pouvez en mettre autant que vous voulez).
Dans un array, les valeurs sont ranges dans des "cases" diffrentes. Ici, nous travaillons sur un array numrot, c'est--dire que
chaque case est identifie par un numro. Ce numro est appel cl.
Attention ! Un array numrot commence toujours la case n0 ! Ne l'oubliez jamais, ou vous risquez de faire des
erreurs par la suite...
www.siteduzero.com
91/361
L'ordre a beaucoup d'importance. Le premier lment ("Franois") aura le n0, ensuite Michel le n1, etc.
Vous pouvez aussi crer manuellement le tableau case par case :
Code : PHP
<?php
$prenoms[0] = 'Franois';
$prenoms[1] = 'Michel';
$prenoms[2] = 'Nicole';
?>
Si vous ne voulez pas avoir crire vous-mme le numro de la case que vous crez, vous pouvez laisser PHP le slectionner
automatiquement en laissant les crochets vides :
Code : PHP
<?php
$prenoms[] = 'Franois'; // Crera $prenoms[0]
$prenoms[] = 'Michel'; // Crera $prenoms[1]
$prenoms[] = 'Nicole'; // Crera $prenoms[2]
?>
C'est tout bte, du temps que vous n'oubliez pas que Michel est en seconde position et donc qu'il a le numro 1 (tant donn
www.siteduzero.com
92/361
Note importante : il n'y a ici qu'une seule instruction (un seul point-virgule). J'aurais pu tout mettre sur la mme ligne,
mais rien ne m'empche de sparer a sur plusieurs lignes pour que a soit plus facile lire.
Vous remarquez qu'on crit une flche (=>) pour dire "associ ". Par exemple, on dit "ville associ Marseille".
Nous avons cr un tableau qui ressemble la structure suivante :
Cl
Valeur
prenom Franois
nom
Dupont
adresse
3 Rue du Paradis
ville
Marseille
Il est aussi possible de crer le tableau case par case comme ceci :
Code : PHP
www.siteduzero.com
93/361
<?php
$coordonnees['prenom'] = 'Franois';
$coordonnees['nom'] = 'Dupont';
$coordonnees['adresse'] = '3 Rue du Paradis';
$coordonnees['ville'] = 'Marseille';
?>
Essayer !
Comme vous l'avez vu dans mes exemples, ils ne servent pas stocker la mme chose :
Les array numrots permettent de stocker une srie d'lments du mme type, comme des prnoms. Chaque lment du
tableau contiendra alors un prnom.
Les array associatifs permettent de dcouper une donne en plusieurs sous-lments. Par exemple, une adresse peut tre
dcoupe en nom, prnom, nom de rue, ville...
www.siteduzero.com
94/361
Parcourir un tableau
Lorsqu'un tableau a t cr, on a souvent besoin de le parcourir pour savoir ce qu'il contient. Nous allons voir trois moyens
d'explorer un array :
La boucle for
La boucle foreach
La fonction print_r (utilise principalement pour le dbuggage)
La boucle for
Il est trs simple de parcourir un tableau numrot avec une boucle for. En effet, puisqu'il est numrot partir de 0, on peut
faire une boucle for qui incrmente un compteur partir de 0 :
Code : PHP
<?php
// On cre notre array $prenoms
$prenoms = array ('Franois', 'Michel', 'Nicole', 'Vronique',
'Benot');
// Puis on fait une boucle pour tout afficher :
for ($numero = 0; $numero < 5; $numero++)
{
echo $prenoms[$numero] . '<br />'; // affichera $prenoms[0],
$prenoms[1] etc...
}
?>
Essayer !
Quand on crit $prenoms[$numero], la variable $numero est d'abord remplace par sa valeur. Par exemple, si $numero
vaut 2, alors cela signifie qu'on cherche obtenir ce que contient $prenoms[2], c'est--dire... Nicole, bravo vous avez
compris.
La boucle foreach
La boucle for a beau fonctionner, on peut utiliser un type de boucle plus adapt aux tableaux qu'on n'a pas vu jusqu'ici :
foreach. C'est une sorte de boucle for spcialise dans les tableaux.
foreach va passer en revue chaque ligne du tableau, et lors de chaque passage, elle va mettre la valeur de cette ligne dans
une variable temporaire (par exemple $element).
Je parle chinois ? Ok, alors regardez :
Code : PHP
<?php
$prenoms = array ('Franois', 'Michel', 'Nicole', 'Vronique',
'Benot');
foreach($prenoms as $element)
www.siteduzero.com
95/361
{
echo $element . '<br />'; // affichera $prenoms[0], $prenoms[1]
etc...
}
?>
Essayer !
C'est le mme code que tout l'heure mais bas ici sur une boucle foreach. A chaque tour de boucle, la valeur de l'lment
suivant est mise dans la variable $element. On peut donc utiliser $element uniquement l'intrieur de la boucle afin
d'afficher l'lment en cours.
L'avantage de foreach est qu'il permet aussi de parcourir les tableaux associatifs.
Code : PHP
<?php
$coordonnees = array (
'prenom' => 'Franois',
'nom' => 'Dupont',
'adresse' => '3 Rue du Paradis',
'ville' => 'Marseille');
foreach($coordonnees as $element)
{
echo $element . '<br />';
}
?>
Essayer !
foreach va mettre tour tour dans la variable $element le prnom, le nom, l'adresse et la ville contenus dans l'array
$coordonnees.
On met donc entre parenthses :
1. D'abord le nom de l'array (ici $coordonnees)
2. Ensuite le mot-cl as (qui signifie quelque chose comme "en tant que")
3. Enfin le nom d'une variable que vous choisissez qui va contenir tour tour chacun des lments de l'array (ici
$element).
www.siteduzero.com
96/361
A chaque tour de boucle, on disposera non pas d'une mais de deux variables :
$cle : elle contiendra la cl de l'lment en cours d'analyse ("prenom", "nom", etc.).
$element : il contiendra la valeur de l'lment en cours ("Franois", "Dupont", etc.).
Essayer !
Avec cette faon de procder, vous avez maintenant dans la boucle la cl ET la valeur.
Et foreach, croyez-moi, c'est un truc vraiment pratique ! On aura souvent l'occasion de s'en servir dans nos prochains scripts
PHP !
Essayer !
www.siteduzero.com
97/361
Voil, c'est facile utiliser du temps qu'on n'oublie pas la balise <pre> pour avoir un affichage correct.
Bien entendu, vous n'afficherez jamais des choses comme a vos visiteurs. On peut en revanche s'en servir pour le
dbuggage, pendant la cration du site, afin de voir rapidement ce que contient l'array.
www.siteduzero.com
98/361
La fonction renvoie un boolen, c'est dire true (vrai) si la cl est dans l'array, et false (faux) si la cl ne se trouve pas dans
l'array. Ca nous permet de faire un test facilement avec un if :
Code : PHP
<?php
$coordonnees = array (
'prenom' => 'Franois',
'nom' => 'Dupont',
'adresse' => '3 Rue du Paradis',
'ville' => 'Marseille');
if (array_key_exists('nom', $coordonnees))
{
echo 'La cl "nom" se trouve dans les coordonnes !';
}
if (array_key_exists('pays', $coordonnees))
{
echo 'La cl "pays" se trouve dans les coordonnes !';
}
?>
Essayer !
Comme vous pouvez le voir, on n'a trouv que "nom", et pas "pays" (logique). Seule la premire condition a donc t excute.
99/361
Le principe est le mme que array_key_exists... mais cette fois on recherche dans les valeurs. in_array renvoie true
si la valeur se trouve dans l'array, false si elle ne s'y trouve pas.
Pour changer un peu de notre array $coordonnees, je vais crer un nouvel array (numrot) compos de fruits
Code : PHP
<?php
$fruits = array ('Banane', 'Pomme', 'Poire', 'Cerise', 'Fraise',
'Framboise');
if (in_array('Myrtille', $fruits))
{
echo 'La valeur "Myrtille" se trouve dans les fruits !';
}
if (in_array('Cerise', $fruits))
{
echo 'La valeur "Cerise" se trouve dans les fruits !';
}
?>
Essayer !
On ne voit que le message pour la Cerise, tout simplement parce que in_array a renvoy true pour "Cerise" et false
pour "Myrtille".
):
Code : PHP
<?php
$fruits = array ('Banane', 'Pomme', 'Poire', 'Cerise', 'Fraise',
'Framboise');
$position = array_search('Fraise', $fruits);
echo '"Fraise" se trouve en position ' . $position . '<br />';
$position = array_search('Banane', $fruits);
echo '"Banane" se trouve en position ' . $position;
?>
Essayer !
Je sais que je me rpte, mais n'oubliez pas qu'un array numrot commence 0 ! Cela explique donc pourquoi
"Banane" se trouve en position 0...
www.siteduzero.com
100/361
Voil donc les fonctions qu'il fallait connatre pour faire une recherche dans un array. Il y en a d'autres mais vous connaissez
maintenant les principales.
Et voil ! Bravo vous avez termin la partie I, vous connaissez les bases de PHP !
Vous ne le savez peut-tre pas, mais vous avez appris normment de choses. En fait, vous venez d'apprendre ce que j'estime le
plus dur : le dbut. Au dbut, on ne sait rien et il faut s'accrocher pour comprendre des choses qui ont l'air de ne servir rien.
Vous en tes arrivs au bout : flicitations !
A ct, tous les prochains chapitres devraient vous paratre agrables et simples lire
Continuez comme a, vous tes sur la bonne voie. Vous allez bientt matriser le PHP comme des pros !
www.siteduzero.com
101/361
www.siteduzero.com
102/361
Le point d'interrogation spare le nom de la page PHP des paramtres. Ensuite, les paramtres s'enchanent selon la forme
nom=valeur et sont spars entre eux par le symbole &.
On peut crire autant de paramtres que l'on veut ?
En thorie oui. Il suffit de les sparer par des & comme je l'ai fait. On peut donc voir une URL de la forme :
page.php?param1=valeur1¶m2=valeur2¶m3=valeur3¶m4=valeur4 [...]
La seule limite est la longueur de l'URL. En gnral il n'est pas conseill de dpasser les 256 caractres, mais parfois les
navigateurs arrivent grer des URL plus longues. Quoiqu'il en soit vous l'aurez compris, on ne peut pas mettre un roman dans
l'URL non plus.
www.siteduzero.com
103/361
Nous voulons faire un lien de index.php qui amne vers bonjour.php et qui lui transmet des informations dans l'URL.
Pour cela, ouvrez index.php (puisque c'est lui qui contiendra le lien) et insrez-y par exemple le code suivant :
Code : PHP
<a href="bonjour.php?nom=Dupont&prenom=Jean">Dis-moi bonjour
!</a>
Comme vous le voyez, le & dans le code a t remplac par & dans le lien. Ca n'a rien voir avec le PHP,
simplement en HTML on demande ce que les & soient crits & dans le code source. Si vous ne le faites pas, le
code ne passera pas la validation W3C.
Vous avez srement devin ce qu'on essaie de faire ici. On appelle une page bonjour.php qui va dire "Bonjour" la personne
dont le nom et le prnom ont t envoys en paramtres.
Comment faire dans la page bonjour.php pour rcuprer ces informations ? C'est ce que nous allons voir maintenant.
www.siteduzero.com
104/361
Valeur
Dupont
$_GET['prenom'] Jean
On peut donc rcuprer ces informations, les traiter, les afficher, bref faire ce qu'on veut avec. Essayons pour commencer de les
afficher, tout simplement.
Crez un nouveau fichier PHP que vous appellerez bonjour.php et placez-y le code suivant :
Code : PHP
<p>Bonjour <?php echo $_GET['prenom']; ?> !</p>
Bien sr, pour une vraie page web il faudrait crire toutes les informations d'en-tte ncessaires en HTML : le
doctype, la balise <head>, etc. Ici, je ne mets pas tout ce code pour faire simple. La page ne sera pas trs belle (ni
valide W3C d'ailleurs) mais ce n'est pas notre problme ici. Nous faisons juste des tests.
Ici, nous affichons le prnom qui a t pass dans l'URL. Bien entendu, nous avons aussi accs au nom. Nous pouvons afficher
le nom et le prnom sans problme :
Code : PHP
<p>Bonjour <?php echo $_GET['prenom'] . ' ' . $_GET['nom']; ?> !</p>
Comme vous le voyez j'en ai profit pour faire une petite concatnation comme nous avons appris le faire. Ce code que vous
voyez l n'est pas bien complexe : nous affichons le contenu de 2 cases de l'array $_GET. C'est vraiment trs simple et il n'y a
rien de nouveau. Tout ce qu'il fallait savoir, c'est qu'on peut retrouver les paramtres envoys dans l'URL grce un array
nomm $_GET.
Si vous voulez tester le rsultat, je vous propose d'essayer en ligne ce que a donne directement sur le Site du Zro. Ce lien
ouvre la page index.php :
Essayer !
Vous devriez faire le test aussi chez vous pour vous assurer que vous comprenez bien le fonctionnement ! Si besoin est, vous
pouvez tlcharger mes fichiers index.php et bonjour.php d'exemple.
www.siteduzero.com
www.siteduzero.com
105/361
106/361
Peut-tre, mais cela montre une chose : on ne peut pas avoir confiance dans les donnes qu'on reoit . N'importe quel visiteur
peut les changer. Dans la page index.php j'ai fait un lien qui dit bonjour Jean Dupont, mais la page bonjour.php ne va
pas forcment afficher "Bonjour Jean Dupont !" puisque n'importe quel visiteur peut s'amuser modifier l'URL.
Je vous propose de faire des modifications encore plus vicieuses et de voir ce qu'on peut faire pour viter les problmes qui en
dcoulent.
www.siteduzero.com
107/361
http://localhost/tests/bonjour.php
Que va afficher la page bonjour.php ? Faites le test ! Elle va afficher quelque chose comme :
Code : Console
Bonjour
Notice: Undefined index: prenom in C:\wamp\www\tests\bonjour.php on line 9
Notice: Undefined index: nom in C:\wamp\www\tests\bonjour.php on line 9
!
Que s'est-il pass ? On a essay d'afficher la valeur de $_GET['prenom'] et de $_GET['nom']... Mais comme on vient de
les supprimer de l'URL, ces variables n'ont pas t cres et donc elles n'existent pas ! PHP nous avertit qu'on essaie d'utiliser
des lments du tableau qui n'existent pas, d'o les "Undefined index".
Pour rsoudre ce problme, on peut faire appel une fonction un peu spciale : isset(). Cette fonction teste si une variable
existe. Nous allons nous en servir pour afficher un message spcifique si le nom ou le prnom sont absents.
Code : PHP
<?php
if (isset($_GET['prenom']) AND isset($_GET['nom'])) // On a le nom
et le prnom
{
echo 'Bonjour ' . $_GET['prenom'] . ' ' . $_GET['nom'] . ' !';
}
else // Il manque des paramtres, on avertit le visiteur
{
echo 'Il faut renseigner un nom et un prnom !';
}
?>
Que fait ce code ? Il teste si les variables $_GET['prenom'] et $_GET['nom'] existent. Si elles existent, on dit bonjour
au visiteur. S'il nous manque une des variables (ou les deux) on affiche un message d'erreur : "Il faut renseigner un nom et un
prnom !".
Essayez maintenant d'accder la page bonjour.php sans les paramtres, vous allez voir qu'on gre bien le cas o le
visiteur aurait retir les paramtres de l'URL.
Est-ce que c'est vraiment la peine de grer ce cas ? C'est vrai quoi, moi je ne m'amuse jamais modifier mes URL et
mes visiteurs non plus je pense !
Oui, oui, trois fois oui : il faut que vous pensiez grer le cas o des paramtres que vous attendiez viendraient manquer.
Vous vous souvenez de ce que je vous ai dit ? Il ne faut jamais faire confiance l'utilisateur. Tt ou tard vous tomberez sur un
utilisateur malintentionn qui essaiera de trafiquer l'URL pour mettre n'importe quoi dans les paramtres. Il faut que votre site
soit prt grer le cas.
Dans notre exemple, si on ne grait pas le cas a ne faisait rien de bien grave (a affichait juste des messages d'erreur). Mais
lorsque votre site web deviendra plus complexe, cela pourrait avoir de plus graves consquences.
Un exemple ? Sur le Site du Zro lui-mme, nous avions une fois oubli de grer le cas o un paramtre viendrait
manquer. Un utilisateur avait essay de l'enlever "pour voir" et notre page PHP tait faite de telle sorte que si le
paramtre manquait, a supprimait toutes les prfrences de tous les membres inscrits du site !
www.siteduzero.com
108/361
Vous n'en tes pas encore l, mais je tiens vous sensibiliser aux problmes potentiels que cela peut provoquer.
Soyez donc vigilants ds maintenant et ne supposez jamais que vous allez recevoir tous les paramtres que vous
attendiez.
On teste si le paramtre repeter existe lui aussi (avec isset($_GET['repeter'])). Si tous les paramtres sont bien l,
on fait une boucle (j'ai choisi de faire un for, mais on aurait aussi pu faire un while). La boucle incrmente une petite
variable $i pour rpter le message de bienvenue le nombre de fois indiqu.
Le rsultat ? Si on va sur :
http://localhost/tests/bonjour.php?nom=Dupont&prenom=Jean&repeter=8
Alors le message de bienvenue s'affichera 8 fois :
Code : Console
Bonjour
Bonjour
Bonjour
Bonjour
Bonjour
Bonjour
Bonjour
Bonjour
Jean
Jean
Jean
Jean
Jean
Jean
Jean
Jean
Dupont
Dupont
Dupont
Dupont
Dupont
Dupont
Dupont
Dupont
!
!
!
!
!
!
!
!
Nous avons amlior notre page pour qu'elle puisse dire bonjour plusieurs fois, et ce nombre de fois est personnalisable dans
www.siteduzero.com
109/361
En tant plus malin et surtout plus prvoyant. Voici ce qu'il faut anticiper :
Le cas o le nombre qu'on vous envoie n'est pas une valeur raisonnable.
Par exemple on peut dire que si on dpasse 100 fois, c'est trop, et il faut refuser d'excuter la page.
De mme, que se passe-t-il si je demande de rpter "-4 fois" ? Ca ne devrait pas tre autoris. Il faut que le
nombre soit au moins gal 1.
Le cas o la valeur n'est pas logique, o elle n'est pas du tout ce qu'on attendait. Rien n'empche le visiteur de
remplacer la valeur du paramtre repeter par du texte !
Que se passe-t-il si on essaie d'accder bonjour.php?
nom=Dupont&prenom=Jean&repeter=grenouille ? Cela ne devrait pas tre autoris. Le mot
"grenouille" n'a pas de sens, on veut un nombre entier positif.
Que se passe-t-il si on essaie d'accder bonjour.php?nom=Dupont&prenom=Jean&repeter=true ?
Cela ne devrait pas tre autoris non plus, on attendait un nombre entier positif, pas un boolen.
Pour vrifier que repeter contient bien un nombre, une bonne solution pourrait tre de forcer la conversion de la variable
en type entier (int). On peut utiliser pour cela ce qu'on appelle le transtypage, une notion qu'on n'a pas vue jusqu'ici mais
qui est trs simple comprendre. Regardez ce code :
Code : PHP
<?php
$_GET['repeter'] = (int) $_GET['repeter'];
?>
Il faut lire cette instruction de droite gauche. Le (int) entre parenthses est comme un tuyau de conversion. Tout ce qui
transite travers ressort forcment en une valeur de type int (entier).
www.siteduzero.com
110/361
Si la valeur est bien un entier (par exemple 14) alors elle n'est pas modifie. En revanche, si la valeur contient autre chose
qu'un entier (par exemple "grenouille") elle est transforme en entier. Ici, comme PHP ne peut pas associer de valeur
grenouille, il lui donne 0.
Aprs avoir excut cette instruction, la variable $_GET['repeter'] contient maintenant forcment un nombre entier. Il
ne reste plus qu' vrifier que ce nombre est bien compris entre 1 et 100 l'aide d'une condition, ce que vous savez faire
normalement.
Voici donc le code final scuris qui prvoit tous les cas pour viter d'tre pris au dpourvu par un utilisateur malintentionn :
Code : PHP
<?php
if (isset($_GET['prenom']) AND isset($_GET['nom']) AND
isset($_GET['repeter']))
{
// 1 : On force la conversion en nombre entier
$_GET['repeter'] = (int) $_GET['repeter'];
// 2 : Le nombre doit tre compris entre 1 et 100
if ($_GET['repeter'] >= 1 AND $_GET['repeter'] <= 100)
{
for ($i = 0 ; $i < $_GET['repeter'] ; $i++)
{
echo 'Bonjour ' . $_GET['prenom'] . ' ' . $_GET['nom'] . ' !<br
/>';
}
}
}
else
{
echo 'Il faut renseigner un nom, un prnom et un nombre de
rptitions !';
}
?>
Cela fait beaucoup de conditions pour quelque chose qui tait la base assez simple. Mais c'tait ncessaire. Vous devrez
toujours faire trs attention comme on l'a fait prvoir tous les cas les plus tordus :
Vrifier que tous les paramtres que vous attendiez sont bien l.
Vrifier qu'ils contiennent bien des valeurs correctes comprises dans des intervalles raisonnables.
www.siteduzero.com
111/361
devrait dj vous avoir sensibilis au problme, mais nous irons plus loin dans le chapitre suivant pour finir de
couvrir ce sujet. Tout ceci est un peu complexe je suis d'accord, mais c'est rellement important !
L'utilisation des paramtres envoys dans l'URL est simple : il suffit de rcuprer ces valeurs dans l'array $_GET. Vous ne
devriez pas avoir eu de mal comprendre cela dans la premire moiti de ce chapitre.
En revanche, j'ai particulirement insist dans ce chapitre sur le fait qu'il faut tre trs vigilant quand on rcupre des donnes
qui sont modifiables par l'utilisateur. N'ayez jamais confiance. Les programmeurs disent "Never trust user input " (ne faites
jamais confiance en ce que l'utilisateur a saisi). Cette phrase devrait ds aujourd'hui tre affiche sur un mur de votre chambre.
Trop de programmeurs dbutants ont fait confiance ce que l'utilisateur allait saisir ("allez quoi, il ne va jamais rentrer
grenouille la place d'un nombre !") et je peux vous dire qu'ils s'en mordent aujourd'hui les doigts.
Heureusement a ne sera pas votre cas ! J'ai t alarmiste, voire mme un peu lourd dans ce chapitre, mais c'est pour votre bien.
Vous allez voir, vous allez trs vite avoir le rflexe de tester les donnes que votre page PHP reoit !
Never trust user input.
Never trust user input.
Never trust user input.
Never trust user input.
www.siteduzero.com
112/361
</p>
</form>
On crira le contenu de notre formulaire entre les balises <form> et </form>. Si vous avez lu mon cours de
HTML/CSS vous verrez qu'une bonne partie de ce chapitre ne sera que des rappels puisque je vais vous prsenter
comment on insre les champs du formulaire dans la page. Cependant, et ce sera nouveau, nous allons aussi dcouvrir
comment traiter en PHP les donnes qui ont t envoyes par le visiteur.
Je souhaite attirer votre attention sur la toute premire ligne de ce code. Il y a 2 attributs trs importants connatre pour la
balise <form> : la mthode (method ) et la cible (action). Il est impratif que vous compreniez quoi ils servent.
La mthode
Il faut savoir qu'il y a plusieurs moyens d'envoyer les donnes du formulaire (plusieurs "mthodes"). Les 2 mthodes possibles
sont :
get : les donnes transiteront par l'URL comme on l'a appris prcdemment. On pourra les rcuprer grce l'array
$_GET. Cette mthode est assez peu utilise car on ne peut pas envoyer beaucoup d'informations dans l'URL (je vous
disais dans le chapitre prcdent qu'il tait prfrable de ne pas dpasser 256 caractres).
post : les donnes ne transiteront pas par l'URL, l'utilisateur ne les verra donc pas passer dans la barre d'adresse. Cette
mthode permet d'envoyer autant de donnes que l'on veut, ce qui fait qu'on la privilgie le plus souvent. Nanmoins,
les donnes ne sont pas plus scurises qu'avec la mthode GET et il faudra toujours vrifier si tous les paramtres sont
bien prsents et valides comme on l'a fait dans le chapitre prcdent. On ne doit pas plus faire confiance aux
formulaires qu'aux URL.
C'est vous de choisir par quelle mthode vous souhaitez que les donnes du formulaire soient envoyes. Si vous hsitez,
sachez que dans 99% des cas la mthode que l'on utilise est post, vous crirez donc method="post" comme je l'ai fait.
La cible
L'attribut action sert dfinir la page appele par le formulaire. C'est cette page qui recevra les donnes du formulaire et qui
sera charge de les traiter.
Imaginons le schma suivant :
www.siteduzero.com
113/361
Dans cet exemple, le formulaire se trouve dans la page formulaire.php. Cette page ne fait aucun traitement particulier,
mais une fois le formulaire envoy (lorsqu'on a cliqu sur le bouton "Envoyer"), le visiteur est redirig vers la page
cible.php qui reoit les donnes du formulaire.
Retenez donc bien que vous travaillez normalement sur 2 pages diffrentes : la page qui contient le formulaire
(formulaire.php dans notre exemple), et celle qui reoit les donnes du formulaire pour les traiter ( cible.php).
www.siteduzero.com
114/361
Pour les mots de passe, vous pouvez utiliser type="password", ce qui aura pour effet de cacher le texte rentr
par le visiteur. A part ce dtail, le fonctionnement reste le mme.
Oui, je sais que vous commencez vous inquiter car vous n'avez pas encore vu de PHP pour le moment mais n'ayez pas peur.
Le fonctionnement est tout simple et a un air de dj vu. Le texte que le visiteur aura rentr sera disponible dans cible.php
sous la forme d'une variable appele $_POST['pseudo'].
Pour l'exemple, je vous propose de crer un formulaire qui demande le prnom du visiteur et qui l'affiche ensuite firement sur
la page cible.php. On va donc distinguer 2 codes sources : celui de la page du formulaire et celui de la page cible.
Voici le code de la page formulaire.php :
Code : PHP
<p>
Cette page ne contient que du HTML.<br />
Veuillez taper votre prnom :
</p>
<form action="cible.php" method="post">
<p>
<input type="text" name="prenom" />
<input type="submit" value="Valider" />
</p>
www.siteduzero.com
115/361
</form>
Rappel du HTML : le champ <input type="submit" /> permet de crer le bouton de validation du formulaire
qui commande l'envoi des donnes, et donc la redirection du visiteur vers la page cible.
Maintenant, je vous propose de crer la page cible.php. Cette page va recevoir le prnom dans une variable nomme
$_POST['prenom'].
Code : PHP
<p>Bonjour !</p>
<p>Je sais comment tu t'appelles, h h. Tu t'appelles <?php echo
$_POST['prenom']; ?> !</p>
<p>Si tu veux changer de prnom, <a href="formulaire.php">clique
ici</a> pour revenir formulaire.php</p>
), ressemble ceci :
On peut y crire autant de lignes que l'on veut. C'est plus adapt si le visiteur doit crire un long message par exemple.
On va utiliser le code HTML suivant pour insrer cette grosse zone de texte :
Code : HTML
<textarea name="message" rows="8" cols="45">
Votre message ici.
www.siteduzero.com
116/361
</textarea>
L encore, on a un attribut name qui va dfinir le nom de la variable qui sera cre dans cible.php. Dans notre cas, ce sera
la variable $_POST['message'].
Vous remarquerez qu'il n'y a pas d'attribut value. En fait, le texte par dfaut est ici crit entre le <textarea> et le
</textarea>. Si vous ne voulez rien mettre par dfaut, alors n'crivez rien entre <textarea> et </textarea>.
Les attributs rows et cols permettent de dfinir la taille de la zone de texte en hauteur et en largeur
respectivement.
La liste droulante
La liste droulante, c'est a :
1</option>
2</option>
3</option>
4</option>
Tout btement, on utilise la balise <select> laquelle on donne un nom (ici : "choix"). On crit ensuite les diffrentes
options disponibles... Puis on referme la balise avec </select>.
Ici, une variable $_POST['choix'] sera cre, et elle contiendra le choix qu'a fait l'utilisateur. S'il a choisi "Choix 3", la
variable $_POST['choix'] sera gale au value correspondant, c'est--dire "choix3".
Vous pouvez aussi dfinir le choix par dfaut de la liste. Normalement c'est le premier, mais si vous rajoutez l'attribut
selected="selected" une balise <option>, alors ce sera le choix par dfaut. On pourrait par exemple crire :
Code : PHP
<option value="choix3" selected="selected">Choix 3</option>
www.siteduzero.com
117/361
L'utilisation de la balise <label> n'est pas obligatoire mais je la recommande fortement. Elle permet d'associer le
libell la case cocher qui a le mme id que son attribut for, ce qui permet de cliquer sur le libell pour cocher
la case. On y gagne donc en ergonomie d'utilisation. Pour en savoir plus, rfrez-vous au chapitre sur les formulaires
du cours sur HTML et CSS.
L encore, on donne un nom la case cocher via l'attribut name (ici : "case"). Ce nom va gnrer une variable dans la page
cible, par exemple $_POST['case'].
Si la case est coche, alors $_POST['case'] aura pour valeur "on".
Si elle n'est pas coche, alors $_POST['case'] n'existera pas. Vous pouvez faire un test avec
isset($_POST['case']) pour vrifier si la case a t coche ou non.
Si vous voulez que la case soit coche par dfaut, il faudra lui rajouter l'attribut checked="checked". Par exemple :
Code : HTML
<input type="checkbox" name="case" checked="checked" />
www.siteduzero.com
118/361
Code : HTML
Aimez-vous les frites ?
<input type="radio" name="frites" value="oui" id="oui"
checked="checked" /> <label for="oui">Oui</label>
<input type="radio" name="frites" value="non" id="non" /> <label
for="non">Non</label>
Comme vous pouvez le voir, les deux boutons d'option ont le mme nom ("frites"). C'est trs important, car les boutons
d'options fonctionnent par groupes : tous les boutons d'option d'un mme groupe doivent avoir le mme nom. Cela permet au
navigateur de savoir quels boutons d'option dsactiver quand on active un autre bouton d'option du groupe. Il serait bte en
effet de pouvoir slectionner "Oui" et "Non" la fois.
Pour pr-cocher l'un de ces boutons d'option, faites pareil que pour les cases cocher : rajoutez un attribut
checked="checked". Ici, comme vous pouvez le voir, "Oui" est slectionn par dfaut.
Dans la page cible, une variable $_POST['frites'] sera cre. Elle aura la valeur du bouton d'option choisi par le
visiteur, issue de l'attribut value. Si on aime les frites, alors on aura $_POST['frites'] = 'oui'.
Il faut bien penser remplir l'attribut value du bouton d'option car c'est lui qui va dterminer la valeur de la variable.
A l'cran, sur la page web on ne verra rien. Mais dans la page cible, une variable $_POST['pseudo'] sera cre, et elle aura
la valeur "Mateo21" !
C'est apparemment inutile, mais vous verrez que vous en aurez parfois besoin.
On croit par erreur que, parce que ces champs sont cachs, le visiteur ne peut pas les voir. C'est faux ! En effet,
n'importe quel visiteur peut afficher le code source de la page et voir qu'il y a des champs cachs en lisant le code
HTML. Mieux, il peut mme modifier la valeur du champ cach s'il a les outils appropris.
Que faut-il retenir ? Ce n'est pas parce que le champ est cach que vous devez considrer qu'il est inviolable.
N'importe quel visiteur (un peu malin) peut le lire, modifier sa valeur et mme le supprimer. Ne faites pas confiance
aux donnes envoyes par le visiteur ! Vous vous souvenez de cette rgle dont je vous ai parl dans le chapitre
prcdent, elle est plus que jamais d'actualit.
www.siteduzero.com
119/361
On a tendance croire que les visiteurs ne peuvent pas "bidouiller" le formulaire mais c'est faux. Je vais vous montrer dans un
premier temps pourquoi les formulaires ne sont pas plus srs que les URL, puis je vous parlerai d'un autre danger important : la
faille XSS. Avec a, nous aurons vraiment fait le tour de ce qu'il faut savoir pour tre tranquille par la suite !
De la mme manire, comme dans le chapitre prcdent, mme si vous demandez un nombre compris entre 1 et 100 il y aura
bien quelqu'un pour crire "48451254523". Soyez donc vigilants et n'ayez jamais confiance dans ce qui vient de l'utilisateur,
savoir les donnes issues des array $_GET et $_POST.
Avec les formulaires, vous ne pouvez pas non plus supposer qu'on va vous envoyer tous les champs que vous attendiez. Un
visiteur peut trs bien s'amuser supprimer un champ de texte, et dans ce cas votre page cible.php ne recevra jamais le
texte qu'elle attendait ! Il faudra imprativement qu'elle vrifie que toutes les donnes qu'elle attendait sont bien l avant
d'effectuer des oprations.
Puisque la page du formulaire se trouve sur mon site, comment peut faire un visiteur pour modifier ma page web ? Il
peut voir les sources mais pas les modifier !
En effet, vos visiteurs ne peuvent pas modifier vos pages web sur le serveur... Mais ils peuvent les reprendre et les modifier
ailleurs. Souvenez-vous de ce schma :
www.siteduzero.com
120/361
La page formulaire.php contient le formulaire et cible.php traite les donnes qu'on lui a envoyes. Autant le code
PHP n'est jamais visible par vos visiteurs, autant le code HTML du formulaire, lui, peut tre vu par tout le monde.
A partir de l, qu'est-ce qui empche quelqu'un de crer une copie lgrement modifie de votre formulaire et de la stocker sur
son serveur ?
Sur le schma ci-dessus, le "mchant" (nous l'appellerons comme a, parce que a lui va bien
votre formulaire, l'a modifi et l'a enregistr sur son serveur (ou mme sur son ordinateur). L'attribut action a t modifi pour
indiquer l'adresse absolue (donc complte) de votre page cible :
Code : PHP
<form method="post" action="http://www.monsite.com/cible.php">
www.siteduzero.com
121/361
Le mchant peut maintenant modifier votre formulaire, ajouter des champs, en supprimer, bref faire ce qu'il veut avec ! Votre
page cible.php n'y verra que du feu car il est impossible de savoir avec certitude de quel formulaire vient le visiteur.
Ces explications sont assez techniques. En fait, on les rserve normalement aux personnes plus exprimentes que les
dbutants. Cependant, je tenais volontairement vous montrer comment c'est possible. Mme si tout n'est pas totalement clair
dans votre tte, vous avez au moins l'ide du mode de fonctionnement.
S'il y a une chose retenir ici, c'est que les formulaires sont modifiables par tous les visiteurs contrairement ce qu'on
pourrait penser. Par consquent, votre page cible.php devra tre aussi vigilante que nous l'avons t dans le chapitre
prcdent et ne pas faire confiance aux donnes de l'utilisateur. Souvenez-vous de cette maxime de programmeur : Never trust
user input.
Il y a un moyen encore plus simple de modifier le formulaire de votre site sans avoir accs votre serveur. Internet
Explorer 8 et Google Chrome embarquent des "outils pour les dveloppeurs" qui permettent de modifier le code
HTML de la page que l'on visite en temps rel. Firefox peut aussi faire de mme avec son clbre plugin Firebug.
nombreux sites web, mme sur des sites web professionnels ! C'est une technique qui consiste injecter du code HTML
contenant du Javascript dans vos pages pour le faire excuter vos visiteurs.
Reprenons la page qui affiche le prnom qu'on lui envoie. Elle contient notamment le code suivant :
Code : PHP
<p>Je sais comment tu t'appelles, h h. Tu t'appelles <?php echo
$_POST['prenom']; ?> !</p>
Si le visiteur dcide d'crire du code HTML la place de son prnom, cela fonctionnera trs bien ! Par exemple, imaginons
qu'il crive dans le champ "Prnom" le code : <strong>Badaboum</strong>. Le code source HTML qui sera gnr par
PHP sera le suivant :
Code : HTML
<p>Je sais comment tu t'appelles, h h. Tu t'appelles
<strong>Badaboum</strong> !</p>
Et alors ? S'il veut mettre son prnom en gras c'est son problme non ?
Outre le fait qu'il peut insrer n'importe quel code HTML (et rendre votre page invalide), ce qui n'est pas le plus grave, il peut
aussi ouvrir des balises de type <script> pour faire excuter du code Javascript au visiteur qui visualisera la page !
Code : HTML
www.siteduzero.com
122/361
Tous les visiteurs qui arriveront sur cette page verront une bote de dialogue Javascript s'afficher. Plutt gnant.
Les choses deviennent vraiment critiques si le visiteur est assez malin pour rcuprer vos cookies de cette faon-l.
Les cookies stockent des informations sur votre session et parfois des informations plus confidentielles comme votre
pseudonyme et votre mot de passe sur le site ! Il est possible de forcer le visiteur qui lira le code Javascript vous
envoyer tous les cookies qu'il a enregistrs pour votre site web, ce qui peut conduire au vol de son compte sur ce site.
Je ne rentrerai pas dans le dtail de cette mthode car on s'loignerait un peu trop du sujet, mais sachez que c'est
possible et qu'il faut donc tout prix viter qu'un visiteur puisse injecter du code Javascript dans vos pages !
Rsoudre le problme est facile : il faut protger le code HTML en l'chappant, c'est--dire en affichant les balises (ou en les
retirant) plutt que de les faire excuter par le navigateur.
Pour chapper le code HTML, il suffit d'utiliser la fonction htmlspecialchars qui va transformer les chevrons des balises
www.siteduzero.com
123/361
HTML <> en < et > respectivement. Cela provoquera l'affichage de la balise plutt que son excution.
Code : PHP
<p>Je sais comment tu t'appelles, h h. Tu t'appelles <?php echo
htmlspecialchars($_POST['prenom']); ?> !</p>
Le code HTML qui en rsultera sera propre et protg car les balises HTML insres par le visiteur auront t chappes :
Code : HTML
<p>Je sais comment tu t'appelles, h h. Tu t'appelles
<strong>Badaboum</strong> !</p>
Il faut penser utiliser cette fonction sur tous les textes envoys par l'utilisateur qui sont susceptibles d'tre affichs
sur une page web. Sur un forum par exemple, il faut penser chapper les messages posts par vos membres, mais
aussi leurs pseudos (ils peuvent s'amuser mettre du HTML dedans !) ainsi que leurs signatures ! Bref, tout ce qui est
affich et qui vient la base d'un visiteur, vous devez penser le protger avec htmlspecialchars.
Si vous prfrez retirer les balises HTML que le visiteur a tent d'envoyer plutt que de les afficher, utilisez la
fonction strip_tags.
www.siteduzero.com
124/361
L'envoi de fichiers
Vous saviez qu'on pouvait aussi envoyer des fichiers grce aux formulaires ? Vous aurez besoin de lire cette section si vous
voulez que vos visiteurs puissent envoyer (on dit aussi uploader) des images, des programmes ou tout autre type de fichier sur
votre site.
Cette section est un peu plus complexe que le reste du chapitre. Sa lecture n'est d'ailleurs pas obligatoire pour la
bonne comprhension de la suite du cours.
Par consquent, n'hsitez pas revenir la lire plus tard, lorsque vous en aurez besoin, si vous ne voulez pas vous
attaquer de suite une partie un peu "difficile".
On va commencer par crer le formulaire permettant d'envoyer un fichier (une simple page HTML).
Nous verrons ensuite comment traiter l'envoi du fichier ct serveur avec PHP.
Grce enctype, le navigateur du visiteur sait qu'il s'apprte envoyer des fichiers.
Maintenant que c'est fait, nous pouvons ajouter l'intrieur du formulaire une balise permettant d'envoyer un fichier. C'est une
balise trs simple de type <input type="file" />. Il faut penser comme toujours donner un nom ce champ de
formulaire (grce l'attribut name) pour que PHP puisse reconnatre le champ aprs.
Code : HTML
<form action="cible_envoi.php" method="post"
enctype="multipart/form-data">
<p>
Formulaire d'envoi de fichier :<br />
<input type="file" name="monfichier" /><br />
<input type="submit" value="Envoyer le fichier" />
</p>
www.siteduzero.com
125/361
</form>
En fait, au moment o la page PHP s'excute, le fichier a t envoy sur le serveur mais il est stock dans un dossier
temporaire.
C'est vous de dcider si vous acceptez dfinitivement le fichier ou non. Vous pouvez par exemple vrifier si le fichier a la
bonne extension (si vous demandiez une image et qu'on vous envoie un ".txt", vous devrez refuser le fichier).
Si le fichier est bon, vous l'accepterez dfinitivement grce la fonction move_uploaded_file.
Pour chaque fichier envoy, une variable $_FILES['nom_du_champ'] est cre. Dans notre cas, la variable s'appellera
$_FILES['monfichier'].
Cette variable est un tableau qui contient plusieurs informations sur le fichier :
Variable
Signification
$_FILES['monfichier']['name']
$_FILES['monfichier']['type']
Indique le type du fichier envoy. Si c'est une image gif par exemple, le
type sera image/gif.
$_FILES['monfichier']['size']
Juste aprs l'envoi, le fichier est plac dans un rpertoire temporaire sur
le serveur en attendant que votre script PHP dcide si oui ou non il
$_FILES['monfichier']['tmp_name']
accepte de le stocker dfinitivement. Cette variable contient
l'emplacement temporaire du fichier (c'est PHP qui gre a).
$_FILES['monfichier']['error']
www.siteduzero.com
126/361
Je vous propose de faire les vrifications suivantes pour dcider si on accepte le fichier ou non :
1. Vrifier tout d'abord si le visiteur a bien envoy un fichier (en testant la variable $_FILES['monfichier'] avec
isset) et s'il n'y a pas eu d'erreur d'envoi (grce $_FILES['monfichier']['error'])
2. Vrifier si la taille du fichier ne dpasse pas 1 Mo par exemple (environ 1 000 000 d'octets) grce
$_FILES['monfichier']['size']
3. Vrifier si l'extension du fichier est autorise (il faut interdire tout prix que les gens puissent envoyer des fichiers
PHP, sinon ils pourraient excuter des scripts sur votre serveur !). Dans notre cas, nous autoriserons seulement les
images (fichiers .png, .jpg, .jpeg et .gif).
Nous analyserons pour cela la variable $_FILES['monfichier']['name'].
Nous allons donc faire une srie de tests dans notre page cible_envoi.php.
www.siteduzero.com
127/361
La fonction pathinfo renvoie un array contenant entre autres l'extension du fichier dans
$infosfichier['extension']. On stocke a dans une variable $extension_upload.
Une fois l'extension rcupre, on peut la comparer un tableau d'extensions autorises (un array) et vrifier si l'extension
rcupre fait bien partie des extensions autorises l'aide de la fonction in_array().
Ouf ! Ca donne a au final :
Code : PHP
<?php
// Testons si le fichier a bien t envoy et s'il n'y a pas
d'erreur
if (isset($_FILES['monfichier']) AND $_FILES['monfichier']['error']
== 0)
{
// Testons si le fichier n'est pas trop gros
if ($_FILES['monfichier']['size'] <= 1000000)
{
// Testons si l'extension est autorise
$infosfichier = pathinfo($_FILES['monfichier']['name']);
$extension_upload = $infosfichier['extension'];
$extensions_autorisees = array('jpg', 'jpeg', 'gif', 'png');
if (in_array($extension_upload, $extensions_autorisees))
{
}
?>
www.siteduzero.com
128/361
Lorsque vous mettrez le script sur le net l'aide d'un logiciel FTP, vrifiez que le dossier "uploads" sur le serveur
existe et qu'il a les droits d'criture. Pour ce faire, sous Filezilla par exemple, faites un clic droit sur le dossier et
choisissez "Attributs du fichier".
Cela vous permettra d'diter les droits du dossier (on parle de CHMOD). Mettez les droits 733, ainsi PHP pourra
placer des fichiers uploads dans ce dossier.
Ce script est un dbut, mais en pratique il vous faudra srement encore l'amliorer. Par exemple, si le nom du fichier contient
des espaces ou des accents a posera un problme une fois envoy sur le web. D'autre part, si quelqu'un envoie un fichier qui a
le mme nom que celui d'une autre personne, l'ancien sera cras !
La solution consiste en gnral "choisir" nous-mmes le nom du fichier stock sur le serveur plutt que de se servir du nom
d'origine. Vous pouvez faire un compteur qui s'incrmente : 1.png, 2.png, 3.jpg, etc.
Soyez toujours trs vigilants sur la scurit, vous devez viter que quelqu'un puisse envoyer des fichiers PHP sur
votre serveur.
www.siteduzero.com
129/361
Pour aller plus loin, je vous recommande de lire le tutoriel de DHKold sur l'upload de fichiers par formulaire . Il est plus
complet que le mien et vous expliquera mieux certains dtails.
Bonne lecture
www.siteduzero.com
130/361
Votre objectif
Voici le scnario : vous voulez mettre en ligne une page web pour donner des informations confidentielles certaines
personnes. Cependant, pour limiter l'accs cette page, il faudra connatre un mot de passe.
Dans notre cas, les donnes confidentielles seront les codes d'accs au serveur central de la NASA (soyons fous !
). Le mot
Comment procder ?
Pour travailler correctement, je recommande toujours de travailler d'abord au brouillon (vous savez, avec un stylo et une
feuille de papier
). Ca peut paratre bien souvent une perte de temps, mais c'est tout fait le contraire. Si vous vous mettez
crire des lignes de code au fur et mesure, a va tre coup sr le bazar. Tandis que si vous prenez 5 minutes pour y
rflchir devant une feuille de papier, votre code sera mieux structur et vous viterez de nombreuses erreurs (qui font perdre
du temps
).
A quoi doit-on rflchir sur notre brouillon ?
1. Au problme que vous vous posez (qu'est-ce que je veux arriver faire ?)
2. Au schma du code, c'est--dire que vous allez commencer le dcouper en plusieurs morceaux, eux-mmes dcoups
en petits morceaux (c'est plus facile avaler
).
3. Aux fonctions et aux connaissances en PHP dont vous allez avoir besoin (pour tre sr que vous les utilisez
convenablement).
Et pour montrer l'exemple, nous allons suivre cette liste pour notre TP.
Problme pos
On doit protger l'accs une page par un mot de passe. La page ne doit pas s'afficher si on n'a pas le mot de passe.
Schma du code
www.siteduzero.com
Connaissances requises
Nous avons dtaill les connaissances requises au dbut de ce chapitre. Vous allez voir que ce TP n'est qu'une simple
application pratique de ce que vous connaissez dj, mais cela sera une bonne occasion de vous entraner.
A vous de jouer !
On a prpar le terrain ensemble, maintenant vous savez tout ce qu'il faut pour raliser le script !
Vous tes normalement capables de trouver le code taper par vous-mmes, et c'est ce que je vous invite faire. Ca ne
marchera probablement pas du premier coup, mais ne vous en faites pas : a ne marche jamais du premier coup !
Bon code !
www.siteduzero.com
131/361
132/361
Correction
Maintenant, on corrige !
Vous ne devriez lire cette partie que si vous avez termin votre travail (pour le comparer au mien), ou si vous tes
compltement bloqu. Si jamais vous tes bloqu, ne regardez pas toute la correction d'un coup. Regardez juste la section qui
vous pose problme et essayez de continuer sans la correction.
Comme vous le savez, il y a 2 pages crer. Commenons par la plus simple, formulaire.php :
Code : PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>Page protge par mot de passe</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso8859-1" />
</head>
<body>
<p>Veuillez entrer le mot de passe pour obtenir les codes d'accs
au serveur central de la NASA :</p>
<form action="secret.php" method="post">
<p>
<input type="password" name="mot_de_passe" />
<input type="submit" value="Valider" />
</p>
</form>
<p>Cette page est rserve au personnel de la NASA. Si vous ne
travaillez pas la NASA, inutile d'insister vous ne trouverez
jamais le mot de passe ! ;-)</p>
</body>
</html>
Si vous avez bien suivi le chapitre sur les formulaires, vous ne devriez avoir eu aucun mal raliser ce formulaire. J'ai choisi
un champ de type "password" puisqu'il s'agit d'un mot de passe. A part a, rien de bien particulier.
Maintenant, intressons-nous la page secret.php qui est appele par le formulaire.
Code : PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>Codes d'accs au serveur central de la NASA</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso8859-1" />
</head>
<body>
<?php
if (isset($_POST['mot_de_passe']) AND $_POST['mot_de_passe'] ==
"kangourou") // Si le mot de passe est bon
{
// On affiche les codes
?>
<h1>Voici les codes d'accs :</h1>
<p><strong>CRD5-GTFT-CK65-JOPM-V29N-24G1-HH28-LLFV</strong></p>
<p>
www.siteduzero.com
133/361
Dans la page secrte, on vrifie d'abord si on a envoy un mot de passe (avec isset) et si ce mot de passe correspond bien
celui que l'on attendait (kangourou). Si ces 2 conditions sont remplies, on affiche alors les codes d'accs.
Comme vous le voyez, je n'ai pas fait un echo pour afficher tout ce texte. Quand il y a beaucoup de texte afficher,
il est prfrable de fermer les balises PHP aprs l'accolade du if, c'est plus simple et plus lisible.
En revanche, pour le cas du else comme il y avait une seule petite phrase afficher, j'ai choisi de l'afficher avec un
echo.
Essayer !
Oui, honntement elle l'est. Du moins, elle est efficace si vous mettez un mot de passe compliqu (pas "kangourou"
Pour moi, un bon mot de passe c'est long, avec plein de caractres bizarres, des majuscules, des minuscules, des chiffres, etc.
Par exemple k7hYTe40Lm8Mf est un bon mot de passe qui a peu de chances d'tre trouv "par hasard".
www.siteduzero.com
134/361
Dans ce mode de fonctionnement, la page formulaire.php contiendrait la fois le formulaire et le message secret.
Comment peut-on faire a ? Ce n'est pas dangereux ? Ce ne serait pas trs scuris non ?
On peut trs bien faire cela de faon tout fait scurise, c'est juste un peu plus "dur" imaginer.
Il faut construire le code de votre page formulaire.php en 2 grandes parties :
Si aucun mot de passe n'a t envoy (ou s'il est faux) : afficher le formulaire
Si le mot de passe a t envoy et qu'il est bon : afficher les codes secrets
Toute votre page PHP sera donc architecture autour d'un grand if qui pourrait ressembler quelque chose comme a :
Code : PHP
<?php
// Le mot de passe n'a pas t envoy ou n'est pas bon
if (!isset($_POST['mot_de_passe']) OR $_POST['mot_de_passe'] !=
"kangourou")
{
// Afficher le formulaire de saisie du mot de passe
}
// Le mot de passe a t envoy et il est bon
else
{
// Afficher les codes secrets
}
?>
Voil dans les grandes lignes comment on ferait. A chaque fois que la page formulaire.php est appele, elle dtermine
(grce au if) si on l'appelle pour afficher la partie secrte ou si on l'appelle pour afficher le formulaire de saisie du mot de
passe.
Voici alors ce qui se passera :
www.siteduzero.com
135/361
1. La premire fois que le visiteur charge la page formulaire.php, aucune donne POST n'est envoye la page.
C'est donc le formulaire qui s'affiche.
2. Une fois qu'on a envoy le formulaire, la page formulaire.php est recharge et cette fois elle reoit les donnes
POST qu'on vient d'envoyer. Elle peut donc les analyser et, si le mot de passe est bon, elle affiche les codes secrets.
Sauriez-vous refaire ce TP en une seule page en vous basant sur mes indices ? Essayez ! Ce sera un trs bon exercice !
Et si vous avez des difficults, n'hsitez pas demander de l'aide sur le forum PHP du site.
Vous pourriez mme aller plus loin, car dans mon schma de code prcdent je n'ai pas prvu de cas pour afficher
"Mot de passe incorrect". Cela peut se faire facilement en dcoupant votre page en 3 l'aide d'un elseif :
formulaire, mot de passe incorrect, codes secrets.
Voil qui devrait vous avoir permis de vous entraner ! Que ce TP vous ait paru facile ou difficile, l'essentiel est de lui avoir
accord du temps. C'est dans les TP que vous apprenez en fait le plus de choses, donc n'hsitez pas y revenir, les relire et
refaire l'exercice !
www.siteduzero.com
136/361
Pour afficher le contenu d'une superglobale et voir ce qu'elle contient, le plus simple est d'utiliser la fonction print_r
puisqu'il s'agit d'un array. Exemple :
Code : PHP
<pre>
<?php
print_r($_GET);
?>
</pre>
Je vous propose de faire le tour des principales variables superglobales qui existent. Nous ne les utiliserons pas toutes, mais
nous aurons fait un petit tour d'horizon des superglobales pour pouvoir nous concentrer ensuite sur les plus utiles d'entre
elles.
$_SERVER : ce sont des valeurs renvoyes par le serveur. Elles sont nombreuses et quelques-unes d'entre elles peuvent
nous tre d'une grande utilit. Je vous propose de retenir au moins $_SERVER['REMOTE_ADDR']. Elle nous donne
l'adresse IP du client qui a demand voir la page. Cela peut tre utile pour l'identifier.
$_ENV : ce sont des variables d'environnement, toujours donnes par le serveur. C'est le plus souvent sous des serveurs
Linux que l'on retrouve des informations dans cette superglobale. Gnralement, on ne trouvera rien de bien utile ldedans pour notre site web.
$_SESSION : on y retrouve les variables de session. Ce sont des variables qui restent stockes sur le serveur le temps
de la visite d'un visiteur. Nous allons apprendre nous en servir dans ce chapitre.
$_COOKIE : contient les valeurs des cookies enregistrs sur l'ordinateur du visiteur. Cela nous permet de stocker des
informations sur l'ordinateur du visiteur pendant plusieurs mois par exemple pour se souvenir de son nom.
$_GET : vous la connaissez, elle contient les donnes envoyes en paramtre dans l'URL
$_POST : de mme, c'est une variable que vous connaissez qui contient les informations qui viennent d'tre envoyes
par un formulaire.
$_FILES : elle contient la liste des fichiers qui ont t envoys via le formulaire prcdent.
Vous connaissez dj une bonne partie de ces variables superglobales comme vous pouvez le constater. Je vous propose
d'tudier plus en dtail les sessions et les cookies. Avec a nous aurons fait le tour des principaux moyens de transmettre des
variables de page en page !
www.siteduzero.com
137/361
Les sessions
Les sessions sont un moyen de conserver des variables sur toutes les pages de votre site. Jusqu'ici, nous tions parvenus
passer des variables de page en page via la mthode GET (en modifiant l'url : page.php?variable=valeur) et via la
mthode POST ( l'aide d'un formulaire).
Mais imaginez maintenant que vous souhaitiez transmettre des variables sur toutes les pages de votre site pendant la dure
d'une visite d'un visiteur. Ce ne serait pas facile avec GET et POST car ils sont plutt faits pour transmettre les informations
une seule fois, d'une page une autre. On sait ainsi envoyer d'une page une autre le nom et le prnom du visiteur, mais ds
qu'on charge une autre page ces informations sont "oublies". C'est pour cela qu'on a invent les sessions.
Tout ceci peut vous sembler un peu compliqu, mais c'est en fait trs simple utiliser. Vous devez connatre 2 fonctions :
session_start() : dmarre le systme de sessions. Si le visiteur vient d'arriver sur le site, alors un numro de
session est gnr pour lui. Vous devez appeler cette fonction au tout dbut de chacune des pages o vous avez besoin
des variables de session.
session_destroy() : ferme la session du visiteur. Cette fonction est automatiquement appele lorsque le visiteur
ne charge plus de page de votre site pendant plusieurs minutes (c'est le timeout), mais vous pouvez aussi crer une page
"Dconnexion" si le visiteur souhaite se dconnecter manuellement.
Il y a un petit pige : il faut appeler session_start() sur chacune de vos pages AVANT d'crire le moindre code
HTML (avant mme la balise <!DOCTYPE>). Si vous oubliez de lancer session_start(), vous ne pourrez pas
accder aux variables superglobales $_SESSION.
www.siteduzero.com
138/361
<?php
// On dmarre la session AVANT d'crire du code HTML
session_start();
// On s'amuse crer quelques variables de session dans $_SESSION
$_SESSION['prenom'] = 'Jean';
$_SESSION['nom'] = 'Dupont';
$_SESSION['age'] = 24;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>Titre de ma page</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
<body>
<p>
Salut <?php echo $_SESSION['prenom']; ?> !<br />
Tu es l'accueil de mon site (index.php). Tu veux aller sur
une autre page ?
</p>
<p>
<a href="mapage.php">Lien vers mapage.php</a><br />
<a href="monscript.php">Lien vers monscript.php</a><br />
<a href="informations.php">Lien vers informations.php</a>
</p>
</body>
</html>
Essayer !
Ne vous y trompez pas : on peut crer les variables de session n'importe o dans le code (pas seulement au dbut comme je l'ai
fait ici). La seule chose qui importe, c'est que le session_start() soit fait au tout dbut de la page.
Comme vous le voyez, j'ai cr 3 variables de session qui contiennent ici le nom, le prnom et l'ge du visiteur. J'ai fait des
liens vers d'autres pages de mon site.
Notez quelque chose de trs important : mes liens sont tous simples et ne transmettent aucune information. Je ne m'occupe de
rien : ni de transmettre le nom, prnom, ge du visiteur, ni de transmettre l'ID de session. PHP gre tout pour nous.PHP s'occupe
tout seul de transmettre les variables !
Maintenant, sur toutes les pages de mon site, je peux retrouver les variables $_SESSION['prenom'], $_SESSION['nom'] et
$_SESSION['age'] ! Bien entendu, il faudra dmarrer le systme de session sur toutes les pages avec session_start().
Voici par exemple le code source de la page informations.php :
Code : PHP
<?php
session_start(); // On dmarre la session AVANT toute chose
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
www.siteduzero.com
139/361
<head>
<title>Titre de ma page</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
<body>
<p>Re-bonjour !</p>
<p>
Je me souviens de toi ! Tu t'appelles <?php echo
$_SESSION['prenom'] . ' ' . $_SESSION['nom']; ?> !<br />
Et ton ge hummm... Tu as <?php echo $_SESSION['age']; ?>
ans, c'est a ? :-D
</p>
</body>
</html>
Essayer !
Vous voyez ? On a juste fait dmarrer la session avec un session_start(), puis nous avons affich les valeurs des
variables de session.
Et l, magie !
Les valeurs des variables avaient t conserves, on n'a rien eu faire !
En rsum, on peut crer des variables de session comme on cre des variables, condition de les crire dans l'array
$_SESSION et d'avoir lanc le systme de sessions avec session_start(). Ces variables sont ainsi conserves de page
en page pendant toute la dure de la visite de votre visiteur.
Si vous voulez dtruire manuellement la session du visiteur, vous pouvez faire un lien "Dconnexion" qui amne vers
une page qui fait appel la fonction session_destroy(). Nanmoins, sachez que sa session sera automatiquement
dtruite au bout d'un certain temps d'inactivit.
Si votre site est hberg chez Free.fr, vous devrez crer un dossier appel "sessions" la racine de votre FTP pour
activer les sessions.
www.siteduzero.com
www.siteduzero.com
140/361
141/361
Les cookies
Travailler avec des cookies fonctionne peu prs de la mme faon qu'avec des sessions, quelques petites diffrences prs
que nous allons voir. Voici ce que nous allons faire pour dcouvrir les cookies :
1. On va voir ce que c'est un cookie exactement... parce que si a se trouve il y en a qui croient en ce moment mme que je
vais parler de recettes de cuisine !
2. Ensuite, nous verrons comment crire un cookie. C'est facile faire, si on respecte quelques rgles.
3. Enfin, nous verrons comment rcuprer le contenu d'un cookie. Ce sera le plus simple.
Cela dpend de votre navigateur web. Gnralement on ne touche pas directement ces fichiers, mais on peut afficher
l'intrieur du navigateur la liste des cookies qui sont stocks. On peut choisir de les supprimer tout moment.
Si vous avez Mozilla Firefox, vous pouvez aller dans le menu Outils / Options / Vie prive et cliquer sur
Supprimer des cookies spcifiques. Vous obtenez la liste et la valeur de tous les cookies stocks :
www.siteduzero.com
142/361
Les cookies sont classs par site web. Chaque site web peut crire comme vous le voyez plusieurs cookies. Chacun d'eux a un
nom et une valeur (que vous pouvez voir la ligne Contenu sur ma capture). Vous noterez que comme tout cookie qui se
respecte, ils ont chacun une date d'expiration. Aprs cette date, ils ne sont plus bons manger ils sont automatiquement
supprims par le navigateur.
Les cookies sont donc des informations temporaires que l'on stocke sur l'ordinateur des visiteurs. La taille est limite
quelques Ko, vous ne pouvez pas stocker beaucoup d'informations la fois, mais c'est en gnral suffisant.
Ecrire un cookie
Comme une variable, un cookie a un nom et une valeur. Par exemple, le cookie pseudo aurait chez moi la valeur M@teo21.
Pour crire un cookie, on utilise la fonction PHP setcookie (qui signifie "Placer un cookie" en anglais).
On lui donne en gnral 3 paramtres, dans l'ordre suivant :
1. Le nom du cookie (ex. : pseudo)
2. La valeur du cookie (ex. : M@teo21)
3. La date d'expiration du cookie, sous forme de timestamp (ex : 1090521508).
Le paramtre correspondant la date d'expiration du cookie mrite quelques explications. Il s'agit d'un timestamp, c'est--dire
du nombre de secondes coules depuis le 1er janvier 1970. Le timestamp est une valeur qui augmente de 1 toutes les
secondes. Pour obtenir le timestamp correspondant maintenant, on fait appel la fonction time(). Pour dfinir une date
d'expiration du cookie, il faut ajouter au "moment actuel" le nombre de secondes dans lequel il doit expirer.
Si vous voulez supprimer le cookie dans un an, il vous faudra donc crire : time() + 365*24*3600. Cela veut dire :
timestamp actuel + nombre de secondes dans une anne. Cela aura pour effet de supprimer votre cookie dans exactement un
an.
Voici donc comment on peut crer un cookie :
Code : PHP
www.siteduzero.com
143/361
Le dernier paramtre true permet d'activer le mode httpOnly sur le cookie et donc de le rendre en quelque sorte plus scuris.
Ca ne cote rien et vous diminuez le risque qu'un de vos visiteurs puisse se faire voler le contenu d'un cookie un jour cause
d'une faille XSS.
Les paramtres au milieu sont des paramtres que nous n'utilisons pas, je leur ai donc envoy null.
Voyons maintenant comment je ferais pour inscrire 2 cookies : un qui retient mon pseudo pendant un an, et un autre qui
retient le nom de mon pays :
Code : PHP
<?php
setcookie('pseudo', 'M@teo21', time() + 365*24*3600, null, null,
false, true); // On crit un cookie
setcookie('pays', 'France', time() + 365*24*3600, null, null, false,
true); // On crit un autre cookie...
// Et SEULEMENT MAINTENANT, on peut commencer crire du code html
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>Ma super page PHP</title>
www.siteduzero.com
144/361
Afficher un cookie
C'est la partie la plus simple. Avant de commencer travailler sur une page, PHP lit les cookies du client pour rcuprer toutes
les informations qu'ils contiennent. Ces informations sont places dans la superglobale $_COOKIE, sous forme d'array comme
d'habitude.
De ce fait, si je veux ressortir le pseudo du visiteur que j'avais inscrit dans un cookie, il suffit d'crire :
$_COOKIE['pseudo']
Ce qui nous donne un code PHP tout bte pour rafficher le pseudo du visiteur :
Code : PHP
<p>
H ! Je me souviens de toi !<br />
Tu t'appelles <?php echo $_COOKIE['pseudo']; ?> et tu viens de
<?php echo $_COOKIE['pays']; ?> c'est bien a ?
</p>
Comme vous le voyez encore une fois, le gros avantage c'est que les superglobales sont accessibles partout.
Vous avez besoin de savoir ce que contient le cookie pseudo ? Affichez donc le contenu de la superglobale
$_COOKIE['pseudo'] !
A noter que si le cookie n'existe pas, la variable superglobale n'existe pas. Il faut donc faire un isset pour vrifier si le
cookie existe ou non.
Les cookies viennent du visiteur. Comme toute information qui vient du visiteur, elle n'est pas sre. N'importe quel
visiteur peut crer des cookies et envoyer ainsi de fausses informations votre site. Souvenez-vous en lorsque vous
lisez les cookies du visiteur : il peut les avoir modifis, donc soyez prudents et ne faites pas une confiance aveugle
au contenu de ces cookies !
www.siteduzero.com
145/361
Notez qu'alors le temps d'expiration du cookie est remis zro pour un an.
Vous connaissez maintenant tout ce qu'il faut savoir sur les superglobales ! Avec les cookies et les sessions, vous avez
maintenant entre les mains 2 outils trs puissants pour retenir des informations de page en page.
www.siteduzero.com
146/361
Le CHMOD est un nombre 3 chiffres que l'on attribue un fichier (par exemple 777). Selon la valeur de ce nombre, Linux
autorisera (ou non) la modification du fichier.
Le problme, c'est qu'en gnral Linux n'autorise pas les modifications de fichiers par un script PHP. Or, c'est justement ce
qu'on veut faire. Alors, comment on va faire pour s'en sortir ? En modifiant le CHMOD pardi !
Il va falloir passer par... votre logiciel FTP ! Oui, celui-l mme qui vous sert envoyer vos pages sur le web.
En ce qui me concerne, j'utilise Filezilla (vous utilisez celui que vous voulez, la manipulation est quasiment la mme).
Connectez-vous votre serveur, et faites un clic-droit sur l'un des fichiers du serveur :
En gnral, vous devriez avoir un menu "CHMOD" ou "Permissions de fichier" (comme moi).
Cela devrait ouvrir une fentre qui ressemble peu prs ceci :
www.siteduzero.com
147/361
Pour ceux qui veulent en savoir plus sur les CHMOD, je traite le sujet beaucoup plus en dtail dans mon cours sur Linux (car
c'est un truc de Linux
). N'hsitez pas aller lire le chapitre si le sujet vous intresse.
www.siteduzero.com
148/361
Il y a 3 tapes respecter :
1. On ouvre le fichier avec fopen. Cette fonction renvoie une information que vous devez mettre dans une variable (ici :
$monfichier). Cela nous sera utile tout l'heure pour fermer le fichier.
On indique fopen tout d'abord le fichier qu'on veut ouvrir ( compteur.txt), et comment on veut l'ouvrir (ici j'ai
mis 'r+'). Voici les principales possibilits qu'on a :
Mode
Explication
Cela ouvre le fichier en lecture seule. Cela veut dire que vous ne pourrez que lire le fichier.
r+
Cela ouvre le fichier en lecture / criture. Vous pourrez non seulement lire le fichier, mais aussi crire dedans
(on l'utilisera assez souvent en pratique).
Ouvre le fichier en criture seule. Mais il y a un avantage : si le fichier n'existe pas, a le cre
automatiquement.
a+
Ouvre le fichier en lecture et criture. Si le fichier n'existe pas il est cr automatiquement. Attention : le
rpertoire doit avoir un CHMOD 777 dans ce cas ! A noter que si le fichier existe dj, le texte sera rajout
la fin.
Vous n'tes absolument pas obligs de donner l'extension .txt votre fichier. Vous pouvez l'appeler comme vous
voulez : compteur.cpt, compteur.num, ou mme compteur tout court.
www.siteduzero.com
149/361
Lire
Pour lire, on a 2 possibilits :
Lire caractre par caractre avec la fonction fgetc
Lire ligne par ligne avec fgets
En gnral, on se dbrouillera pour mettre une information par ligne dans notre fichier. On utilise donc assez peu fgetc qui
est assez lourd utiliser (il faudrait faire une boucle pour lire caractre par caractre).
Dans notre cas, on va supposer que notre fichier ne contient qu'une ligne : le nombre de pages qui ont t vues sur le site.
Pour rcuprer ce nombre, il faudra procder comme ceci :
Code : PHP
<?php
// 1 : on ouvre le fichier
$monfichier = fopen('compteur.txt', 'r+');
// 2 : on lit la premire ligne du fichier
$ligne = fgets($monfichier);
// 3 : quand on a fini de l'utiliser, on ferme le fichier
fclose($monfichier);
?>
Il faut indiquer fgets le fichier lire. On lui donne notre variable $monfichier qui lui permettra de l'identifier.
fgets renvoie toute la ligne (la fonction arrte la lecture au premier saut de ligne). Donc, notre variable $ligne devrait
contenir la premire ligne du fichier.
Et si mon fichier fait 15 lignes, comment je fais pour toutes les lire ?
Il faut faire une boucle. Un premier fgets vous donnera la premire ligne. Au second tour de boucle, le prochain appel
fgets renverra la deuxime ligne, et ainsi de suite.
C'est un peu lourd, mais si on stocke assez peu d'informations dans le fichier cela peut suffire. Sinon, si on a beaucoup
d'informations stocker, on prfrera utiliser une base de donnes (on en parlera dans la prochaine partie).
Ecrire
Pour l'criture, on n'a qu'une seule possibilit : utiliser fputs.
Cette fonction va crire la ligne que vous voulez dans le fichier.
Elle s'utilise comme ceci :
Code : PHP
<?php fputs($monfichier, 'Texte crire'); ?>
www.siteduzero.com
150/361
Toutefois, il faut savoir o on crit le texte. En effet, le fonctionnement d'un fichier est assez bizarre :
1. Vous l'ouvrez avec fopen
2. Vous lisez par exemple la premire ligne avec fgets.
3. Oui mais voil, maintenant le "curseur" de PHP se trouve la fin de la premire ligne (vu qu'il vient de lire la premire
ligne).
Si vous faites un fputs juste aprs, il va crire la suite ! Pour viter a, on va utiliser la fonction fseek qui va
replacer le curseur o on veut dans le fichier. En l'occurence, on va replacer le curseur au dbut du fichier en faisant :
fseek($monfichier, 0);
Notre curseur sera alors repositionn au dbut :
Si vous avez ouvert le fichier avec le mode 'a' ou 'a+', toutes les donnes que vous crirez seront toujours
ajoutes la fin du fichier. La fonction fseek n'aura donc aucun effet dans ce cas.
4. Ouf, notre curseur est au dbut du fichier, on peut faire un fputs. La ligne va s'crire par-dessus l'ancienne, ce qui fait
que l'ancien texte sera cras (remplac par le nouveau).
Pour y voir un peu plus clair, je vous propose ce code source qui compte le nombre de fois que la page a t vue :
Code : PHP
<?php
$monfichier = fopen('compteur.txt', 'r+');
$pages_vues = fgets($monfichier); // On lit la premire ligne
(nombre de pages vues)
$pages_vues++; // On augmente de 1 ce nombre de pages vues
fseek($monfichier, 0); // On remet le curseur au dbut du fichier
fputs($monfichier, $pages_vues); // On crit le nouveau nombre de
pages vues
fclose($monfichier);
echo '<p>Cette page a t vue ' . $pages_vues . ' fois !</p>';
?>
Essayer !
Ce n'tait pas si dur, vous voyez.
www.siteduzero.com
151/361
www.siteduzero.com
152/361
www.siteduzero.com
153/361
C'est un peu ce que je me disais au dbut... Classer certaines choses ok, mais il me semblait que je n'en aurais besoin que trs
rarement.
Grave erreur ! Vous allez le voir, 99% du temps on range ses informations dans une base de donnes. Pour le 1% restant, on
peut enregistrer dans un fichier comme on a appris le faire... mais quand on a got aux bases de donnes on peut
difficilement s'en passer ensuite !
Imaginez par exemple une armoire, dans laquelle chaque dossier est sa place.
Quand tout est sa place, c'est beaucoup plus facile de retrouver un objet n'est-ce pas ? Eh bien l c'est pareil : en classant les
informations que vous collectez (par exemple des informations sur vos visiteurs), il vous sera trs facile aprs de rcuprer ce
que vous cherchez.
Il faut donc choisir le SGBD que vous allez utiliser pour stocker les donnes. Je vous recommande de travailler plutt avec les
SGBD libres et gratuits, tels que MySQL, PostgreSQL et SQLite. Aprs, tout est question de got et des fonctionnalits que
vous recherchez. MySQL est un bon compromis.
Nous allons utiliser MySQL mais sachez que l'essentiel de ce que vous allez apprendre fonctionnera de la mme
manire avec un autre SGBD. Ce cours est construit afin que vous ayez le moins de choses possible rapprendre si
vous choisissez de changer de SGBD.
www.siteduzero.com
154/361
rien voir avec le PHP, mais nous allons imprativement en avoir besoin.
Voici un exemple de commande en langage SQL pour vous donner une ide :
Code : SQL
SELECT id, auteur, message, datemsg FROM livreor ORDER BY datemsg
DESC LIMIT 0, 10
Le principal objectif de cette partie du cours sera d'apprendre utiliser ce langage SQL pour que vous soyez capables de
donner n'importe quel ordre la base de donnes, comme par exemple : "Rcupre-moi les 10 dernires news de mon site",
"Supprime le dernier message post dans ce forum", etc.
Voici ce qu'il peut se passer lorsque le serveur a reu une demande d'un client qui veut poster un message sur vos forums :
1. Le serveur utilise toujours PHP, il lui fait donc passer le message.
2. PHP effectue les actions demandes et se rend compte qu'il a besoin de MySQL. En effet, le code PHP contient un
endroit "Va demander MySQL d'enregistrer ce message". Il fait donc passer le travail MySQL.
3. MySQL fait le travail que PHP lui avait soumis et lui rpond "OK, c'est bon !"
4. PHP renvoie au serveur que MySQL a bien fait ce qui lui tait demand.
Maintenant que nous avons fait les prsentations, il va falloir dcouvrir comment est organise une base de donnes. Bien
comprendre l'organisation d'une base de donnes est en effet absolument indispensable.
www.siteduzero.com
155/361
Une table est donc reprsente sous la forme d'un tableau ; par exemple, voici quoi peut ressembler le contenu d'une table
appele "visiteurs" :
Table "visiteurs"
Numro Pseudonyme
1
2
Kryptonic
Age
kryptonic@free.fr
24
Serial_Killer serialkiller@unitedgamers.com
16
M@teo21
top_secret@siteduzero.com
18
Bibou
bibou557@laposte.net
29
...
...
...
...
Et pour finir, voici l'indispensable schma pour que tout a soit clair :
www.siteduzero.com
156/361
La base de donnes contient plusieurs tables (on peut en mettre autant que l'on veut l'intrieur). Chaque table est en fait un
tableau o les colonnes sont appeles champs et o les lignes sont appeles entres.
Pour vous donner quelques exemples concrets, voici quelques noms de tables que l'on peut tre amenes crer pour les
besoins de son site web :
news : stocke toutes les news qui sont affiches l'accueil.
livre_or : stocke tous les messages posts sur le livre d'or.
forum : stocke tous les messages posts sur le forum.
newsletter : stocke les adresses e-mails de tous les visiteurs inscrits la newsletter.
Voil, vous devriez commencer comprendre pourquoi vous allez avoir besoin d'une BDD sur votre site.
Si quelque chose ne vous parat pas clair, si vous avez l'impression de mlanger un peu "bases", "tables", "champs", "entres",
relisez de nouveau cette partie. Il faut que vous soyez capable de reproduire le schma tous seuls sur un bout de papier.
www.siteduzero.com
157/361
Question typique, je dois avouer que la premire fois c'est trs troublant. On vous parle de quelque chose qui n'a pas l'air
concret.
En fait, tout ce que je viens de vous montrer, c'est une faon de "visualiser" la chose. Il faut que vous imaginiez que la base de
donnes gre les informations sous forme de tableaux, parce que c'est la meilleure reprsentation qu'on peut se faire d'une base
de donnes.
Mais concrtement, quand MySQL enregistre des informations, il les crit bien quelque part. Oui comme tout le monde, il
enregistre dans des fichiers !
Ces fichiers sont quelque part sur votre disque dur mais il ne faut jamais les ouvrir et encore moins les modifier directement. Il
faut toujours parler avec MySQL qui va se charger d'extraire et de modifier les informations dans ces fichiers.
Chaque SGBD a sa propre faon d'enregistrer les donnes, mais aucun d'eux ne peut y chapper : pour que les donnes restent
enregistres, il faut les stocker dans des fichiers sur le disque dur.
Par exemple, avec MySQL sous Windows si vous utilisez WAMP, vous devriez trouver les fichiers o sont stockes
les informations dans C:\wamp\mysql\data. Je vous recommande trs fortement de ne pas y toucher car ce n'est
pas prvu pour tre modifi directement !
Dans la pratique, on n'ira jamais toucher ces fichiers directement. On demandera TOUJOURS MySQL d'enregistrer, ou
d'aller lire des choses. Aprs, c'est lui qui se dbrouille pour classer a comme il veut dans ses fichiers.
Et c'est bien a le gros avantage de la base de donnes : pas de prise de tte pour le rangement des informations. Vous
demandez MySQL de vous sortir toutes les news de votre site enregistres de Fvrier Juillet, il va lire dans ses fichiers, et
vous ressort les rponses. Vous vous contentez de "dialoguer" avec MySQL. Lui il se charge du sale boulot, c'est--dire ranger
vos donnes dans ses fichiers.
Si vous avez bien compris et retenu le schma, que vous avez suivi sans trop de mal ce chapitre et que vous avez tout juste au
QCM, c'est que vous savez ce qu'il faut.
Cependant, tout ceci doit vous paratre un peu flou. C'est tout fait normal. Heureusement dans le chapitre suivant nous allons
pas mal manipuler, ce qui devrait vous aider mieux comprendre tout cela
phpMyAdmin
Nous allons maintenant faire des manipulations sur une base de donnes. Vous allez "voir" ce que peuvent contenir une base
et ses tables.
Il existe plusieurs faons d'accder sa base de donnes et d'y faire des modifications. On peut utiliser une ligne de commande
(console), excuter les requtes en PHP ou faire appel un programme qui nous permet d'avoir rapidement une vue
d'ensemble. Ici je vous propose de dcouvrir phpMyAdmin, un des outils les plus connus permettant de manipuler une base de
donnes MySQL.
phpMyAdmin est livr avec WAMP, vous allez donc pouvoir l'utiliser tout de suite. La quasi-totalit des hbergeurs
permettent d'utiliser phpMyAdmin. Renseignez-vous auprs de votre hbergeur pour savoir comment y accder. Vous aurez
trs certainement besoin d'un login et d'un mot de passe.
www.siteduzero.com
158/361
Vous avez 2 endroits importants, signals par des numros sur ma capture d'cran :
1. Liste des bases : c'est la liste de vos bases de donnes. Le nombre entre parenthses, c'est le nombre de tables qu'il y a
dans la base.
Sur ma capture d'cran, on a donc 2 bases : information_schema, qui contient 28 tables, et mysql, qui contient
23 tables.
2. Crer une base : pour crer une nouvelle base de donnes, tapez un nom dans le champ de formulaire droite, cliquez
sur "Crer" et hop ! C'est fait.
Pour le moment, 2 bases sont dj cres : "information_schema" et "mysql". Ne touchez pas ces bases, elles servent au
fonctionnement interne de mysql.
Nous allons crer une nouvelle base "test" dans laquelle nous travaillerons dans toute la suite du cours. Utilisez le formulaire
droite pour crer cette base : rentrez le nom test et cliquez sur le bouton Crer.
L'cran suivant devrait alors s'afficher si la base a bien t cre :
www.siteduzero.com
159/361
>
On vous indique qu'aucune table n'a t trouve dans la base. Et si on en crait une ?
Dans le champ "Crer une nouvelle table sur la base test", indiquez le nom news et le nombre de champs 3 :
Soyons clairs : je ne suis pas en train de vous apprendre crer un systme de news pour votre site. Pour le moment nous
cherchons seulement dcouvrir le fonctionnement de phpMyAdmin.
Vous devriez avoir ceci sous les yeux :
www.siteduzero.com
160/361
Chaque colonne reprsente un champ. Nous avons demand 3 champs, il y a donc 3 colonnes.
phpMyAdmin vous demande beaucoup d'informations mais rassurez-vous, il n'est pas ncessaire de tout remplir. La plupart du
temps, les sections les plus intressantes seront :
Champ : permet de dfinir le nom du champ (important !)
Type : le type de donnes que va stocker le champ (nombre entier, texte, date...)
Taille/Valeurs : permet d'indiquer la taille maximale du champ, utile pour le type VARCHAR notamment afin de
limiter le nombre de caractres autoriss.
Index : active l'indexation du champ. Ce mot barbare signifie dans les grandes lignes que votre champ sera adapt aux
recherches. Le plus souvent, on utilise l'index PRIMARY sur les champs de type id.
AUTO_INCREMENT : permet au champ de s'incrmenter tout seul chaque nouvelle entre. On l'utilise frquemment
sur les champs de type "id".
Je vous propose de remplir le formulaire comme je l'ai fait. Veillez bien cocher AUTO_INCREMENT et dfinir un index
PRIMARY sur le champ id.
Une fois que c'est fait, cliquez sur le bouton Sauvegarder en bas de la page. Votre table est cre !
Avant d'aller plus loin, je voudrais revenir un peu plus en dtail sur les types de champs et les index, notamment l'index
PRIMARY qu'on a utilis.
www.siteduzero.com
161/361
Alors que PHP ne propose que quelques types de donnes que l'on connat bien maintenant (int, string, bool...), MySQL
propose une quantit trs importantes de types de donnes.
En fait, ceux-ci sont classs par catgories :
NUMERIC : ce sont les nombres. On y trouve des types ddis aux petits nombres entiers (TINYINT), aux gros nombres
entiers (BIGINT), aux nombres dcimaux, etc.
DATE and TIME : ce sont les dates et les heures. De nombreux types diffrents permettent de stocker une date, une
heure, ou les deux la fois.
STRING : ce sont les chanes de caractres. L encore, il y a des types adapts toutes les tailles.
SPATIAL : cela concerne les bases de donnes spatiales, utile pour ceux qui font de la cartographie. Ce ne sera pas
notre cas, donc nous n'en parlerons pas ici.
En fait, phpMyAdmin a eu la bonne ide de proposer au tout dbut de cette liste les 4 types de donnes les plus courants :
INT : nombre entier.
VARCHAR : court texte (entre 1 et 255 caractres).
TEXT : long texte (on peut y stocker un roman sans problme).
DATE : date (jour, mois, anne).
Nous n'aurons besoin de jongler qu'entre ces 4 types, donc ce sont eux qu'il faut retenir. Cela couvrira 99% des besoins. Vous
pouvez aussi garder en tte le type DOUBLE qui permet de stocker des nombres dcimaux.
Une petite remarque propos de VARCHAR : c'est un type adapt aux courts textes, comme le titre d'une news de
votre site. Sa seule exigence est que vous devez indiquer la taille maximale du champ (entre 1 et 255). Si vous ne le
faites pas, vous ne pourrez pas crer la table. Si vous ne savez pas combien limiter votre champ, vous pouvez mettre
la valeur maximale (255) comme je l'ai fait dans l'exemple prcdent.
www.siteduzero.com
162/361
entre dans la table. En gnral, on utilise le champ "id" comme cl primaire comme on vient de le faire.
Chaque news de votre site doit pouvoir tre identifie de manire unique. Le moyen le plus simple pour cela est de lui donner
un numro unique, dans un champ nomm "id". Il ne peut pas y avoir 2 news avec le mme id ! Il en irait de mme pour les
autres tables de votre site : par exemple, chaque membre de votre site doit se voir attribuer un numro unique. Si 2 membres
ont le mme numro, on ne pourra pas les diffrencier !
Il est vital que chaque table possde sa cl primaire. On ne vous interdira pas de crer des tables sans cl primaire, mais leur
performances seront extrmement rduites. Je vous conseille donc de prendre le rflexe de crer chaque fois ce champ "id" en
lui donnant l'index PRIMARY, ce qui aura pour effet d'en faire une cl primaire. Vous en profiterez en gnral pour cocher la
case AUTO_INCREMENT afin que ce champ gre lui-mme les nouvelles valeurs automatiquement (1, 2, 3, 4...).
www.siteduzero.com
163/361
Si vous cliquez sur le mot "news", le contenu de la table s'affiche droite de l'cran.
Si vous cliquez sur la petite image de tableau gauche, phpMyAdmin vous prsentera la structure de la table.
Actuellement, comme notre table est vide (elle ne contient aucune entre), c'est la structure de la table qui s'affichera dans les
deux cas :
Ce tableau vous rappelle de quels champs est constitue votre table : c'est sa structure. Notez que le champ id est soulign car
c'est la cl primaire de la table.
Il n'y a rien de bien intressant faire ici, mais sachez qu'il est possible d'ajouter ou de supprimer des champs tout moment.
Ce n'est pas parce que votre table a t cre qu'elle est fige. Vous avez des options pour renommer les champs, les supprimer,
en ajouter, etc.
Jetez dj un oeil aux onglets en haut : "Structure", "Afficher", "SQL", etc. Cela vous amnera vers diffrentes options que nous
verrons plus loin. Nous allons commencer par nous intresser l'onglet "Insrer" qui va nous permettre d'ajouter des entres
la table.
Une page s'ouvre dans laquelle vous pouvez rentrer des valeurs pour chacun des champs. Cela va tre pour nous l'occasion
d'insrer notre premire news :
www.siteduzero.com
164/361
Seule la colonne "Valeur" nous intresse. Vous pouvez rentrer une valeur pour chacun des trois champs. Vous remarquerez que
je n'ai pas mis de valeur pour l'id : c'est normal, le numro d'id est automatiquement calcul grce l'option
auto_increment. Ne vous en occupez pas et choisissez plutt un titre puis inscrivez un contenu. L'id de la premire news
sera 1, celui de la seconde sera 2, etc.
Les id ne doivent pas obligatoirement se suivre de 1 en 1. S'il n'y a pas de news n15 par exemple, cela ne pose aucun
problme. Ce qui compte, c'est qu'il n'y ait pas deux news avec le mme id. C'est d'ailleurs justement ce que permet
d'viter la cl primaire : elle interdit que deux entres aient le mme id.
Une fois que vous avez rentr le texte que vous vouliez, cliquez sur le premier bouton "Excuter" de la page.
Il y a d'autres champs en-dessous : ignorez-les. Ils vous permettent d'ajouter plusieurs entres la fois mais nous n'en
avons pas besoin.
Vous reprez ici les champs : id, titre et contenu. Cette table a 3 entres, et comme vous pouvez le voir MySQL a bien fait les
choses puisque les numros d'id se sont crs tous seuls.
Vous pouvez modifier ou supprimer chacun des lments que vous voyez l'cran. Il y a beaucoup d'autres options en-dessous
que je vous laisse regarder. Pour l'instant, ce qui compte, c'est que vous ayez compris la procdure pour ajouter des lments
la table et que vous soyez capables de lister le contenu de la table.
Mais... Je ne vais pas devoir passer par phpMyAdmin chaque fois que je veux ajouter ou supprimer un lment
quand mme ? Il faudra passer par l pour ajouter chaque news de son site, mais aussi chaque membre, chaque
www.siteduzero.com
165/361
Non, bien sr que non. Comme son nom l'indique, phpMyAdmin est un outil d'administration. Il permet de voir rapidement la
structure et le contenu de vos tables. Il est aussi possible d'ajouter ou de supprimer des lments comme on vient de le voir,
mais on ne le fera que trs rarement. Nous apprendrons crer des pages en PHP qui insrent ou suppriment des lments
directement depuis notre site web.
Il nous reste encore dcouvrir quelques-unes des fonctionnalits offertes par phpMyAdmin et nous aurons termin notre tour
d'horizon de cet outil.
www.siteduzero.com
166/361
Autres oprations
Nous avons jusqu'ici dcouvert le rle de 3 onglets :
Afficher : affiche le contenu de la table
Structure : prsente la structure de la table (liste des champs)
Insrer : permet d'insrer de nouvelles entres dans la table
Je souhaite vous prsenter 6 autres onglets que nous n'avons pas encore dcouverts :
SQL
Importer
Exporter
Oprations
Vider
Supprimer
SQL
Cliquez sur l'onglet "SQL" :
Il s'affiche l'cran :
C'est ici que vous pouvez excuter ce que l'on appelle des requtes SQL pour demander MySQL de faire quelque chose.
Dans la grande zone de texte, vous pouvez taper des requtes SQL. Par exemple on nous propose ici :
Code : SQL
SELECT * FROM `news` WHERE 1
Cela signifie : "Afficher tout le contenu de la table 'news' ". C'est justement ce langage SQL que nous allons dcouvrir tout au
long des prochains chapitres.
www.siteduzero.com
167/361
Notez qu'il est aussi possible d'crire des requtes SQL dans une nouvelle fentre. Pour ouvrir une nouvelle fentre de requte
SQL, cliquez sur le bouton SQL en haut du menu gauche :
Importer
Il y a aussi un onglet "Importer" :
Dans la page qui s'affiche, vous pouvez envoyer un fichier de requtes SQL (gnralement un fichier .sql) MySQL pour qu'il
les excute :
www.siteduzero.com
168/361
Seul le premier champ en haut devrait nous intresser : il nous permet d'indiquer un fichier sur notre disque dur contenant des
requtes SQL excuter.
Cliquez ensuite sur le bouton "Excuter" tout en bas sans vous proccuper des autres champs.
Quelle diffrence y a-t-il entre crire la requte SQL (comme on vient de le voir juste avant) et envoyer un fichier
contenant des requtes SQL ?
C'est la mme chose, sauf que parfois quand on doit envoyer un trs grand nombre de requtes, il est plus pratique d'utiliser un
fichier. Dans les prochains chapitres du cours d'ailleurs, je vous donnerai un fichier de requtes excuter, et il faudra utiliser
cette mthode.
Exporter
Nous nous intressons maintenant l'onglet "Exporter". C'est ici que vous allez pouvoir rcuprer votre base de donnes sur le
disque dur sous forme de fichier texte .sql (qui contiendra des tonnes de requtes SQL).
Ce fichier que l'on va "exporter", est-ce que c'est le mme que celui dont tu nous parlais tout l'heure ? Celui situ
dans C:\wamp\mysql\data ?
Non pas du tout. Ce que je vous ai montr tout l'heure, c'tait quelque chose d'illisible. Je vous avais dit qu'on n'y toucherai
pas, je ne vous ai pas menti.
www.siteduzero.com
169/361
Le fichier que vous allez obtenir grce "l'exportation" de phpMyAdmin, c'est un fichier qui dit MySQL comment recrer
votre base de donnes (avec des requtes en langage SQL).
A quoi sert ce fichier ?
>
www.siteduzero.com
170/361
Je vous conseille de laisser les options par dfaut, c'est largement suffisant.
Distinguez simplement la structure des donnes de la table. La structure d'une table se rsume en quelques lignes, ce sont en
fait les noms des champs, leurs types etc... Par contre, les donnes correspondent aux entres, et il peut y en avoir beaucoup !
Pour faire une sauvegarde complte, il faut donc prendre la structure ET les donnes.
Pensez cocher la case "Transmettre" en bas, sinon il ne se passera rien. A noter que vous pouvez demander une
compression, ce qui est utile si votre table est trs grosse.
Cliquez sur "Excuter". On vous proposera alors de tlcharger un fichier : c'est tout fait normal. N'hsitez pas regarder ce
qu'il y a dans ce fichier : vous allez voir qu'il contient plusieurs requtes SQL. C'est ce langage que je vais vous apprendre
dans les chapitres qui suivent !
Comment dois-je faire pour recrer la base de donnes sur mon site web ?
Il faut aller sur le phpMyAdmin de votre hbergeur (il en a forcment un). Renseignez-vous pour connatre l'adresse. Par
exemple chez Free c'est : http://phpmyadmin.free.fr/phpMyAdmin (il faudra indiquer votre login et mot de passe).
Une fois dessus, rendez-vous dans l'onglet "Importer" qu'on a vu tout l'heure. Cliquez sur "Parcourir" pour indiquer o se
trouve le fichier SQL que vous venez de crer sur votre disque dur. Faites "Excuter", attendez que a l'envoie, et c'est bon !
Votre base de donnes est alors recre sur Internet !
Oprations
Vous pouvez faire ici diverses oprations sur votre table.
Je ne vais pas les numrer une une, ni vous expliquer comment elles fonctionnent vu que c'est trs simple. Sachez
simplement que vous pourriez avoir besoin de :
Changer le nom de la table : indiquez le nouveau nom pour cette table.
Dplacer la table vers : si vous voulez mettre cette table dans une autre base de donnes.
Copier la table : faire une copie de la table, dans une autre base ou dans la mme (attention, dans ce cas il faudra
qu'elle ait un nom diffrent).
Optimiser la table : force d'utiliser une table, surtout si elle est grosse, on finit par avoir des "pertes" qui font que la
table n'est plus bien organise. Un clic l-dessus et hop, c'est r-arrang.
Vider
Vide tout le contenu de la table. Toutes les entres vont disparatre, seule la structure de la table restera (c'est--dire les
champs).
Attention ! Il n'est pas possible d'annuler cette opration !
Supprimer
Pour supprimer la totalit de la table (structure + donnes), cliquez sur cet onglet.
www.siteduzero.com
171/361
L encore, rflchissez-y deux fois avant de tout supprimer, car vous ne pourrez rien rcuprer par la suite, moins d'avoir
fait une sauvegarde au pralable avec l'outil d'exportation.
Nous avons vu la plupart des fonctionnalits utiles de phpMyAdmin.
C'est que phpMyAdmin permet de faire beaucoup de choses, vous venez de le voir !
C'est pour vous un "outil" qui vous permettra d'administrer votre base de donnes, de voir ce qu'elle contient et dans quel tat
elle est.
Mais maintenant nous allons rentrer dans le vif du sujet : comment utiliser une base de donnes avec PHP ? Ni une ni deux, on
retourne coder !
www.siteduzero.com
172/361
Ce sont toutes des extensions car PHP est trs modulaire. On peut ajouter ou supprimer des lments PHP trs facilement, car
tout le monde n'a pas forcment besoin de toutes les fonctionnalits.
Quel moyen choisir parmi tous ceux-l ?
Vous l'aurez compris, les fonctions mysql_ ne sont plus utiliser (on dit qu'elles sont obsoltes). Il reste choisir entre
mysqli_ et PDO. Nous allons ici utiliser PDO car c'est cette mthode d'accs aux bases de donnes qui va devenir la plus
utilise dans les prochaines versions de PHP. D'autre part, le gros avantage de PDO est que vous pouvez l'utiliser de la mme
manire pour vous connecter n'importe quel autre type de base de donnes (PostgreSQL, Oracle...).
Vous pourrez donc rutiliser ce que vous allez apprendre si vous choisissez d'utiliser une autre base de donnes que MySQL.
Activer PDO
www.siteduzero.com
173/361
Normalement, PDO est activ par dfaut. Pour le vrifier, faites un clic gauche sur l'icne de WAMP dans la barre des tches,
puis allez dans le menu PHP / Extensions PHP et vrifiez que php_pdo_mysql est bien coch.
Vous pouvez ouvrir le fichier de configuration de PHP (qui s'appelle gnralement php.ini) et rechercher la ligne qui
contient php_pdo_mysql. Enlevez le point-virgule devant s'il y en a un pour activer l'extension :
Code : Autre
;extension=php_pdo_firebird.dll
;extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_odbc.dll
Si vous tes sous Linux et que vous utilisez XAMPP, recherchez la ligne pdo_mysql.default_socket et compltez-la
comme ceci
Code : Autre
pdo_mysql.default_socket = /opt/lampp/var/mysql/mysql.sock
Enregistrez le fichier puis redmarrez PHP. Il suffit pour cela de relancer votre logiciel favori, type WAMP, MAMP, XAMPP...
www.siteduzero.com
174/361
Pour l'instant, nous faisons des tests sur notre ordinateur la maison. On dit qu'on travaille "en local". Par consquent, le nom
de l'hte sera localhost.
Quant au login et au mot de passe, par dfaut le login est root et il n'y a pas de mot de passe.
Voici donc comment on doit faire pour se connecter MySQL via PDO sur la base test :
Code : PHP
<?php
$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
?>
Oui, il faut reconnatre qu'il contient quelques nouveauts. En effet, PDO est ce qu'on appelle une extension oriente objet.
C'est une faon de programmer un peu diffrente des fonctions classiques que l'on a appris utiliser jusqu'ici.
Nous aurons l'occasion d'en apprendre plus au sujet de la programmation oriente objet (POO) plus loin dans le cours.
Pour l'instant, je vous invite rutiliser les codes que je vous propose en suivant mes exemples. Vous comprendrez
les dtails de leur mode de fonctionnement un peu plus tard.
La ligne de code qu'on vient de voir cre ce qu'on appelle un objet $bdd. Ce n'est pas vraiment une variable (mme si a y
ressemble fortement), c'est un objet qui reprsente la connexion la base de donnes. On cre la connexion en indiquant dans
l'ordre dans les paramtres :
Le nom d'hte (localhost)
La base de donnes (test)
Le login (root)
Le mot de passe (ici il n'y a pas de mot de passe, j'ai donc mis une chane vide)
Lorsque votre site sera en ligne, vous aurez srement un nom d'hte diffrent ainsi qu'un login et un mot de passe comme ceci :
Code : PHP
<?php
$bdd = new PDO('mysql:host=sql.hebergeur.com;dbname=mabase',
'pierre.durand', 's3cr3t');
?>
Il faudra donc penser changer cette ligne pour l'adapter votre hbergeur en modifiant les informations en consquence
lorsque vous enverrez votre site sur le web.
Le premier paramtre (qui commence par mysql) s'appelle le DSN : Data Source Name. C'est gnralement le seul
qui change en fonction du type de base de donnes auquel on se connecte.
www.siteduzero.com
175/361
Voil encore un code un peu nouveau pour nous. Je ne vais pas rentrer dans le dtail, car nous aurons l'occasion de parler de
tout cela plus tard.
Nanmoins, je me doute que vous voudriez savoir comment ce code fonctionne au moins dans les grandes lignes. Voici le
principe : PHP excute les instructions l'intrieur du bloc try{ } . Si une erreur se produit, il s'arrte et "saute" directement
au niveau du catch{ } pour savoir quoi faire. Ici, on choisit d'afficher l'erreur et d'arrter le script si on arrive dans le bloc
catch.
Si au contraire tout se passe bien, PHP continue l'excution du code et ne lit pas ce qu'il y a dans le bloc catch.
Votre page PHP ne devrait donc rien afficher pour le moment.
Enfin, vous noterez qu'on cre un array $pdo_options que l'on envoie en paramtre sur la ligne suivante. L'objectif de
cette manipulation est d'activer les exceptions PDO. Grce ce petit ajout (que je vous recommande d'effectuer
systmatiquement), nous pourrons rcuprer les erreurs lorsqu'elles se produisent.
Oulah ! Tout ceci semble bien compliqu, je n'y comprends pas grand chose ! C'est grave docteur ?
Non pas du tout ! En fait, et j'insiste l-dessus, PDO nous fait utiliser des fonctionnalits de PHP que l'on n'a pas tudies
jusqu' prsent (programmation oriente objet, exceptions...). Contentez-vous pour le moment de rutiliser les codes que je
vous propose et n'ayez crainte : nous reviendrons sur ces codes-l plus tard pour les expliquer dans le dtail.
Si vous avez une page blanche, vous pouvez continuer. Si vous avez une erreur, lisez le message et essayez de comprendre ce
qu'il signifie. Si vous tes bloqu, n'hsitez pas demander de l'aide sur les forums sinon vous ne pourrez pas aller plus loin.
Ce que vous devez retenir : utilisez ce modle de blocs try/catch pour rcuprer les erreurs relatives la base de donnes,
renvoyes par PDO. Cela vous permettra d'avoir un message clair (bon d'accord, en anglais) qui vous permettra de comprendre
vos erreurs.
www.siteduzero.com
176/361
Tlcharger la table
Rien qu'au nom, vous pouvez vous douter que cette table contient quelque chose en rapport avec des jeux vido. En effet,
vous allez le voir, cette table contient une liste d'une cinquantaine de jeux vido.
Pour cet exemple, plusieurs amis ont voulu rpertorier tous les jeux vido qu'ils possdent. La base de donnes est pour eux
un moyen trs pratique de classer et d'organiser tout cela, vous allez voir pourquoi.
Euh dis, qu'est-ce que je dois en faire de ce fichier jeux_video.sql ?
Inutile d'essayer de l'ouvrir, a n'a pas d'intrt. Il faut l'importer via l'onglet "Importer" de phpMyAdmin. Nous avons appris
le faire dans le chapitre prcdent. Pensez slectionner votre base de donnes "test" au pralable.
Et voil ! Vous devriez voir une nouvelle table apparatre gauche : "jeux_video". Vous pouvez vous amuser regarder ce
qu'elle contient, pour vous faire une ide.
Voici les 5 premires entres qu'elle contient (il y en a une cinquantaine en tout !) :
ID
nom
possesseur
console
prix nbre_joueurs_max
commentaires
Florent
NES
Un jeu d'anthologie !
Sonic
Patrick
Megadrive 2
Zelda : ocarina of
time
Florent
Nintendo
64
15
Mario Kart 64
Florent
Nintendo
64
25
Michel
GameCube 55
Pour le moment ne modifiez pas cette table. Notre objectif est de crer une page PHP qui va afficher ce que contient la table
jeux_video.
177/361
Maintenant arrive le grand moment que vous attendiez tous : on va parler MySQL. On va donc commencer parler en SQL !
Pour cela, on va faire ce qu'on appelle une requte. On va demander poliment MySQL de nous dire tout ce que contient la
table jeux_video.
Pour rcuprer des informations de la base de donnes, nous avons besoin de notre objet qui reprsente la connexion la base.
Vous vous souvenez, il s'agit de $bdd. Nous allons effectuer la requte comme ceci :
Code : PHP
<?php
$reponse = $bdd->query('Tapez votre requte SQL ici');
?>
On rcupre ce que la base de donnes nous a renvoy dans un autre objet, que l'on a appel ici $reponse.
Ceci peut se traduire par : Prendre tout ce qu'il y a dans la table "jeux_video" .
Analysons chaque terme de cette requte :
SELECT : en langage SQL, le premier mot indique quel type d'opration doit faire MySQL. Dans ce chapitre, nous ne
verrons que SELECT. Ca demande MySQL d'afficher ce que contient une table.
* : aprs le SELECT, on doit indiquer quels champs MySQL doit rcuprer dans la table. Si on n'est intress que par
les champs "nom" et "possesseur", il faudra taper :
SELECT nom, possesseur FROM jeux_video
Si vous voulez prendre tous les champs, tapez *. Cette petite toile peut se traduire par "tout" : "Prendre tout ce qu'il y
a..."
FROM : c'est un mot de liaison. Ca se traduit par "dans". FROM fait la liaison entre le nom des champs et le nom de la
table
jeux_video : c'est le nom de la table dans laquelle il faut aller piocher.
Effectuons la requte avec la mthode que l'on vient de dcouvrir :
Code : PHP
<?php
$reponse = $bdd->query('SELECT * FROM jeux_video');
?>
www.siteduzero.com
178/361
$donnees est un array qui contient champ par champ les valeurs de la premire entre. Par exemple, si vous vous intressez
au champ console, vous utiliserez l'array $donnees['console'].
Il faudra faire une boucle pour parcourir chaque entre une une. A chaque fois que vous appellerez $reponse->fetch(),
vous passez l'entre suivante. La boucle est donc rpte autant de fois qu'il n'y a d'entres dans votre table.
Ouf ! Cela fait beaucoup d'informations la fois. Je vous propose de rsumer tout ce qu'on vient d'apprendre, de la connexion
via PDO l'affichage du rsultat de la requte :
Code : PHP
<?php
try
{
// On se connecte MySQL
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '',
$pdo_options);
// On rcupre tout le contenu de la table jeux_video
$reponse = $bdd->query('SELECT * FROM jeux_video');
// On affiche chaque entre une une
while ($donnees = $reponse->fetch())
{
?>
<p>
<strong>Jeu</strong> : <?php echo $donnees['nom']; ?><br />
Le possesseur de ce jeu est : <?php echo
$donnees['possesseur']; ?>, et il le vend <?php echo
$donnees['prix']; ?>
euros !<br />
Ce jeu fonctionne sur <?php echo $donnees['console']; ?> et
on peut y jouer <?php echo $donnees['nbre_joueurs_max']; ?> au
www.siteduzero.com
179/361
maximum<br />
<?php echo $donnees['possesseur']; ?> a laiss ses
commentaires sur <?php echo $donnees['nom']; ?> : <em><?php echo
$donnees['commentaires']; ?></em>
</p>
<?php
}
$reponse->closeCursor(); // Termine le traitement de la requte
}
catch(Exception $e)
{
// En cas d'erreur prcdemment, on affiche un message et on
arrte tout
die('Erreur : '.$e->getMessage());
}
?>
Essayer !
Alors, vous avez vu ?
Ca en fait un paquet de texte ! Il faut dire que la table que je vous ai donn contient une cinquantaine d'entres, donc c'est
normal que vous ayez beaucoup de rsultats !
Concrtement que se passe-t-il ? On fait une boucle pour chaque entre de la table. On commence par l'entre n1, puis l'entre
n2 etc... A chaque fois qu'on fait une nouvelle boucle, on passe en revue une autre entre.
Quelle est la diffrence entre $reponse et $donnees ?
En effet c'est un peu curieux et nouveau pour vous. Cette ligne fait 2 choses la fois :
Elle va rcuprer une nouvelle entre et place son contenu dans $donnees
Elle vrifie si $donnees vaut vrai ou faux
Le fetch renvoie faux (false) dans $donnees lorsqu'il est arriv la fin des donnes, c'est--dire que toutes les entres ont
t passes en revue. Dans ce cas la condition du while vaut faux, et la boucle s'arrte.
www.siteduzero.com
180/361
Elle provoque la "fermeture du curseur d'analyse des rsultats". Cela signifie, en d'autres termes plus humains, que vous devez
effectuer cet appel closeCursor() chaque fois que vous avez fini de traiter le retour d'une requte afin d'viter d'avoir des
problmes la requte suivante. Cela signifie qu'on a termin le travail sur la requte.
Reprenons le code complet prcdent et adaptons-le pour afficher un nom de jeu par ligne :
Code : PHP
<?php
try
{
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '',
$pdo_options);
$reponse = $bdd->query('SELECT nom FROM jeux_video');
while ($donnees = $reponse->fetch())
{
echo $donnees['nom'] . '<br />';
}
$reponse->closeCursor();
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
?>
Essayer !
Ce code est trs semblable au prcdent mais c'est l'occasion pour vous de vous familiariser avec MySQL et PDO. Retenez
bien en particulier les choses suivantes :
La connexion la base de donnes n'a besoin d'tre faite qu'une seule fois, au dbut de la page.
Il faut fermer les rsultats de recherche avec closeCursor() aprs avoir trait chaque requte.
www.siteduzero.com
181/361
WHERE
Grce au mot-cl WHERE, vous allez pouvoir trier vos donnes !
Supposons par exemple que je veuille lister uniquement les jeux appartenant Patrick. La requte au dbut sera la mme
qu'avant, mais je rajouterai la fin WHERE possesseur='Patrick'.
Ca nous donne la requte :
Code : SQL
SELECT * FROM jeux_video WHERE possesseur='Patrick'
Traduction : "Slectionner tous les champs de la table jeux_video lorsque le champ possesseur est gal Patrick ".
Vous noterez que les chanes de caractres doivent tre places entre apostrophes pour les dlimiter, comme c'est ici
le cas pour 'Patrick'. Elles ne sont en revanche pas ncessaires pour les nombres.
www.siteduzero.com
182/361
Essayer !
Si vous vous amusez changer le nom du possesseur (par exemple "WHERE possesseur='Michel'"), a n'affichera que les jeux
appartenant Michel ! Essayez, vous verrez !
Il est par ailleurs possible de combiner plusieurs conditions. Par exemple, si je veux lister les jeux de Patrick qu'il vend
moins de 20 euros, je combinerai les critres de slection l'aide du mot-cl AND (qui signifie "et") :
Code : SQL
SELECT * FROM jeux_video WHERE possesseur='Patrick' AND prix < 20
Traduction : "Slectionner tous les champs de jeux_video lorsque le possesseur est Patrick ET lorsque le prix est infrieur
20".
Il existe aussi le mot-cl OR pour signifier "ou".
ORDER BY
ORDER BY nous permet d'ordonner nos rsultats. Nous pourrions ainsi classer les rsultats en fonction de leur prix ! La
requte SQL serait :
Code : SQL
SELECT * FROM jeux_video ORDER BY prix
Traduction : "Slectionner tous les champs de jeux_video et ordonner les rsultats par prix croissant. ".
Application :
Code : PHP
<?php
try
{
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '',
$pdo_options);
$reponse = $bdd->query('SELECT nom, prix FROM jeux_video ORDER
BY prix');
while ($donnees = $reponse->fetch())
{
echo $donnees['nom'] . ' cote ' . $donnees['prix'] . '
EUR<br />';
}
}
$reponse->closeCursor();
www.siteduzero.com
183/361
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
?>
Essayer !
Traduction : "Slectionner tous les champs de jeux_video, et ordonner les rsultats par prix dcroissant. ".
A noter : si on avait utilis ORDER BY sur un champ contenant du texte, le classement aurait t fait par ordre
alphabtique.
LIMIT
LIMIT nous permet de ne slectionner qu'une partie des rsultats (par exemple les 20 premiers). C'est trs utile lorsqu'il y a
beaucoup de rsultats et que vous souhaitez les paginer (c'est--dire par exemple afficher les 30 premiers rsultats sur la page
1, les 30 suivants sur la page 2, etc.).
Il faut rajouter la fin de la requte le mot cl LIMIT, suivi de 2 nombres spars par une virgule. Par exemple :
Code : SQL
SELECT * FROM jeux_video LIMIT 0, 20
Quelques exemples :
LIMIT 0, 20 : affiche les 20 premires entres.
LIMIT 5, 10 : affiche de la sixime la quinzime entre.
LIMIT 10, 2 : affiche la onzime et la douzime entre.
www.siteduzero.com
184/361
Allez un petit exemple ! Si on veut afficher les 10 premiers jeux de la table, on utilisera le code suivant :
Code : PHP
<?php
try
{
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '',
$pdo_options);
$reponse = $bdd->query('SELECT nom FROM jeux_video LIMIT 0,
10');
echo '<p>Voici les 10 premires entres de la table jeux_video
:</p>';
while ($donnees = $reponse->fetch())
{
echo $donnees['nom'] . '<br />';
}
$reponse->closeCursor();
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
?>
Essayer !
Et voil le travail !
Bonjour, je suis masochiste, et avant de terminer cette section je souhaiterais mlanger toutes les requtes SQL que je
viens d'apprendre en une seule. C'est possible ?
www.siteduzero.com
185/361
Code : SQL
SELECT nom, possesseur, console, prix FROM jeux_video WHERE
console='Xbox' OR console='PS2' ORDER BY prix DESC LIMIT 0,10
Il faut utiliser les mots-cls dans l'ordre que j'ai donn : WHERE puis ORDER BY puis LIMIT, sinon MySQL ne
comprendra pas votre requte.
Essayez donc de traduire a en franais dans un premier temps, pour voir si vous avez compris, puis aprs testez cette requte
chez vous pour voir si c'est bien ce quoi vous vous attendiez.
www.siteduzero.com
186/361
Au lieu de toujours afficher les jeux de Patrick, on aimerait que cette requte soit capable de s'adapter au nom de la personne
dfini dans une variable, par exemple $_GET['possesseur']. Ainsi la requte pourrait s'adapter en fonction de la
demande de l'utilisateur !
On pourrait tre tent de concatner la variable dans la requte comme ceci :
Code : PHP
<?php
$reponse = $bdd->query('SELECT nom FROM jeux_video WHERE
possesseur=\'' . $_GET['possesseur'] . '\'');
?>
Il est ncessaire d'entourer la chane de caractres d'apostrophes comme je vous l'ai indiqu prcdemment, d'o la
prsence des antislash pour insrer les apostrophes : \'
Bien que ce code fonctionne, c'est l'illustration parfaite de ce qu'il ne faut pas faire et que pourtant beaucoup de sites font
encore. En effet, si la variable $_GET['possesseur'] a t modifie par un visiteur (et nous savons quel point il ne faut
pas faire confiance l'utilisateur !), il y a un gros risque de faille de scurit qu'on appelle Injection SQL. Un visiteur pourrait
s'amuser insrer une requte SQL au milieu de la vtre et pourrait potentiellement lire tout le contenu de votre base de
donnes, comme par exemple la liste des mots de passe de vos utilisateurs !
Le sujet des injections SQL est un peu complexe pour tre dtaill ici. Si vous souhaitez en apprendre plus ce sujet,
je vous invite consulter Wikipdia.
Nous allons utiliser un autre moyen plus sr d'adapter nos requtes en fonction de variables : les requtes prpares.
www.siteduzero.com
187/361
On va dans un premier temps "prparer" la requte sans sa partie variable, que l'on reprsentera avec un marqueur sous forme
de point d'interrogation :
Code : PHP
<?php
$req = $bdd->prepare('SELECT nom FROM jeux_video WHERE possesseur =
?');
?>
Au lieu d'excuter la requte avec query() comme la dernire fois, on appelle ici prepare().
La requte est alors prte, sans sa partie variable. Maintenant, nous allons excuter la requte en appelant execute et en lui
transmettant la liste des paramtres :
Code : PHP
<?php
$req = $bdd->prepare('SELECT nom FROM jeux_video WHERE possesseur =
?');
$req->execute(array($_GET['possesseur']));
?>
La requte est alors excute l'aide des paramtres que l'on a indiqus sous forme d'array.
S'il y a plusieurs marqueurs, il faut indiquer les paramtres dans le bon ordre :
Code : PHP
<?php
$req = $bdd->prepare('SELECT nom FROM jeux_video WHERE possesseur =
? AND prix <= ?');
$req->execute(array($_GET['possesseur'], $_GET['prix_max']));
?>
Le premier point d'interrogation de la requte sera remplac par le contenu de la variable $_GET['possesseur'] et le
second point d'interrogation sera remplac par le contenu de $_GET['prix_max']. Le contenu de ces variables aura t
automatiquement scuris pour prvenir les risques d'injection SQL.
Essayons de construire une page capable de lister les jeux appartenant une personne et dont le prix ne dpasse pas une
certaine somme :
Code : PHP
<?php
try
{
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '',
$pdo_options);
www.siteduzero.com
188/361
Bien que la requte soit "scurise" (ce qui limine les risques d'injection SQL), il faudrait nanmoins vrifier quand
mme que $_GET['prix_max'] contient bien un nombre et qu'il est compris dans un intervalle correct. Vous
n'tes donc pas dispenss d'effectuer des vrifications supplmentaires si vous estimez cela ncessaire.
Essayez d'appeler cette page (que l'on nommera par exemple selection_jeux.php) en modifiant les valeurs des
paramtres, vous allez voir que la liste des jeux qui ressort change en fonction des paramtres envoys ! Quelques exemples :
selection_jeux.php?possesseur=Michel&prix_max=20
selection_jeux.php?possesseur=Michel&prix_max=40
selection_jeux.php?possesseur=Patrick&prix_max=45
selection_jeux.php?possesseur=Florent&prix_max=15
... A vous de jouer !
Les points d'interrogations ont t remplacs par les marqueurs nominatifs :possesseur et :prixmax (ils commencent par
le symbole deux-points comme vous le voyez).
Ces marqueurs sont remplacs par les variables l'aide cette fois d'un array associatif. Cela permet parfois plus de clart quand
www.siteduzero.com
189/361
il y a beaucoup de paramtres. De plus, contrairement aux points d'interrogations, nous ne sommes cette fois plus obligs
d'envoyer les variables dans le mme ordre que la requte.
Vous tes arrivs vivants jusqu'au bout ? Bravo !
Vous venez d'apprendre une quantit de choses impressionnantes dans ce chapitre ! Une fois que vous aurez lu le chapitre
suivant, vous commencerez tre capables de crer des scripts de news, de livre d'or, un forum, etc.
Vu que ce chapitre tait d'une importance capitale, n'hsitez pas le relire (aprs vous tre reposs :p), car il faut vraiment que
vous matrisiez les requtes SQL et leur affichage avec PHP !
www.siteduzero.com
190/361
Non non.
C'est vrai que PhpMyAdmin permet de rajouter de nouvelles entres dans la table. Mais ce qui nous intresse ici, c'est de le
faire via un script PHP et une requte SQL !
Tout d'abord, je vous rappelle quoi ressemble la table "jeux_video" :
ID
nom
possesseur
console
prix nbre_joueurs_max
commentaires
Florent
NES
Un jeu d'anthologie !
Sonic
Patrick
Megadrive 2
Zelda : ocarina of
time
Florent
Nintendo
64
15
Mario Kart 64
Florent
Nintendo
64
25
Michel
GameCube 55
...
...
...
...
...
...
...
Les nombres (tels que 45 et 50 ici) n'ont pas besoin d'tre entours d'apostrophes. Seules les chanes de caractres les
ncessitent.
www.siteduzero.com
191/361
Vous remarquerez que pour le premier champ (ID), j'ai laiss des apostrophes vides. C'est voulu : le champ a la proprit
"auto_increment", MySQL mettra donc le numro d'ID lui-mme. On pourrait mme se passer du champ ID dans la requte :
Code : SQL
INSERT INTO jeux_video(nom, possesseur, console, prix,
nbre_joueurs_max, commentaires) VALUES('Battlefield 1942',
'Patrick', 'PC', 45, 50, '2nde guerre mondiale')
C'est encore plus simple ! Le champ ID sera de toute faon automatiquement rempli par MySQL, il est donc inutile de le lister.
Enfin, si vous le dsirez, sachez que vous n'tes pas obligs de lister les noms des champs d'abord, cette requte
marche tout aussi bien (mais elle est moins claire) :
Code : SQL
INSERT INTO jeux_video VALUES('', 'Battlefield 1942',
'Patrick', 'PC', 45, 50, '2nde guerre mondiale')
Il faut lister les valeurs pour tous les champs sans exception (ID compris) dans le bon ordre.
Application en PHP
Utilisons cette requte SQL au sein d'un script PHP. Cette fois, au lieu de faire appel query() (que l'on utilisait dans le
chapitre prcdent pour rcuprer des donnes), on va utiliser exec() qui est prvue pour excuter des modifications sur la
base de donnes :
Code : PHP
<?php
try
{
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '',
$pdo_options);
// On ajoute une entre dans la table jeux_video
$bdd->exec('INSERT INTO jeux_video(nom, possesseur, console,
prix, nbre_joueurs_max, commentaires) VALUES(\'Battlefield 1942\',
\'Patrick\', \'PC\', 45, 50, \'2nde guerre mondiale\')');
echo 'Le jeu a bien t ajout !';
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
?>
Que fait ce code ? Il ajoute une entre dans la BDD pour le jeu "Battlefield 1942", appartenant "Patrick", qui fonctionne sur
"PC", qui cote 45 euros etc...
www.siteduzero.com
192/361
La prsence de multiples apostrophes rend la requte un peu difficile lire et crire cause des antislash (\) que l'on doit
rajouter devant. De plus, cette requte insre toujours les mmes donnes. Comme on l'a vu dans le chapitre prcdent, si on
veut rendre une partie de la requte variable, le plus rapide et le plus sr est de faire appel aux requtes prpares.
Je ne mets plus dsormais l'tape de la connexion MySQL avec PDO dans mes codes pour les simplifier. Bien
entendu, il faut toujours se connecter au pralable si on veut que la requte fonctionne !
Pour plus de clart, j'ai utilis ici des marqueurs nominatifs. Comme vous le voyez, j'ai cr l'array sur plusieurs lignes : c'est
autoris et surtout c'est bien plus lisible.
Les variables telles que $nom et $possesseur doivent avoir t dfinies prcdemment. Gnralement, on rcuprera des
variables de $_POST (issues d'un formulaire) pour insrer une entre dans la base de donnes. Nous dcouvrirons un cas
pratique dans le TP suivant.
www.siteduzero.com
193/361
Comment a marche ?
Tout d'abord, le mot-cl UPDATE permet de dire qu'on va modifier une entre.
Ensuite, le nom de la table (jeux_video).
Le mot-cl SET, qui spare le nom de la table de la liste des champs modifier.
Viennent ensuite les champs qu'il faut modifier, spars par des virgules. Ici, on modifie le champ "prix", on lui affecte
la valeur "10" (prix = 10), et de mme pour le champ nbre_joueurs_max. Les autres champs ne seront pas modifis.
Enfin, le mot-cl WHERE est tout simplement indispensable. Il nous permet de dire MySQL quelle entre il doit
modifier (sinon toutes les entres seraient affectes !). On se base trs souvent sur le champ ID pour indiquer quelle
entre doit tre modifie. Ici, on suppose que Battlefield a t enregistr sous l'ID n51.
Si vous voulez, vous pouvez vous baser sur le nom du jeu au lieu de l'ID pour effectuer votre slection :
Code : SQL
UPDATE jeux_video SET prix = '10', nbre_joueurs_max = '32' WHERE nom
= 'Battlefield 1942'
Dernire minute ! Florent vient de racheter tous les jeux de Michel ! Il va falloir modifier a tout de suite !
Heu, il va falloir modifier chaque entre une une ?
Non ! Il n'est pas question de passer des heures modifier chaque entre une une pour a ! En rflchissant environ 0,5
seconde vous allez trouver tous seuls la requte SQL qui permet de faire ce qu'on souhaite.
C'est bon vous avez trouv ? Allez, je vous donne la rponse dans le mille :
Code : SQL
UPDATE jeux_video SET possesseur = 'Florent' WHERE possesseur =
'Michel'
www.siteduzero.com
194/361
Traduction : Dans la table jeux_video, modifier toutes les entres dont le champ possesseur est gal Michel, et le remplacer
par Florent.
Qu'il y ait 1, 10, 100 ou 1000 entres, cette requte elle-seule suffit pour mettre jour toute la table ! Si c'est pas beau le SQL.
Application en PHP
De la mme manire, en PHP on fait appel exec() pour effectuer des modifications :
Code : PHP
<?php
$bdd->exec('UPDATE jeux_video SET prix = 10, nbre_joueurs_max = 32
WHERE nom = \'Battlefield 1942\'');
?>
Notez que cet appel renvoie le nombre de lignes modifies. Essayez de rcuprer cette valeur dans une variable et de l'afficher,
par exemple comme ceci :
Code : PHP
<?php
$nb_modifs = $bdd->exec('UPDATE jeux_video SET possesseur =
\'Florent\' WHERE possesseur = \'Michel\'');
echo $nb_modifs . ' entres ont t modifies !';
?>
www.siteduzero.com
195/361
Si vous oubliez le WHERE, toutes les entres seront supprimes ! Cela quivaut vider la table.
Je vous laisse essayer cette requte en PHP. Vous pouvez l encore passer par exec() si vous voulez excuter une requte
bien prcise, ou bien utiliser une requte prpare si votre requte dpend de variables.
Vous tes maintenant capables de lire, ajouter, modifier et supprimer des informations dans une base de donnes. Ce sont
toutes les oprations de base. On les rsume parfois sous le nom CRUD (Create, Read, Update, Delete).
En thorie, une dcouverte minimale du langage SQL pourrait (dj) s'arrter l. Cependant, c'est un langage bien plus riche
que a : nous aurons l'occasion de dcouvrir d'autres fonctionnalits du SQL dans les prochains chapitres. Mais avant cela, un
petit TP va nous permettre de nous exercer avec ce que nous avons appris.
TP : un Mini-Chat
Voil un TP qui va nous permettre de mettre en pratique tout ce que l'on vient d'apprendre avec le langage SQL. Il faut dire
qu'on a enchan beaucoup de nouveauts dans les chapitres prcdents (base de donnes, extraction des informations
contenues dans une table, etc.).
Avec les connaissances que vous avez maintenant, vous tes en mesure de raliser de vrais scripts qui pourront vous tre utiles
pour votre site, comme un Mini-Chat (ce qu'on va faire) ou encore un livre d'or, un systme de news (ou blog), etc. Ces scripts
sont en fait assez similaires, mais le plus simple d'entre eux est le Mini-Chat.
Le Mini-Chat permettra d'ajouter facilement une touche de dynamisme votre site, mais il faut encore le construire. A nous de
jouer !
www.siteduzero.com
196/361
Prrequis
Vous pourrez suivre ce TP sans problme si vous avez lu tous les chapitres prcdents. Plus prcisment, nous allons utiliser
les notions suivantes :
Transmission de variables via un formulaire
Lire dans une table
Ecrire dans une table
Utilisation de PDO et des requtes prpares
Objectifs
Avant de commencer attaquer notre script PHP, qu'est-ce que je vous avais dit qu'il fallait absolument faire en premier ? Un
brouillon !
Eh oui, votre script ne va pas s'crire tout seul comme par magie
Ce sera quelque chose de basique pour commencer, mais rien ne vous empchera de l'amliorer votre sauce.
On souhaite avoir, sur la mme page, deux zones de texte en haut : une pour crire votre pseudo, une autre pour crire votre
petit message. Ensuite, un bouton "Envoyer" permettra d'envoyer les donnes MySQL, pour qu'il les enregistre dans une
table.
En-dessous, le script devra afficher les 10 derniers messages qui ont t enregistrs (parce que si vous les affichez tous et que
vous avez 1000 messages a risque d'tre un peu long !) en allant du plus rcent au plus ancien.
C'est un peu flou ? OK, voil quoi doit ressembler votre page PHP une fois termine :
www.siteduzero.com
197/361
Maintenant que l'on sait ce que l'on veut obtenir, il nous sera beaucoup plus facile de le raliser ! Et ne rigolez pas, trop de
gens se lancent dans un script sans vraiment savoir ce qu'ils veulent faire, ce qui les conduit bien souvent dans un mur.
ID pseudo
message
Tom
John
Patrice
Tom
John
Commencez donc par crer cette table dans votre base de donnes avec phpMyAdmin. Appelez-la comme vous voulez, moi
j'ai choisi minichat.
www.siteduzero.com
198/361
Il aurait t possible de tout faire sur une seule page PHP, mais pour bien sparer le code il est prfrable d'utiliser 2 fichiers
comme ici.
Vous avez toutes les connaissances ncessaires pour raliser un Mini-Chat bas sur la structure du schma prcdent...
l'exception de la redirection. En effet, il existe plusieurs moyens de rediriger le visiteur vers une autre page (via une balise
<meta> par exemple) mais le plus propre et le plus rapide consiste faire une redirection HTTP. Voici comment il faut
procder pour faire cela sur la page minichat_post.php :
Code : PHP
<?php
// Effectuer ici la requte qui insre le message
// Puis rediriger vers minichat.php comme ceci :
header('Location: minichat.php');
?>
Le visiteur ne verra jamais la page minichat_post.php. Celle-ci n'affiche rien mais commande en revanche au navigateur
du visiteur de retourner sur minichat.php.
La fonction header() permet d'envoyer ce qu'on appelle des en-ttes HTTP. C'est le protocole utilis sur le web
entre le serveur et le client pour changer des pages web. Ici, on utilise une des possibilits de HTTP qui commande
une redirection via la commande Location.
Par rapport d'autres types de redirection (comme la balise <meta>), cette technique a l'avantage d'tre instantane
et transparente pour l'utilisateur. De plus, s'il rafrachit ensuite la page minichat.php, il ne risque pas d'avoir le
message souvent gnant et droutant : "Pour afficher cette page, les informations prcdemment transmises doivent
tre renvoyes. Etes-vous sr de vouloir le faire ?".
199/361
Un petit rappel ne peut pas faire de mal : ne faites jamais confiance aux donnes de l'utilisateur ! Tout ce qui vient de
l'utilisateur doit tre trait avec la plus grande mfiance.
Ici, on a une page minichat_post.php assez simple qui reoit 2 champs : le pseudo et le message. A priori, il n'y a pas de
vrification supplmentaire faire, si ce n'est qu'il faudra veiller l'affichage protger les chanes de caractres contre la
faille XSS (celle qui permet d'insrer du HTML et du Javascript dans la page). Il faudra donc bien veiller appeler
htmlspecialchars() pour protger les chanes.
A vous de jouer !
Allez, j'en ai assez dit. C'est maintenant votre tour de rflchir. Avec les lments que je vous ai donns, et avec ce que vous
avez appris dans les chapitres prcdents, vous devez tre capables de raliser le Mini-Chat !
Si vous avez un peu de mal, et si votre script ne marche pas, ne le supprimez pas dans un moment de rage (il ne faut jamais
s'nerver
). Faites une pause et revenez-y plus tard.
Si vous coincez vraiment, vous pouvez demander de l'aide sur les forums ou regarder la correction pour vous aider. Faites
l'effort dans tous les cas de travailler ce script, ce sera trs formateur vous verrez !
www.siteduzero.com
200/361
Correction
Hop hop hop ! On relve les copies !
Vous allez maintenant voir ce que j'attendais de vous. Si vous avez russi faire quelque chose qui marche : bravo !
Et si vous n'y tes pas arrivs, ne vous en faites pas trop : le principal est que vous ayez fait l'effort de rflchir. En voyant la
correction, vous apprendrez normment de choses !
Il y avait deux fichiers, commenons par minichat.php.
www.siteduzero.com
201/361
$reponse->closeCursor();
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
?>
</body>
</html>
Il n'y avait pas de pige particulier, l'exception du htmlspecialchars() ne pas oublier sur le message ET le pseudo.
Toutes les donnes issues du formulaire doivent tre protges pour viter la faille XSS dont nous avons parl dans un
chapitre prcdent.
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
?>
Ce code est relativement court et sans surprises. On se connecte la base, on insre les donnes et on redirige le visiteur vers la
page minichat.php comme on vient d'apprendre le faire.
En fait, ce code peut tre amlior (je vais en parler un peu plus loin). En effet, on ne teste pas si le pseudo et le
message existent bien, s'ils sont vides ou non, etc. Il est donc en thorie possible d'enregistrer des messages vides, ce
www.siteduzero.com
Vous voulez tester le minichat ? Pas de problme ! Ce lien ouvre la page minichat.php :
Essayer !
www.siteduzero.com
202/361
203/361
Remplacez M@teo21 par le pseudonyme du visiteur. Ce pseudonyme peut tre issu d'un cookie par exemple : lorsqu'il
poste un message, vous inscrivez son pseudo dans un cookie, ce qui vous permet ensuite de prremplir le champ.
Proposez d'actualiser le Mini Chat. Le Mini Chat ne s'actualise pas automatiquement s'il y a de nouveaux messages.
C'est normal, ce serait difficile faire notre niveau (le web n'a pas vraiment t prvu pour ce type d'applications la
base). En revanche, ce que vous pouvez facilement faire, c'est proposer un lien "Rafrachir" qui charge nouveau la
page minichat.php. Ainsi, s'il y a de nouveaux messages, ils apparatront aprs un clic sur le lien.
Afficher les anciens messages. On ne voit actuellement que les 10 derniers messages. Sauriez-vous trouver un moyen
d'afficher les anciens messages ? Bien sr, tous les afficher d'un coup sur la mme page n'est pas une bonne ide. Vous
pourriez imaginer un paramtre $_GET['page'] qui permet de choisir le numro de page des messages afficher.
Au travail !
Il est probable que peu d'entre vous aient trouv de suite le code "exact" que j'attendais. Mais si vous n'tiez pas trop loin, c'est
tout aussi bon.
Et mme si vous n'avez pas russi, passez un moment essayer de comprendre le code, c'est trs important. Il faut que vous
soyez capables de le refaire sans aide !
Maintenant, si vous voulez utiliser ce script PHP sur votre site web, aucun problme ! Mais je vous conseille d'y apporter
quelques amliorations : au niveau du graphisme d'abord (parce que c'est rudement moche ce que j'ai fait), mais aussi au
niveau du code PHP.
Je vous donne rendez-vous au prochain TP, et d'ici l restez attentifs en cours.
www.siteduzero.com
204/361
Les fonctions scalaires : elles agissent sur chaque entre. Par exemple, vous pouvez transformer en majuscules la
valeur de chacune des entres d'un champ.
Les fonctions d'agrgat : lorsque vous utilisez ce type de fonction, des calculs sont faits sur l'ensemble de la table
pour retourner une valeur. Par exemple, calculer la moyenne des prix retourne une valeur : le prix moyen.
www.siteduzero.com
205/361
nom
possesseur
console
prix nbre_joueurs_max
commentaires
Florent
NES
Un jeu d'anthologie !
Sonic
Patrick
Megadrive 2
Zelda : ocarina of
time
Florent
Nintendo
64
15
Mario Kart 64
Florent
Nintendo
64
25
Michel
GameCube 55
On crit les noms des fonctions SQL en majuscules, comme on le fait dj pour la plupart des mots-cl comme SELECT,
INSERT, etc. Ce n'est pas une obligation mais plutt une convention, une habitude qu'ont prise les programmeurs.
Pour vous montrer comment on utilise les fonctions SQL scalaires, je vais me baser sur la fonction UPPER() qui permet de
convertir l'intgralit d'un champ en majuscules. Supposons que nous souhaitions obtenir en majuscules les noms de tous les
jeux. Voici comment on crirait la requte SQL :
Code : SQL
SELECT UPPER(nom) FROM jeux_video
La fonction UPPER est utilise sur le champ nom. On rcupre ainsi tous les noms des jeux en majuscules.
Cela modifie-t-il le contenu de la table ?
Non ! La table reste la mme. La fonction UPPER modifie seulement la valeur envoye PHP. On ne touche donc pas au
contenu de la table.
Cela cre en fait un "champ virtuel" qui n'existe que le temps de la requte. Il est conseill de donner un nom ce champ
virtuel qui reprsente les noms des jeux en majuscules. Il faut utiliser pour cela le mot-cl AS comme ceci :
Code : SQL
SELECT UPPER(nom) AS nom_maj FROM jeux_video
www.siteduzero.com
206/361
On rcupre les noms des jeux en majuscules via un champ virtuel appel nom_maj.
Ce champ virtuel est appel alias.
On peut s'en servir en PHP pour afficher les noms des jeux en majuscules :
Code : PHP
<?php
$reponse = $bdd->query('SELECT UPPER(nom) AS nom_maj FROM
jeux_video');
while ($donnees = $reponse->fetch())
{
echo $donnees['nom_maj'] . '<br />';
}
$reponse->closeCursor();
?>
Essayer !
Comme vous le voyez, PHP ne rcupre qu'un champ nomm nom_maj (mme s'il n'existe pas dans la table). En affichant le
contenu de ce champ, on ne rcupre que les noms des jeux en majuscules.
Bien entendu vous pouvez aussi rcuprer le contenu des autres champs comme avant sans leur appliquer forcment une
fonction :
Code : SQL
SELECT UPPER(nom) AS nom_maj, possesseur, console, prix FROM
jeux_video
possesseur
Florent
www.siteduzero.com
console
NES
prix
4
207/361
SONIC
Patrick
Megadrive
Florent
Nintendo 64 15
MARIO KART 64
Florent
Nintendo 64 25
GameCube
55
Ainsi, le jeu "Sonic" sera renvoy sous la forme "SONIC" dans un champ nomm nom_maj.
Cette fois, le jeu "Sonic" sera renvoy sous la forme "sonic" dans un champ nomm nom_min.
www.siteduzero.com
208/361
Ainsi, si un jeu cote 25,86999 , il sera retourn sous forme de la valeur 25,87 dans un champ prix_arrondi.
Et bien d'autres !
Il existe beaucoup d'autres fonctions SQL du mme type mais je ne peux pas toutes vous les prsenter. La documentation de
MySQL vous propose une liste bien plus complte de fonctions mathmatiques (comme ROUND) et de fonctions sur les
chanes de caractres (comme UPPER). Si vous voulez en dcouvrir d'autres, c'est par l qu'il faut aller !
www.siteduzero.com
209/361
On donne l encore un alias au rsultat donn par la fonction. La particularit, c'est que cette requte ne va retourner qu'une
seule entre, le prix moyen de tous les jeux :
prix_moyen
28.34
Pour afficher cette information en PHP, on pourrait faire comme on en a l'habitude (cela fonctionne) :
Code : PHP
<?php
$reponse = $bdd->query('SELECT AVG(prix) AS prix_moyen FROM
jeux_video');
while ($donnees = $reponse->fetch())
{
echo $donnees['prix_moyen'];
}
$reponse->closeCursor();
?>
Nanmoins, pourquoi s'embterait-on faire une boucle tant donn qu'on sait qu'on ne va rcuprer qu'une seule entre,
puisqu'on utilise une fonction d'agrgat ?
On peut se permettre d'appeler fetch() une seule fois, en dehors d'une boucle, tant donn qu'il n'y a qu'une seule entre. Le
code suivant est donc un peu plus adapt dans le cas prsent :
Code : PHP
www.siteduzero.com
210/361
<?php
$reponse = $bdd->query('SELECT AVG(prix) AS prix_moyen FROM
jeux_video');
$donnees = $reponse->fetch();
echo $donnees['prix_moyen'];
$reponse->closeCursor();
?>
Essayer !
Ce code est plus simple et plus logique. On rcupre la premire (et seule) entre une fois avec fetch() et on affiche ce
qu'elle contient, puis on ferme le curseur. Inutile de le faire dans une boucle tant donn qu'il n'y a pas de seconde entre.
Le calcul de la moyenne ne sera fait que sur la liste des jeux qui appartiennent Patrick. Vous pourriez mme combiner les
conditions pour obtenir le prix moyen des jeux de Patrick qui se jouent 1 seul joueur. Essayez !
On rcuprerait d'un ct le prix moyen de tous les jeux et de l'autre la liste des noms de tous les jeux ? Ca ne peut pas se
reprsenter dans un seul et mme tableau.
Comme vous le savez, SQL renvoie les informations sous la forme d'un tableau. Or on ne peut pas reprsenter la moyenne des
prix (qui tient en une seule entre) en mme temps que la liste des jeux. Il faudrait faire 2 requtes si on voulait avoir ces 2
informations.
www.siteduzero.com
211/361
C'est la fonction que l'on vient d'tudier pour dcouvrir les fonctions d'agrgat. Elle retourne la moyenne d'un champ
contenant des nombres :
Code : SQL
SELECT AVG(prix) AS prix_moyen FROM jeux_video
www.siteduzero.com
212/361
Il est possible de compter uniquement les entres pour lesquelles l'un des champs n'est pas vide, c'est--dire qu'il ne vaut pas
NULL. Il n'y a pas de jeu de ce type dans notre table jeux_video, mais supposons que pour certains jeux on ne connaisse
pas le nombre de joueurs maximum. On laisserait certaines entres vides, ce qui aurait pour effet d'afficher NULL (pas de
valeur) sur la colonne nbre_joueurs_max comme ceci :
ID
nom
possesseur
console
prix nbre_joueurs_max
commentaires
Florent
NES
NULL
Un jeu d'anthologie !
Sonic
Patrick
Megadrive 2
NULL
Zelda : ocarina of
time
Florent
Nintendo
64
15
Mario Kart 64
Florent
Nintendo
64
25
Michel
GameCube 55
NULL
Dans ce cas, on peut compter uniquement les jeux qui ont un nombre de joueurs maximum dfini. On doit indiquer en
paramtre le nom du champ analyser :
Code : SQL
SELECT COUNT(nbre_joueurs_max) AS nbjeux FROM jeux_video
Dans notre exemple, seuls les jeux Zelda et Mario Kart seront compts car on connat leur nombre de joueurs maximum. Donc
on obtiendra 2 en rponse.
Enfin, il est possible de compter le nombre de valeurs distinctes sur un champ prcis. Par exemple dans la colonne
possesseur, Florent apparat plusieurs fois, Patrick aussi, etc. Mais combien y a-t-il de personnes diffrentes dans la table ?
On peut le savoir en utilisant le mot-cl DISTINCT devant le nom du champ analyser, comme ceci :
Code : SQL
SELECT COUNT(DISTINCT possesseur) AS nbpossesseurs FROM jeux_video
On peut ainsi facilement savoir combien de personnes diffrentes sont rfrences dans la table. Essayez de faire de mme pour
connatre le nombre de consoles diffrentes dans la table !
www.siteduzero.com
www.siteduzero.com
213/361
214/361
Ca n'a pas de sens de rcuprer le prix moyen de tous les jeux et le champ "console" la fois. Il n'y a qu'un seul prix moyen
pour tous les jeux, mais plusieurs consoles. MySQL ne peut pas renvoyer un tableau correspondant ces informations-l.
Si vous essayez d'excuter la requte, vous obtiendrez des rsultats incohrents :
prix_moyen console
28.34
NES
On a bien le bon prix moyen de tous les jeux, mais on rcupre juste une console (pourquoi celle-l plutt qu'une autre ?).
Bref, a ne veut rien dire.
Essayer !
Il faut utiliser GROUP BY en mme temps qu'une fonction d'agrgat, sinon il ne sert rien. Ici, on rcupre le prix moyen et la
console, et on choisit de grouper par console. Par consquent, on obtiendra la liste des diffrentes consoles de la table et le
prix moyen des jeux qu'elles contiennent !
prix_moyen
console
12.67
Dreamcast
5.00
Gameboy
47.50
GameCube
Cette fois les valeurs sont cohrentes ! On a la liste des consoles et le prix moyen des jeux associs.
www.siteduzero.com
215/361
Exercice : essayez d'obtenir de la mme faon la valeur totale des jeux que possde chaque personne.
Essayer !
Avec cette requte, on rcupre uniquement la liste des consoles et leur prix moyen si ce prix moyen ne dpasse pas 10 euros.
HAVING ne doit s'utiliser que sur le rsultat d'une fonction d'agrgat. Voil pourquoi on l'utilise ici sur prix_moyen et non
sur console.
Je ne comprends pas la diffrence entre WHERE et HAVING ? Les deux permettent de filtrer non ?
Oui, mais pas au mme moment. WHERE agit en premier, avant le groupement des donnes, tandis que HAVING agit en second,
aprs le groupement des donnes. On peut d'ailleurs trs bien combiner les deux, regardez l'exemple suivant :
Code : SQL
SELECT AVG(prix) AS prix_moyen, console FROM jeux_video WHERE
possesseur='Patrick' GROUP BY console HAVING prix_moyen <= 10
Essayer !
Ici, on demande rcuprer le prix moyen par console de tous les jeux de Patrick (WHERE), condition que le prix moyen des
jeux de la console ne dpasse pas 10 euros (HAVING).
Les fonctions SQL ouvrent de nombreuses possibilits comme vous avez pu le constater.
On pourrait se dire que certaines fonctionnalits auraient aussi bien pu tre traites en PHP. Par exemple, mettre en majuscules
le nom des jeux aurait pu tre fait avec une fonction PHP adapte au moment de l'affichage. C'est vrai, mais les fonctions SQL
sont souvent plus souples et plus indiques car on rcupre ainsi un rsultat dj mis en forme. D'autre part, si on se met
utiliser des fonctions d'agrgat en mme temps qu'un regroupement de donnes, on peut rapidement obtenir des informations
trs intressantes partir d'une table toute simple.
L'utilisation de GROUP BY et HAVING n'est d'ailleurs pas toujours trs bien comprise, j'ai parfois vu des gens les utiliser avec
des fonctions scalaires ce qui n'a pas de sens. Prenez donc bien le temps de comprendre ce qu'elles font pour ne pas les utiliser
n'importe comment. Demandez-vous toujours "Qu'est-ce que je veux obtenir" et construisez la requte bout par bout car tout
www.siteduzero.com
216/361
www.siteduzero.com
217/361
Un formulaire apparat, vous proposant de crer un nouveau champ. C'est l'occasion de passer en revue les diffrents types de
champs qui permettent de stocker des dates.
Cela fait beaucoup de choix ! Dans la pratique, je vous invite retenir surtout DATE (AAAA-MM-JJ) quand le moment de la
journe importe peu, et DATETIME (AAAA-MM-JJ HH:MM:SS) quand vous avez besoin du jour et de l'heure prcise la
seconde prs.
Crez un champ nomm date de type DATETIME comme ceci :
Bien que cela fonctionne avec MySQL, il est parfois prfrable de donner un autre nom au champ que date. En
effet, c'est un mot-cl du langage SQL, ce qui peut provoquer des erreurs avec d'autres systmes de bases de donnes
comme Oracle.
www.siteduzero.com
218/361
Vous pourriez par exemple nommer le champ comme ceci : date_creation, ou encore date_modification.
... vous renverra la liste des messages posts le 02/04/2010 (2 avril 2010).
Si le champ est de type DATETIME (comme c'est le cas pour notre nouveau Mini Chat), il faut aussi indiquer prcisment les
heures, minutes et secondes :
Code : SQL
SELECT pseudo, message, date FROM minichat WHERE date = '2010-04-02
15:28:22'
En SQL, pour rcuprer des donnes comprises entre 2 intervalles comme ici, il y a une syntaxe plus simple et plus
lgante avec le mot-cl BETWEEN qui signifie "Entre". On pourrait crire la requte prcdente comme ceci :
Code : SQL
www.siteduzero.com
219/361
Cela signifie : rcuprer tous les messages dont la date est comprise entre 2010-04-02 00:00:00 et 2010-04-18
00:00:00. Vous pouvez aussi utiliser cette syntaxe sur les champs contenant des nombres.
Si vous voulez insrer une entre contenant une date, il suffit l encore de respecter le format de date de la base de donnes :
Code : SQL
INSERT INTO minichat(pseudo, message, date) VALUES('Mateo', 'Message
!', '2010-04-02 16:32:22')
www.siteduzero.com
220/361
La date sera alors automatiquement remplace par la date et l'heure actuelle, au format AAAA-MM-JJ HH:MM:SS.
Notez qu'il existe aussi les fonctions CURDATE() et CURTIME() qui retournent respectivement uniquement la date (AAAAMM-JJ) et l'heure (HH:MM:SS).
www.siteduzero.com
221/361
Avec les fonctions que l'on vient de dcouvrir l'instant, on pourrait extraire tous les lments de la date comme ceci :
Code : SQL
SELECT pseudo, message, DAY(date) AS jour, MONTH(date) AS mois,
YEAR(date) AS annee, HOUR(date) AS heure, MINUTE(date) AS minute,
SECOND(date) AS seconde FROM minichat
On pourrait ensuite afficher la date dans l'ordre que l'on souhaite en PHP l'aide du dcoupage en champs qu'on vient de faire :
Code : PHP
<?php
echo $donnees['jour'] . '/' . $donnees['mois'] . '/' .
$donnees['annee'] . '...';
?>
C'est cependant un peu compliqu et il y a plus simple. La fonction DATE_FORMAT vous permet d'adapter directement la
date au format que vous prfrez. Il faut dire que le format par dfaut de MySQL (AAAA-MM-JJ HH:MM:SS) n'est pas trs
courant en France.
Voici comment on pourrait l'utiliser :
Code : SQL
SELECT pseudo, message, DATE_FORMAT(date, '%d/%m/%Y %Hh%imin%ss') AS
date FROM minichat
Ainsi, on rcuprerait les dates avec un champ nomm date sous la forme 11/03/2010 15h47min49s.
Comment a marche ce bazar ?
Les symboles %d, %m, %Y (etc.) sont remplacs par le jour, le mois, l'anne, etc. Les autres symboles et lettres sont affichs
tels quels.
Il existe beaucoup d'autres symboles, pour extraire par exemple le nom du jour (la plupart du temps en anglais
malheureusement, comme "Saturday"), le numro du jour dans l'anne, etc. La liste des symboles disponibles est dans la doc
la section DATE_FORMAT.
www.siteduzero.com
222/361
Le champ date_expiration correspond la date de l'entre + 15 jours. Le mot-cl INTERVAL ne doit pas tre chang, en
revanche vous pouvez remplacer DAY par MONTH, YEAR, HOUR, MINUTE, SECOND, etc. Par consquent, si vous
souhaitez que les messages expirent dans 2 mois :
Code : SQL
SELECT pseudo, message, DATE_ADD(date, INTERVAL 2 MONTH) AS
date_expiration FROM minichat
Juste un petit rappel pour tre sr qu'on se comprend bien : cette requte ne commande pas la suppression des
messages dans 2 mois ! On cre juste un champ virtuel date_expiration qui correspond la date du message + 2
mois. Cela serait utile pour informer l'utilisateur quand son message va expirer, mais ce serait vous de faire en sorte
que votre site supprime le message au bout de 2 mois !
Ce tour d'horizon des dates vous sera rapidement trs utile. On peut effectuer de nombreuses oprations sur les dates l'aide de
fonctions comme vous venez de le dcouvrir, ce qui nous fait gagner du temps et nous permet d'obtenir en PHP directement les
informations que l'on souhaite dans la forme qui nous convient le mieux.
www.siteduzero.com
223/361
Prrequis
Dans ce TP, nous allons nous concentrer sur la base de donnes. Nous aurons besoin des notions suivantes :
Lire dans une table
Utilisation de PDO et des requtes prpares
Utilisation de fonctions SQL
Manipulation des dates en SQL
Objectifs
Commenons par dfinir ce qu'on veut arriver faire. Un systme de blog avec des commentaires, oui, mais encore ? Il faut
savoir jusqu'o on veut aller, ce qu'on a l'intention de raliser et ce qu'on va mettre de ct.
Si on est trop ambitieux, on risque de le regretter : on pourrait en effet y passer des jours et ce TP deviendrait long, complexe
et fastidieux. Je vous propose donc de raliser l'affichage de base d'un blog et des commentaires associs aux billets, et je vous
inviterai par la suite l'amliorer pour crer l'interface de gestion des billets et d'ajout de commentaires.
L'ajout de billets et de commentaires ne sont donc pas au programme de ce TP, ce qui va nous permettre de nous concentrer sur
leur affichage.
www.siteduzero.com
224/361
Voici quoi devrait ressembler l'affichage d'un billet et de ses commentaires (commentaires.php) :
Comme vous pouvez le constater, l'affichage est minimaliste. Le but n'est pas de raliser le design de ce blog mais bel et bien
d'avoir quelque chose de fonctionnel.
Le CSS
Voici le fichier CSS (trs simple) que j'utiliserai pour ce TP :
www.siteduzero.com
225/361
Code : CSS
h1, h3
{
text-align:center;
}
h3
{
background-color:black;
color:white;
font-size:0.9em;
margin-bottom:0px;
}
.news p
{
background-color:#CCCCCC;
margin-top:0px;
}
.news
{
width:70%;
margin:auto;
}
a
{
}
text-decoration: none;
color: blue;
Libre vous de l'utiliser ou non, de le modifier, bref faites-en ce que vous voulez.
On va vraiment stocker tous les commentaires dans une seule table, mme s'ils concernent des billets diffrents ?
Oui. C'est la bonne faon de faire. Tous les commentaires, quel que soit le billet auquel ils se rapportent, seront stocks dans la
mme table. On pourra faire le tri facilement l'aide d'un champ id_billet qui indiquera pour chaque commentaire le
numro du billet associ.
Voici la structure que je propose pour la table billets :
id (int) : identifiant du billet, cl primaire et auto_increment
titre (varchar 255) : titre du billet
contenu (text) : contenu du billet
date_creation (datetime) : date et heure de cration du billet
www.siteduzero.com
226/361
C'est vraiment la base. Vous pouvez rajouter d'autres champs si vous le dsirez. Par exemple, on n'a pas dfini de champ
auteur pour les billets.
Notez qu'il est possible d'ajouter des champs tout moment, comme nous l'avons vu il y a peu. L'interface
phpMyAdmin propose des options pour cela.
Comme nous n'allons pas crer les formulaires d'ajout de billets et de commentaires dans un premier temps, je vous conseille
de remplir vous-mmes les tables l'aide de phpMyAdmin aprs les avoir cres.
Si vous tes du genre flemmard, vous pouvez aussi tlcharger mes tables toutes prtes avec quelques donnes l'intrieur,
mais je vous recommande de vous entraner les crer vous-mmes.
Le visiteur arrive d'abord sur l'index o sont affichs les derniers billets. S'il choisit d'afficher les commentaires de l'un d'eux, il
charge la page commentaires.php qui affichera le billet slectionn ainsi que tous ses commentaires. Bien entendu, il
faudra envoyer un paramtre la page commentaires.php pour qu'elle sache quoi afficher, je vous laisse deviner lequel.
Il sera possible de revenir la liste des billets depuis les commentaires l'aide d'un lien de retour.
A vous de jouer !
www.siteduzero.com
227/361
Je vous en ai assez dit, la ralisation de ce TP devrait tre relativement simple pour vous si vous avez bien suivi jusqu'ici.
N'oubliez pas les lments essentiels de scurit, notamment la protection de tous les textes par htmlspecialchars(). Et
ne faites jamais confiance l'utilisateur !
www.siteduzero.com
228/361
Correction
Si vous lisez ces lignes, c'est que vous devez tre venu bout de ce TP. Celui-ci ne prsentait pas de difficults particulires
mais il tait l'occasion de vous exercer un peu plus avec MySQL tout en faisant appel aux fonctions et dates en SQL.
www.siteduzero.com
229/361
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
?>
</body>
</html>
Vous constaterez que tous les textes, y compris les titres, sont protgs par htmlspecialchars(). J'utilise par ailleurs une
fonction qui doit tre nouvelle pour vous : nl2br(). Elle permet de convertir les retours la ligne en balises HTML <br
/>. C'est une fonction dont vous aurez srement besoin pour conserver facilement les retours la ligne saisis dans les
formulaires.
Ct SQL, cette page ne fait qu'une seule requte : celle qui rcupre les 5 derniers billets.
Code : SQL
SELECT id, titre, contenu, DATE_FORMAT(date_creation, '%d/%m/%Y
%Hh%imin%ss') AS date_creation_fr FROM billets ORDER BY
date_creation DESC LIMIT 0, 5
On rcupre toutes les donnes qui nous intressent dans cette table, en mettant en forme au passage la date. Pour cela, on
utilise la fonction scalaire DATE_FORMAT qui nous permet d'obtenir une date dans un format franais.
Les billets sont ordonns par date dcroissante, le plus rcent tant donc en haut de la page.
Enfin, chaque billet est suivi d'un lien vers la page commentaires.php en transmettant le numro du billet dans l'URL :
Code : PHP
<a href="commentaires.php?billet=<?php echo $donnees['id']; ?
>">Commentaires</a>
Code : PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>Mon blog</title>
<meta http-equiv="Content-Type" content="text/html;
www.siteduzero.com
www.siteduzero.com
230/361
231/361
</html>
La requte qui rcupre le billet ressemble celle de la page prcdente, la diffrence prs qu'il s'agit d'une requte prpare
car elle dpend d'un paramtre : l'id du billet (fourni par $_GET['billet'] qu'on a reu dans l'URL).
Comme on rcupre forcment un seul billet, il est inutile de faire une boucle. L'affichage est identique celui qu'on faisait
pour chaque billet sur la page prcdente, l'exception du lien vers la page des commentaires qui ne sert plus rien (puisque
nous sommes sur la page des commentaires
).
On pense librer le curseur aprs l'affichage du billet avec :
Code : PHP
<?php
$req->closeCursor();
?>
En effet, cela permet de "terminer" le traitement de la requte pour pouvoir traiter la prochaine requte sans problme.
La rcupration des commentaires se fait ensuite via la requte suivante :
Code : SQL
SELECT auteur, commentaire, DATE_FORMAT(date_commentaire, '%d/%m/%Y
%Hh%imin%ss') AS date_commentaire_fr FROM commentaires WHERE
id_billet = ? ORDER BY date_commentaire
Vous noterez que l'on ne se connecte la base de donnes qu'une fois par page. Pas besoin donc de se reconnecter
pour effectuer cette seconde requte.
On rcupre avec cette requte tous les commentaires lis au billet correspondant l'id reu dans l'URL. Les commentaires sont
tris par date croissante comme c'est habituellement le cas sur les blogs, mais vous pouvez changer cet ordre si vous le dsirez,
c'est facile.
www.siteduzero.com
232/361
233/361
Quand vous commencerez avoir beaucoup de billets (et beaucoup de commentaires) vous voudrez peut-tre ne pas tout
afficher sur la mme page. Pour cela, il faut crer un systme de pagination.
Supposons que vous souhaitiez afficher uniquement 5 billets par page. Si vous voulez afficher des liens vers chacune des
pages, il faut savoir combien votre blog comporte de billets.
Par exemple, si vous avez 5 billets, il n'y aura qu'une seule page. Si vous avez 12 billets, il y aura 3 pages. Pour connatre le
nombre de billets, une requte SQL avec COUNT(*) est indispensable :
Code : SQL
SELECT COUNT(*) AS nb_billets FROM billets
Une fois ce nombre de billets rcupr, vous pouvez trouver le nombre de pages et crer des liens vers chacune d'elles :
Page : 1 2 3 4
Chacun de ces nombres amnera vers la page correspondante et ajoutera dans l'url le numro de celle-ci :
Code : HTML
<a href="index.php?page=2">2</a>
A l'aide du paramtre $_GET['page'] vous pourrez dterminer quelle page vous devez afficher. A vous d'adapter la
requte SQL pour commencer uniquement partir du billet n o X. Par exemple, si vous demandez afficher la page 2, vous
voudrez afficher uniquement les billets n o 5 9 (n'oubliez pas qu'on commence compter partir de 0 !). Revoyez la section
sur LIMIT au besoin.
Et si aucun numro de page n'est dfini dans l'URL, lorsqu'on arrive la premire fois sur le blog ?
Dans ce cas, si $_GET['page'] n'est pas dfinie, vous devrez considrer que le visiteur veut afficher la page 1 (la plus
rcente).
Ca demande un peu de rflexion mais le jeu en vaut la chandelle ! N'hsitez pas demander de l'aide sur les forums au besoin.
www.siteduzero.com
234/361
Pour en savoir plus sur la protection d'un dossier avec ces fichiers .htaccess et .htpasswd, je vous invite consulter
cette annexe au cours.
Allez, au boulot !
Je vous avais prvenu : ce TP ne vous montre que les bases du blog (l'affichage) mais c'est vous de jouer si vous voulez
construire le reste du blog ! Ralisez les amliorations que je propose, cela vous prendra srement un peu de temps mais vous
progresserez beaucoup en faisant cela.
N'hsitez pas vous faire aider si une amlioration vous bloque trop longtemps. N'abandonnez pas la premire difficult !
www.siteduzero.com
235/361
nom
prenom nom_possesseur
tel
console
prix nbre_joueurs_max
commentaires
Super Mario
Bros
Florent
Dugommier
01 44
77 21
33
NES
Un jeu d'anthologie !
Sonic
Patrick
Lejeune
03 22
17 41
22
Megadrive 2
Zelda : ocarina
of time
Florent
Dugommier
01 44
77 21
33
Nintendo
64
15
Mario Kart 64
Florent
Dugommier
01 44
77 21
33
Nintendo
64
25
Un excellent jeu de
kart !
Super Smash
Bros Melee
Michel
Doussand
04 11
78 02
00
GameCube 55
Un jeu de baston
dlirant !
Comme vous le voyez, le nom, le prnom et le numro de tlphone de Florent apparaissent autant de fois qu'il possde jeux
vido, et il en irait de mme pour Patrick et Michel. Il faut tout prix viter ces rptitions.
Ce que je vous propose, c'est de crer une autre table, que l'on nommera par exemple proprietaires, qui centralisera les
informations des propritaires des jeux vido :
Table proprietaires
ID prenom
nom
tel
Florent
Dugommier 01 44 77 21 33
Patrick
Lejeune
03 22 17 41 22
Michel
Doussand
04 11 78 02 00
Cette table liste tous les propritaires de jeux connus et leur attribue chacun un ID. Les propritaires n'apparaissent qu'une
seule fois, il n'y a pas de doublon.
Maintenant, il faut modifier la structure de la table jeux_video pour faire rfrence aux propritaires. Pour cela, le mieux
est de crer un champ ID_proprietaire qui indique le numro du propritaire dans l'autre table :
Table jeux_video
ID
nom
ID_proprietaire
console
prix nbre_joueurs_max
commentaires
NES
Un jeu d'anthologie !
Sonic
Megadrive 2
Zelda : ocarina of
time
Nintendo
64
15
Nintendo
www.siteduzero.com
Mario Kart 64
Nintendo
64
236/361
25
GameCube 55
Le nouveau champ ID_proprietaire est de type INT. Il permet de faire rfrence une entre prcise de la table
proprietaires.
On peut maintenant considrer que les tables sont relies travers ces ID de propritaires.
MySQL sait donc que l'ID_proprietaire n1 dans la table des jeux_video correspond Florent ?
Non, il ne le sait pas. Il ne voit que des nombres et il ne fait pas la relation entre les 2 tables. Il va falloir lui expliquer cette
relation dans une requte SQL : on va faire ce qu'on appelle une jointure entre les 2 tables.
www.siteduzero.com
237/361
Les informations sont spares dans des tables diffrentes et c'est bien. Cela vite de dupliquer des informations sur le disque.
Cependant, lorsqu'on rcupre la liste des jeux, si on souhaite obtenir le nom du propritaire, il va falloir adapter la requte
pour rcuprer aussi les informations issues de la table proprietaires. Pour cela, on doit faire ce qu'on appelle une
jointure.
Il existe plusieurs types de jointures, qui nous permettent de choisir exactement les donnes que l'on veut rcuprer. Je vous
propose d'en dcouvrir 2, les plus importantes :
Les jointures internes : elles ne slectionnent que les donnes qui ont une correspondance entre les 2 tables
Les jointures externes : elles slectionnent toutes les donnes, mme si certaines n'ont pas de correspondance dans
l'autre table.
Il est important de bien comprendre la diffrence entre une jointure interne et une jointure externe.
Pour cela, imaginons que nous ayons une 4me personne dans la table des propritaires, un certain Romain Vipelli, qui ne
possde aucun jeu :
Table proprietaires
ID prenom
nom
tel
Florent
Dugommier 01 44 77 21 33
Patrick
Lejeune
03 22 17 41 22
Michel
Doussand
04 11 78 02 00
Romain Vipelli
01 21 98 51 01
Romain Vipelli est rfrenc dans la table proprietaires mais il n'apparat nulle part dans la table jeux_video car il ne
possde aucun jeu.
Si vous rcuprez les donnes des 2 tables l'aide :
D'une jointure interne : Romain Vipelli n'apparatra pas dans les rsultats de la requte. La jointure interne force les
donnes d'une table avoir une correspondance dans l'autre.
D'une jointure externe : vous aurez toutes les donnes de la table des propritaires mme s'il n'y a pas de
correspondance dans l'autre table des jeux vido, donc Romain Vipelli, qui pourtant ne possde aucun jeu vido,
apparatra.
La jointure externe est donc plus complte car elle est capable de rcuprer plus d'informations, tandis que la jointure interne
est plus stricte car elle ne rcupre que les donnes qui ont une quivalence dans l'autre table.
Voici par exemple les donnes que l'on rcuprerait avec une jointure interne :
Jointure interne
www.siteduzero.com
238/361
prenom
Patrick
...
...
On obtient les jeux et leurs propritaires, mais Romain qui ne possde pas de jeu n'apparat pas du tout. En revanche, avec une
jointure externe :
Jointure externe
nom_jeu
prenom
Patrick
...
...
NULL
Romain
Romain apparat maintenant. Comme il ne possde pas de jeu, il n'y a aucun nom de jeu indiqu (NULL).
Nous allons maintenant voir dans la pratique comment raliser ces deux types de jointures.
www.siteduzero.com
239/361
Ces deux techniques produisent exactement le mme rsultat, mais il faut les connatre toutes les deux.
Cependant a ne fonctionnera pas car ce n'est pas suffisant. En effet, le champ nom apparat dans les 2 tables : une fois pour le
nom du propritaire, et une autre fois pour le nom du jeu vido. C'est ce qu'on appelle une colonne ambige car MySQL ne
sait pas s'il doit rcuprer un nom de personne (comme Dugommier) ou un nom de jeu (comme Super Mario Bros). Bref, il est
un peu perdu.
L'astuce consiste marquer le nom de la table devant le nom du champ comme ceci :
Code : SQL
SELECT jeux_video.nom, proprietaires.prenom FROM proprietaires,
jeux_video
Ainsi, on demande clairement de rcuprer le nom du jeu et le prnom du propritaire avec cette requte.
Le champ prenom n'est pas ambigu, car il n'apparat que dans la table proprietaires. On pourrait donc se
passer d'crire le prfixe proprietaires devant, mais a ne cote rien de le faire et c'est plus clair : on voit
immdiatement en lisant la requte de quelle table est issu ce champ.
Il reste encore lier les 2 tables entre elles. En effet, les jeux et leurs propritaires ont une correspondance via le champ
ID_proprietaire (de la table jeux_video) et le champ ID (de la table proprietaires). On va indiquer cette
liaison dans un WHERE comme ceci :
Code : SQL
SELECT jeux_video.nom, proprietaires.prenom
FROM proprietaires, jeux_video
WHERE jeux_video.ID_proprietaire = proprietaires.ID
www.siteduzero.com
240/361
Comme la requte devient longue, je me permets de l'crire sur plusieurs lignes. Cette criture est tout fait autorise
et a l'avantage d'tre plus lisible.
On indique bien que le champ ID_proprietaire de la table jeux_video correspond au champ ID de la table
proprietaires. Cela tablit la correspondance entre les 2 tables telle qu'on l'avait dfinie dans le schma au dbut du
chapitre.
Notre requte est enfin complte, vous pouvez l'essayer.
Vous devriez rcuprer les donnes suivantes :
nom
prenom
Patrick
...
...
On rcuprera donc 2 champs : nom_jeu et prenom_proprietaire. Ces alias permettent de donner un nom plus clair
aux champs que l'on rcupre.
nom_jeu
prenom_proprietaire
Patrick
...
...
Il est possible aussi de donner un alias aux noms des tables, ce qui est fortement recommand pour donner un nom plus court
et plus facile crire. En gnral, on cre des alias de tables d'une lettre ou deux correspondant leurs initiales, comme ceci :
Code : SQL
www.siteduzero.com
241/361
Comme vous le voyez, la table jeux_video a pour alias la lettre j et proprietaires la lettre p. On rutilise ces alias
dans toute la requte, ce qui la rend plus courte crire (et plus lisible aussi au final
).
Notez que le mot-cl AS est en fait facultatif, les dveloppeurs ont tendance l'omettre. Vous pouvez donc tout simplement le
retirer de la requte :
Code : SQL
SELECT j.nom nom_jeu, p.prenom prenom_proprietaire
FROM proprietaires p, jeux_video j
WHERE j.ID_proprietaire = p.ID
Cette fois, on rcupre les donnes depuis une table principale (ici proprietaires) et on fait une jointure interne (INNER
JOIN) avec une autre table (jeux_video). La liaison entre les champs est faite dans la clause ON un peu plus loin.
Le fonctionnement reste le mme, on rcupre les mmes donnes que tout l'heure avec la syntaxe WHERE.
Si vous voulez filtrer (WHERE), ordonner (ORDER BY) ou limiter les rsultats (LIMIT), vous devez le faire la fin de la
requte, aprs le "ON j.ID_proprietaire = p.ID". Par exemple :
www.siteduzero.com
242/361
Code : SQL
SELECT j.nom nom_jeu, p.prenom prenom_proprietaire
FROM proprietaires p
INNER JOIN jeux_video j
ON j.ID_proprietaire = p.ID
WHERE j.console = 'PC'
ORDER BY prix DESC
LIMIT 0, 10
Traduction (inspirez un grand coup avant de lire) : "Rcupre le nom du jeu et le prnom du propritaire dans les tables
proprietaires et jeux_video, la liaison entre les tables se fait entre les champs ID_proprietaire et ID, prends
uniquement les jeux qui tournent sur PC, trie-les par prix dcroissant et ne prends que les 10 premiers."
Faut s'accrocher avec des requtes de cette taille-l.
www.siteduzero.com
243/361
proprietaires est appele la "table de gauche" et jeux_video la "table de droite". Le LEFT JOIN demande rcuprer
tout le contenu de la table de gauche (donc tous les propritaires) mme s'ils n'ont pas d'quivalence dans la table
jeux_video.
nom_jeu
prenom_proprietaire
Patrick
...
...
NULL
Romain
Romain apparat dsormais dans les rsultats de la requte grce la jointure externe. Comme il ne possde aucun jeu, la
colonne du nom du jeu est vide.
La table de droite est jeux_video. On rcuprerait donc tous les jeux, mme ceux qui n'ont pas de propritaire associ.
Comment est-ce possible qu'un jeu n'ait pas de propritaire associ ?
www.siteduzero.com
244/361
Il y a 2 cas possibles :
Soit le champ ID_proprietaire contient une valeur qui n'a pas d'quivalent dans la table des propritaires, par exemple
"56".
Soit le champ ID_proprietaire vaut NULL, c'est--dire que personne ne possde ce jeu. C'est le cas notamment du jeu
Bomberman dans la table que vous avez tlcharge (voir tableau ci-dessous).
ID
nom
ID_proprietaire
console
prix nbre_joueurs_max
commentaires
NES
Un jeu d'anthologie !
Sonic
Megadrive 2
Zelda : ocarina of
time
Nintendo
64
15
Mario Kart 64
Nintendo
64
25
GameCube 55
...
...
...
...
...
...
...
NULL
NES
51 Bomberman
Dans ce cas, Bomberman n'appartient personne. Avec la requte RIGHT JOIN que l'on vient de voir, on obtiendra toutes les
lignes de la table de droite (jeux_video) mme si elles n'ont aucun lien avec la table proprietaires, comme c'est le cas
ici pour Bomberman.
On obtiendra donc les donnes suivantes :
nom_jeu
prenom_proprietaire
Patrick
...
...
Bomberman
NULL
Cette introduction aux jointures devrait vous avoir permis de comprendre comment on peut sparer les informations dans
diffrentes tables pour viter de rpter inutilement des informations. Cette plus grande sparation des donnes nous donne
plus de flexibilit : ainsi, on peut rcuprer seulement la liste des propritaires puisqu'elle est stocke dans une table part.
Vous devriez, pour vous entraner, faire la mme sparation par exemple pour la liste des consoles. Vous pourriez crer une
table consoles qui contiendrait le nom de la console, son anne de sortie, le nom de son fabricant (Nintendo, Sega,
Microsoft...). Et pour aller plus loin vous pourriez aussi stocker les fabricants dans une table fabricants !
Enfin, sachez qu'il est possible d'aller plus loin dans l'association des tables avec MySQL. Si on utilise des tables de type
InnoDB (contrairement au type MyISAM qu'on a utilis par dfaut jusqu'ici), MySQL peut connatre la relation entre les tables
tout instant, et pas seulement au moment de la requte. Cela permet de faire par exemple en sorte que si on supprime un
propritaire, cela supprime automatiquement tous les jeux vido qu'il possde dans l'autre table.
www.siteduzero.com
245/361
www.siteduzero.com
246/361
Activer la librairie GD
On a dj un problme (a commence fort
).
En effet, la librairie GD (qui vous permet de crer des images) est livre avec PHP, mais elle n'est pas active. Ca veut dire quoi
? Qu'il va falloir demander de l'activer tout simplement.
La procdure suivre est exactement la mme que celle qu'on avait vue pour activer PDO lorsque nous avons dcouvert les
bases de donnes. Sous WAMP par exemple, faites un clic gauche sur l'icne de WAMP dans la barre des tches, puis allez
dans le menu PHP / Extensions PHP et cochez php_gd2.
Et sur Internet avec mon hbergeur ? Est-ce que je peux utiliser GD ?
Cela dpend des hbergeurs. Une grande partie des hbergeurs gratuits dsactivent GD parce que a consomme beaucoup de
ressources du processeur.
Si des dizaines de sites se mettent gnrer des images en mme temps, a risquerait de faire ramer toute la machine et donc de
ralentir tous les autres sites.
Ne dsesprez pas pour autant, il existe certainement des hbergeurs gratuits qui acceptent la librairie GD... Sinon, il faudra
peut-tre trouver un hbergement payant (on peut en trouver des pas chers qui ont activ GD !).
www.siteduzero.com
247/361
Y'a du boulot.
Le header
Il y a 2 faons de gnrer une image en PHP :
Soit on fait en sorte que notre script PHP renvoie une image (au lieu d'une page web comme on avait l'habitude). Dans
ce cas, si on va sur la page http://www.monsite.com/testgd.php, a affichera une image et non pas une page web !
Soit on demande PHP d'enregistrer l'image dans un fichier.
Dans les 2 cas, on utilisera exactement les mmes fonctions.
On va commencer par la premire faon de gnrer l'image, c'est--dire qu'on va faire en sorte que notre script "renvoie" une
image au lieu d'une page web.
Mais comment faire pour que le navigateur sache que c'est une image et non pas une page HTML qu'il doit afficher ?
Il va falloir envoyer ce qu'on appelle un header (en-tte). Grce la fonction header, on va "dire" au navigateur que l'on est
en train d'envoyer une image.
Je vous rappelle les types d'images les plus courants sur le web :
JPEG : c'est un format trs adapt pour les photos par exemple, car on peut utiliser beaucoup de couleurs.
PNG : c'est le format le plus rcent, trs adapt dans la plupart des cas. En fait, moins d'avoir affaire une photo, le
mieux est d'utiliser le PNG.
Le PNG est en quelque sorte le "remplaant" du format GIF.
Donc pour faire simple : si c'est une photo, vous faites un JPEG, sinon dans tous les autres cas vous faites un PNG.
Voici le code PHP qu'il faut mettre pour "annoncer" au navigateur que l'on va renvoyer une image PNG :
Code : PHP
<?php
header ("Content-type: image/png");
?>
Voil, c'est assez simple. Ce code signifiera pour le navigateur que l'on envoie une image PNG, et non pas une page HTML.
Si vous envoyez un JPEG, c'est presque pareil, mais vous remplacez le "png" par "jpeg".
La fonction header est particulire. Comme setcookie, elle doit tre utilise avant d'avoir crit le moindre code
HTML.
En clair, mettez cette ligne tout au dbut de votre code, et vous n'aurez pas de problmes.
www.siteduzero.com
248/361
).
Cette fonction est simple. Elle prend 2 paramtres : la largeur et la hauteur de l'image que vous voulez crer. Elle renvoie une
information, que vous devez mettre dans une variable (par exemple $image). Ce qui nous donne :
Code : PHP
<?php
header ("Content-type: image/png");
$image = imagecreate(200,50);
?>
Ici, nous sommes en train de crer une image de 200 pixels de large et 50 pixels de haut.
$image ne contient ni un nombre, ni du texte. Cette variable contient une "image". C'est assez difficile imaginer qu'une
variable puisse "contenir" une image, mais c'est comme a je n'y peux rien.
On dit que $image est une "ressource". Une ressource est une variable un peu spciale qui contient toutes les
informations sur un objet. Ici, il s'agit d'une image, mais il pourrait trs bien s'agir d'un PDF ou mme d'un fichier que
vous avez ouvert avec fopen. Tiens tiens, a vous rappelle quelque chose ?
www.siteduzero.com
249/361
Pour crer une nouvelle image en se basant sur celle-l, je dois utiliser la fonction imagecreatefromjpeg. Ca nous
donnerait le code suivant :
Code : PHP
<?php
header ("Content-type: image/jpeg");
$image = imagecreatefromjpeg("couchersoleil.jpg");
?>
Ces 2 fonctions s'utilisent de la mme manire : vous avez juste besoin d'indiquer quelle est l'image que vous voulez afficher.
Il faut savoir qu'il y a 2 faons d'utiliser les images en PHP : vous pouvez les afficher directement aprs les avoir cres, ou
vous pouvez les enregistrer sur le disque pour pouvoir les rafficher plus tard sans avoir refaire tous les calculs.
www.siteduzero.com
250/361
C'est bien joli, mais l on n'a qu'une image sous les yeux. Et si je veux mettre du texte autour ? Les menus de mon site
?
En fait, on utilise une technique qui, j'en suis sr, va vous surprendre. On va demander afficher la page PHP comme une
image.
Donc, si la page PHP s'appelle "image.php", vous mettrez ce code HTML pour l'afficher depuis une autre page :
Code : HTML
<img src="image.php" />
Incredible, isn't it ?
Mais en fait, c'est logique quand on y pense ! La page PHP que l'on vient de crer EST une image (parce qu'on a modifi le
header). On peut donc afficher l'image que l'on vient de crer depuis n'importe quelle page de votre site en utilisant
simplement la balise <img />
Le gros avantage de cette technique, c'est que l'image affiche pourra changer chaque fois !
www.siteduzero.com
251/361
Cette fois, l'image a t enregistre sur le disque avec le nom monimage.png. Pour l'afficher depuis une autre page web,
vous ferez donc comme ceci :
Code : HTML
<img src="images/monimage.png" />
Oui, je sais. Vous avez t patients et c'est bien parce que c'est maintenant que a va devenir intressant. Allez donc chercher
votre baguette magique, je vous attends.
www.siteduzero.com
252/361
Texte et couleur
C'est bon, vous avez votre baguette magique ?
Alors voici ce que nous allons apprendre faire maintenant :
Manipuler les couleurs
Ecrire du texte
Vous allez commencer voir un peu ce qu'il est possible de faire grce la librairie GD, mais vous verrez plus loin qu'on peut
faire bien plus.
Si vous avez un logiciel de dessin comme Paint et que vous allez dans le menu Couleur / Modifier les couleurs, vous pouvez
choisir la couleur que vous voulez :
www.siteduzero.com
253/361
Comme vous pouvez le voir, en cliquant sur la couleur qui vous intresse on vous donne les quantits de Rouge Vert Bleu.
Vous pouvez donc choisir la couleur que vous voulez. Allez-y, servez-vous.
Mais revenons ce qui nous intresse : PHP (c'est bien pour a que vous tes l non ?).
Pour dfinir une couleur en PHP, on doit utiliser la fonction : imagecolorallocate.
On lui donne 4 paramtres : l'image sur laquelle on travaille, la quantit de rouge, la quantit de vert, et la quantit de bleu.
Cette fonction nous renvoie la couleur dans une variable. Grce cette fonction, on va pouvoir se crer des "variablescouleur" qui vont nous tre utiles pour indiquer la couleur ensuite.
Voici quelques exemples de cration de couleur :
Code : PHP
<?php
header ("Content-type: image/png");
$image = imagecreate(200,50);
$orange = imagecolorallocate($image, 255, 128, 0);
$bleu = imagecolorallocate($image, 0, 0, 255);
$bleuclair = imagecolorallocate($image, 156, 227, 254);
$noir = imagecolorallocate($image, 0, 0, 0);
$blanc = imagecolorallocate($image, 255, 255, 255);
imagepng($image);
?>
Une chose trs importante noter : la premire fois que vous faites un imagecolorallocate, cette couleur devient la couleur de
fond de votre image.
Donc, si vous avez bien compris, ce code doit crer une image... toute orange ! Essayez !
Essayer !
Si j'avais voulu que le fond soit blanc et pas orange, il aurait fallu placer $blanc en premier.
www.siteduzero.com
254/361
Voil, vous savez maintenant crer toutes les couleurs de l'arc-en-ciel en PHP.
Ecrire du texte
Nous voici enfin dans le vif du sujet (ouf !). Nous avons une belle image avec un maaagnifique fond orange, et nous voulons
crire du texte dedans.
Avec la fonction imagestring, c'est facile !
Cette fonction prend beaucoup de paramtres. Elle s'utilise comme ceci :
Code : PHP
<?php
imagestring($image, $police, $x, $y, $texte_a_ecrire, $couleur);
?>
Il existe aussi la fonction imagestringup qui fonctionne exactement pareil, sauf qu'elle crit le texte
verticalement au lieu d'horizontalement !
Je vous dtaille les paramtres dans l'ordre, c'est important que vous compreniez bien :
$image : c'est notre fameuse variable qui contient l'image.
$police : c'est la police de caractres que vous voulez utiliser. Vous devez mettre un nombre de 1 5 : 1 = petit, 5 =
grand. Il est aussi possible d'utiliser une police de caractre personnalise, mais il faut avoir des polices dans un format
spcial qu'il serait trop long de dtailler ici. On va donc se contenter des polices par dfaut
$x et $y : ce sont les coordonnes o vous voulez placer votre texte sur l'image. Et l vous vous dites : "Ae, a sent
les maths
" (comme quoi les maths a sert
). Vous devez savoir que l'origine se trouve en haut gauche de votre
image. Le point de coordonnes 0, 0 reprsente donc le point tout en haut gauche de l'image.
Voici le schma de notre image orange de tout l'heure, qui est de taille 200x50 :
Notez que les coordonnes de l'image s'arrtent (199, 49) et non (200, 50) comme on pourrait s'y attendre.
En effet, il ne faut pas oublier qu'on commence compter partir de 0 ! De 0 199 il y a bien 200 points.
Comme vous pouvez le voir, j'ai marqu en bleu les 4 points des cts de l'image. 0, 0 se trouve tout en haut gauche,
et 199, 49 se trouve tout en bas droite.
$texte_a_ecrire, c'est le... texte que vous voulez crire. Non non, y'a pas de pige.
$couleur, c'est une couleur que vous avez cr tout l'heure avec imagecolorallocate.
www.siteduzero.com
255/361
Code : PHP
<?php
header ("Content-type: image/png");
$image = imagecreate(200,50);
$orange = imagecolorallocate($image, 255, 128, 0);
$bleu = imagecolorallocate($image, 0, 0, 255);
$bleuclair = imagecolorallocate($image, 156, 227, 254);
$noir = imagecolorallocate($image, 0, 0, 0);
$blanc = imagecolorallocate($image, 255, 255, 255);
imagestring($image, 4, 35, 15, "Salut les Zros !", $blanc);
imagepng($image);
?>
Essayer !
La ligne avec imagestring peut se traduire par : Mets dans l'image $image, avec la police de taille 4, aux coordonnes (35,
15), le texte "Salut les Zros !", de couleur blanche.
www.siteduzero.com
256/361
ImageSetPixel
($image, $x, $y,
$couleur);
Description
Aperu
ImageSetPixel
($image, 100, 100,
$noir);
ImageLine ($image,
$x1, $y1, $x2, $y2,
$couleur);
ImageLine ($image,
30, 30, 120, 120,
$noir);
ImageEllipse
($image, $x, $y,
$largeur, $hauteur,
$couleur);
ImageEllipse
($image, 100, 100,
100, 50, $noir);
www.siteduzero.com
ImageFilledEllipse
($image, $x, $y,
$largeur, $hauteur,
$couleur);
257/361
ImageFilledEllipse
($image, 100, 100,
100, 50, $noir);
ImageRectangle
Dessine un rectangle, dont le coin en haut gauche est de
($image, $x1, $y1,
coordonnes (x1, y1) et celui en bas droite (x2, y2)
$x2, $y2, $couleur);
ImageRectangle
($image, 30, 30,
160, 120, $noir);
ImageFilledRectangle
Pareil que ImageRectangle, sauf que le rectangle est cette
($image, $x1, $y1,
fois entirement colori.
$x2, $y2, $couleur);
ImageFilledRectangle
($image, 30, 30,
160, 120, $noir);
ImagePolygon
($image,
$array_points,
$nombre_de_points,
$couleur);
www.siteduzero.com
$points = array(10,
40, 120, 50, 160,
160);
ImagePolygon
($image, $points, 3,
$noir);
ImageFilledPolygon
($image,
$array_points,
$nombre_de_points,
$couleur);
258/361
On peut aussi dessiner des lignes plus paisses. Pour cela, il faut utiliser la fonction ImageSetThickness. On doit prciser
l'image concerne et l'paisseur voulue (en pixels) :
Code : PHP
<?php
ImageSetThickness ($image, $epaisseur);
?>
Lorsque vous changez l'paisseur, toutes les formes que vous dessinez aprs gardent cette paisseur. Pour revenir l'paisseur
initiale (1 pixel), il faut donc refaire appel ImageSetThickness en demandant une paisseur de 1.
Voil, c'est pas bien compliqu pourvu qu'on sache bien manier les coordonnes des pixels.
www.siteduzero.com
259/361
Bien sr que non ! Il y a d'autres fonctions que je veux absolument vous montrer parce qu'elles permettent de raliser des
oprations bien plus complexes !
Nous allons apprendre :
Rendre une image transparente
Mlanger deux images
Redimensionner une image, pour crer une miniature par exemple.
J'espre que vous tes encore en forme, ce serait dommage de s'endormir sur les fonctions les plus intressantes.
Je vais reprendre l'exemple de l'image o j'ai crit "Salut les Zros !" sur un vieux fond orange, et je vais y rajouter la fonction
imagecolortransparent pour rendre ce fond transparent :
Code : PHP
<?php
header ("Content-type: image/png");
$image = imagecreate(200,50);
$orange = imagecolorallocate($image, 255, 128, 0); // Le fond est
orange (car c'est la premire couleur)
$bleu = imagecolorallocate($image, 0, 0, 255);
$bleuclair = imagecolorallocate($image, 156, 227, 254);
$noir = imagecolorallocate($image, 0, 0, 0);
$blanc = imagecolorallocate($image, 255, 255, 255);
imagestring($image, 4, 35, 15, "Salut les Zros !", $noir);
imagecolortransparent($image, $orange); // On rend le fond orange
transparent
imagepng($image);
?>
www.siteduzero.com
260/361
Sympa, non ?
www.siteduzero.com
261/361
imagecopymerge est une fonction vraiment sympa, parce que maintenant vous allez pouvoir "copyrighter"
automatiquement toutes les images de votre site si vous le voulez.
Cependant, le script utilis ici est un petit peu plus complexe, et je crois que quelques explications ne seraient pas de refus.
Voici donc les points bien comprendre :
Dans ce script, on manipule 2 images : $source (le logo) et $destination (la photo). Les deux sont cres l'aide
de la fonction imagecreatefrompng (et fromjpeg pour la photo).
Il y a ensuite toute une srie de calculs partir des coordonnes et de la largeur et hauteur des images. J'imagine que a
a d vous faire peur, mais c'est en fait trs simple du temps qu'on sait faire une soustraction.
Notre but est de savoir quelles coordonnes placer le logo sur la photo. Moi, je veux le mettre tout en bas droite.
www.siteduzero.com
262/361
Pour a, j'ai besoin de connatre la dimension des images. J'utilise les fonctions imagesx et imagesy pour rcuprer
les dimensions du logo et de la photo.
Ensuite, pour placer le logo tout en bas, il faut le mettre la position $hauteur_de_la_photo $hauteur_du_logo. On fait de mme pour placer le logo droite : $largeur_de_la_photo $largeur_du_logo. Si j'avais voulu mettre le logo tout en haut gauche, l a aurait t beaucoup plus simple :
pas besoin de faire de calculs, vu qu'en haut gauche les coordonnes sont (0, 0) !
Vient ensuite la fonction imagecopymerge, la plus importante. Elle prend de nombreux paramtres. Ce qu'il faut
savoir, c'est qu'elle a besoin de 2 images : une source et une destination. Elle modifie l'image de destination (ici la
photo) pour y intgrer l'image source. Cela explique pourquoi c'est $destination que l'on affiche la fin, et non
pas $source (le logo) qui n'a pas chang.
Les paramtres donner la fonction sont, dans l'ordre :
1. L'image de destination : ici $destination, la photo. C'est l'image qui va tre modifie et dans laquelle on va
mettre notre logo.
2. L'image source : ici $source, c'est notre logo. Cette image n'est pas modifie.
3. L'abscisse o vous dsirez placer le logo sur la photo : il s'agit ici de l'abscisse du point situe la position
largeur_de_la_photo - $largeur_du_logo
4. L'ordonne o vous dsirez placer le logo sur la photo : de mme, il s'agit de l'ordonne du point sur la photo
(ici $hauteur_de_la_photo - $hauteur_du_logo).
5. L'abscisse de la source : en fait, la fonction imagecopymerge permet aussi de ne prendre qu'une partie de
l'image source. Ca peut devenir un peu compliqu, alors nous on va dire qu'on prend tout le logo. On part donc
du point situ aux coordonnes (0, 0) de la source. Mettez donc 0 pour l'abscisse.
6. L'ordonne de la source : de mme pour l'ordonne. Mettez 0.
7. La largeur de la source : c'est la largeur qui dtermine quelle partie de l'image source vous allez prendre. Nous
on prend toute l'image source, donc vous prenez pas la tte non plus et mettez $largeur_source.
8. La hauteur de la source : de mme, mettez $hauteur_source.
9. Le pourcentage de transparence : c'est un nombre entre 0 et 100 qui indique la transparence de votre logo sur la
photo. Si vous mettez 0, le logo sera invisible (totalement transparent) et si vous mettez 100 il sera totalement
opaque (il n'y aura pas d'effet de "fusion"). Mettez un nombre autour de 60-70, en gnral c'est bien.
Concrtement, on peut se servir de ce code pour faire une page copyrighter.php. Cette page prendra un paramtre : le
nom de l'image copyrighter.
Par exemple, si vous voulez copyrighter automatiquement tropiques.jpg, vous afficherez l'image comme ceci :
Code : HTML
<img src="copyrighter.php?image=tropiques.jpg" />
www.siteduzero.com
263/361
Cette fonction est donc puissante mais lente. Tellement lente que certains hbergeurs dsactivent la fonction pour
viter que le serveur ne rame. Il serait suicidaire d'afficher directement l'image chaque chargement d'une page. Nous
allons donc crer la miniature une fois pour toutes et l'enregistrer dans un fichier.
Nous allons donc enregistrer notre miniature dans un fichier (par exemple mini_couchersoleil.jpg). Cela veut dire
qu'on peut dj retirer la premire ligne (le header) qui ne sert plus rien.
Comme pour imagecopymerge, on va avoir besoin de 2 images : la source et la destination. Ici, la source c'est l'image
originale, et la destination c'est l'image miniature que l'on va crer.
La premire chose faire sera donc de crer une nouvelle image vide... Avec quelle fonction ? imagecreate ? Oui, c'est
presque la bonne rponse.
Le problme voyez-vous, c'est que imagecreate cre une nouvelle image dont le nombre de couleurs est limit (256
couleurs maximum en gnral). Or, notre miniature contiendra peut-tre plus de couleurs que l'image originale cause des
calculs mathmatiques.
On va donc devoir utiliser une autre fonction dont je ne vous ai pas encore parl : imagecreatetruecolor. Elle
fonctionne de la mme manire que imagecreate, mais cette fois l'image pourra contenir beaucoup plus de couleurs
Voici le code que je vais utiliser pour gnrer la miniature de ma photo couchersoleil.jpg :
Code : PHP
<?php
$source = imagecreatefromjpeg("couchersoleil.jpg"); // La photo est
la source
$destination = imagecreatetruecolor(200, 150); // On cre la
miniature vide
// Les fonctions imagesx et imagesy renvoient la largeur et la
hauteur d'une image
$largeur_source = imagesx($source);
$hauteur_source = imagesy($source);
$largeur_destination = imagesx($destination);
$hauteur_destination = imagesy($destination);
// On cre la miniature
imagecopyresampled($destination, $source, 0, 0, 0, 0,
$largeur_destination, $hauteur_destination, $largeur_source,
$hauteur_source);
// On enregistre la miniature sous le nom "mini_couchersoleil.jpg"
imagejpeg($destination, 'mini_couchersoleil.jpg');
?>
Avant on avait a :
www.siteduzero.com
264/361
www.siteduzero.com
265/361
Comme vous pouvez le voir, imagecopyresampled permet de faire beaucoup de choses, et en gnral on ne se servira pas
de tout.
Plusieurs paramtres sont 0, et c'est pas vraiment la peine de chercher comprendre pourquoi (mme si ce n'est pas bien
compliqu). Basez-vous sur mon exemple pour crer vos miniatures, et le tour sera jou.
Ainsi se termine ce (gros) chapitre.
J'espre que vous y avez appris beaucoup de choses intressantes et que vous saurez faire bon usage des fonctions de la
librairie GD.
J'ai essay de vous expliquer un maximum de fonctions, et pourtant je n'ai pas pu parler de tout. Il y a d'autres fonctions
susceptibles de vous intresser, que vous pourrez trouver dans la documentation en cliquant ici.
La liste des fonctions disponibles se trouve un peu plus bas sur la page. Bonne pche !
Croyez-moi si vous voulez, mais ce charabia imprononable... eh bien a veut vraiment dire quelque chose ! Si si je vous jure !
Ok, je ne vous le cache pas, y'a du boulot parce que nous allons traiter ici un des aspects les plus difficiles du PHP, mais
paradoxalement c'est trs utile, intressant (certains diront mme "passionnant").
Il faut bien retenir que c'est un chapitre difficile (en fait, je suis oblig de l'taler sur 2 chapitres), mais que a vaut vraiment le
coup de s'y intresser. Pourquoi ? Parce que c'est un systme trs puissant et trs rapide pour faire des recherches dans des
chanes de caractres (des phrases par exemple). C'est une sorte de fonctionnalit Rechercher / Remplacer trs pousse, dont
vous ne pourrez plus vous passer une fois que vous saurez vous en servir.
Des exemples ?
Vrifier automatiquement si l'adresse e-mail entre par le visiteur a une forme valide (comme "dupont@free.fr")
Modifier une date que vous avez au format amricain (08-05-1985) pour la mettre dans le bon ordre en franais
(05/08/1985)
Remplacer automatiquement toutes les adresses "http://" par des liens cliquables, comme cela se fait sur certains
forums.
Ou encore crer votre propre langage simplifi partir du HTML, comme le fameux bbCode ([b][/b]...)
Ouvrez grand vos oreilles et attachez vos ceintures. C'est partiii yiiiiihhhaaaa !!!
www.siteduzero.com
266/361
PHP propose donc de choisir entre POSIX et PCRE. Et, pour ma part, le choix est tout fait : nous allons tudier PCRE.
Rassurez-vous, ce n'est pas beaucoup plus compliqu que POSIX, mais a a l'avantage d'tre trs rapide. Et notre niveau de
PHP, ce qui nous intresse justement c'est la rapidit.
Pour viter d'avoir trop de thorie (a serait vraiment barbant), on va commencer pour s'entraner utiliser une de ces
fonctions : preg_match.
preg_match
En utilisant cette fonction, vous pourrez vous exercer en mme temps que moi et voir petit petit si vous avez compris le
principe du langage PCRE.
Il faut juste savoir que cette fonction renvoie un boolen : VRAI ou FAUX (true ou false en anglais). Elle renvoie true (vrai) si
elle a trouv le mot que vous cherchiez dans la chane, false (faux) si elle ne l'a pas trouv.
Vous devez lui donner 2 informations : votre regex (c'est le petit surnom qu'on donne "expression rgulire") et la chane
dans laquelle vous faites une recherche.
Voici par exemple comment on peut s'en servir, l'aide d'une condition if :
Code : PHP
<?php
if (preg_match("** Votre REGEX **", "Ce dans quoi vous faites la recherche"))
www.siteduzero.com
267/361
{
echo 'Le mot que vous cherchez se trouve dans la chane';
}
else
{
echo 'Le mot que vous cherchez ne se trouve pas dans la chane';
}
?>
A la place de "** Votre REGEX **", vous taperez quelque chose en langage PCRE, comme ce que je vous ai montr au dbut
de ce chapitre :
#(((https?|ftp)://(w{3}\.)?)(?<!www)(\w+-?)*\.([a-z]{2,4}))#
C'est justement ceci qui nous intresse, c'est sur a que nous allons nous pencher par la suite.
Parce que, au cas o vous l'auriez pas remarqu, ce truc-l n'est franchement pas vident lire... Et le chinois a l'air tout simple
ct !
www.siteduzero.com
268/361
Euh, mais quoi servent les dises, puisque de toute faon la regex est entoure par des guillemets dans la fonction
PHP ?
Parce que, si on veut, on peut utiliser des options. On ne va pas parler des options tout de suite (on n'en a pas besoin pour
commencer), mais sachez que ces options se placent aprs le second dise, comme ceci :
#Ma regex#Options
A la place de "Ma regex", vous devez mettre le mot que vous recherchez.
Prenons un exemple : vous aimeriez savoir si une variable contient le mot "guitare". Il vous suffit d'utiliser la regex suivante
pour faire la recherche :
#guitare#
Dans un code PHP, a donne :
Code : PHP
<?php
if (preg_match("#guitare#", "J'aime jouer de la guitare."))
{
echo 'VRAI';
}
else
{
echo 'FAUX';
}
?>
Essayez !
Comme vous pouvez le voir, notre script affiche VRAI parce que le mot guitare a t trouv dans la phrase "J'aime jouer de la
guitare."
Retenez bien ce petit bout de code, nous allons le garder un moment en changeant parfois la regex, parfois la phrase dans
laquelle on fait la recherche.
Pour que vous compreniez bien comment les regex se comportent, je vais vous prsenter les rsultats dans un tableau, comme
ceci :
Chane
Regex
www.siteduzero.com
Rsultat
269/361
FAUX
Regex
Rsultat
FAUX
Comment faire si on veut que nos regex ne fassent plus la diffrence entre majuscules et minuscules ?
On va utiliser justement une option. C'est la seule que vous aurez besoin de retenir pour le moment. Il faut rajouter la lettre "i"
aprs le 2me dise, et la regex ne fera plus attention la casse :
Chane
Regex
Rsultat
#guitare#i
VRAI
Vive la GUITARE !
#guitare#
FAUX
Dans le dernier exemple, je n'ai pas mis l'option "i" alors on m'a rpondu FAUX.
Mais dans les autres exemples, vous pouvez voir que le "i" a permis de ne plus faire la diffrence majuscules / minuscules.
Le symbole OU
On va maintenant utiliser le symbole OU, que vous avez dj vu dans le chapitre sur les conditions : c'est la barre verticale "|".
Grce elle, vous allez pouvoir laisser plusieurs possibilits votre regex. Ainsi, si vous tapez :
#guitare|piano#
Cela veut dire que vous cherchez soit le mot "guitare", soit le mot "piano". Si un des 2 mots est trouv, la regex rpond VRAI.
Voici quelques exemples :
Chane
Regex
Rsultat
VRAI
#guitare|piano#
VRAI
#guitare|piano#
FAUX
#guitare|piano|banjo# VRAI
www.siteduzero.com
270/361
Dans le dernier exemple, j'ai mis 2 fois la barre verticale. Cela signifie que l'on recherche guitare OU piano OU banjo.
Vous suivez toujours ?
Parfait !
On peut maintenant voir les histoires de dbut et de fin de chane, et ensuite on pourra passer la vitesse suprieure.
Compris ? Voici une srie de tests pour que vous voyiez bien comment a fonctionne :
Chane
Regex
Rsultat
#^Bonjour# VRAI
#zro$#
VRAI
#^zro#
FAUX
FAUX
Simple non ?
Dans le dernier cas a ne fonctionne pas, car la chane ne se termine pas par "zro" mais par "!!!". Donc forcment, on nous
rpond faux...
www.siteduzero.com
271/361
Regex
Rsultat
#gr[aoi]s#
VRAI
VRAI
FAUX
#[aeiouy]$# VRAI
#^[aeiouy]# FAUX
Je suppose que vous comprenez les deux premires regex. Mais je pense que vous auriez besoin d'explications sur les trois
dernires :
Pour "Brk, c'est trop gras comme nourriture", j'ai utilis cette fois la regex #gr[aoi]s$#. Si vous avez bien suivi ce
que je vous ai dit tout l'heure, a veut dire que notre chane doit se terminer par "gris", "gras" ou "gros". Or, ici le mot
est au milieu, donc on nous rpond FAUX. Essayez de le mettre la fin et vous verrez que a marche.
Ensuite "Je suis un vrai zro" avec la regex #[aeiouy]$#. Celle-ci signifie que notre regex doit se terminer par une
voyelle (aeiouy). Ca tombe bien, la dernire lettre de la chane est la lettre "o", donc on nous rpond VRAI.
Enfin, mme chane mais avec la regex #^[aeiouy]#. Cette fois, la chane doit commencer par une voyelle (en
minuscule en plus). Or, la chane commence par "J", donc la rponse est FAUX !
Ca va, je ne vous ai toujours pas perdu en route ?
Si un moment vous sentez que vous avez dcroch, n'hsitez pas relire un peu au-dessus, a ne vous fera pas de mal.
www.siteduzero.com
272/361
Grce au symbole "-" (le tiret), on peut autoriser toute une plage de caractres.
Par exemple, tout l'heure on a utilis la classe [aeiouy]. Ok c'est pas trop long.
Mais que dites-vous de la classe [abcdefghijklmnopqrstuvwxyz] ? Tout a pour dire que vous voulez qu'il y ait une
lettre ?
J'ai mieux !
Vous avez le droit d'crire : [a-z] ! Avouez que c'est plus court ! Et si vous voulez vous arrter la lettre "e", pas de problme
non plus : [a-e].
En plus, ca fonctionne aussi avec les chiffres : [0-9]. Si vous voulez plutt un chiffre entre 1 et 8, tapez : [1-8]
Encore mieux ! Vous pouvez crire 2 plages la fois dans une classe : [a-z0-9]. Cela signifie "N'importe quelle lettre
(minuscule) OU un chiffre".
Bien entendu, vous pouvez aussi autoriser les majuscules, sans passer par les options comme on l'a fait tout l'heure. Ca
donnerait : [a-zA-Z0-9]. C'est donc une faon plus courte d'crire :
[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789] (j'espre que vous comprenez,
parce que j'ai pas envie de m'embter taper toutes les lettres de l'alphabet 50 fois si a ne sert rien !
).
Faisons quelques tests voulez-vous ?
Chane
Regex
Rsultat
#[a-z]#
VRAI
#^[0-9]#
FAUX
#<h[1-6]># VRAI
Le dernier exemple est particulirement intressant car on se dirige doucement vers la pratique. On y vrifie justement si la
chane comporte une balise HTML de titre (<h1> ou <h2> etc... jusqu' <h6>).
Regex
Rsultat
#[^0-9]#
VRAI
cette phrase contient autre chose que des majuscules et des chiffres #[^A-Z0-9]#
www.siteduzero.com
VRAI
273/361
#^[^a-z]#
#[^aeiouy]$# FAUX
ScrrmmmblllGnngngnngnMmmmmffff
#[^aeiouy]#
Maintenant, faites une pause parce que a va pas s'arranger par la suite !
www.siteduzero.com
VRAI
VRAI
274/361
Les quantificateurs
Les quantificateurs sont des symboles qui permettent de dire combien de fois peuvent se rpter un caractre ou une suite de
caractres.
Par exemple, pour reconnatre une adresse e-mail comme francois@free.fr, il va falloir dire : "Elle commence par une
ou plusieurs lettres, elle est suivi d'un @ (arobase), suivie de deux lettres au moins, suivi d'un point, et enfin de 2 4 lettres
(pour le .fr, .com., mais aussi .info (a existe !)).
Bon pour le moment notre but n'est pas d'crire une regex qui permet de savoir si l'adresse e-mail rentre par le visiteur a la
bonne forme (c'est encore trop tt). Mais tout a pour vous dire qu'il est indispensable de savoir indiquer combien de fois une
lettre peut se rpter !
Il faut utiliser des parenthses. Par exemple, si on veut reconnatre "Ayayayayayay" (le cri de guerre de Speedy Gonzalez
on devra taper la regex suivante :
#Ay(ay)*#
Ce code reconnatra "Ay", "Ayay", "Ayayay", "Ayayayay", "Oue Ae Ae" (non je rigole pour le dernier
).
Vous pouvez utiliser le symbole "|" dans les parenthses. La regex #Ay(ay|oy)*# renverra vrai par exemple pour
"Ayayayoyayayayoyoyoyoyayoy" ! C'est le "ay" OU le "oy" rpt plusieurs fois, tout simplement !
Autre bonne nouvelle, vous pouvez mettre un quantificateur aprs une classe de caractres (vous savez, avec les crochets !).
Ainsi #[0-9]+# permet de reconnatre n'importe quel nombre, du temps qu'il y a au moins un chiffre !
Faisons quelques tests pour bien rentrer a dans notre tte :
Chane
Regex
Rsultat
eeeee
#e+#
VRAI
ooo
#u?#
VRAI
magnifique
#[0-9]+#
FAUX
www.siteduzero.com
),
275/361
Yahoooooo
#^Yaho+$#
VRAI
FAUX
Blablablablabla
#^Bla(bla)*$# VRAI
Les derniers exemples sont trs intressants. La regex (#^Yaho+$#) signifie que la chane doit commencer et finir par le mot
"Yahoo". Il peut y avoir 1 "o" ou plusieurs. Ainsi "Yaho", "Yahoo", "Yahooo" etc marchent... Mais vous ne devez rien mettre
avant ni aprs car j'ai indiqu que c'tait un dbut ET une fin de chane avec ^ et $.
Enfin, la dernire regex autorise les mots "Bla", "Blabla", "Blablabla" etc... Je me suis servi des parenthses pour indiquer que
"bla" peut tre rpt 0, 1 ou plusieurs fois.
Ca commence faire mal la tte n'est-ce pas ?
Regex
Rsultat
eeeee
#e{2,}#
VRAI
#^[0-9]{6}$#
VRAI
www.siteduzero.com
).
276/361
Si vous tes toujours vivant et que vous lisez ces lignes, c'est trs bon signe !
Pour le moment les regex ne vous permettent pas encore de faire quelque chose de trs utile, mais dans le prochain chapitre on
va enfin les utiliser pour du concret.
Prenez votre temps, et ne passez pas au chapitre suivant avant d'tre certains d'avoir tout compris et retenu, sinon vous allez
vous planter en beaut.
www.siteduzero.com
277/361
Il faut bien les retenir. Pour la plupart d'entre eux, vous les connaissez dj.
Ainsi, le dollar "$" est un caractre spcial parce qu'il permet d'indiquer une fin de chane.
De mme pour l'accent circonflexe, le dise, les parenthses, les crochets, les accolades et les symboles "? + *" : nous les avons
tous utiliss dans le chapitre prcdent, souvenez-vous.
Pour le point "." et l'antislash "\", vous ne les connaissez pas mais vous n'allez pas tarder les apprendre.
Bon, ce sont des caractres spciaux et chacun d'eux signifie quelque chose de prcis. Et alors ?
Et alors, le problme vous tombe dessus le jour o vous voulez chercher par exemple "Quoi ?" dans une chane.
Comment cririez-vous la Regex ? Comme a ?
#Quoi ?#
Eh non surtout pas ! Le point d'interrogation, vous le savez, sert dire que la lettre juste avant est facultative (elle peut
apparatre 0 ou 1 fois). Ici, l'espace devant le point d'interrogation serait donc facultatif, mais ce n'est pas ce qu'on veut faire !
Alors, comment faire pour faire comprendre qu'on recherche "Quoi ?" alors que le point d'interrogation a dj une signification
?
Il va falloir l'chapper. Cela signifie que vous devez placer en fait un antislash "\" devant un caractre spcial. Ainsi, la bonne
regex serait :
#Quoi \?#
Ici, l'antislash sert dire que le point d'interrogation juste aprs n'est pas un symbole spcial, mais bel et bien une lettre comme
une autre !
C'est la mme chose pour tous les autres mtacaractres que je vous ai montrs plus haut ( # ! ^ $ ( ) [ ] {
} ? + * . \) : il faut mettre un antislash devant si vous voulez les utiliser dans votre recherche.
Vous remarquerez que pour utiliser un antislash il faut... un antislash devant ! Comme ceci : \\.
Regex
Rsultat
Je suis impatient !
#impatient \!#
VRAI
#sommeil\.\.\.#
www.siteduzero.com
VRAI
278/361
Le smiley :-\
#:-\\#
VRAI
www.siteduzero.com
279/361
\D
\w
\W
Indique ce qui n'est PAS un caractre alphanumrique ou un tiret de soulignement. Ca revient taper [^a-zAZ0-9_]
\t
\n
\r
\s
\S
Il s'agit de lettres normales, mais quand on place un antislash devant, on leur donne une signification spciale.
C'est l'inverse de ce qu'on faisait tout l'heure : on utilisait un antislash devant les mtacaractres pour leur enlever leur
signification spciale.
Pour le point, il existe une exception : il indique tout sauf les Entres (\n).
Pour faire en sorte que le point indique tout, mme les entres, vous devrez utiliser l'option "s" de PCRE. Exemple :
#[0-9]-.#s
www.siteduzero.com
280/361
Un numro de tlphone
Pour cette premire vraie Regex, nous allons essayer de voir si une variable (rentre par un visiteur via un formulaire par
exemple) correspond bien un numro de tlphone.
Je vais me baser sur les numros de tlphone franais, alors il faudra m'excuser si vous n'tes pas franais et que vous ne
connaissez pas. L'avantage, c'est que vous pourrez ensuite vous exercer crire cette Regex pour les numros de tlphone de
votre pays.
Pour rappel (et pour ceux qui ne savent pas donc), un numro de tlphone franais comporte 10 chiffres. Par exemple : "01 53
78 99 99". Il faut respecter les rgles suivantes :
Le premier chiffre est TOUJOURS un 0
Le second chiffre va de 1 9 (1 pour la rgion parisienne... 6 et 7 pour les tlphones portables, 8 pour les numros
spciaux, et 9 pour les numros VOIP).
Ensuite viennent les 8 chiffres restants (ils peuvent aller de 0 9 sans problme)
Pour commencer, et pour faire simple, on va supposer que l'utilisateur rentre le numro de tlphone sans mettre d'espace ni
quoi que ce soit (mais on complique juste aprs, et vous verrez que c'est l le vritable intrt des Regex).
Ainsi, le numro de tlphone doit ressembler a : "0153789999". Comment crire une Regex qui corresponde un numro
de tlphone comme celui-ci ?
Voici comment je procde, dans l'ordre, pour construire cette Regex :
1. Primo, on veut qu'il y ait UNIQUEMENT le numro de tlphone. On va donc commencer par mettre les symboles ^ et
$ pour indiquer un dbut et une fin de chane :
#^$#
2. Continuons. On sait que le premier caractre est forcment un 0. On tape donc :
#^0$#
3. Le 0 est suivi par un nombre allant de 1 9. Il faut donc utiliser la classe [1-9], qui signifie "Un nombre de 1 9"
#^0[1-9]$#
4. Ensuite, viennent les 8 chiffres restants, pouvant aller de 0 9. Il nous suffit donc d'crire [0-9]{8} pour indiquer que
l'on veut 8 chiffres. Au final, a nous donne cette Regex :
#^0[1-9][0-9]{8}$#
Et c'est tout !
Bon, je vois que vous tes en forme, alors ne nous arrtons pas en si bon chemin et amliorons cette Regex.
Maintenant, on va supposer que la personne peut taper un espace tous les 2 chiffres (comme c'est courant de le faire en France),
mais aussi un point ou un tiret. Notre Regex devra donc accepter les numros de tlphone suivants :
0153789999
01 53 78 99 99
01-53-78-99-99
01.53.78.99.99
0153 78 99 99
0153.78 99-99
etc...
www.siteduzero.com
281/361
<p>
<?php
if (isset($_POST['telephone']))
{
$_POST['telephone'] = htmlspecialchars($_POST['telephone']); // On rend inoffensiv
}
?>
</p>
<form method="post">
<p>
<label for="telephone">Votre tlphone ?</label> <input id="telephone" name="telep
<input type="submit" value="Vrifier le numro" />
</p>
</form>
Essayer !
www.siteduzero.com
282/361
Vous pouvez essayer tous les numros de tlphone que vous voulez, avec des espaces au milieu, ou pas si a vous chante : la
Regex gre tous les cas.
Vous auriez pu aussi utiliser le raccourci \d pour indiquer un chiffre dans votre Regex :
#^0\d([-. ]?\d{2}){4}$#
Personnellement, je trouve que mettre [0-9] est quand mme plus clair.
www.siteduzero.com
283/361
Allez, je suis en forme et de bonne humeur, je vous donne le script PHP pour tester cette Regex :
Code : PHP
<p>
<?php
if (isset($_POST['mail']))
{
$_POST['mail'] = htmlspecialchars($_POST['mail']); // On rend inoffensives les balises
}
?>
</p>
if (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['mail']))
{
echo 'L\'adresse ' . $_POST['mail'] . ' est <strong>valide</strong> !';
}
else
{
echo 'L\'adresse ' . $_POST['mail'] . ' n\'est pas valide, recommencez !'
}
<form method="post">
<p>
<label for="mail">Votre mail ?</label> <input id="mail" name="mail" /><br />
<input type="submit" value="Vrifier le mail" />
</p>
</form>
Essayer !
Testez donc des adresses comme :
the_cypher@hotmail.com
business_consultants@free4work.info
mega-killer.le-retour@super-site.fr.st
etc etc...
www.siteduzero.com
284/361
Et a, bah c'est tout bnf pour vous : vous venez d'apprendre crire des Regex, vous n'avez presque rien de plus savoir
pour vous en servir avec MySQL.
Il faut savoir cependant que MySQL ne comprend que les Regex en langage POSIX, et pas PCRE comme on a appris.
Salaud ! Tu nous as fait apprendre PCRE parce que c'est plus rapide, et on peut mme pas s'en servir avec MySQL ???
www.siteduzero.com
285/361
Capture et remplacement
Je vous avais dit au dbut de ces 2 chapitres consacrs aux Regex qu'elles servaient faire une recherche puissante (a on vient
de le voir, travers l'exemple du tlphone et du mail), mais aussi faire une recherche et un remplacement.
Cela va nous permettre par exemple de faire la chose suivante :
1. Chercher s'il y a des adresses e-mail dans un message laiss par un visiteur.
2. Modifier automatiquement son message pour mettre un lien <a href="mailto:blabla@truc.com"> devant chaque
adresse, ce qui rendra les e-mails cliquables !
Avec cette technique, on peut faire pareil pour rendre les liens http:// automatiquement cliquables eux aussi. On peut aussi,
vous allez voir, crer notre propre langage simplifi pour le visiteur, comme le fameux bbCode utilis sur la plupart des
forums ([b][/b] pour mettre en gras, a vous dit quelque chose ?
).
Normalement, si vous rflchissez 2 secondes, vous devez vous dire que les parenthses ne sont pas obligatoires ici. Et c'est
vrai que pour faire juste une recherche, les parenthses sont effectivement inutiles. Mais pour faire un remplacement, cela va
tre trs pratique !
En effet, retenez bien ceci : chaque fois qu'il y a une parenthse, cela cre une variable appele $1 (pour la premire
parenthse), $2 pour la seconde etc...
On va se servir ensuite de ces variables pour modifier la chane (faire un remplacement).
Sur la Regex que je vous ai montre plus haut, il y a une seule parenthse vous tes d'accord ? Donc, il y aura juste une
variable $1, qui contiendra ce qui se trouve entre le [b] et le [/b]. Et grce a, on sait ce qu'on va mettre en gras.
Bon, la thorie de tout a est dlicate expliquer, alors je vais vous montrer de suite comment on fait pour mettre en gras tous
les mots compris entre des [b][/b] :
Code : PHP
<?php
$texte = preg_replace('#\[b\](.+)\[/b\]#i', '<strong>$1</strong>', $texte);
?>
www.siteduzero.com
286/361
Vous pouvez utiliser jusqu' 99 parenthses capturantes dans une Regex (a vous laisse de la marge ). Ca va donc
jusqu' $99
Une variable $0 est toujours cre, elle contient toute la Regex. Sur le mme exemple que tout l'heure :
#(anti)co(nsti)(tu(tion)nelle)ment#
... $0 contient "anticonstitutionnellement".
Si, par hasard, vous ne voulez pas qu'une parenthse soit capturante (pour vous faciliter les comptes, ou parce que vous
avez beaucoup beaucoup de parenthses), il faut qu'elle commence par un point d'interrogation suivi d'un deux points
":". Par exemple :
#(anti)co(?:nsti)(tu(tion)nelle)ment#
La seconde parenthse n'est pas capturante. Il ne nous reste que 3 variables (4 si on compte $0) :
1. $0 : anticonstitutionnellement
2. $1 : anti
3. $2 : tutionnelle
4. $3 : tion
Voil si vous avez compris a, vous avez tout compris, bravo !
www.siteduzero.com
287/361
Et nous ferons en sorte de remplacer aussi automatiquement les URL (http://) par des liens cliquables.
Commenons par [b] et [i] (c'est la mme chose).
Vous avez dj vu le code pour [b], et c'est en effet presque le bon. Il y a un problme toutefois : il manque des options. Pour
que a marche, on va avoir besoin d'utiliser 3 options :
i : pour accepter les majuscules comme les minuscules ([B] et [b])
s : pour que le "point" fonctionne aussi pour les retours la ligne (pour que le texte puisse tre en gras sur plusieurs
lignes)
U : le U majuscule est une option que vous ne connaissez pas, qui signifie "Ungreedy" ("pas gourmand"). Je vous passe
les explications un peu complexes sur son fonctionnement, mais sachez que, grosso modo, a ne marcherait pas
correctement s'il y avait plusieurs [b] dans votre texte. Exemple :
"Ce texte est [b]important[/b], il faut me [b]comprendre[/b] !"
... sans l'option Ungreedy, la Regex aurait voulu mettre en gras tout ce qu'il y a entre le premier [b] et le dernier [/b]
(c'est--dire "important[/b], il faut me [b]comprendre";).
En utilisant l'option "U", la Regex s'arrtera au premier [/b], et c'est ce qu'on veut
Voici donc le code correct pour mettre en gras et italique avec le bbCode :
Code : PHP
<?php
$texte = preg_replace('#\[b\](.+)\[/b\]#isU', '<strong>$1</strong>', $texte);
$texte = preg_replace('#\[i\](.+)\[/i\]#isU', '<em>$1</em>', $texte);
?>
Comme vous pouvez le voir, c'est quasiment pareil pour [b] et [i] ( part que la balise HTML qu'on utilise est <em>).
Donc l, si vous avez suivi jusqu'ici, a ne doit pas trop vous surprendre.
Passons maintenant un cas un peu plus complexe : celui de la balise [color=truc]. On va laisser le choix entre plusieurs
couleurs avec le symbole "|" (OU), et on va utiliser 2 parenthses capturantes :
1. La premire pour rcuprer la couleur qui a t choisie (en anglais, comme a on n'aura pas besoin de le changer pour
le code HTML).
2. La seconde pour rcuprer le texte entre [color=truc] et [/color] (pareil que pour gras et italique).
Voici le rsultat :
Code : PHP
<?php
$texte = preg_replace('#\[color=(red|green|blue|yellow|purple|olive)\](.+)\[/color\]#is
?>
www.siteduzero.com
288/361
Ainsi, si on tape [color=blue]texte[/color], a crira texte en bleu. Vous pouvez essayer avec les autres couleurs
aussi !
Allez dernire tape, et aprs je vous laisse essayer.
Je veux que les liens "http://" soient automatiquement transforms en liens cliquables. Essayez d'crire la regex, vous en tes
tout fait capables !
Voici la solution :
Code : PHP
<?php
$texte = preg_replace('#http://[a-z0-9._/]+#i', '<a href="$0">$0</a>', $texte);
?>
Dans le texte de remplacement, j'ai utilis $0 qui, si vous vous souvenez bien, prend tout le texte reconnu par la
Regex (donc ici toute l'url).
Il n'y a pas les options "s" et "U" car on ne fait jamais de retour la ligne au milieu d'une URL et, le mode "Ungreedy"
ne sert pas ici (essayez avec U, vous verrez que le lien s'arrte la premire lettre !)
Vous remarquerez que j'ai fait simple pour cette Regex. C'est vrai, j'aurais pu la faire plus complexe et plus prcise, mais je n'ai
pas envie de vous embrouiller avec a, et surtout je veux que vous l'amlioriez vous-mmes.
En effet, la Regex marche trs bien pour http://www.siteduzero.com/images/super_image2.jpg, mais elle ne marche pas s'il y a
des variables en paramtres dans l'url, comme par exemple :
http://www.siteduzero.com/index.php?page=3&skin=blue
Je vous laisse le soin d'amliorer la Regex, a vous fera un peu de travail
Vous savez quoi ? Vous avez peut-tre mal la tte, mais dites-vous que moi j'ai mal la tte ET mal aux doigts !
Mais je vais fournir quand mme un dernier petit effort, voici l'heure du cadeau bonus !
Code : PHP
<?php
if (isset($_POST['texte']))
{
$texte = stripslashes($_POST['texte']); // On enlve les slash qui se seraient ajo
$texte = htmlspecialchars($texte); // On rend inoffensives les balises HTML que le
$texte = nl2br($texte); // On cre des <br /> pour conserver les retours la lign
}
?>
<p>
www.siteduzero.com
289/361
<blockquote style="font-size:0.8em">
<p>
Je suis un gros [b]Zro[/b], et pourtant j'ai [i]tout appris[/i] sur http://www.si
Je vous [b][color=green]recommande[/color][/b] d'aller sur ce site, vous pourrez a
</p>
</blockquote>
<form method="post">
<p>
<label for="texte">Votre message ?</label><br />
<textarea id="texte" name="texte" cols="50" rows="8"></textarea><br />
<input type="submit" value="Montre-moi toute la puissance des Regex" />
</p>
</form>
Essayer !
Pfiou !
Eh bah si avec a vous me pondez pas un super site, je ne peux plus rien pour vous.
Avant de terminer, comme j'ai peur que vous vous ennuyiez, je vous donne quelques ides de Regex que vous pourriez
rajouter au parser :
Je vous l'ai dj dit plus haut, mais il serait trs apprciable que les URL cliquables fonctionnent aussi pour des URL
avec des variables comme :
http://www.siteduzero.com/index.php?page=3&skin=blue
Vous devriez aussi parser les adresses e-mail, en faisant un lien "mailto:" dessus !
Il serait bien de complter le bbCode avec [u], [img] etc...
Mais puisqu'on y est, pourquoi refaire du bbCode ? Aprs tout, si vous tes allergiques aux crochets, que pour vous [b]
ne veut rien dire, vous n'avez qu' inventer le code : {gras} {/gras}
Et, si faire des Regex vous plat, je peux vous proposer un dernier dfi qui devrait vous occuper un petit moment :
crire une fonction qui colore automatiquement le code HTML !
Vous donnez la fonction le code HTML, elle en fait un htmlspecialchars, puis elle rajoute des <span
style="color:..."> pour colorer par exemple en bleu les noms des balises, en vert les attributs, en rouge ce qui est entre
guillemets, etc.
Bon courage !
Vous en aurez besoin !
Aprs des chapitres comme ceux-ci, je pense que ce petit cadeau vous fera le plus grand bien.
www.siteduzero.com
290/361
Je n'ai pas grand chose ajouter, si ce n'est que je suis extnu mais heureux, parce que c'tait vraiment un des chapitres les
plus difficiles du cours et nous y sommes venus bout ensemble.
www.siteduzero.com
291/361
Ni l'un, ni l'autre. C'est un nouvel lment en programmation. Pour tre plus prcis, un objet c'est... un mlange de plusieurs
variables et fonctions.
Ne faites pas cette tte-l, vous allez dcouvrir tout cela par la suite.
Imaginez... un objet
Pour viter que ce que je vous raconte ressemble un trait d'art moderne conceptuel, on va imaginer ensemble ce qu'est un
objet l'aide de plusieurs schmas concrets.
Les schmas 3D que vous allez voir par la suite ont t raliss pour moi par Nab, que je remercie d'ailleurs vivement au
passage.
Imaginez qu'un programmeur dcide un jour de crer une section de son site web qui permet d'ajouter des membres, de les
placer dans des groupes (administrateur, modrateur...), de les bannir, de les supprimer... Le code est complexe : il a besoin de
crer plusieurs fonctions qui s'appellent entre elles, des variables pour mmoriser le nom du membre, sa date d'inscription, son
groupe, etc.
Il met du temps crire ce code, c'est un peu compliqu, mais il y arrive. Au final, le code qu'il a crit est compos de plusieurs
fonctions et variables. Quand on regarde a pour la premire fois, a ressemble une exprience de savant fou laquelle on ne
comprend rien :
www.siteduzero.com
292/361
Ce programmeur est content de son code et veut le distribuer sur internet pour que tout le monde puisse crer sa section
membres sur son site sans avoir tout recoder. Seulement voil, moins d'tre un expert en chimie certifi, vous allez mettre
pas mal de temps avant de comprendre comment tout ce bazar fonctionne.
Quelle fonction appeler en premier ? Quelles valeurs envoyer quelle fonction pour crer le membre ?
C'est l que notre ami programmeur pense nous. Il conoit son code de manire oriente objet. Cela signifie qu'il place tout
son bazar chimique l'intrieur d'un simple cube. Ce cube est ce qu'on appelle un objet :
www.siteduzero.com
293/361
Ici, une partie du cube a t volontairement mise en transparence pour vous montrer que nos fioles chimiques sont bien situes
l'intrieur du cube. Mais en ralit, le cube est compltement opaque, on ne voit rien de ce qu'il y a l'intrieur :
Ce cube contient toutes les fonctions et les variables (nos fioles de chimie), mais il les masque l'utilisateur.
Au lieu d'avoir des tonnes de tubes et fioles chimiques dont il faut comprendre le fonctionnement, on nous propose juste
quelques boutons sur la face avant du cube : un bouton "crer un membre", un bouton "bannir", etc. L'utilisateur n'a plus qu'
se servir des boutons du cube et n'a plus besoin de se soucier de tout ce qui se passe l'intrieur. Pour l'utilisateur, c'est donc
compltement simplifi.
En clair : programmer de manire oriente objet, c'est crer du code source (peut-tre complexe), mais que l'on masque en le
plaant l'intrieur d'un cube (un objet) travers lequel on ne voit rien. Pour le programmeur qui va l'utiliser, travailler avec
un objet est donc beaucoup plus simple qu'avant : il a juste appuyer sur des boutons et n'a pas besoin d'tre diplm en
chimie pour s'en servir.
Bien sr, c'est une image, mais c'est ce qu'il faut comprendre et retenir pour le moment.
www.siteduzero.com
294/361
$pdo_options);
?>
$bdd n'est en fait pas une variable mais un objet. On cre un objet l'aide de la commande new suivie du nom de la classe.
Classe ? Objet ? Quelle est la diffrence ?
La classe est un plan, une description de l'objet. Imaginez qu'il s'agit par exemple des plans de construction d'une
maison.
L'objet est une instance de la classe, c'est--dire une application concrte du plan. Pour reprendre l'exemple prcdent,
l'objet est la maison. On peut crer plusieurs maisons bases sur un plan de construction. On peut donc crer plusieurs
objets partir d'une classe.
Un objet est, je vous le disais plus tt, un mlange de fonctions et de variables. Lorsqu'on l'utilise, on fait appel ses fonctions
:
www.siteduzero.com
295/361
Code : PHP
<?php
$bdd->query();
$bdd->prepare();
$bdd->execute();
?>
Cela signifie : excuter la fonction query() de mon objet $bdd, puis la fonction prepare(), puis la fonction
execute(), etc. La flche -> est propre aux objets. Il faut donc comprendre que l'on excute la fonction query() de l'objet
$bdd qui reprsente la connexion la base de donnes.
Autre exemple, imaginaire cette fois, pour tre sr que vous compreniez bien :
Code : PHP
<?php
$maison1 = new Maison();
$maison2 = new Maison();
$maison1->nettoyer();
?>
Ici, nous avons plusieurs objets reprsentant des maisons ($maison1 et $maison2), mais nous n'appelons que la fonction
nettoyer() de la maison 1, donc c'est la seule qui sera propre.
Un des avantages de la programmation oriente objet comme vous le voyez, c'est sa lisibilit. Ce code est facile lire et
comprendre.
Nous allons maintenant apprendre dans la suite de ce chapitre crer nos propres classes.
www.siteduzero.com
296/361
Etant donn que notre fichier ne contiendra que du code PHP, il est possible (et mme recommand par des
dveloppeurs expriments !) de retirer la balise de fermeture ?> la fin du fichier. Cela peut paratre surprenant,
mais c'est en fait un moyen efficace d'viter d'insrer des lignes blanches la fin du code PHP, ce qui a tendance
produire des bugs du type "Headers already sent by".
A l'intrieur des accolades, nous allons dfinir des variables et des fonctions membres de la classe. Un point vocabulaire ce
sujet : certains dveloppeurs utilisent d'autres mots pour dsigner les variables et fonctions membres des classes. Les voici :
Variables membres : aussi appeles attributs ou proprits
Fonctions membres : aussi appeles mthodes
Essayons maintenant de dfinir ensemble quelques variables et fonctions dans la classe Membre.
www.siteduzero.com
297/361
Nous allons stocker toutes ces informations dans des variables sous forme de texte. Compltez votre classe en rajoutant ces
variables :
Code : PHP
<?php
class Membre
{
private $pseudo;
private $email;
private $signature;
private $actif;
}
?>
Nous indiquons que notre classe Membre est compose de 4 variables : $pseudo, $email, $signature et $actif. Pour
l'instant, elles ne possdent pas de valeur.
Ne vous proccupez pas pour l'instant du mot-cl private devant ces noms de variables, je vous expliquerai un peu plus
loin ce que cela signifie.
www.siteduzero.com
298/361
$this->pseudo = $nouveauPseudo;
Nous avons donc 2 fonctions qui permettent de manipuler le pseudonyme du visiteur. Elles sont vraiment trs simples comme
vous le voyez. Ainsi, getPseudo renvoie le pseudo :
Code : PHP
<?php
public function getPseudo()
{
return $this->pseudo;
}
?>
La variable $pseudo est accessible dans les fonctions avec le prfixe $this->. Cela signifie "Le pseudo de cet objet". En
effet, souvenez-vous, on peut crer plusieurs objets partir d'une classe. Il peut y avoir plusieurs membres et chacun d'eux a un
pseudo diffrent. Le prfixe $this-> permet d'indiquer que c'est bien le pseudonyme du membre sur lequel on travaille que
l'on veut rcuprer.
On fait de mme avec une fonction setPseudo qui prend en paramtre le nouveau pseudo du membre et qui le place dans
$this->pseudo.
Ces fonctions sont trs simples et un peu inutiles non ?
En fait, les getters et setters sont souvent des fonctions simples, mais l'intrt est qu'on peut faire des calculs et des vrifications
sur les donnes. Par exemple, on pourrait amliorer la fonction setPseudo comme ceci :
Code : PHP
<?php
public function setPseudo($nouveauPseudo)
{
// Vrifier si le nouveau pseudo n'est pas vide ou trop long
if (!empty($nouveauPseudo) AND strlen($nouveauPseudo) < 15)
{
// Ok on change son pseudo
$this->pseudo = $nouveauPseudo;
}
}
?>
Ainsi, on autorise le changement de pseudonyme uniquement s'il correspond certains critres : pseudo non vide et longueur
infrieure 15 caractres. On pourrait profiter de cette fonction pour vrifier aussi la prsence de caractres non autoriss.
L'intrt de passer par une fonction pour modifier les variables est donc de pouvoir contrler que l'on n'insre pas n'importe
quoi. Pour l'e-mail, on pourrait ainsi vrifier que celui-ci a la forme d'un vritable e-mail.
www.siteduzero.com
299/361
fonctions qui se contentent de modifier les variables. A nous de dcider quelles actions on veut pouvoir effectuer sur le
membre : le bannir, lui envoyer un e-mail...
Code : PHP
<?php
class Membre
{
public function envoyerEMail($titre, $message)
{
mail($this->email, $titre, $message);
}
public function bannir()
{
$this->actif = false;
$this>envoyerEMail('Vous avez t banni', 'Ne revenez plus !');
}
}
?>
...
La fonction envoyerEMail est toute simple : elle utilise la fonction mail() de PHP qui permet d'envoyer un e-mail ainsi
que l'adresse e-mail stocke dans l'objet ($this->email).
D'autre part, la fonction bannir() change le statut actif du membre pour indiquer qu'il n'est plus actif et lui envoie un email pour l'avertir de son bannissement. On en profite pour rutiliser la fonction envoyerEMail() de notre classe. Vous
remarquerez qu'on doit placer l aussi le prfixe $this-> devant le nom d'une fonction de la classe qu'on appelle.
C'est dans l'esprit de la programmation oriente objet : on rutilise du code dj crit pour viter de rinventer la roue
chaque fois.
www.siteduzero.com
300/361
!');
}
?>
Maintenant que la classe est prte (mme si on peut encore l'amliorer), on peut commencer l'utiliser et donc crer des
objets. Crez un nouveau fichier (que vous appellerez comme vous voulez, par exemple index.php), dans lequel vous allez
crer et utiliser un objet de type Membre.
Code : PHP
<?php
include_once('Membre.class.php');
$membre = new Membre();
$membre->setPseudo('M@teo21');
echo $membre->getPseudo() . ', je vais te bannir !';
$membre->bannir();
?>
On commence par inclure la dfinition de la classe Membre situe dans le fichier Membre.class.php. On utilise la
www.siteduzero.com
301/361
fonction include_once() qui nous assure que le fichier n'a pas dj t inclus ailleurs dans la page, ce qui aurait provoqu
une erreur car il est interdit de dfinir deux fois une mme classe.
On cre ensuite un nouvel objet de type Membre avec la ligne :
Code : PHP
<?php
$membre = new Membre();
?>
Nous avons maintenant un objet $membre qui reprsente un membre vide. On lui dfinit ensuite un pseudo, on l'affiche, puis
pour s'amuser on le bannit.
Ne confondez pas la classe et l'objet. La classe commence avec un "M" majuscule, tandis que l'objet avec un "m"
minuscule. Nous aurions d'ailleurs pu donner n'importe quel nom notre objet ($mateo, $nouveauVenu...), mais
faute de trouver de meilleur nom j'ai utilis le mme nom que la classe, avec la premire lettre en minuscule pour les
diffrencier.
Vous avez donc l un exemple d'utilisation concrte de la classe. Bien que celle-ci soit basique, vous pourriez dj donner ce
fichier Membre.class.php des amis programmeurs, accompagn de prfrence d'une petite documentation qui explique
comment l'utiliser, et vos amis pourront comme vous crer et manipuler des membres.
Une classe, c'est donc un peu un package prt l'emploi. Elle contient son lot de variables et de fonctions. Pour l'utiliser, nous
faisons tout simplement appel ses fonctions sans nous soucier de ce qu'elles font l'intrieur. Cela rejoint donc le schma
que je vous avais prsent au dbut de ce chapitre :
Les variables et le code des fonctions n'intressent pas le programmeur qui utilise la classe. Il se contente simplement
d'appuyer sur des boutons, c'est--dire d'appeler les fonctions dont il a besoin pour manipuler son membre : "Donne-lui le
pseudo M@teo21", "Bannis-le", etc.
www.siteduzero.com
302/361
www.siteduzero.com
303/361
Le constructeur : __construct
Lorsque vous crez un objet, comme nous l'avons fait prcdemment, celui-ci est vide au dpart. Ses variables membres ne
contiennent rien. Ainsi notre membre n'avait pas de pseudo, pas d'e-mail, rien.
Code : PHP
<?php
$membre = new Membre(); // Le membre est vide
?>
Or, quand vous crez un objet comme ceci avec new, il faut savoir que PHP recherche l'intrieur de la classe une fonction
nomme __construct. Jusqu'ici nous n'en avions pas cr, donc faute d'en trouver PHP crait un objet vide.
Le rle d'une fonction constructeur est justement de construire l'objet (non, sans blague !), c'est--dire de le prparer une
premire utilisation. Dans notre cas, on aimerait par exemple charger en base de donnes les informations concernant le
membre et insrer les bonnes valeurs dans les variables ds le dpart.
Code : PHP
<?php
class Membre
{
public function __construct($idMembre)
{
// Rcuprer en base de donnes les infos du membre
// SELECT pseudo, email, signature, actif FROM membres WHERE
id = ...
// Dfinir les variables avec les rsultats de la base
$this->pseudo = $donnees['pseudo'];
$this->email = $donnees['email'];
// etc.
}
?>
...
Notre fonction constructeur prend un paramtre : l'id du membre. On peut partir de l charger en base de donnes les
informations concernant le membre et les insrer dans l'objet : $this->pseudo, $this->email...
Comme notre constructeur prend un paramtre, il faudra dsormais crer nos objets en envoyant un id :
Code : PHP
<?php
www.siteduzero.com
304/361
Le destructeur : __destruct
Moins couramment utilis, le destructeur peut nanmoins se rvler utile. Cette fonction est appele automatiquement par
PHP lorsque l'objet est dtruit.
Mais quand l'objet est-il dtruit ?
Pour dtruire un objet, ou toute autre variable, on peut le faire la main avec la fonction unset() :
Code : PHP
<?php
unset($membre);
?>
Si vous ne le faites pas, l'objet sera dtruit la fin de l'environnement dans lequel il a t cr. Si l'objet a t cr dans la page
(comme c'tait le cas dans index.php), il sera supprim la fin de l'excution de la page.
C'est alors que le destructeur est appel. Son rle est de raliser toutes les oprations ncessaires pour mettre fin la vie de
l'objet.
La classe PDO, par exemple, a besoin d'utiliser le destructeur pour fermer la connexion la base de donnes. Elle envoie alors
un signal la base de donnes "Fin de la connexion".
Dans le cas de notre classe Membre, il n'y aurait rien de spcial faire a priori. Nanmoins, pour tester le fonctionnement du
destructeur, vous pouvez en crer un qui affiche un message signalant que l'objet va tre dtruit :
Code : PHP
<?php
public function __destruct()
{
echo 'Cet objet va tre dtruit !';
}
?>
Vous verrez que ce message apparat la fin de la page dans notre cas. Si vous avez cr plusieurs objets, vous verrez autant de
messages qu'il n'y a d'objets, car chacun d'eux va tre dtruit !
www.siteduzero.com
305/361
Il existe de nombreuses autres fonctions magiques dont l'utilit est cependant moins importante : __get(), __set(),
__call(), __sleep(), __wakeup()... Elles permettent de contrler certaines autres tapes de la vie de votre objet.
Nous ne les dtaillerons pas ici mais si vous voulez en savoir plus sur elles, vous pouvez lire la page de la documentation qui
prsente les fonctions magiques.
www.siteduzero.com
306/361
L'hritage
L'hritage est probablement le concept le plus important de la programmation oriente objet. C'est ce qui lui donne toute sa
puissance. Cela permet de rutiliser des classes pour construire d'autres classes. On se sert de certaines classes "de base" pour
construire des classes plus compltes.
En revanche, vous ne pouvez pas dire "Un dinosaure est un diplodocus", ou encore "Un bus est un oiseau". Donc on ne peut
pas faire d'hritage dans ces cas-l, du moins a n'aurait aucun sens.
www.siteduzero.com
307/361
Le nouveau mot-cl ici est extends, qui signifie "tend". Traduction : la classe Admin tend [les possibilits de] la classe
Membre. C'est cela l'hritage : nous avons maintenant une classe Admin qui possde toutes les variables et fonctions de
Membre, et nous allons pouvoir en dfinir de nouvelles qui seront propres aux admins.
Pour que PHP connaisse la classe Membre afin de permettre l'hritage, il est impratif d'inclure le fichier
Membre.class.php au pralable.
Rajoutons maintenant des fonctionnalits qui seront propres aux admins. Par exemple, ceux-ci, grce leurs privilges,
peuvent choisir la couleur dans laquelle sera crit leur pseudonyme. Ils ont donc une variable $couleur et des fonctions qui
permettent de la lire et de la modifier :
Code : PHP
<?php
include_once('Membre.class.php');
class Admin extends Membre
{
private $couleur;
public function setCouleur()
{
// ...
}
}
?>
Un peu de vocabulaire ici : on dit que Membre est la classe mre, tandis que Admin est la classe fille. C'est la fille
qui hrite de la mre, imparable logique de programmeur.
Dans notre fichier index.php on peut maintenant crer des membres mais aussi des admins :
Code : PHP
<?php
$membre = new Membre(31); // Contient un pseudo, un e-mail...
$maitreDesLieux = new Admin(2); // Contient les mmes donnes qu'un
membre + la couleur
$membre->setPseudo('Arckintox'); // OK
$maitreDesLieux->setPseudo('M@teo21'); // OK
www.siteduzero.com
308/361
Avec peu d'efforts, nous avons cr une nouvelle classe qui rutilise une classe existante. On peut donc appeler la fonction
setPseudo comme pour les membres, et on peut en plus effectuer de nouvelles oprations comme dfinir une couleur de
pseudo.
www.siteduzero.com
309/361
Ici, vous voyez que les fonctions sont publiques et les variables sont prives. Rien ne nous empche cependant de faire
l'inverse, mme si ce n'est vraiment pas conseill pour les variables comme nous allons le voir.
Qu'est-ce que cela signifie concrtement ? Que la personne qui utilise la classe travers des objets (dans index.php par
exemple) peut uniquement accder ce qui est public et pas ce qui est priv :
Code : PHP
www.siteduzero.com
310/361
<?php
$membre = new Membre(4);
$membre->setPseudo('M@teo21'); // OK car setPseudo est public
$membre->pseudo = 'M@teo21'; // Interdit car $pseudo est private
?>
C'est donc vous qui dfinissez avec ces public, private ou protected si l'utilisateur a le droit ou non d'appeler la
fonction ou la variable.
Et protected justement, a correspond quoi ?
C'est identique private mais il y a une diffrence lorsqu'on hrite de la classe. Par exemple, si on dfinit la variable
$email comme protected dans la classe Membre, cela signifie que les classes qui en hritent (comme Admin) auront le
droit d'y accder. Sinon, en private, elles n'auraient pas pu les appeler directement.
L'encapsulation
Pourquoi est-ce qu'on s'embte avec a ? Et si on mettait tout en public ? On se prendrait moins la tte non ?
Si tout tait public, mme les variables membres, n'importe qui pourrait faire :
Code : PHP
<?php
$membre = new Membre(4);
$membre->email = 'Portnawak';
?>
Or, "Portnawak" n'est pas un vritable e-mail, je pense que vous serez d'accord avec moi.
Pour viter qu'on puisse faire n'importe quoi avec ses objets, on a invent une rgle trs simple qui s'appelle la rgle
d'encapsulation. On peut la rsumer comme ceci :
Voil pourquoi on prend l'habitude de crer des fonctions get et set : cela nous permet de vrifier qu'on ne fait pas n'importe
quoi avec les variables, comme dfinir un e-mail invalide.
Il arrive en revanche que l'on dfinisse des fonctions membres prives. Ce sont des fonctions internes la classe que
l'utilisateur n'a pas appeler directement.
Il est recommand en gnral d'utiliser plutt protected que private, surtout si vous pensez hriter de la classe.
En effet, leur fonctionnement est le mme mais protected est plus souple si vous avez un jour des classes filles.
www.siteduzero.com
311/361
Le but de l'encapsulation est de masquer la personne qui utilise la classe son fonctionnement interne. Quand vous crez un
objet, vous ne devez pas avoir vous soucier des variables qu'il contient, de la faon dont celles-ci sont agences, etc. Vous
tes juste une personne qui appuie sur des boutons pour effectuer des actions sur l'objet (revoir mes schmas du dbut du
chapitre). Vous devez donc passer par des fonctions pour modifier vos objets.
Pour forcer l'utilisateur "appuyer sur les boutons" plutt que de "toucher aux fioles chimiques dangereuses qu'il ne
comprend pas", on utilise les droits d'accs. Ainsi, les fonctions sont pour la plupart publiques (sauf celles qui servent au
fonctionnement interne de la classe) et les variables sont toujours prives ou protges pour que l'utilisateur ne puisse pas
mettre n'importe quoi l'intrieur.
Si vous retenez et comprenez ce principe, alors vous serez sur la bonne voie pour bien programmer en orient objet.
Notre prsentation de la programmation oriente objet en PHP s'achve ici. Nous avons fait le tour de la plupart des
fonctionnalits de base, mais la POO permet d'aller plus loin. Comme il faudrait un cours entier pour tout dcouvrir, je vous
recommande vivement la lecture du tutoriel de vyk12 spcialement ddi la POO en PHP. Vous y dcouvrirez de nouvelles
informations sur l'hritage, mais aussi de nouveaux concepts comme les design patterns, les interfaces, les exceptions, etc.
Comme je vous le disais au dbut, tout ceci doit vous paratre encore pas mal abstrait. Je sais ce que vous ressentez : un
mlange de frustration et probablement de fascination pour quelque chose que vous ne comprenez pas encore vraiment.
J'ai fait de mon mieux dans ce chapitre pour tre le plus concret possible, mais c'est par la pratique que vous comprendrez le
mieux. Un peu de patience.
www.siteduzero.com
Partie 5 : Annexes
312/361
Partie 5 : Annexes
Dans les annexes, vous trouverez plusieurs choses intressantes en rapport avec le PHP que je n'ai pas pu mettre dans le cours.
Ne regardez pas les annexes la fin, mais plutt pendant la lecture du cours, histoire de souffler entre 2 chapitres.
www.siteduzero.com
Partie 5 : Annexes
313/361
Le nom de domaine
Savez-vous ce qu'est un nom de domaine ?
Il s'agit en fait d'une adresse sur le Web : siteduzero.com est par exemple un nom de domaine.
Un nom de domaine est constitu de 2 parties :
siteduzero.com
En rouge, le nom de domaine proprement dit. Il s'agit d'un nom que l'on peut gnralement choisir librement, du tant
que personne ne l'a rserv avant nous. Il peut contenir des lettres et des chiffres, mais pas de symboles particuliers
(comme le franais, le , le , les espaces, etc).
En bleu, l'extension (aussi appele tld). Il existe grosso modo une extension par pays (.fr pour la France, .be pour la
Belgique, .ca pour le Canada). Toutefois, il y a aussi des extensions utilises au niveau international comme .com, .net,
.org. Elles taient au dpart rserves aux sites commerciaux, aux organisations, etc... mais cela fait longtemps que tout
le monde peut les rserver. D'ailleurs, .com est trs probablement l'extension la plus utilise sur le Web.
En gnral, un site web voit son adresse prcde par "www", comme par exemple "www.siteduzero.com". Cela ne fait
pas partie du nom de domaine : en fait, "www" est ce qu'on appelle un sous-domaine, et on peut en thorie en crer
autant qu'on veut une fois qu'on est propritaire du nom de domaine
Le "www" a t adopt par tous les webmasters, c'est une sorte de convention, mais elle n'est absolument pas
obligatoire.
Pour plus d'info sur l'ICANN, je vous invite lire cette page en franais de leur site qui dtaille un peu plus leur rle
sur le Web. C'est que c'est un sacr boulot de grer la plupart des noms de domaine du Web !
www.siteduzero.com
Partie 5 : Annexes
314/361
Dans ce chapitre, nous allons voir comment commander un nom de domaine en mme temps que l'hbergement, c'est de loin la
solution la plus simple et la moins coteuse pour vous.
www.siteduzero.com
Partie 5 : Annexes
315/361
L'hbergeur
Intressons-nous maintenant l'hbergeur.
Qu'est-ce qu'un hbergeur et pourquoi aurais-je besoin de lui ?
Sur Internet, tous les sites web sont stocks sur des ordinateurs particuliers appels "Serveurs". Ce sont des ordinateurs
gnralement trs puissants qui restent tout le temps allums. Ils contiennent les pages des sites web et les dlivrent aux
internautes qui les demandent, toute heure du jour et de la nuit.
Voici quoi ressemble par exemple un serveur :
Un serveur
Un serveur ne possde pas d'cran car, la plupart du temps, il tourne tout seul sans avoir besoin qu'on fasse quoi que ce soit
dessus. Comme vous le voyez, les serveurs sont trs plats : c'est un format spcial de serveur (appel "1U"). Cela permet de les
empiler dans des baies (une sorte d'armoire climatise pour serveurs
).
Voici quoi ressemble une baie :
www.siteduzero.com
Partie 5 : Annexes
316/361
Comme vous le voyez, il y a un cran pour toute la baie. C'est suffisant car on ne branche l'cran sur un serveur que si celui-ci
rencontre un problme. La plupart du temps, heureusement, le serveur travaille sans broncher
Le rle de l'hbergeur
L'hbergeur est une entreprise qui se charge de grer des baies de serveurs. Elle s'assure du bon fonctionnement des serveurs
24h/24 7j/7. En effet, si l'un d'eux tombe en panne, tous les sites prsents sur la machine deviennent inaccessibles (et a fait
des clients mcontents
).
Ces baies se situent dans des lieux particuliers appels datacenters. Les datacenters sont donc des "entrepts serveurs" en
quelque sorte, et leur accs est trs protg.
Il est aussi possible en thorie d'hberger un site sur son propre ordinateur. Toutefois, c'est complexe, il vaut mieux
avoir des connaissances en Linux, l'ordinateur doit tre assez puissant, tourner jour et nuit et... surtout... la connexion
doit tre trs trs haut dbit (surtout en upload , la vitesse d'envoi des fichiers compte normment). Les particuliers
n'ont en rgle gnrale pas une connexion suffisamment puissante pour hberger des sites, tandis que les datacenters
oui : ils sont cbls en fibre optique (a peut aller une vitesse de plusieurs Gbps !
)
Bref, grer un serveur soi-mme est complexe, et la plupart du temps les particuliers et les entreprises font appel un
hbergeur dont c'est le mtier.
Trouver un hbergeur
www.siteduzero.com
Partie 5 : Annexes
317/361
Les hbergeurs, contrairement aux registrars, sont trs trs nombreux. Il y en a de tous types, tous les prix. Il y a un
vocabulaire connatre pour vous reprer dans leurs offres :
Hbergement mutualis : si vous optez pour une offre d'hbergement mutualise, votre site sera plac sur un serveur
grant plusieurs sites la fois (peut-tre une centaine, peut-tre plus). C'est l'offre la moins chre et c'est celle que je
vous recommande de viser si vous dmarrez votre site web.
Hbergement ddi virtuel : cette fois, le serveur ne gre que trs peu de sites (gnralement moins d'une dizaine).
Cette offre est gnralement adapts aux sites qui ne peuvent plus tenir sur un hbergement mutualis car ils ont trop
de trafic (trop de visiteurs), mais qui ne peuvent pas se payer un hbergement ddi (voir ci-dessous).
Hbergement ddi (on parle aussi de "serveur ddi") : c'est le nec plus ultra. Le serveur gre uniquement votre site et
aucun autre. Attention, cela cote assez cher et il vaut mieux avoir des connaissances en Linux pour administrer le
serveur distance.
Par exemple, le Site du Zro est lui-mme sur un hbergement ddi, car son trafic est trs important.
Mais o puis-je trouver un hbergeur ?
Si les offres de 1&1 ne vous conviennent pas, vous pouvez regarder chez l'hbergeur
PlanetHoster (un concurrent
) ou encore MavenHosting, qui proposent d'autres
offres pour les particuliers et entreprises.
PlanetHoster fait des rductions spciales pour les visiteurs du Site du Zro sur tous ses hbergements mutualiss via
un code promotionnel :
5% de remise pour le plan essentiel grce au code "SiteDuZero-Perso"
15% de remise pour les plans performance et illimit grce au code "SiteDuZero"
Ces remises sont valables pour une commande annuelle de l'une de ces 3 offres.
La suite de ce chapitre vous dtaille la procdure pour hberger votre site chez 1&1, mais sachez que cela fonctionne
quasiment de la mme manire avec PlanetHoster et MavenHosting.
Revenons 1&1. L'hbergeur propose plusieurs offres d'hbergement mutualis :
www.siteduzero.com
Partie 5 : Annexes
318/361
1&1 Dual Essentiel : 2,5 Go d'espace disque, trafic illimit, 1 nom de domaine et 10 comptes email.
1&1 Dual Classique : 100 Go d'espace disque, trafic illimit, 2 noms de domaine et 100 comptes email.
1&1 Dual Avanc : 250 Go d'espace disque, trafic illimit, 3 noms de domaine et 500 comptes email.
1&1 Dual Illimit : espace disque, trafic et comptes email illimits, 4 noms de domaine.
Tous ces packs donnent la possibilit d'avoir des noms de domaine en .fr !
Ces offres ont chacune leurs caractristiques. Plus l'offre que vous choisissez est leve, plus vous aurez d'espace disque, de
noms de domaine, de comptes email, de bases de donnes etc. Pour visualiser les diffrentes caractristiques, cliquez sur le
bouton "Afficher toutes les fonctions", qui se trouve juste sous les offres. N'hsitez pas regarder les dtails : le 1&1 Dual
Essentiel ne propose pas les langages Perl, Python ou Ruby par exemple, alors que les autres offres les proposent.
Mais qu'est-ce qu'ils appellent le "trafic" ?
Le trafic, c'est la quantit de donnes envoyes par mois aux visiteurs de votre site. Par exemple, si vous avez une image de 1
Mo sur votre site et qu'elle est charge 500 fois dans le mois par vos visiteurs, alors vous crerez un trafic de 500 Mo.
En pratique, il faut savoir que les navigateurs des visiteurs mettent en cache les images, ce qui leur vite d'avoir recharger
plusieurs fois une mme image. Cela diminue d'autant plus le trafic ncessaire.
Ici le trafic tant illimit sur toutes les offres, cela ne pose pas de problme.
Et comment je sais quelle offre choisir ?
www.siteduzero.com
Partie 5 : Annexes
319/361
C'est en fonction de vos besoins. Si vous ne voulez hberger que quelques pages HTML par exemple, 2,5 Go de disque seront
largement suffisants, vous pouvez alors vous contenter de l'offre 1&1 Dual Essentiel. Si au contraire vous voulez hberger des
photos, des vidos ou des musiques, il vous faudra plus d'espace disque, et donc prendre une offre suprieure. De la mme
manire, si vous voulez hberger uniquement un site en PHP (un blog par exemple), la premire offre suffit ; en revanche, si
vous voulez hberger des applications en Ruby, alors il vous faudra prendre une offre suprieure. Regardez galement le
nombre des bases de donnes proposes, cela peut tre utile si vous en avez besoin de plusieurs pour vos sites Web.
Au final, c'est vous de voir ce dont vous aurez besoin.
Peut-tre vous tes vous demand ce que signifiait ce "dual", dans le nom des offres. H bien sachez que 1&1 hberge en
ralit vos sites sur deux serveurs en mme temps, deux endroits diffrents. Ainsi si l'un des serveurs tombe en panne pour
une raison quelconque, vos visiteurs pourront toujours accder votre site, via le deuxime serveur. D'o l'appellation de
"dual".
C'est une scurit non ngligeable, prendre en compte lorsque vous hbergez un site.
1&1 met votre disposition des applications web installer, via "1&1 Applications Click & Build". Ce sont des sites
dj cods, comme Wordpress, phpBB, Joomla! ou encore Magento. Au total, ce ne sont pas moins de 65 applications
prtes l'emploi, installer facilement directement via 1&1. De quoi se faciliter grandement la vie ! En effet, vous
n'avez mme pas besoin de savoir coder pour avoir votre blog, forum ou site en ligne.
Vous trouverez la liste complte de ces applications sur la page ddie.
Ce cadre vous invite vrifier la disponibilit de votre nom de domaine. 1&1 va alors se charger de vrifier instantanment si
le domaine est disponible. Si c'est bon, vous pouvez passer la suite.
Sinon, il faudra choisir un autre nom de domaine car quand le domaine est dj pris vous ne pouvez pas faire grand chose.
www.siteduzero.com
Partie 5 : Annexes
320/361
Nanmoins, 1&1 vous propose des noms alternatifs disponibles. Il est galement possible de choisir votre nom de domaine
aprs avoir valid votre commande.
Obtenir un "vrai" nom de domaine (.fr, .com, .net, .org...) est habituellement payant chez les hbergeurs. Nanmoins,
si vous achetez un hbergement d'un an chez 1&1, le nom de domaine est offert (il est compris dans l'hbergement).
1&1 vous propose ensuite diffrentes options, libre vous de les accepter ou de les refuser.
Il ne vous reste plus qu' renseigner vos coordonnes et finaliser l'achat par carte bancaire ou par chque.
Une fois les formalits et le paiement effectus, vous tes redirig vers 1&1, qui vous confirme la bonne prise en compte de
votre commande.
Vous devriez recevoir un peu plus tard un e-mail vous indiquant toutes les informations ncessaires pour mettre en place votre
site. Conservez-les prcieusement, vous en aurez besoin.
Lorsque vous aurez reu par email vos identifiants pour vous connecter au serveur de votre hbergeur, vous pouvez passer
l'tape suivante : envoyer votre site web sur le serveur de votre hbergeur !
www.siteduzero.com
Partie 5 : Annexes
321/361
FTP signifie File Transfer Protocol et, pour faire court et simple, c'est le moyen que l'on utilise pour envoyer nos fichiers.
Il existe des logiciels permettant d'utiliser le FTP pour transfrer vos fichiers sur Internet.
Bien entendu, des logiciels FTP il en existe des centaines, gratuits, payants, franais, anglais etc...
Pour que nous soyons sur la mme longueur d'ondes, je vais vous proposer celui que j'utilise qui est gratuit et en
franais : FileZilla.
Ce logiciel n'a rien avoir avec Mozilla, si ce n'est qu'il se termine lui aussi par "zilla". N'allez donc pas
croire que je vous force utiliser des logiciels d'un mme diteur, c'est tout fait faux
D'ailleurs, vous pouvez utiliser n'importe quel autre logiciel FTP si a vous chante, a ne me drange absolument pas.
Quoiqu'il en soit, je vais vous montrer quelle est la marche suivre avec FileZilla.
Premire tape : ... le tlcharger bien entendu
A premire vue, a a l'air un peu compliqu ( premire vue seulement). En fait, le principe est trs simple.
Il y a 4 grandes zones dans la fentre connatre :
1. En haut, vous verrez apparatre les messages qu'envoie et reoit le logiciel. Si vous avez un peu de chance, vous verrez
mme la machine vous dire Bonjour" (si si je vous jure ;)) En gnral, cette zone ne nous intresse pas vraiment, sauf
s'il y a des messages d'erreur... et comme ils sont crits en rouge, vous devriez pas les louper
www.siteduzero.com
Partie 5 : Annexes
322/361
2. A gauche, c'est votre disque dur. Dans la partie du haut vous avez les dossiers, et dans la partie du bas la liste des
fichiers du dossier actuel.
3. A droite, c'est la liste des fichiers envoys sur Internet. Pour le moment il n'y a rien, car on ne s'est pas "connect", mais
a va venir ne vous en faites pas.
4. Enfin, en bas, vous verrez apparatre les fichiers en cours d'envoi (et le pourcentage d'envoi).
Si vous ne les avez pas, il faut que vous les cherchiez c'est indispensable. On vous les a probablement envoyes par mail.
Sinon, n'hsitez pas les demander votre hbergeur (IP / Login / Mot de passe).
Maintenant que nous sommes en possession de ces informations, nous allons les donner FileZilla qui en a besoin pour se
connecter au serveur.
Cliquez sur la petite icne en haut gauche (pas sur la petite flche droite, mais sur l'image) :
Une fentre s'ouvre. Cliquez sur "Nouveau site" et donnez-lui le nom que vous voulez (par exemple Site du Zr0). A droite,
vous allez devoir indiquer les 3 informations dont je viens de vous parler, comme ceci :
www.siteduzero.com
Partie 5 : Annexes
323/361
Vous pouvez distinguer en haut l'hte (c'est l qu'il faut indiquer l'adresse ip, du genre ftp.attitude-nature.com).
Pour pouvoir entrer le login / mot de passe, cochez Type d'authentification : Normal
Ici le login est attitudeU et le mot de passe est... cach (vous croyiez quand mme pas que j'allais vous le donner ?! :p)
Cliquez sur "Connexion" et le tour est (presque) jou.
Si la connexion a russi, alors ce que vous avez faire est trs simple : dans la partie de gauche, cherchez o se trouvent sur
votre disque dur vos fichier .html et .css (mais aussi vos images .jpg, .png, .gif etc...).
Double-cliquez sur le fichier que vous voulez transfrer gauche. Au bout de quelques secondes, il apparatra droite, ce qui
voudra dire qu'il a t correctement envoy sur le serveur, donc qu'il est accessible sur Internet !!!
Vous pouvez envoyer n'importe quel type de fichier. Bien entendu, gnralement on envoie des fichiers .html, .css et
des images, mais vous pouvez aussi trs bien envoyer des .pdf, des programmes, des zip etc etc...
www.siteduzero.com
Partie 5 : Annexes
324/361
Il apparat droite, ce qui veut dire qu'il est maintenant disponible sur le serveur
Veuillez noter qu'il faut que votre page d'accueil s'appelle "index.php". C'est la page qui sera charge lorsqu'un
nouveau visiteur arrivera sur votre site.
Vous pouvez aussi transfrer des dossiers entiers d'un seul coup : il suffit de faire glisser-dplacer le dossier depuis la partie de
gauche jusqu' la partie de droite de la fentre.
Allez, avouez qu'une fois configur, c'est pas bien compliqu
www.siteduzero.com
Partie 5 : Annexes
325/361
Bonne question. En fait, votre hbergeur vous propose dj une base de donnes MySQL. Celle-ci est le plus souvent dj
cre.
Normalement, votre hbergeur doit vous donner le moyen d'y accder (par e-mail ou sur leur panel web).
Vous avez besoin de ces informations :
L'adresse IP du serveur MySQL
Votre login MySQL
Votre mot de passe MySQL
Le nom de la base de donnes, si elle a dj t cre
L'adresse du phpMyAdmin qui vous permet de grer votre base en ligne
Gnralement, les hbergeurs ne vous proposent qu'une ou deux bases de donnes. Ce n'est pas vraiment une
limitation car une base de donnes suffit stocker toutes les informations dont on a besoin. Avoir plusieurs bases
permet juste de mieux dcouper les informations, un peu comme les dossiers sur votre ordinateur.
Servez-vous des 4 premires informations (IP, login, mot de passe, nom de la base) pour adapter votre code PHP afin qu'il
puisse se connecter la base de donnes de l'hbergeur :
Code : PHP
<?php
$bdd = new PDO('mysql:host=sql.hebergeur.com;dbname=mabase',
'pierre.durand', 's3cr3t');
?>
Maintenant que c'est fait, vos scripts ont accs la base de donnes de l'hbergeur... Mais celle-ci est encore vide ! Il faut
utiliser le phpMyAdmin qu'ils mettent votre disposition pour y recrer les tables.
Pour cela, vous devez suivre ces tapes :
1. Sur votre machine, via WAMP, accdez votre phpMyAdmin local. Utilisez-le pour exporter toutes vos tables, comme
nous avons appris le faire. Cela va crer un fichier .sql sur votre disque dur qui contiendra vos tables.
www.siteduzero.com
Partie 5 : Annexes
326/361
2. Rendez-vous ensuite sur l'adresse du phpMyAdmin de votre hbergeur. Une fois l-bas, utilisez la fonctionnalit
d'importation pour y importer le fichier .sql qui se trouve sur votre disque dur.
www.siteduzero.com
Partie 5 : Annexes
327/361
3. Patientez un peu... Et vos tables sont maintenant charges sur le serveur MySQL de l'hbergeur !
C'est peu prs tout ce que vous avez besoin de savoir.
Bien entendu, vous ne pouviez pas deviner tout seul tout ceci. C'est d'ailleurs pour cela que j'ai rdig cette annexe, car bon
nombre de dbutants sont perdus et ne comprennent pas l'intrt des registrars, hbergeurs, serveurs et compagnie
Allez, au boulot, vous avez des fichiers transfrer je crois
Codez proprement
En programmation comme partout ailleurs, il y a 2 types de personnes :
Ceux qui effectuent leur travail rapidement, mais ne se soucient pas de la qualit, de la lisibilit, et de l'volutivit de
leur code.
Ceux qui font l'effort de soigner un peu leur travail, car ils ont conscience que ce petit travail supplmentaire sera un
gain de temps norme l'avenir.
Il va de soi que le 2me type de personne est de loin le meilleur.
Toutefois, quand on dbute, on a tendance se dire "Ca marche, parfait, ne touchons plus rien et laissons comme a". C'est un
mauvais rflexe, et je ne serai pas le seul vous le dire : n'importe quel programmeur PHP ayant un peu d'exprience sait qu'un
code qui marche n'est pas forcment bon.
Cette annexe est en fait une suite de petits conseils apparemment peu importants, sur lesquels je voudrais que vous portiez
toute votre attention.
C'est peu de choses, et c'est pourtant ce qui fait la distinction entre un "bon" programmeur et euh... un programmeur du
www.siteduzero.com
Partie 5 : Annexes
328/361
Dimanche !
www.siteduzero.com
Partie 5 : Annexes
329/361
www.siteduzero.com
Partie 5 : Annexes
330/361
Le premier contient des noms courts et pas clairs, il est difficile de comprendre rapidement ce qu'il fait.
Le deuxime contient des noms un peu plus longs, mais au moins on arrive de suite savoir quoi sert telle variable et
telle fonction.
Ces 2 codes produisent exactement le mme rsultat, simplement l'un d'entre eux est beaucoup plus comprhensible que
l'autre.
Je vous laisse deviner lequel
= ceil($total / $mess_page);
C'est fou comment des noms crits correctement en franais permettent d'y voir plus clair.
www.siteduzero.com
Partie 5 : Annexes
331/361
<em>ligne impaire</em>';
www.siteduzero.com
Partie 5 : Annexes
}
?>
332/361
L'avantage avec un code indent, c'est qu'on voit bien les "niveaux" des instructions. On spare bien les blocs, et on arrive se
reprer bien plus facilement.
Avoir un code correctement indent, c'est quasiment indispensable lorsque vous commencez faire des scripts de plusieurs
dizaines de lignes (ce qui arrive assez vite !).
Certains dveloppeurs ont tendance remplacer les tabulations par 2 ou 4 espaces, car la largeur d'une tabulation
peut varier d'un logiciel un autre, alors que celle d'un espace est fixe. En gnral, c'est l'diteur de texte lui-mme
qui convertit nos tabulations par des espaces, de faon transparente.
www.siteduzero.com
Partie 5 : Annexes
333/361
... vous rajoutez le commentaire "Affiche le pseudo du visiteur", l je dis non, non et non !
Il est strictement inutile de commenter chaque ligne de votre code une une ! Si j'ai insist tout l'heure pour que vous
mettiez des noms de variables et de fonctions clairs, c'est justement pour vous viter avoir besoin de trop commenter.
Le plus judicieux et le plus intelligent, c'est de commenter un "groupe de lignes", pour expliquer brivement quoi elles
servent quand cela n'est pas vident.
C'est le sens gnral de votre code que vous devez expliquer dans les commentaires, et non pas le rle de chaque ligne !
Pour vous aider, il existe 2 types de commentaires :
Ceux qui commencent par // : ils permettent de commenter sur une seule ligne la fois.
Ceux qui commencent par /* et qui se terminent par */ : ils sont utiliss pour des longs commentaires s'talant sur
plusieurs lignes.
Voici une petite illustration d'un code correctement comment :
Code : PHP
<?php
/*
Script "Questionnaire de satisfaction"
Par M@teo21
Dernire modification : 20 Aot XXXX
*/
// On vrifie d'abord s'il n'y a pas de champ vide
if ($_POST['description'] == NULL OR $_POST['mail'] == NULL)
{
echo 'Tous les champs ne sont pas remplis !';
}
else // Si c'est bon, on enregistre les informations dans la base
{
$bdd->prepare('INSERT INTO enquete VALUES (\'\', ?, ?)');
$bdd->execute(array($_POST['description'], $_POST['mail']));
// Puis on envoie les photos
for ($numero = 1 ; $numero <= 3 ; $numero++)
{
if ($_FILES['photo' . $numero]['error'] == 0)
{
if ($_FILES['photo' . $numero]['size'] < 500000)
{
move_uploaded_file($_FILES['photo' .
www.siteduzero.com
Partie 5 : Annexes
334/361
Comme vous le voyez, je n'ai pas comment toutes les lignes. J'ai juste comment des groupes de lignes pour expliquer leur
fonction globale, ce qui me permettra moi (ou un autre) de se reprer beaucoup plus facilement dans le code plus tard !
Ces petits conseils n'ont l'air de rien comme a, mais ils valent de l'or.
Alors certes, je ne vous cache pas que chaque programmeur a ses petites habitudes et la faon de faire n'est pas partout la
mme. Pourtant, ces conseils constitueront pour vous un bon point de dpart pour que vous preniez les bonnes habitudes.
En faisant l'effort de les respecter, vous gagnerez beaucoup plus que ce que vous ne le pensez. Et vous verrez que, le jour o
vous devrez dbugger un gros code qui a dcid de ne plus marcher, vous serez vraiment heureux d'avoir indent, comment
et utilis des noms clairs dans votre code.
www.siteduzero.com
Partie 5 : Annexes
335/361
Accder la doc
La documentation, c'est bien beau, mais c'est o ? Comment y accder ?
Pour cela, on a 2 possibilits, tout dpend de ce que vous voulez faire :
Voir la liste des fonctions classes par thme : si vous ne savez pas exactement quelle fonction vous cherchez, si vous
voulez flner un peu et que vous voulez avoir la liste des fonctions classes par catgories... C'est la premire mthode
que vous utiliserez.
Accder la prsentation d'une fonction dont on connat le nom : si vous connaissez le nom d'une fonction, mais que
vous ne savez pas vous en servir, c'est cette seconde mthode que l'on utilisera. C'est la mthode la plus simple, la plus
rapide, et la plus frquemment utilise.
Je vais vous dtailler maintenant chacune de ces mthodes pour accder la doc. Vous utiliserez l'une ou l'autre en fonction
de vos besoins.
Ce que vous voyez l, c'est la liste des "thmes" de fonctions. Comme vous pouvez le voir, y'en a un sacr paquet !
Ne prenez pas peur si vous ne comprenez mme pas 1 thme sur 10 (je suis comme vous si a peut vous rassurer), mais faites
l'effort de lire un peu tout ce qu'il y a, et reprez s'il y a un thme qui vous intresse plus particulirement qu'un autre.
Par exemple, vous pouvez y voir les thmes "Mail" et "Mathmatiques". Supposons que je sois intress par les fonctions
mathmatiques de PHP. Je clique sur "Mathmatiques".
www.siteduzero.com
Partie 5 : Annexes
336/361
L, une nouvelle page s'ouvre. On vous propose une petite introduction que je vous recommande de lire chaque fois, ainsi
que la liste des fonctions
Certains thmes de fonctions ne sont pas activs avec PHP. C'est le cas par exemple de la librairie GD pour crer des
images.
Si c'est le cas, on vous indique qu'il faut "activer" la librairie, comme je vous ai appris le faire dans le chapitre sur la
librairie GD.
D'autres fonctions appartiennent des extensions qu'il faut installer manuellement.
En ce qui concerne les fonctions mathmatiques, elles sont toujours actives par dfaut, donc pas de problme de ce ct-l.
Descendez plus bas dans la page (parfois vous devez descendre trs trs bas), jusqu' l'endroit marqu "Table des matires".
C'est l que a nous intresse : il y a la liste des fonctions du thme "mathmatiques" :
A gauche, vous avez le nom de la fonction, et droite un trs bref descriptif de ce qu'elle fait.
Si vous cliquez sur un nom de fonction, vous accdez la prsentation de la fonction. Nous verrons comment fonctionne cette
page dans la seconde partie de cette annexe.
Ici par exemple, je peux tre intress par le calcul d'un logarithme nprien (fonction log). Et si les maths et vous a fait
deux, il y a quand mme quelques fonctions qui devraient vous intresser : max qui retourne le nombre le plus grand, ou
mt_rand qui gnre un nombre alatoire.
Il est inutile d'crire http://www. devant, il sera rajout tout seul. C'est plus rapide de s'en passer.
www.siteduzero.com
Partie 5 : Annexes
337/361
Si la fonction existe, vous tombez directement sur la prsentation de la fonction. Sinon, on vous dit que la fonction n'existe
pas et on vous propose d'autres fonctions qui ont peu prs le mme nom.
Si je veux tout savoir sur mt_rand donc, je tape ceci dans la barre d'adresse de mon navigateur :
Lorsque vous validez cette adresse, vous arrivez directement sur la page qui prsente la fonction mt_rand !
Plutt rapide et pratique non ?
www.siteduzero.com
Partie 5 : Annexes
338/361
Ce qui nous intresse le plus l-dedans, c'est le "Mode d'emploi de la fonction". Il correspond ces lignes :
Code : Autre
int mt_rand ( void )
www.siteduzero.com
Partie 5 : Annexes
339/361
Ces lignes dcrivent le mode d'emploi de mt_rand. Je vais vous apprendre le dchiffrer, car lorsque vous saurez le lire,
vous saurez utiliser n'importe quelle fonction PHP l'aide de la doc !
Mais alors... Qu'est-ce que a signifie si on n'envoie aucun paramtre ? Que va faire la fonction ?
www.siteduzero.com
Partie 5 : Annexes
340/361
Citation
Appele sans les arguments optionnels min et max, mt_rand() retourne un nombre pseudo-alatoire, entre 0 et
RAND_MAX (un nombre maximum fix par PHP ). Pour obtenir un nombre entre 5 et 15 inclus, il faut utiliser
mt_rand(5,15).
www.siteduzero.com
Partie 5 : Annexes
341/361
Dans la mesure du possible, essayez de tester les exemples proposs. Il arrive souvent qu'on comprenne mieux avec des
exemples que l'on essaie soi-mme.
La documentation PHP est vraiment un outil prcieux, bien fait (il faut dire ce qui est), mais pas forcment trs "parlant".
Si, pour apprendre se servir d'une fonction rien ne vaut un bon tuto, vous en arriverez forcment un jour un stade o
personne ne pourra vraiment vous aider, personne sauf la doc.
Apprenez ds aujourd'hui vous en servir, car c'est grce elle que vous apprendrez le plus de choses une fois que vous aurez
fini de lire les tutoriels du Site du Zro.
www.siteduzero.com
Partie 5 : Annexes
342/361
Parse error
Si on devait dire qu'il existe UNE erreur de base, a serait trs certainement celle-l. Impossible de programmer en PHP sans y
avoir droit un jour.
Le message d'erreur que vous obtenez ressemble celui-ci :
Code : Autre
Parse error: parse error in fichier.php on line 15
Ce message vous indique une erreur dans fichier.php la ligne 15. Gnralement, cela veut dire que votre problme se
situe la ligne 15, mais ce n'est pas toujours le cas (trop facile sinon
). Parfois c'est la ligne prcdente qui a un problme,
pensez donc regarder autour de la ligne indique.
Avec un diteur de texte spcialis comme Notepad++, vous avez les numros de ligne sur votre gauche comme ceci :
Bon, concrtement qu'est-ce qu'un parse error ? Un "parse error" est en fait une instruction PHP mal forme. Il peut y avoir
plusieurs causes :
Vous avez oubli le point-virgule la fin de l'instruction. Comme toutes les instructions doivent se terminer par un
point-virgule, si vous oubliez d'en mettre un a provoquera un "parse error". Par exemple :
Code : PHP
$id_news = 5
... gnrera un parse error. Si vous mettez le point-virgule la fin, tout rentrera dans l'ordre !
Code : PHP
$id_news = 5;
Vous avez oubli de fermer un guillemet (ou une apostrophe, ou une parenthse). Par exemple :
Code : PHP
echo "Bonjour !;
www.siteduzero.com
Partie 5 : Annexes
343/361
... il suffit de fermer correctement les guillemets et vous n'aurez plus de problme
Code : PHP
echo "Bonjour !";
Vous vous tes tromp dans la concatnation, vous avez peut-tre oubli un point :
Code : PHP
echo "J'ai " . $age " ans";
Undefined function
Une autre erreur assez classique : la fonction inconnue. Vous obtenez ce message d'erreur :
Code : Autre
Fatal Error: Call to undefined function: fonction_inconnue() in fichier.php on line 27
L, il faut comprendre que vous avez utilis une fonction qui n'existe pas.
2 possibilits :
Soit la fonction n'existe vraiment pas. Vous avez probablement fait une faute de frappe, vrifiez si une fonction
l'orthographe similaire existe.
Autre cas possible : la fonction existe vraiment, mais PHP ne la reconnat pas. C'est parce que cette fonction se trouve
dans une extension de PHP que vous n'avez pas active. Par exemple, si vous essayez d'utiliser la fonction
imagepng alors que vous n'avez pas activ la bibliothque GD pour les images en PHP, on vous dira que la fonction
n'existe pas. Activez la bibliothque qui utilise la fonction et tout sera rgl.
Une dernire chose : il se peut aussi que vous essayiez d'utiliser une fonction qui n'est pas disponible dans la version de PHP
que vous avez.
Vrifiez dans le manuel dans quelles versions de PHP cette fonction est disponible.
Partie 5 : Annexes
344/361
Cela signifie que vous avez oubli des paramtres pour la fonction, ou mme que vous en avez mis trop.
Comme je vous l'ai appris dans le chapitre sur la doc PHP, consultez le mode d'emploi de la fonction pour savoir combien de
paramtres elle prend et lesquels sont facultatifs.
Par exemple, la fonction fopen requiert au minimum 2 paramtres : le premier pour le nom du fichier ouvrir et le second
pour le mode d'ouverture (en lecture seule, criture etc...). Si vous ne mettez que le nom du fichier ouvrir comme ceci :
Code : PHP
$fichier = fopen("fichier.txt");
... vous aurez l'erreur "Wrong parameter count". Pensez donc rajouter le paramtre qui manque, par exemple comme ceci :
Code : PHP
$fichier = fopen("fichier.txt", "r");
Dans les versions actuelles de PHP, on vous dit mme le nombre de paramtres que vous avez oubli dans le message
d'erreur !
www.siteduzero.com
Partie 5 : Annexes
345/361
Si vous respectez bien ce canevas de code, toute erreur qui se produira l'intrieur du bloc try provoquera l'appel du bloc
catch... qui se charge d'afficher l'erreur SQL.
Si la requte marche, aucune erreur ne sera affiche et le contenu du bloc catch ne sera jamais appel. Si la requte plante en
www.siteduzero.com
Partie 5 : Annexes
346/361
revanche, PHP arrtera de gnrer la page et vous affichera l'erreur donne par MySQL...
A partir de l, il va falloir vous dbrouiller tous seuls, car les erreurs SQL sont assez nombreuses et je ne peux pas toutes les
lister.
En gnral, MySQL vous dit "You have an error in your SQL syntax near 'XXX'". A vous de bien relire votre requte SQL,
l'erreur se trouve gnralement prs de l'endroit o on vous l'indique.
www.siteduzero.com
Partie 5 : Annexes
347/361
Ce que vous devez retenir, c'est que chacune des ces fonctions doit tre utilise au tout dbut de votre code PHP . Il ne faut
RIEN mettre avant, sinon a provoquera l'erreur "Headers already sent by...".
Un exemple de code qui gnre l'erreur :
Code : PHP
<html>
<?php session_start(); ?>
Ici, j'ai eu le malheur de mettre un peu de code HTML avant le session_start(), et c'est ce qui a provoqu l'erreur.
Mettez le session_start() en tout premier, et vous n'aurez plus de problme :
Code : PHP
<?php session_start(); ?>
<html>
www.siteduzero.com
Partie 5 : Annexes
348/361
2 possibilits :
Vous pouvez supprimer la ligne suivante dans votre code :
Code : PHP
<?php header ("Content-type: image/png"); ?>
Imaginez que vous fassiez une boucle while, mais que celle-ci ne s'arrte jamais : votre script PHP va tourner en boucle tout
le temps sans jamais s'arrter.
Heureusement, PHP limite le temps d'excution d'une page PHP 30 secondes par dfaut. Si une page met plus de 30s se
gnrer, PHP arrte tout en disant que c'est trop long. Et il fait bien, parce que sinon cela pourrait ralentir tout le serveur et
rendre votre site inacessible !
Voici un exemple de boucle while qui ne s'arrtera jamais :
Code : PHP
<?php
$nombre = 5;
while ($nombre == 5)
{
echo 'Zro ';
}
?>
www.siteduzero.com
Partie 5 : Annexes
349/361
Comme vous pouvez le voir, un tel code PHP ne s'arrtera jamais parce que $nombre vaut TOUJOURS 5...
Si vous avez donc l'erreur "Maximum execution time exceeded", il va falloir reprer une boucle qui ne s'arrte jamais, car c'est
elle qui provoque ce problme.
Rassurez-vous : la limite est fixe 30s, mais vous n'y serez jamais confront. En gnral, un serveur met moins de 50
millisecondes charger une page PHP (on est trs loin des 30 secondes !).
Cette annexe touche sa fin, j'espre que les informations que vous y aurez dnich vous auront aid rsoudre vos
problmes.
Quoiqu'il en soit, n'oubliez pas que chaque problme est particulier. Un peu de persvrance et on finit toujours par trouver le
bug.
Enfin, si vous n'y arrivez vraiment pas, ne baissez pas les bras pour autant et allez poser votre question sur les forums du site.
Un Zro un peu plus expriment verra probablement votre erreur au premier coup d'oeil.
www.siteduzero.com
Partie 5 : Annexes
350/361
Crer le .htaccess
La premire tape est de crer sur votre disque dur un fichier appel .htaccess. Oui, c'est un fichier qui n'a pas de nom et
qui a seulement une extension, savoir .htaccess. Ne soyez donc pas tonns s'il commence par un point.
Ouvrez un nouveau fichier avec votre diteur de texte favori. Nous allons crire des codes qui n'ont rien voir avec du HTML
ou du PHP : ce sont des instructions pour le serveur. Elles vont lui expliquer que seules certaines personnes sont autorises
accder au dossier. Copiez-y ce code :
Code : Apache
AuthName "Page d'administration protge"
AuthType Basic
AuthUserFile "/home/site/www/admin/.htpasswd"
Require valid-user
En effet, c'est la plupart du temps dlicat trouver car cela dpend du serveur. Heureusement, il existe une fonction PHP qui va
beaucoup nous aider : realpath. Cette fonction donne le chemin absolu vers le fichier que vous indiquez. Vous allez donc
faire comme ceci pour trouver le chemin absolu :
1. Crez un fichier appel chemin.php.
2. Inscrivez juste cette ligne de code l'intrieur :
Code : PHP
<?php echo realpath('chemin.php'); ?>
3. Envoyez ce fichier sur votre serveur avec votre logiciel FTP. Placez-le dans le dossier que vous voulez protger.
4. Ouvrez votre navigateur et allez voir ce fichier PHP. Il vous donne le chemin absolu, par exemple dans mon cas :
/home/site/www/admin/chemin.php
5. Copiez ce chemin dans votre .htaccess, et remplacez le chemin.php par .htpasswd, ce qui nous donne au
final par exemple :
/home/site/www/admin/.htpasswd
6. Supprimez le fichier chemin.php de votre serveur, il ne nous sert plus rien maintenant qu'il nous a donn le chemin
absolu.
Si vous tes hbergs chez Free, il y a une petite subtilit dans la gestion de la localisation du .htpasswd : vous ne
devez pas renseigner la ligne AuthUserFile par le chemin absolu du fichier, mais par son chemin relatif partir
de la racine de votre espace perso. Exemple : si vous utilisez un espace Free nomm monftpfree, et que vous
placez votre fichier .htpasswd dans un rpertoire admin, le fichier chemin.php vous renverra un chemin sous
la forme /mnt/XXX/sda/X/X/monftpfree/admin/.htpasswd. Vous devez alors simplement crire :
/monftpfree/admin/.htpasswd. D'autre part, il ne faut pas crire AuthUserFile mais PerlSetVar
www.siteduzero.com
Partie 5 : Annexes
351/361
AuthFile.
Enregistrez le fichier en inscrivant le nom entre guillemets, comme ceci : ".htaccess". Cela permet de forcer l'diteur
enregistrer un fichier qui commence par un point.
Voil, on a fini de crer le .htaccess, on peut maintenant passer au .htpasswd !
www.siteduzero.com
Partie 5 : Annexes
352/361
Crer le .htpasswd
Crez maintenant un nouveau fichier avec votre diteur de texte.
Le .htpasswd va contenir la liste des personnes autorises accder aux pages du dossier. On y inscrit une personne par ligne,
sous cette forme :
Code : Autre
login:mot_de_passe_crypt
Dans cet exemple, il y a 4 personnes autorises accder au dossier : mateo21, ptipilou, djfox et vincent.
Comment peut-on crypter les mots de passe ?
Bonne question ! Encore une fois, il y a une super fonction PHP qui va nous tirer d'affaire : crypt. Vous lui donnez un mot de
passe et, ne cherchez pas savoir comment, elle vous le crypte.
Par exemple, si mon mot de passe est "kangourou", voici le code PHP que je devrai crire pour l'obtenir en version crypte :
Code : PHP
<?php echo crypt('kangourou'); ?>
Crypter ses mots de passe est trs utile : en effet, si quelqu'un vient un jour lire votre fichier .htpasswd (quelqu'un qui utilise
le mme PC que vous par exemple), il ne verra que le mot de passe crypt. Et l, aucun risque qu'il ne retrouve votre mot de
passe : ce cryptage est indchiffrable. Il est sens unique.
Bon, on pourrait en thorie s'arrter l pour le .htpasswd, mais mon me de codeur PHP me commande de crer un petit script
qui va bien vous tre utile (non non, ne me remerciez pas, c'est tout naturel !).
Code : PHP
<p>
<?php
if (isset($_POST['login']) AND isset($_POST['pass']))
{
$login = $_POST['login'];
$pass_crypte = crypt($_POST['pass']); // On crypte le mot de
passe
echo 'Ligne copier dans le .htpasswd :<br />' . $login . ':' .
$pass_crypte;
www.siteduzero.com
Partie 5 : Annexes
353/361
}
else // On n'a pas encore rempli le formulaire
{
?>
</p>
<p>Entrez votre login et votre mot de passe pour le crypter.</p>
<form method="post">
<p>
Login : <input type="text" name="login"><br />
Mot de passe : <input type="text" name="pass"><br /><br />
<input type="submit" value="Crypter !">
</p>
</form>
<?php
}
?>
Essayer !
Il y a 2 parties dans ce code :
1. SI les variables $_POST['login'] et $_POST['pass'] existent, alors c'est qu'on vient de valider le formulaire.
On crypte le mot de passe qu'on a rentr, et on affiche $login:$pass_crypte pour que vous n'ayez plus qu' copier la
ligne dans le .htpasswd
2. SINON, si les variables $_POST['login'] et $_POST['pass'] n'existent pas, donc on affiche le formulaire pour demander
d'entrer un login et un mot de passe.
Le formulaire recharge la mme page, car il n'y a pas d'attribut action dans la balise <form> comme on l'a vu dans le
chapitre sur les formulaires. Lors du rechargement de la page, les variables $_POST['login'] et $_POST['pass'] existeront
puisque vous venez d'entrer le login et le mot de passe. Le mot de passe sera alors crypt !
Je vous conseille de crer cette page quelque part sur votre disque dur (ou sur votre serveur peu importe), pour que vous
puissiez crypter rapidement vos mots de passe pour le .htpasswd.
Si vous avez la flemme de le crer, pas de souci, vous n'avez qu' venir sur cette page et cliquer sur le bouton "Essayer !".
Il y a certains cas o vous ne devrez pas crypter les mots de passe. Sous WAMP ou sur les serveurs de Free.fr par
exemple, vous ne DEVEZ PAS crypter vos mots de passe pour que cela fonctionne. Vous devrez donc les crire
directement. Par exemple :
mateo21:kangourou
www.siteduzero.com
Partie 5 : Annexes
354/361
Si vous rentrez le bon login avec le bon mot de passe, vous serez alors autoris accder aux pages !
La protection par .htaccess que je viens de vous prsenter a l'avantage d'tre rapide et simple mettre en place. Elle vous
permet donc de crer une zone Admin en moins de temps qu'il n'en faut pour le dire.
Cependant, sur un site un peu plus volu, vous aurez probablement besoin de limiter les accs certaines sections du site en
fonction du nom du membre ou du groupe auquel il appartient. L, tout dpend de l'architecture de votre site. En rgle
gnrale, un if suffit dterminer si la page peut tre affiche ou non.
www.siteduzero.com
Partie 5 : Annexes
355/361
Regex
Explication
#guitare#
#guitare$#
#^guitare$#
www.siteduzero.com
Partie 5 : Annexes
356/361
Classes de caractres
Regex
Explication
#gr[ioa]s#
[a-z]
Caractre minuscule de a z
[0-9]
Chiffre de 0 9
[a-e0-9]
#^[^0-9]#
www.siteduzero.com
Partie 5 : Annexes
357/361
Quantificateurs
Regex
Explication
#a?#
#a+#
#a*#
#bor?is#
"bois" ou "boris"
#a{3,5}#
#a{3,}#
"a" doit apparatre au moins 3 fois ("aaa", "aaaa", "aaaaa", "aaaaaa" etc...)
www.siteduzero.com
Partie 5 : Annexes
358/361
Mtacaractres
Les mtacaractres sont :
# !^$ ()[]{}|?+* .\
Pour utiliser un mtacaractre dans une recherche, il faut l'chapper avec un antislash : \
Regex
Explication
#Hein?#
Les mtacaractres n'ont pas besoin d'tre chapps dans une classe, sauf pour "#" (symbole de fin de la regex), "]" (symbole de
la fin de la classe) et "\" (si votre classe recherche un antislash) que l'on doit faire prcder d'un antislash.
Si on veut rechercher un tiret dans une classe de caractres, il faut le placer au dbut ou la fin de la classe : [a-zA-Z0-9-]
www.siteduzero.com
Partie 5 : Annexes
359/361
Classes abrges
Classe abrge Correspondance
\d
[0-9]
\D
[^0-9]
\w
[a-zA-Z0-9_]
\W
[^a-zA-Z0-9_]
\t
Tabulation
\n
Nouvelle ligne
\r
Retour chariot
\s
\S
Classe universelle
www.siteduzero.com
Partie 5 : Annexes
360/361
Capture et remplacement
En utilisant la fonction preg_replace on peut automatiquement faire des remplacements l'aide de Regex.
Code : PHP
<?php
$texte = preg_replace('#\[b\](.+)\[/b\]#i', '<strong>$1</strong>',
$texte);
?>
Les parenthses servent entourer un bout de la Regex pour crer des variables $1, $2, $3 etc... Qui seront utiles pour
faire le remplacement
Il peut y avoir jusqu' 99 parenthses capturantes, donc jusqu' $99
(?:texte) est une parenthse non capturante : elle ne cre pas de variable.
Une variable $0 est toujours cre et correspond l'ensemble de la Regex.
Ainsi, la Regex suivante...
#(anti)co(?:nsti)(tu(tion)nelle)ment#
... cre les variables suivantes :
$0 : anticonstitutionnellement
$1 : anti
$2 : tutionnelle
$3 : tion
www.siteduzero.com
Partie 5 : Annexes
361/361
Options
Il existe de nombreuses options que l'on peut utiliser avec les Regex PCRE.
Parmi les 3 que nous sommes amens le plus souvent utiliser, il y a :
i : la Regex ne fera plus la diffrence entre majuscules / minuscules.
s : le point (classe universelle) fonctionnera aussi pour les retours la ligne (\n)
U : mode "Ungreedy" (pas gourmand). Utilis pour que la Regex s'arrte le plus tt possible. Pratique par exemple pour
le bbCode [b][/b] : la Regex s'arrtera la premire occurence de [/b]
Voil !
En esprant que ce petit Mmo serve au maximum d'entre vous... Il faut dire qu'il y a tellement de choses retenir avec les
Regex qu'un petit appui comme celui-ci ne peut pas faire de mal.
www.siteduzero.com