Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
com/
Sauf mention contraire, le contenu de cet ouvrage est publi sous la licence : Creative Commons BY-NC-SA 2.0 La copie de cet ouvrage est autorise sous rserve du respect des conditions de la licence Texte complet de la licence disponible sur : http://creativecommons.org/licenses/by-nc-sa/2.0/fr/ Simple IT 2010 - ISBN : 978-2-9535278-1-0
Avant-propos
l ny a pas si longtemps encore, on concevait les sites web comme de simples pages de prsentation. Ainsi, un internaute qui souhaitait se faire connatre crait sa page perso pour parler un peu de lui, tandis quune entreprise utilisait sa page web pour y prsenter ses produits et services. Finalement, les sites web ntaient pas si loigns des aches que lon pouvait rencontrer dans la rue : vous y lisez une information, puis vous passez votre chemin. partir des annes 2000, notre conception du Web a commenc changer. On a dcouvert quon pouvait en faire bien plus quune ache publicitaire, quil tait possible de le transformer en un vritable lieu dchanges o le visiteur ne serait plus seulement lecteur mais aussi acteur. Ctait en fait le dbut dune vritable rvolution du Web, que certains ont nomme Web 2.0 . Les premiers sites informatifs taient dits statiques car leur contenu ne changeait que trs rarement, au bon vouloir de leur crateur, le webmaster. Leurs successeurs, les sites web participatifs, ont t appels sites dynamiques car leur contenu pouvait tre modi tout moment par nimporte quel visiteur. Aujourdhui, on ne conoit plus le Web autrement que par ses sites dynamiques qui invitent linternaute participer : les blogs : ils sont rgulirement mis jour par leurs crateurs et les lecteurs peuvent participer en commentant les billets. Ce sont des sites dynamiques ; les forums : ce sont de vritables espaces de discussion en ligne ; les rseaux sociaux : Facebook et Twitter, pour ne citer queux, invitent les internautes changer entre eux, que ce soient des messages, des photos, des vidos... Ce sont eux aussi des sites dynamiques. En fait, la plupart des sites web que vous connaissez et que vous visitez aujourdhui sont des sites dynamiques. On pourrait ajouter de nombreux autres sites dans cette catgorie, comme les moteurs de recherche, les webmails, les wikis, etc. Ainsi, vous souhaitez vous aussi crer un site dynamique ? Vous aimeriez avoir votre blog, votre site avec un espace membres, un chat et des forums pour discuter ? Mais vous ne savez pas comment vous y prendre ni par o commencer ? Cest justement pour vous aider vous lancer que ce livre existe ! Jai souhait crire un cours destin aux dbutants, le plus progressif et pdagogique possible. Le rsultat est entre vos mains. i
CHAPITRE 0. AVANT-PROPOS
ii
COMMENT LIRE CE LIVRE ? un sujet un peu plus pointu, savoir la transmission de donnes entre des pages. De nombreux concepts essentiels de PHP seront abords : traitement des URL et des formulaires, sessions, cookies, chiers... Nous raliserons nos premiers Travaux Pratiques (TP) ensemble en apprenant protger le contenu dune page par un mot de passe. 3. Stocker des informations dans une base de donnes : nous commencerons travailler avec MySQL partir de cette partie. Nous apprendrons ce quest une base de donnes, nous dcouvrirons le clbre outil phpMyAdmin, puis nous crirons nos premires requtes en langage SQL. Votre niveau va rellement voluer tout au long de cette partie, car vous pourrez raliser un mini-chat et un systme de blog avec commentaires au cours de dirents TP ! 4. Utilisation avance de PHP : cette section est ddie ceux qui ont bien lu et assimil les parties prcdentes. Nous aborderons des notions plus avances autour de PHP qui vont considrablement augmenter vos possibilits : expressions rgulires, programmation oriente objet, architecture MVC, etc. Comme vous, je naime pas les cours thoriques qui nous noient dans de nouvelles notions sans nous proposer dapplication pratique. Jaime pouvoir raliser des petits projets concrets au fur et mesure de mon apprentissage, et cest pour cela que ce cours est ponctu de plusieurs TP. Vous pourrez ainsi vous tester rgulirement et dcouvrir ce que vous tes en mesure de faire votre niveau. :o)
CHAPITRE 0. AVANT-PROPOS Pour utiliser les codes web, rendez-vous sur la page suivante3 : http://www.siteduzero.com/codeweb.html Un formulaire vous invite rentrer votre code web. Faites un premier essai avec le code ci-dessous : Code web : 123456 Ces codes web ont deux intrts : vous faire tlcharger les codes source inclus dans ce livre, ce qui vous vitera davoir recopier certains codes un peu longs ; vous rediriger vers les sites web prsents tout au long du cours. Ce systme de redirection nous permet de tenir jour le livre que vous avez entre les mains sans que vous ayez besoin dacheter systmatiquement chaque nouvelle dition. Si un site web change dadresse, nous modierons la redirection mais le code web utiliser restera le mme. Si un site web disparat, nous vous redirigerons vers une page du Site du Zro expliquant ce qui sest pass et vous proposant une alternative. En clair, cest un moyen de nous assurer de la prennit de cet ouvrage sans que vous ayez faire quoi que ce soit !
Remerciements
Je tiens remercier un grand nombre de personnes qui mont aid et soutenu dans la ralisation de ce livre. Mes parents, qui suivent avec attention ce que jessaie de construire avec le Site du Zro et la collection Livre du Zro. lodie, qui ne manque jamais dnergie pour mencourager continuer.
pouvez aussi utiliser le formulaire de recherche du Site du Zro, section Code Web . faudrait-il forcment que la dcouverte dun langage informatique soit longue et ennuyeuse ? ;-)
4 Pourquoi 3 Vous
iv
REMERCIEMENTS Pierre Dubuc, mon associ, qui travaille darrache-pied avec moi pour faire valoir notre approche rsolument dirente des cours pour dbutants. Nos infographistes, Fan Jiyong (couverture du livre) et Yannick Piault (illustrations des chapitres) qui ont nouveau beaucoup travaill pour illustrer ce livre. Vincent Pontier, le crateur de llPHPant, pour son aimable autorisation de reproduction de la plus clbre des mascottes. Lquipe des zCorrecteurs, toujours aussi dvolue la langue franaise, qui a fait nouveau un travail formidable de relecture orthographique et damlioration du style et de la uidit des phrases. Merci tout particulirement Philippe Lutun (ptipilou), Loc Le Breton (Fihld), Martin Wetterwald (DJ Fox), Stphanie Noardo (Poulpette) et tienne de Maricourt (Xeroth). Lquipe de Simple IT et tous les visiteurs du Site du Zro qui font que cette belle aventure dure depuis plus dune dizaine dannes ! Je vous souhaite une bonne dcouverte de PHP et MySQL. Faites de beaux sites web !
CHAPITRE 0. AVANT-PROPOS
vi
Sommaire
Avant-propos PHP et MySQL, les outils du web dynamique . . . . . . . . . . . . . . . . . . Quallez-vous apprendre en lisant ce livre ? . . . . . . . . . . . . . . . . . . . Comment lire ce livre ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ce livre est issu du Site du Zro . . . . . . . . . . . . . . . . . . . . . . . . . Remerciements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
i ii ii iii iv iv
1
3 4 5 7 10 13 14 15 20 23 26 33 vii
1 Introduction PHP Les sites statiques et dynamiques . . . . . . . . . . . . . . . . . . . . . . . . . Comment fonctionne un site web ? . . . . . . . . . . . . . . . . . . . . . . . . Les langages du Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Et la concurrence ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Prparer son ordinateur De quels programmes a-t-on besoin ? . . . . . . . . . . . . . . . . . . . . . . . Sous Windows : WAMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sous Mac OS X : MAMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sous Linux : XAMPP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utiliser un bon diteur de chiers . . . . . . . . . . . . . . . . . . . . . . . . . 3 Premiers pas avec PHP
SOMMAIRE Les balises PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Acher du texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Les commentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Inclure des portions de page Le principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . La pratique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Les variables Quest-ce quune variable ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aecter une valeur une variable . . . . . . . . . . . . . . . . . . . . . . . . . Acher et concatner des variables . . . . . . . . . . . . . . . . . . . . . . . . Faire des calculs simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Les conditions La structure de base : if. . . else . . . . . . . . . . . . . . . . . . . . . . . . . . Une alternative pratique : switch . . . . . . . . . . . . . . . . . . . . . . . . . Les ternaires : des conditions condenses . . . . . . . . . . . . . . . . . . . . . 7 Les boucles Une boucle simple : while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Une boucle plus complexe : for . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Les fonctions Quest-ce quune fonction ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . Les fonctions prtes lemploi de PHP . . . . . . . . . . . . . . . . . . . . . . Crer ses propres fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Les tableaux Les deux types de tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . Parcourir un tableau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Rechercher dans un tableau . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 37 41 43 44 46 49 50 52 55 57 61 62 68 71 73 74 76 79 80 83 87 91 92 95 98
II
103
105
SOMMAIRE Envoyer des paramtres dans lURL . . . . . . . . . . . . . . . . . . . . . . . 106 Rcuprer les paramtres en PHP . . . . . . . . . . . . . . . . . . . . . . . . 107 Ne faites jamais conance aux donnes reues ! . . . . . . . . . . . . . . . . . 108 11 Transmettre des donnes avec les formulaires 117
Crer la base du formulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 Les lments du formulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 Ne faites jamais conance aux donnes reues : la faille XSS . . . . . . . . . . 125 Lenvoi de chiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 137
Instructions pour raliser le TP . . . . . . . . . . . . . . . . . . . . . . . . . . 138 Correction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 Aller plus loin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 13 Variables superglobales, sessions et cookies 145
Les variables superglobales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 Les sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 Les cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 14 Lire et crire dans un chier 157
Autoriser lcriture de chiers (chmod) . . . . . . . . . . . . . . . . . . . . . . 158 Ouvrir et fermer un chier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 Lire et crire dans un chier . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
III
165
167
Le langage SQL et les bases de donnes . . . . . . . . . . . . . . . . . . . . . 168 Structure dune base de donnes . . . . . . . . . . . . . . . . . . . . . . . . . 170 Mais o sont enregistres les donnes ? . . . . . . . . . . . . . . . . . . . . . . 172 16 phpMyAdmin 173
Crer une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 Modier une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 Autres oprations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 ix
Se connecter la base de donnes en PHP . . . . . . . . . . . . . . . . . . . . 188 Rcuprer les donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 Les critres de slection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 Construire des requtes en fonction de variables . . . . . . . . . . . . . . . . . 202 Traquer les erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 18 crire des donnes 209
INSERT : ajouter des donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 UPDATE : modier des donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 DELETE : supprimer des donnes . . . . . . . . . . . . . . . . . . . . . . . . . . 215 19 TP : un mini-chat 217
Instructions pour raliser le TP . . . . . . . . . . . . . . . . . . . . . . . . . . 218 Correction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 Aller plus loin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 20 Les fonctions SQL 225
Les fonctions scalaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 Les fonctions dagrgat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 GROUP BY et HAVING : le groupement de donnes . . . . . . . . . . . . . . . . 234 21 Les dates en SQL 237
Les champs de type date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 Les fonctions de gestion des dates . . . . . . . . . . . . . . . . . . . . . . . . . 240 22 TP : un blog avec des commentaires 243
Instructions pour raliser le TP . . . . . . . . . . . . . . . . . . . . . . . . . . 244 Correction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 Aller plus loin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252 23 Les jointures entre tables 257
Modlisation dune relation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 Quest-ce quune jointure ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 Les jointures internes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 Les jointures externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 x
SOMMAIRE
IV
269
271
Activer la bibliothque GD . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 Les bases de la cration dimage . . . . . . . . . . . . . . . . . . . . . . . . . 272 Texte et couleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 Dessiner une forme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 Des fonctions encore plus puissantes . . . . . . . . . . . . . . . . . . . . . . . 283 25 Les expressions rgulires (partie 1/2) 291
O utiliser une regex ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292 Des recherches simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 Les classes de caractres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 Les quanticateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 26 Les expressions rgulires (partie 2/2) 303
Une histoire de mtacaractres . . . . . . . . . . . . . . . . . . . . . . . . . . 304 Les classes abrges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305 Construire une regex complte . . . . . . . . . . . . . . . . . . . . . . . . . . 306 Capture et remplacement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 27 La programmation oriente objet Crer une classe 319
Quest-ce quun objet ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 Crer un objet partir de la classe . . . . . . . . . . . . . . . . . . . . . . . . 329 Constructeur, destructeur et autres fonctions spciales . . . . . . . . . . . . . 331 Lhritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 Les droits daccs et lencapsulation . . . . . . . . . . . . . . . . . . . . . . . 336 28 Organiser son code selon larchitecture MVC 339
Quest-ce que larchitecture MVC ? . . . . . . . . . . . . . . . . . . . . . . . . 340 Le code du TP blog et ses dfauts . . . . . . . . . . . . . . . . . . . . . . . . 342 Amlioration du TP blog en respectant larchitecture MVC . . . . . . . . . . 344 Aller plus loin : les frameworks MVC . . . . . . . . . . . . . . . . . . . . . . . 349 29 TP : crer un espace membres 351 xi
SOMMAIRE Conception de lespace membres . . . . . . . . . . . . . . . . . . . . . . . . . 352 Ralisation des pages principales de lespace membres . . . . . . . . . . . . . 355 Aller plus loin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
Annexes
361
363
A Codez proprement
Des noms clairs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364 Indentez votre code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366 Un code correctement comment . . . . . . . . . . . . . . . . . . . . . . . . . 367 B Utilisez la documentation PHP ! 371
Accder la doc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 Prsentation dune fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374 C Au secours ! Mon script plante ! 379
Les erreurs les plus courantes . . . . . . . . . . . . . . . . . . . . . . . . . . . 380 Traiter les erreurs SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382 Quelques erreurs plus rares . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383 D Protger un dossier avec un .htaccess 387
Crer le .htaccess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 Crer le .htpasswd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389 Envoyer les chiers sur le serveur . . . . . . . . . . . . . . . . . . . . . . . . . 391 E Mmento des expressions rgulires 393
Structure dune regex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394 Classes de caractres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394 Quanticateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394 Mtacaractres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 Classes abrges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 Capture et remplacement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396 Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
xii
Premire partie
Chapitre
1
Dicult :
Introduction PHP
e qui fait le succs du Web aujourdhui, cest la fois sa simplicit et sa facilit daccs. Un internaute lambda na 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 dun site web. Quest-ce quun serveur et un client ? Comment rend-on son site dynamique ? Que signient PHP et MySQL ? Ce premier chapitre est l pour rpondre toutes ces questions et vous montrer que vous tes capables dapprendre crer des sites web dynamiques. Tous les lecteurs seront la n rassurs de savoir quils commencent au mme niveau !
Fig. 1.1 LlPHPant, la mascotte de PHP Lobjectif de ce cours est de vous rendre capables de raliser des sites web dynamiques entirement par vous-mmes, pas pas. En eet, 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 sinscrire sur votre site et avoir accs des sections qui leur sont rserves ; un forum : il est courant aujourdhui de voir les sites web proposer un forum de discussion pour sentraider ou simplement 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 dy naviguer ! des actualits : vous pouvez automatiser lcriture dactualits, en orant vos visiteurs la possibilit den 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.
1 Vous pouvez lire sur le Site du Zro le cours HTML/CSS que jai rdig pour vous mettre niveau (code web : 235029) ou bien vous procurer mon livre Russir son site web avec XHTML et CSS aux ditions Eyrolles.
COMMENT FONCTIONNE UN SITE WEB ? Bien entendu, ce ne sont l que des exemples. Il est possible daller 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 dlevage virtuel danimaux, 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 ?
CHAPITRE 1. INTRODUCTION PHP La plupart du temps, le serveur est dpourvu dcran : il reste allum et travaille tout seul sans intervention humaine, 24 h/24, 7 j/7. Un vrai forat du travail. On rsume : votre ordinateur est appel le client, tandis que lordinateur qui dtient le site web est appel le serveur. Comment les deux communiquent-ils ? Cest justement l que se fait la dirence entre un site statique et un site dynamique. Voyons ensemble ce qui change.
Fig. 1.4 Transferts avec un site statique La communication est donc plutt basique : Bonjour, je suis le client, je voudrais voir cette page web. Tiens, voil la page que tu mas demande. Sur un site statique, il ne se passe rien dautre. Le serveur stocke des pages web et les envoie aux clients qui les demandent sans les modier.
Fig. 1.5 Transfert avec un site dynamique Cest comme cela que certains sites parviennent acher par exemple votre pseudonyme sur toutes les pages. tant donn que le serveur gnre une page chaque fois quon lui en demande une, il peut la personnaliser en fonction des gots et des prfrences du visiteur (et acher, entre autres, son pseudonyme).
CSS : cest le langage de mise en forme des sites web. Alors que le HTML permet dcrire le contenu de vos pages web et de les structurer, le langage CSS soccupe de la mise en forme et de la mise en page. Cest en CSS que lon choisit notamment la couleur, la taille des menus et bien dautres choses encore. Voici un code CSS :
div.banner { text-align: center; font-weight: bold; font-size: 120%; }
CHAPITRE 1. INTRODUCTION PHP 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 HTML et CSS. Le problme, cest que lorsquon connat seulement HTML et CSS, on ne peut produire que des sites statiques. . . et non des sites dynamiques ! Pour ces derniers, il est ncessaire de manipuler dautres langages en plus de HTML et CSS. La question quil faut vous poser est donc : connaissez-vous HTML et CSS ? Si oui, cest 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 diciles, ils sont la porte de tous. Vous pouvez les apprendre en lisant mon cours sur HTML et CSS2 . Sachez quapprendre ces langages nest laaire que de quelques petites semaines, voire moins si vous avez susamment de temps libre.
MySQL : cest ce quon appelle un SGBD (Systme de Gestion de Base de Donnes). Pour faire simple, son rle est denregistrer des donnes de manire organise an de vous aider les retrouver facilement plus tard. Cest 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 sappelle le SQL. Voici un code en langage SQL :
2 Disponible
PHP et MySQL sont ce quon 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 de PHP et de MySQL du jour au lendemain, et a cest trs important ! Dautre part, PHP et MySQL sont disponibles gratuitement. Cela signie une chose essentielle : vous naurez pas dbourser un centime pour construire votre site web ! PHP peut fonctionner seul et sut crer un site dynamique, mais les choses deviennent rellement intressantes lorsquon le combine un SGBD tel que MySQL. Cependant pour simplier, oublions pour le moment MySQL et concentrons-nous sur PHP.
Fig. 1.7 PHP dcide ce qui va tre ach 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 HTML 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, ache Bienvenue Jonathan sur la page web. En revanche, si ce nest pas un membre de mon site, ache Bienvenue la place et propose au visiteur de sinscrire. Cest un exemple trs basique de site dynamique : selon que vous tes un membre enregistr ou non, vous ne verrez pas les mmes choses et naurez peut-tre pas accs toutes les sections. 9
Et la concurrence ?
HTML et CSS nont 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 dtre 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 dabord, 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 dirents du second.
Fig. 1.8 Ruby on Rails Je ne peux pas prsenter ici tous les concurrents, mais cela devrait dj vous donner une bonne ide. Pour information, il est aussi possible dutiliser 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).
3 Un
4 Cest
framework est un ensemble de bibliothques qui fournissent des services pour les dveloppeurs. ce qui est utilis sur le site des impts franais, par exemple.
10
ET LA CONCURRENCE ? tant donn lobjet 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 laise 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. Cest 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 ny a pas de meilleur choix. Je vous recommande le langage pour lequel vous serez certains davoir quelquun pour vous aider. PHP en ce sens est souvent un trs bon choix.
Fig. 1.9 Oracle L encore, cette liste est loin dtre 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 n de compte, si vos moyens sont limits, vous navez 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. 11
En rsum
Il existe deux types de sites web : les sites statiques : raliss en HTML et CSS, leur contenu ne peut tre mis jour que par le webmaster ; les sites dynamiques : raliss avec dautres outils comme PHP et MySQL en plus de HTML et CSS, ils permettent aux visiteurs de participer la vie du site, de poster des messages. . . bref, de rendre le site vivant ! Les visiteurs du site sont appels les clients. Ils demandent au serveur qui hberge le site de leur transmettre les pages web. PHP est un langage excut par le serveur. Il permet de personnaliser la page en fonction du visiteur, de traiter ses messages, deectuer des calculs, etc. Il gnre une page HTML. MySQL est un systme de gestion de bases de donnes. Il se charge du stockage des informations (liste des messages, des membres. . .).
12
Chapitre
2
Dicult :
ous savons dsormais que PHP sexcute sur le serveur et que son rle est de gnrer des pages web. Cependant, seul un serveur peut lire du PHP ; or votre ordinateur nest pas un serveur. Comment diable allez-vous pouvoir crer un site dynamique si PHP ne fonctionne pas chez vous ? Qu cela ne tienne : nous allons temporairement transformer votre ordinateur en serveur pour que vous puissiez excuter du PHP et travailler sur votre site dynamique. Vous serez n prts programmer aprs avoir lu ce chapitre !
13
Fig. 2.1 Mozilla Firefox Cependant, pour ceux qui comme nous travaillent sur des sites dynamiques, ces outils ne susent pas. Il est ncessaire dinstaller des programmes supplmentaires.
SOUS WINDOWS : WAMP Ces programmes dont nous allons avoir besoin, quels sont-ils ? Apache : cest ce quon appelle un serveur web. Il sagit du plus important de tous les programmes, car cest lui qui est charg de dlivrer les pages web aux visiteurs. Cependant, Apache ne gre que les sites web statiques 1 . Il faut donc le complter avec dautres programmes. PHP : cest un plug-in pour Apache qui le rend capable de traiter des pages web dynamiques en PHP. En clair, en combinant Apache et PHP, notre ordinateur sera capable de lire des pages web en PHP. MySQL : cest le logiciel de gestion de bases de donnes dont je vous ai parl en introduction. Il permet denregistrer des donnes de manire organise2 . Nous nen aurons pas besoin immdiatement, mais autant linstaller de suite.
Fig. 2.2 Logo dApache Tous ces lments qui vont nous aider crer notre site dynamique sont libres et gratuits. Certes, il en existe dautres (parfois payants), mais la combinaison Apache + PHP + MySQL est la plus courante sur les serveurs web, tel point quon a cr des packs tout prts qui contiennent tous ces lments. Il est possible de les installer un un mais cela prend plus de temps et vous nallez rien y gagner3 . Dans la suite de ce chapitre, nous allons voir comment installer le pack qui convient en fonction de votre systme dexploitation.
15
CHAPITRE 2. PRPARER SON ORDINATEUR Lorsque vous lancez WAMP, une icne doit apparatre en bas droite de la barre des tches, ct de lhorloge, comme sur la gure 2.3.
Fig. 2.3 Icne de WAMP Si une fentre apparat pour vous indiquer que le pare-feu bloque Apache, cliquez sur Dbloquer (g. 2.4). Vous navez aucune raison de vous inquiter, cest parfaitement normal.
Fig. 2.4 Firewall et Apache Par dfaut, WAMP est en anglais. Vous pouvez facilement le passer en franais en faisant un clic droit sur licne de WAMP dans la barre des tches, puis en allant dans le menu Language / french (g. 2.5).
SOUS WINDOWS : WAMP Vous pouvez alors lancer la page daccueil de WAMP. Faites un clic gauche sur licne de WAMP (attention, jai bien dit un clic gauche cette fois), puis cliquez sur Localhost, comme le montre la gure 2.6.
Une page web similaire la capture de la gure 2.7 devrait souvrir dans votre navigateur favori (Firefox, par exemple). Si la page sache chez vous, cela signie quApache fonctionne.
CHAPITRE 2. PRPARER SON ORDINATEUR La page web que vous voyez lcran 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 dun serveur web sur votre propre machine. Pour le moment, vous tes le seul internaute pouvoir y accder. On dit que lon travaille en local . Notez que lURL ache par le navigateur dans la barre dadresse est http://localhost/, ce qui signie que vous naviguez sur un site web situ sur votre propre ordinateur. La section Vos projets de la page daccueil de WAMP doit indiquer quaucun projet nexiste 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 lexplorateur Windows et rendez-vous dans le dossier o WAMP a t install, puis dans le sous-dossier intitul www. Par exemple : C:\wamp\www. Une fois dans ce dossier, crez un nouveau sous-dossier que vous appellerez tests, comme le suggre limage 2.8.
Fig. 2.8 Dossier cr pour WAMP Retournez sur la page daccueil de WAMP et actualisez-la (vous pouvez appuyer sur la 18
SOUS WINDOWS : WAMP touche F5). La section Vos projets devrait maintenant acher tests car WAMP a dtect que vous avez cr un nouveau dossier (g. 2.9).
Fig. 2.9 Projets dans WAMP Vous crerez l-dedans vos premires pages web en PHP. Vous pouvez cliquer sur le lien tests . Comme vous navez pas encore cr de chier PHP, vous devriez voir une page vide comme dans la gure 2.10.
Fig. 2.10 Le contenu est pour le moment vide Si vous avez le mme rsultat, cela signie que tout fonctionne. Bravo, vous avez install WAMP et il fonctionne correctement. Vous tes prts programmer en PHP ! Vous pouvez passer les sections suivantes qui ne concernent que les utilisateurs sous Mac OS X et Linux. 19
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 le logiciel. Lorsque vous louvrez, la fentre de la gure 2.12 apparat. 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. Licne de chacun de ces lments doit tre verte comme sur la gure 2.13. Je vous invite congurer le rpertoire dans lequel Apache ira chercher les chiers PHP de votre site web. Pour cela, cliquez sur le bouton Prfrences de la fentre principale. Une bote de dialogue de conguration souvre (gure 2.14). Cliquez sur longlet Apache en haut. Cliquez sur le bouton Choisir pour slectionner le dossier dans lequel vous placerez les chiers de votre site web. Sous Mac OS, un dossier est dj cr : il sagit de Sites , dans votre rpertoire personnel (g. 2.15). 20
21
22
SOUS LINUX : XAMPP Slectionnez ce rpertoire5 , qui devrait tre de la forme /Users/pseudo/Sites. Validez les changements et retournez sur la fentre principale de MAMP. L, cliquez sur Ouvrir la page daccueil . Votre navigateur (Firefox ou Safari, par exemple) devrait alors souvrir et acher une page web. Pour vous prparer pour la suite, je vous invite crer un dossier tests dans votre rpertoire Sites . Nous placerons nos premiers chiers PHP de test lintrieur. Si le dossier tests a t correctement cr, vous pouvez visualiser son contenu en vous rendant ladresse http://localhost:8888/tests/. Si tout va bien, une page vide devrait sacher (gure 2.16).
Fig. 2.16 Dossier vide MAMP MAMP est correctement install et congur. Vous tes maintenant prts travailler en PHP pour le chapitre suivant !
23
Fig. 2.17 Tlchargement de XAMPP pour Linux XAMPP est aussi disponible pour Windows et Mac OS X comme vous pourrez le constater sur le site. La mthode dinstallation est sensiblement dirente, mais vous pouvez lessayer si vous avez dj test WAMP (pour Windows) ou MAMP (pour Mac OS X) et quil ne vous convient pas. Sur la page qui sache, recherchez un peu plus bas le lien de tlchargement de XAMPP pour Linux.
Fig. 2.18 Lien de tlchargement de XAMPP Une fois le tlchargement termin, ouvrez une console. Linstallation et le lancement de XAMPP se font en eet uniquement en console6 . Rendez-vous dans le dossier dans lequel vous avez tlcharg XAMPP. Par exemple, dans mon cas, le chier se trouve sur le bureau : cd ~/Desktop Vous devez passer root pour installer et lancer XAMPP. root est le compte administrateur de la machine qui a notamment le droit dinstaller des programmes. Normalement, il sut de taper su et de rentrer le mot de passe root. Sous Ubuntu, il faudra taper sudo su et taper votre mot de passe habituel. Si comme moi vous utilisez Ubuntu, tapez donc : sudo su Vous devez maintenant extraire le dossier compress dans /opt. Pour ce faire, recopiez simplement la commande suivante : tar xvfz xampp-linux-1.6.7.tar.gz -C /opt
6 Allons, allons, pas de chichis, vous nallez pas me faire avaler que cest la premire fois que vous louvrez, la console !
24
SOUS LINUX : XAMPP Il se peut que le nom du chier soit lgrement dirent si le numro de version a chang. Adaptez le nom du chier en le compltant automatiquement laide de la touche Tabulation. Lorsque la dcompression des chiers est termine, cest fait ! XAMPP est maintenant install. Pour dmarrer XAMPP (et donc Apache, PHP et MySQL), tapez la commande suivante : /opt/lampp/lampp start Si vous dsirez plus tard arrter XAMPP, tapez : /opt/lampp/lampp stop
Noubliez pas que vous devez tre root lorsque vous dmarrez ou arrtez XAMPP. Ce nest pas bien compliqu, comme vous pouvez le voir ! Vous pouvez maintenant tester XAMPP en ouvrant votre navigateur favori et en tapant ladresse suivante : http://localhost. Vous devriez voir la page de slection de la langue de XAMPP. Cliquez sur Franais , comme la gure 2.19 vous y invite.
Fig. 2.19 Choix de la langue dans XAMPP La page principale de conguration de XAMPP sache 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). Vous pouvez vrier que tout fonctionne correctement en allant dans le menu Statut, comme dans la gure 2.20. Au minimum, les modules MySQL et PHP doivent tre en vert. Quant aux autres, nous ne les utiliserons pas, donc peu importe. ;-) Les chiers PHP devront tre placs dans le rpertoire /opt/lampp/htdocs. Vous pouvez y crer un sous-rpertoire tests pour vos premiers tests. 25
cd /opt/lampp/htdocs mkdir tests Une fois le dossier cr, vous pouvez y accder depuis votre navigateur ladresse suivante : http://localhost/tests. Vous devriez voir une page similaire la gure 2.21. Vous tes prts travailler en PHP !
Fig. 2.21 Le dossier tests est actuellement vide dans XAMPP Je vous propose donc dinstaller un logiciel qui va vous permettre dditer vos chiers source de manire ecace. Vous en avez probablement dj install un si vous avez appris programmer en HTML / CSS, mais comme on nest jamais trop prudent, je vais rapidement vous en prsenter quelques-uns en fonction de votre systme dexploitation. Voici le code source HTML que nous allons utiliser pour commencer en terrain connu. Copiez-collez ce code dans lditeur de texte que je vais vous faire installer :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/x html1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>Ceci est une page 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 HTML.<br
27
<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>
Code web : 589020 Il ny a pas de PHP pour linstant an de commencer en douceur. Nous allons simplement essayer denregistrer un chier HTML avec ce code pour nous chauer.
Sous Windows
Il existe beaucoup de logiciels gratuits tlcharger pour diter du texte sous Windows. Il mest impossible de tous vous les prsenter : je vais donc vous en recommander un qui est trs utilis et en lequel vous pouvez avoir conance : Notepad++. Ce logiciel est petit et rapide tlcharger. Nhsitez pas lessayer. Code web : 105790 Lorsque Notepad++ souvre, il prsente gnralement comme vous le montre la gure 2.22 un chier vide (vous pouvez en crer un nouveau au besoin en allant dans le menu Fichier / Nouveau). Copiez-collez le code HTML que je viens de vous donner dans Notepad++. Vous devriez voir lcran de la gure 2.23. Comme vous pouvez le voir, le code nest pas color. La raison vient du fait que Notepad++ ne sait pas de quel type de code source il sagit. Vous devez au pralable enregistrer le chier. Allez dans Fichier / Enregistrer, puis choisissez le dossier o vous souhaitez enregistrer le chier. Je vous conseille daller dans le dossier C:\wamp\www\tests que vous avez cr linstallation de WAMP. Choisissez le type de chier .html7 puis donnez un nom votre chier, ainsi que le montre la gure 2.24. Une fois le chier enregistr, le code source apparat color (gure 2.25). Vous pourrez suivre la mme procdure plus loin avec les chiers PHP, condition denregistrer le chier en .php. a vous entranera, vous verrez.
7 Hyper
28
29
30
Sous Mac OS X
Si vous tes sous Mac, je peux vous recommander lditeur TextWrangler, qui est gratuit. Code web : 606652 Il existe aussi Smultron. Vous pouvez lessayer mais il nest malheureusement plus mis jour. Code web : 295295 Dautres diteurs de texte payants de qualit existent, notamment lexcellent TextMate. Code web : 640856
Sous Linux
Sous Linux, les bons diteurs ne manquent pas. Si vous tes des habitus 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 (g. 2.27) ou tout autre logiciel install avec votre distribution Linux, cela fera laaire. Quel que soit le logiciel que vous utilisez, rassurez-vous, a ne change pas du tout la manire dont vous allez apprendre le PHP : les manipulations seront exactement les mmes pour tout le monde. 31
En rsum
Pour crer des sites web dynamiques, nous devons installer des outils qui transformeront notre ordinateur en serveur an de pouvoir tester notre site. Les principaux outils dont nous avons besoin sont : Apache : le serveur web ; PHP : le programme qui permet au serveur web dexcuter des pages PHP ; MySQL : le logiciel de gestion de bases de donnes. Bien quil soit possible dinstaller ces outils sparment, il est plus simple pour nous dinstaller un paquetage tout prt : WAMP sous Windows, MAMP sous Mac OS X ou XAMPP sous Linux. Il est conseill dutiliser un diteur de texte qui colore le code source comme Notepad++ pour programmer convenablement en PHP.
32
Chapitre
3
Dicult :
ans le premier chapitre, nous avons dcouvert le principe de fonctionnement du PHP. Ici, nous allons passer au concret et raliser notre toute premire page web en PHP.
Ne vous attendez pas un rsultat extraordinaire, mais cela va nous permettre de prendre nos marques. Vous allez en particulier comprendre comment on spare le code HTML classique du code PHP. Vous tes prts ? Allons-y !
33
Fig. 3.1 Insertion de code PHP Comme vous pouvez le voir, on retrouve le code HTML que lon connat bien. . . et on insre en plus des donnes dynamiques au milieu. Ici, par exemple, cest le pseudonyme : il change en fonction du visiteur. La partie surligne peut donc changer selon les visiteurs. Le Site du Zro fait la mme chose pour ses membres inscrits. Votre pseudonyme est ach en haut des pages lorsque vous tes connects au Site du Zro.
34
On peut sans problme crire la balise PHP sur plusieurs lignes. En fait, cest mme indispensable car la plupart du temps le code PHP fera plusieurs lignes. Cela donnera quelque chose comme :
<?php /* Le code PHP se met ici Et ici Et encore ici */ ?>
Il existe dautres 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.
35
Bien entendu, cette page ne fonctionne pas vu que nous navons pas encore crit de vrai code PHP (ce sont juste des balises dexemple). Tout ce quil vous faut retenir ici, cest que ds que vous voulez mettre du code PHP, hop, vous ouvrez une balise PHP : < ?php ?>. Peut-on placer une balise PHP nimporte o dans le code ?
Oui ! Vraiment nimporte o. Pas seulement dans le corps de la page dailleurs : vous pouvez placer une balise PHP dans len-tte de la page.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/x html1/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 dune balise HTML (bon, ce nest pas trs joli, je vous laccorde) :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/x html1/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/ht ml; charset=iso-8859-1" /> </head>
Il faut se rappeler que PHP gnre du code HTML. Nous allons mieux comprendre le fonctionnement en apprenant acher du texte en PHP. 36
AFFICHER DU TEXTE
Acher du texte
Bon, tout a cest bien beau, mais il serait temps de commencer crire du code PHP, non ? Grande nouvelle : cest maintenant que vous allez apprendre votre premire instruction en PHP. Ne vous attendez pas quelque chose dextraordinaire, votre PC ne va pas se mettre danser la samba tout seul. ;-) Vous allez cependant un peu mieux comprendre comment le PHP fonctionne, cest-dire comment il gnre du code HTML. Il est indispensable de bien comprendre cela, soyez donc attentifs !
Linstruction echo
Le PHP est un langage de programmation, ce qui ntait pas le cas du HTML2 . Si vous avez dj programm dans dautres 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 navez jamais fait de programmation auparavant. Tout langage de programmation contient ce quon appelle des instructions. On en crit une par ligne en gnral, et elles se terminent toutes par un point-virgule. Une instruction commande lordinateur deectuer une action prcise. Ici, la premire instruction que nous allons dcouvrir permet dinsrer du texte dans la page web. Il sagit de linstruction echo, la plus simple et la plus basique de toutes les instructions que vous devez connatre. Voici un exemple dutilisation de cette instruction :
<?php echo "Ceci est du texte"; ?>
Comme vous le voyez, lintrieur de la balise PHP on crit linstruction echo suivie du texte acher entre guillemets. Les guillemets permettent de dlimiter le dbut et la n du texte, ce qui aide lordinateur se reprer. Enn, linstruction se termine par un point-virgule comme je vous lavais annonc, ce qui signie Fin de linstruction. Notez quil existe une instruction identique echo appele print, qui fait la mme chose. Cependant, echo est plus couramment utilise. Il faut savoir quon a aussi le droit de demander dacher des balises. Par exemple, le code suivant fonctionne :
<?php echo "Ceci est du <strong>texte</strong>"; ?>
Le mot texte sera ach en gras grce la prsence des balises <strong> et </strong>.
2 On
parle plutt de langage de description, car il permet de dcrire une page web.
37
Bonne question. Si vous mettez un guillemet, a veut dire pour lordinateur que le texte acher sarrte l. Vous risquez au mieux de faire planter votre beau code et davoir une terrible Parse error . La solution consiste faire prcder le guillemet dun antislash \ :
<?php echo "Cette ligne a t crite \"uniquement\" en PHP."; ?>
Vous savez que le code PHP sinsre au milieu du code HTML. Alors allons-y, prenons une page basique en HTML et plaons-y du code PHP :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/x html1/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 HTML.<br /> <?php echo "Celle-ci a t crite entirement en PHP."; ?>
Code web : 475630 Je vous propose de copier-coller ce code source dans votre diteur de texte et denregistrer la page. Nous allons lessayer et voir ce quelle produit comme rsultat. Mais au fait, vous rappelez-vous comment vous devez enregistrer votre page PHP ?
AFFICHER DU TEXTE Lessentiel, quel que soit votre systme dexploitation, est que le chier soit enregistr dans le dossier www (ou un de ses sous-dossiers) sinon le chier PHP ne pourra pas sexcuter ! Si vous utilisez Notepad++, slectionnez PHP Hypertext Preprocessor file (*.php) dans la fentre pour enregistrer, comme le montre la gure 3.2.
Fig. 3.2 Sauvegarde dune page PHP Une fois la page enregistre, il faut maintenant la tester.
CHAPITRE 3. PREMIERS PAS AVEC PHP souhaitez le comparer au vtre3 . Essayez le code web ci-dessous. Code web : 960791 Alors, que voyez-vous ? Je pense que vous tes tonns et surpris de ce que je vous ai fait faire : a a lair dtre inutile, et ce nest pas tout fait faux. Le code PHP a crit une ligne lcran, tout simplement. Mais euh, cest pas plus simple de lcrire en HTML ?
Si ! Mais vous verrez bientt lintrt de cette fonction. Pour le moment, on constate juste que a crit du texte.
Fig. 3.3 Gnration de HTML par PHP Sur la gure 3.4, vous dcouvrez concrtement ce quil se passe avec notre code source. Le code PHP est excut en premier et lordinateur fait ce quon lui demande. Ici on lui a dit Ache ce texte ici . Une fois toutes les instructions PHP excutes4 , la page qui sort est une page qui ne
3 Je 4 Ici
vous conseille fortement de savoir acher la page chez vous directement. ctait simple, il ny en avait quune !
40
LES COMMENTAIRES contient que du HTML ! Cest cette page de rsultat qui est envoye au visiteur, car celui-ci ne sait lire que le HTML.
Fig. 3.4 Gnration de HTML avec echo Rappelez-vous, seul le serveur peut excuter du PHP. Le PHP nest jamais envoy au visiteur. Pour que nous puissions excuter du PHP sur notre ordinateur (an de faire nos tests), nous avons d le transformer en mini-serveur en installant un programme tel que WAMP.
Les commentaires
Bon, mine de rien je viens de vous apprendre pas mal de choses dun coup, a doit vous faire un choc. Daccord ce ntait pas extraordinaire, mais vous nallez 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, cest--dire quil disparat compltement lors de la gnration de la page. Il ny a que vous qui voyez ce texte. Mais alors, quoi sert un commentaire ?
Cest pour vous. Cela permet de vous y retrouver dans votre code PHP, parce que si vous ny touchez pas pendant des semaines et que vous y revenez, vous risquez dtre un peu perdus. Vous pouvez crire tout et nimporte quoi, le tout est de sen servir bon escient. Il existe deux types de commentaires : les commentaires monolignes ; les commentaires multilignes. 41
CHAPITRE 3. PREMIERS PAS AVEC PHP Tout dpend de la longueur de votre commentaire. Je vais vous prsenter les deux.
Je vous ai mis deux commentaires des endroits dirents : le premier est la n dune ligne ; le second est sur toute une ligne. vous de voir o vous placez vos commentaires : si vous commentez une ligne prcise, mieux vaut mettre le commentaire la n de cette ligne.
Ici, les commentaires nont pas grande utilit, mais vous verrez de quelle faon je les utilise dans les prochains chapitres pour vous dcrire le code PHP.
En rsum
Les pages web contenant du PHP ont lextension .php. Une page PHP est en fait une simple page HTML qui contient des instructions en langage PHP. Les instructions PHP sont places dans une balise < ?php ?>. Pour acher du texte en PHP, on utilise linstruction echo. Il est possible dajouter des commentaires en PHP pour dcrire le fonctionnement du code. On utilise pour cela les symboles // ou /* */. 42
Chapitre
4
Dicult :
ous est-il dj arriv de vouloir modier le menu de votre site et de devoir pour cela corriger le code HTML de chacune de vos pages web ? Le menu dune page web apparat en eet sur chacune des pages et vous avez trs certainement d le recopier sur chacune delles. a marche, mais ce nest pas trs pratique. . . Une des fonctionnalits les plus simples et les plus utiles de PHP est linclusion de pages. On peut trs facilement inclure toute une page ou un bout de page lintrieur dune autre. Cela va grandement vous faciliter la tche en vous vitant davoir copier le mme code HTML plusieurs fois. Au l de ce chapitre, vous allez dcouvrir un des multiples avantages que vous donne le PHP lors de la cration de votre site. Cest dailleurs ce qui ma fait instantanment aimer ce langage lorsque je lai dcouvert, alors que je venais comme vous seulement dapprendre le HTML et le CSS. :-)
43
Le principe
La plupart des sites web sont gnralement dcoups selon le schma 4.1.
Le problme
Jusquici, vous tiez condamns copier sur chaque page lidentique : len-tte ; le menu ; le pied de page. Cela donnait du code lourd et rptitif sur toutes les pages ! Regardez le code dexemple ci-dessous qui reprsente une page web (appelons-la index.php) avec en-tte, menu et pied de page :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "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> <!-- Len-tte -->
44
LE PRINCIPE
<div id="en_tete"> </div> <!-- Le menu --> <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> <!-- Le corps --> <div id="corps"> <h1>Mon super site</h1> Bienvenue sur mon super site !<br /> Vous allez adorer ici, cest un site gnial qui va parler de... euh... Je cherche encore un peu le thme de mon site. :-D </p> </div> <!-- Le pied de page --> <div id="pied_de_page"> <p>Copyright moi, tous droits rservs</p> </div> </body> </html> <p>
Dune page lautre, ce site contiendra chaque fois le mme code pour len-tte, le menu et le pied de page ! En eet, seul le contenu du corps change en temps normal.
La solution
En PHP, nous pouvons facilement insrer dautres pages1 lintrieur dune page. Le principe de fonctionnement des inclusions en PHP est plutt simple comprendre. Vous avez un site web compos de disons vingt pages. Sur chaque page, il y a un menu,
1 On
45
CHAPITRE 4. INCLURE DES PORTIONS DE PAGE 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 modier votre menu, vous naurez qu modier menu.php et lensemble des pages de votre site web sera automatiquement mis jour !
La pratique
Comme je vous le disais, je vous propose de crer un nouveau chier PHP et dy insrer uniquement le code HTML correspondant votre menu, comme ceci :
<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 en fonction des besoins de votre site. Mais. . . la page menu.php ne contiendra pas le moindre code PHP. . . cest normal ? Une page dont lextension est .php peut trs bien ne contenir aucune balise PHP (mme si cest plutt rare). Dans ce cas, cela redevient une page HTML classique qui nest pas modie avant lenvoi. En thorie, vous pourriez trs bien enregistrer votre page avec lextension .html : menu.html. Nanmoins, an dviter de mlanger des pages .php et .html sur votre site, je vous recommande de travailler uniquement avec lextension .php partir de maintenant. Maintenant que vos morceaux de pages sont prts, reprenez les pages de votre site, par exemple la page daccueil nomme index.php. Remplacez le menu par le code PHP suivant2 :
2 Vous noterez que, contrairement echo, jai ici plac des parenthses autour des guillemets. Il faut dire que echo tait un peu une exception. Dornavant vous verrez souvent des parenthses. include est en ralit une structure de langage particulire, comme echo, et peut donc sutiliser avec ou sans parenthses. Pour le moment nous dbutons, donc nous nous contenterons de faire comme cela sans trop rentrer dans les dtails pour ne pas nous brler les ailes. ;-)
46
LA PRATIQUE
<?php include("menu.php"); ?>
Cette instruction ordonne lordinateur : Insre ici le contenu de la page menu.php . Si nous reprenons le code que nous avons vu tout lheure et que nous remplaons chaque code rptitif par un include, cela donne le code source suivant :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "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("menus.php"); ?> <div id="corps"> <h1>Mon super site</h1> <p> Bienvenue sur mon super site !<br /> Vous allez adorer ici, cest un site gnial qui va parler de... euh... 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") ; ?>
Cest le mme principe que pour les liens relatifs, que vous connaissez dj dans le langage HTML. 47
CHAPITRE 4. INCLURE DES PORTIONS DE PAGE 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 quavant ! Le schma 4.2 vous aidera comprendre comment les pages sont incluses.
Fig. 4.2 Les includes en pratique La page nale que reoit le visiteur est identique celle que je vous ai montre au dbut du chapitre. . . mais vous, vous avez normment gagn en exibilit puisque votre code nest plus recopi 150 fois inutilement. Le nombre dinclude par page nest pas limit, par consquent vous pouvez dcouper votre code en autant de sous-parties que vous le souhaitez !
En rsum
Une page PHP peut inclure une autre page (ou un morceau de page) grce linstruction include. Linstruction include sera remplace par le contenu de la page demande. Cette technique, trs simple mettre en place, permet par exemple de placer les menus de son site dans un chier menus.php que lon inclura dans toutes les pages. Cela permet de centraliser le code des menus alors quon tait auparavant oblig de le copier dans chaque page sur nos sites statiques en HTML et CSS !
48
Chapitre
5
Dicult :
Les variables
ttention, chapitre fondamental ! Les variables sont un lment indispensable dans tout langage de programmation, et en PHP on ny chappe pas. Ce nest pas un truc de programmeurs tordus, cest au contraire quelque chose qui va nous simplier la vie. Sans les variables, vous nirez 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, eectuer des calculs et bien dautres choses !
49
50
QUEST-CE QUUNE VARIABLE ? Les chanes de caractres (string) : les chanes de caractres sont le nom informatique quon donne au texte. Tout texte est appel chane de caractres. En PHP, ce type de donnes a un nom : string. On peut stocker des textes courts comme trs longs au besoin. Exemple : Je suis un texte . Une chane de caractres est habituellement crite entre guillemets ou entre apostrophes2 : Je suis un texte. Les deux fonctionnent mais il y a une petite dirence que lon va dcouvrir plus loin. Les nombres entiers (int) : ce sont les nombres du type 1, 2, 3, 4, etc. On compte aussi parmi eux les entiers relatifs : -1, -2, -3. . . Exemple : 42. Les nombres dcimaux (float) : ce sont les nombres virgule, comme 14,738. On peut stocker de nombreux chires aprs la virgule, ce qui devrait convenir pour la plupart des usages que vous en ferez. Attention, les nombres doivent tre crits avec un point au lieu de la virgule (cest la notation anglaise). Exemple : 14.738. Les boolens (bool) : cest un type trs important qui permet de stocker soit vrai soit faux. Cela permet de retenir si une information est vraie ou fausse. On les utilise trs frquemment. On crit true pour vrai, et false pour faux. Exemple : true. Rien (NULL) : aussi bizarre que cela puisse paratre, on a parfois besoin de dire quune variable ne contient rien. Rien du tout. On indique donc quelle vaut NULL. Ce nest pas vraiment un type de donnes, mais plutt labsence de type. La gure 5.1 vous rsume ce quil faut retenir des dirents types dinformations quest capable de stocker PHP dans les variables.
Cela devrait vous donner une ide de tout ce quest capable de stocker PHP en mmoire. Ces types suront pour la cration de notre site ! Maintenant, passons aux choses concrtes. Comment crer une variable et comment acher ce quelle contient ?
2 On
51
Avec ce code PHP, on vient en fait de crer une variable : son nom est age_du_visiteur ; sa valeur est 17. Notez quon ne peut pas mettre despace dans un nom de variable. la place, utilisez un underscore _ 3 . Pour le nom, vitez aussi les accents, les cdilles et tout autre symbole : PHP ne les apprcie pas trop. . . Analysons dans le dtail le code quon vient de voir. Dabord, on crit le symbole dollar ($) : il prcde toujours le nom dune variable. Cest comme un signe de reconnaissance si vous prfrez : a permet de dire PHP Jutilise une variable . Vous reconnatrez toujours quil y a une variable par la prsence du symbole dollar ($). Ensuite, il y a le signe gal (=) : celui-l cest logique, cest pour dire que $age_du_visiteur est gal . . . la suite, il y a la valeur de la variable, ici 17. Enn, il y a lincontournable point-virgule ( ;) qui permet de terminer linstruction. Concrtement, quest-ce que le code prcdent acherait ? Rien du tout ! Eh oui, tant que vous nutilisez pas echo, rien ne sache. L, le serveur a juste cr la variable temporairement en mmoire, mais il na rien fait dautre. Supposons maintenant que lon crive ceci :
<?php $age_du_visiteur = 17; // La variable est cre et vaut 17 $age_du_visiteur = 23; // La variable est modifie et vaut 23 $age_du_visiteur = 55; // La variable est modifie et vaut 55 ?>
Que se passera-t-il ? La variable $age_du_visiteur va tre cre et prendre pour valeur, dans lordre : 17, 23, puis 55. Tout cela va trs vite, lordinateur tant trs rapide vous naurez pas le temps de dire ouf que tout ce code PHP aura t excut.
3 Cest
52
AFFECTER UNE VALEUR UNE VARIABLE Comme tout lheure, rien ne sache. Seulement, quelque part dans la mmoire de lordinateur, 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 lchapper comme on la vu prcdemment en insrant un antislash devant. Il en va de mme pour les guillemets doubles. Voici un exemple pour bien comprendre :
<?php $variable = "Mon \"nom\" est Mateo21"; $variable = Je m\appelle Mateo21; ?>
En eet, si vous oubliez de mettre un antislash, PHP va croire que cest la n de la chane et il ne comprendra pas le texte qui suivra5 . Vous pouvez en revanche insrer sans problme des guillemets simples au milieu de guillemets doubles et inversement :
<?php $variable = Mon "nom" est Mateo21; $variable = "Je mappelle Mateo21"; ?>
La dirence est subtile, faites attention. Il y a dailleurs une dirence plus importante entre les deux types de guillemets dont nous parlerons plus loin.
4 Attention, 5 Vous
53
CHAPITRE 5. LES VARIABLES Le type int (nombre entier) On vient de lutiliser pour nos exemples prcdents. Il sut tout simplement dcrire le nombre que vous voulez stocker, sans guillemets.
<?php $age_du_visiteur = 17; ?>
Le type float (nombre dcimal) Vous devez crire votre nombre avec un point au lieu dune virgule. Cest la notation anglaise.
<?php $poids = 57.3; ?>
Le type bool (boolen) Pour dire si une variable vaut vrai ou faux, vous devez crire le mot true ou false sans guillemets autour (ce nest pas une chane de caractres !). Je vous conseille de bien choisir le nom de votre variable pour que lon comprenne ce que a signie. Voyez vous-mmes :
<?php $je_suis_un_zero = true; $je_suis_bon_en_php = false; ?>
Une variable vide avec NULL Si vous voulez crer une variable qui ne contient rien, vous devez lui passer le mot-cl NULL6 .
<?php $pas_de_valeur = NULL; ?>
Cela sert simplement indiquer que la variable ne contient rien, tout du moins pour le moment.
6 Vous
54
Comme vous le voyez, il sut dcrire le nom de la variable que vous voulez acher. Au fait, on ne doit pas mettre de guillemets aprs le echo comme tu nous as appris ? Non, quand il sagit dune variable on ne met pas de guillemets autour. Crez un chier PHP avec ce code source pour le tester. Inutile de mettre tout le code HTML autour, ce nest pas grave, ce ne sera pas une vraie page HTML valide mais cest bien susant pour nos tests. Vous devriez voir, ainsi que vous le montre la gure 5.2, le rsultat sacher sur un fond blanc dans votre navigateur.
Fig. 5.2 Achage dune variable Le nombre contenu lintrieur de la variable sache dans la page (ici 17).
La concatnation
Non, ce nest pas une insulte. Cela signie assemblage. ;-) En fait, crire 17 tout seul comme on la fait nest pas trs parlant. On aimerait crire du texte autour pour dire : Le visiteur a 17 ans . La concatnation est justement un moyen dassembler du texte et des variables. Comment faire cela ? Les petits malins auront lide dcrire trois instructions echo :
<?php $age_du_visiteur = 17;
55
Fig. 5.3 Ajouter du texte autour dune variable Mais il y a plus malin. On peut tout faire sur une ligne. Pour cela, il y a deux mthodes et cest justement maintenant que le fait dutiliser des guillemets simples ou doubles va faire la dirence. Concatner avec des guillemets doubles Avec des guillemets doubles, cest le plus simple. Vous pouvez crire le nom de la variable au milieu du texte et il sera remplac par sa valeur. Concrtement, essayez ce code :
<?php $age_du_visiteur = 17; echo "Le visiteur a $age_du_visiteur ans"; ?>
a ache : Le visiteur a 17 ans. En eet, lorsque vous utilisez des guillemets doubles, les variables qui se trouvent lintrieur sont analyses et remplaces par leur vraie valeur. a a le mrite dtre une solution facile utiliser, mais je vous recommande plutt celle des guillemets simples, que nous allons voir ds prsent. Concatner avec des guillemets simples Si vous crivez le code prcdent entre guillemets simples, vous allez avoir une drle de surprise :
<?php $age_du_visiteur = 17; echo Le visiteur a $age_du_visiteur ans; // Ne marche pas ?>
Eh bien si ! Mais cette fois, il va falloir crire la variable en dehors des guillemets et sparer les lments les uns des autres laide dun point. Regardez :
<?php $age_du_visiteur = 17; echo Le visiteur a . $age_du_visiteur . ans; ?>
Cette fois, a ache bien comme on voulait : Le visiteur a 17 ans. a a lair bien plus compliqu, mais en fait cest cette mthode quutilisent la plupart des programmeurs expriments en PHP. En eet, le code est plus lisible, on repre bien la variable alors que tout lheure elle tait comme noye dans le texte. Dautre part, votre diteur de texte devrait vous colorer la variable, ce quil ne faisait pas pour le code prcdent. Il faut noter aussi que cette mthode dcriture est un choua plus rapide car PHP voit de suite o se trouve la variable et na pas besoin de la chercher au milieu du texte. Dornavant, jcrirai toutes mes chanes de caractres entre guillemets simples ( de rares exceptions prs) et jutiliserai la seconde mthode de concatnation quon vient de voir. Prenez le temps de vous habituer lutiliser et cela nira par devenir compltement naturel pour vous.
57
= = = =
2 + 4; // $nombre prend la valeur 6 5 - 1; // $nombre prend la valeur 4 3 * 5; // $nombre prend la valeur 15 10 / 2; // $nombre prend la valeur 5
// Allez on rajoute un peu de difficult $nombre = 3 * 5 + 1; // $nombre prend la valeur 16 $nombre = (1 + 2) * 2; // $nombre prend la valeur 6 ?>
Allez quoi, boudez pas, un peu de calcul mental a na jamais fait de mal personne. Vriez mes calculs, comme vous pouvez le voir il ny 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 :
<?php $nombre = 10; $resultat = ($nombre + 5) * $nombre; // $resultat prend la valeur 150 ?>
Cest de la pure logique, je ne peux rien vous dire de plus. Si vous avez compris ces bouts de code, vous avez tout compris.
Le modulo
Il est possible de faire un autre type dopration un peu moins connu : le modulo. Cela reprsente le reste de la division entire. Par exemple, 6 / 3 = 2 et il ny a pas de reste. En revanche, 7 / 3 = 28 et il reste 1. Vous avez fait ce type de calculs lcole primaire, souvenez-vous ! Le modulo permet justement de rcuprer ce reste . Pour faire un calcul avec un modulo, on utilise le symbole %.
<?php $nombre = 10 % 5; // $nombre prend la valeur 0 car la division tombe juste
8 Car
58
En rsum
Une variable est une petite information qui reste stocke en mmoire le temps de la gnration de la page PHP. Elle a un nom et une valeur. Il existe plusieurs types de variables qui permettent de stocker dirents types dinformations : du texte (string), des nombres entiers (int), des nombres dcimaux (float), des boolens pour stocker vrai ou faux (bool), etc. En PHP, un nom de variable commence par le symbole dollar : $age par exemple. La valeur dune variable peut tre ache avec linstruction echo. Il est possible de faire des calculs mathmatiques entre plusieurs variables : addition, soustraction, multiplication. . .
59
60
Chapitre
6
Dicult :
Les conditions
e chapitre est dune importance capitale. En eet, vous serez trs souvent amens employer des conditions dans vos pages web PHP.
quoi servent les conditions ? On a parfois besoin dacher des choses direntes en fonction de certaines donnes. Par exemple, si cest le matin, vous voudrez dire Bonjour votre visiteur ; si cest le soir, il vaudra mieux dire Bonsoir . Cest l quinterviennent les conditions. Elles permettent de donner des ordres dirents PHP selon le cas. Pour notre exemple, on lui dirait : Si cest le matin, ache Bonjour . Sinon, si cest le soir, ache Bonsoir . Vous allez voir que les conditions constituent vraiment la base pour rendre votre site dynamique, cest--dire pour acher des choses direntes en fonction du visiteur, de la date, de lheure de la journe, etc. Voil pourquoi ce chapitre est si important ! Allez, on y va !
61
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 lgalit, dire Si cest gal . . . . Dans les conditions, on utilisera toujours le double gal (==).
Les symboles suprieur (>) et infrieur (<) sont situs en bas gauche de votre clavier.
62
Ici, on demande PHP : si la variable $age est infrieure ou gale 12, ache Salut gamin ! . Vous remarquerez que dans la quasi-totalit des cas, cest sur une variable quon fait la condition. Dans notre exemple, on travaille sur la variable $age. Ce qui compte ici, cest quil y a deux possibilits : soit la condition est remplie (lge est infrieur ou gal 12 ans) et alors on ache 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 acher un autre message si lge est suprieur 12 ans :
<?php $age = 8; if ($age <= 12) // SI lge 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 lautorisation dentrer ? La rponse est : $autorisation_entrer" ; ?>
1 Vous
63
CHAPITRE 6. LES CONDITIONS Code web : 182557 Bon : comment marche ce code ? Tout dabord, jai mis plusieurs instructions entre accolades. Ensuite, vous avez remarqu que jai ajout le mot else ( sinon ). En clair, on demande : Si lge est infrieur ou gal 12 ans, fais ceci, sinon fais cela. Essayez ce bout de code chez vous, en vous amusant modier la valeur de $age (sur la premire ligne). Vous allez voir que le message qui sache change en fonction de lge que vous indiquez ! Bien entendu, vous mettez les instructions que vous voulez entre accolades. Ici par exemple, jai donn une valeur dirente la variable $autorisation_entrer aprs avoir ach un message, valeur qui pourrait nous servir par la suite :
<?php if ($autorisation_entrer == "Oui") // SI on a lautorisation dentrer { // instructions excuter quand on est autoris entrer } elseif ($autorisation_entrer == "Non") // SINON SI on na pas lautorisation dentrer { // instructions excuter quand on nest pas autoris entrer } else // SINON (la variable ne contient ni Oui ni Non, on ne peut pas agir) { echo "Euh, je ne connais pas ton ge, tu peux me le rappeler sil te plat ? "; } ?>
Ouh l, a commence se compliquer un tantinet, nest-ce pas ? La principale nouveaut ici, cest le mot-cl elseif qui signie sinon si . Dans lordre, PHP rencontre les conditions suivantes : 1. si $autorisation_entrer est gale Oui , tu excutes ces instructions. . . 2. sinon si $autorisation_entrer est gale Non , tu excutes ces autres instructions. . . 3. sinon, tu redemandes lge pour savoir si on a ou non lautorisation dentrer.
Au fait, au dpart, une variable ne contient rien. Sa valeur est vide, on dit quelle vaut NULL, cest--dire rien du tout. Pour vrier si la variable est vide, vous pouvez taper : if ($variable == NULL). . .
64
Voil, jusque-l rien dextraordinaire. Vous avez vu que je nai pas mis de guillemets pour true et false, comme je vous lai dit dans le chapitre sur les variables. Mais un des avantages des boolens, cest quils sont particulirement adapts aux conditions. Pourquoi ? Parce quen fait vous ntes pas obligs dajouter le == true. Quand vous travaillez sur une variable boolenne, PHP comprend trs bien ce que vous avez voulu dire :
<?php if ($autorisation_entrer) { echo "Bienvenue petit Zro. :o)"; } else { echo "Tas pas le droit dentrer !"; } ?>
PHP comprend quil faut quil vrie si $autorisation_entrer vaut true. Avantages : cest plus rapide crire pour vous ; a se comprend bien mieux. En eet, si vous lisez la premire ligne, a donne : SI on a lautorisation dentrer. . . . Cest donc un raccourci connatre quand on travaille sur des boolens. Oui mais ta mthode courte ne marche pas si on veut vrier si le boolen vaut faux. Comment on fait avec la mthode courte, hein ? 65
CHAPITRE 6. LES CONDITIONS Il y a un symbole qui permet de vrier si la variable vaut false : le point dexclamation ( !). On crit :
<?php if (! $autorisation_entrer) { } ?>
Cest une autre faon de faire. Si vous prfrez mettre if ($autorisation_entrer == false) cest tout aussi bien, mais la mthode courte est plus lisible.
Le symbole quivalent pour OR est constitu de deux barres verticales. Pour taper une barre verticale, appuyez sur les touches Alt Gr et 6 en mme temps2 , ou Alt Gr et & 3 . La premire colonne contient le mot-cl en anglais, la troisime son quivalent en symbole. Les deux fonctionnent aussi bien, mais je vous recommande dutiliser le mot-cl de prfrence, cest plus facile lire4 . Servez-vous de ces mots-cls pour mettre plusieurs conditions entre les parenthses. Voici un premier exemple :
<?php if ($age <= 12 AND $sexe == "garon") { echo "Bienvenue sur le site de Captain Mgakill !"; } elseif ($age <= 12 AND $sexe == "fille") { echo "Cest pas un site pour les filles ici, retourne jouer la Barbie !"; } ?>
2 Sur 3 Sur
un clavier AZERTY franais. un clavier AZERTY belge. 4 Jespre que vous connaissez un peu langlais, quand mme.
66
LA STRUCTURE DE BASE : IF. . . ELSE Cest tout simple en fait et a se comprend trs bien : si lge est infrieur ou gal 12 ans et que cest un garon, on lui permet daccder au site de son super-hros prfr. Sinon, si cest une lle dont lge est infrieur ou gal 12 ans, on lenvoie gentiment balader5 . Bon allez, un dernier exemple avec OR pour que vous layez vu au moins une fois, et on arrte l.
<?php if ($sexe == "fille" OR $sexe == "garon") { echo "Salut Terrien !"; } else { echo "Euh, si tes ni une fille ni un garon, tes quoi alors ?"; } ?>
Lastuce bonus
Avec les conditions, il y a une astuce connatre. Sachez que les deux codes ci-dessous donnent exactement le mme rsultat :
<?php if ($variable == 23) { echo <strong>Bravo !</strong> Vous avez trouv le nombre mystre !; } ?> <?php if ($variable == 23) { ?> <strong>Bravo !</strong> Vous avez trouv le nombre mystre ! <?php } ?>
Comme vous le voyez, dans la seconde colonne on na pas utilis de echo. En eet, il vous sut douvrir laccolade ({), puis de fermer la balise PHP ( ?>), et vous pouvez mettre tout le texte acher que vous voulez en HTML ! Rudement pratique quand il y a de grosses quantits de texte acher, et aussi pour viter davoir se prendre la tte avec les antislashs devant les guillemets (" ou ). Il vous faudra toutefois penser refermer laccolade aprs6 .
5 Hum, 6
hum, maccusez pas de sexisme hein, ctait juste pour lexemple. lintrieur dune balise PHP, bien entendu.
67
CHAPITRE 6. LES CONDITIONS Et aprs a, ma foi, il ny 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 ny a rien de bien dicile. Contentez-vous de reprendre le schma que je vous ai donn pour la structure if... else et de lappliquer votre cas. Nous aurons dailleurs bientt loccasion de pratiquer un peu, et vous verrez que les conditions sont souvent indispensables.
Pour vous faire comprendre lintrt de switch, je vais vous donner un exemple un peu lourd avec les if et elseif que vous venez dapprendre :
<?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, cest un peu juste..."; } elseif ($note == 12) { echo "Tu es assez bon"; } elseif ($note == 16)
68
elseif ($note == 20) { echo "Excellent travail, cest parfait !"; } else { echo "Dsol, je nai pas de message afficher pour cette note"; } ?>
Comme vous le voyez, cest lourd, long, et rptitif. Dans ce cas, on peut utiliser une autre structure plus souple : cest switch. Voici le mme exemple avec switch7 :
<?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, cest un peu juste..."; break; case 12: echo "Tu es assez bon"; break; case 16: echo "Tu te dbrouilles trs bien !"; break;
7 Le
69
} ?>
Code web : 733130 Testez donc ce code ! Essayez de changer la note (dans la premire instruction) pour voir comment PHP ragit ! Et si vous voulez apporter quelques modications ce code8 , nhsitez pas, a vous fera de lentranement ! Tout dabord, il y a beaucoup moins daccolades (elles marquent seulement le dbut et la n du switch). case signie cas . Dans le switch, on indique au dbut sur quelle variable on travaille (ici $note). On dit PHP : Je vais analyser la valeur de $note. Aprs, on utilise des case pour analyser chaque cas (case 0, case 10, etc.). Cela signie : Dans le cas o la valeur est 0. . . Dans le cas o la valeur est 10. . . Avantage : on na plus besoin de mettre le double gal ! Dfaut : a ne marche pas avec les autres symboles (< > <= >= !=). En clair, le switch ne peut tester que lgalit. Le mot-cl default la n est un peu lquivalent du else. Cest le message qui sache par dfaut quelle que soit la valeur de la variable. Il y a cependant une chose importante savoir : supposons dans notre exemple que la note soit de 10. PHP va lire : case 0 ? Non. Je saute. case 5 ? Non plus. Je saute. case 7 ? Non plus. Je saute. case 10 ? Oui, jexcute les instructions. Mais contrairement aux elseif, PHP ne sarrte pas l et continue lire les instructions des case qui suivent ! case 12, case 16, etc. Pour empcher cela, utilisez linstruction break ;. Linstruction 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 denlever les break dans le code prcdent, vous allez comprendre pourquoi ils sont indispensables ! Quand doit-on choisir if, et quand doit-on choisir switch ?
Cest 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
8 Vous
70
LES TERNAIRES : DES CONDITIONS CONDENSES utiliser switch pour rendre le code plus clair.
On peut faire la mme chose en une seule ligne grce une structure ternaire :
<?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 cest vrai, alors la valeur indique aprs le point dinterrogation (ici true) sera aecte la variable $majeur. Sinon, cest la valeur qui suit le symbole deux-points qui sera aecte $majeur. Cest un peu tordu mais a marche. Si vous nutilisez pas ce type de condition dans vos pages web, je ne vous en voudrai pas. Il faut avouer que les ternaires sont un peu diciles 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 quelquun dautre. 71
En rsum
Les conditions permettent PHP de prendre des dcisions en fonction de la valeur des variables. La forme de condition la plus courante est if. . . elseif. . . else qui signie si . . . sinon si . . . sinon . On peut combiner des conditions avec les mots-cls AND ( et ) et OR ( ou ). Si une condition comporte de nombreux elseif, il peut tre plus pratique dutiliser switch, une autre forme de condition. Les ternaires sont des conditions condenses qui font un test sur une variable, et en fonction des rsultats de ce test donnent une valeur une autre variable. Elles sont cependant plus rarement utilises.
72
Chapitre
7
Dicult :
Les boucles
ans la srie des lments de base de PHP connatre absolument, voici les boucles ! Rpter des instructions, a, lordinateur sait faire (et en plus, il ne bronche jamais) !
Imaginez que vous tes en train de crer le forum de votre site. Sur une page, on ache par exemple une trentaine de messages. Il serait bien trop long et rptitif de dire Ache le message 1 et le nom de son auteur , Ache le message 2 et le nom de son auteur , Ache le message 3 et le nom de son auteur , etc. Pour viter davoir faire cela, on peut utiliser un systme de boucle qui nous permettra de dire une seule fois : Ache 30 messages et le nom de leur auteur chaque fois . Bien entendu, nous nallons 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 au long de ce cours. Ce nest pas bien compliqu, vous allez voir !
73
Fig. 7.1 Principe de fonctionnement dune boucle Voil ce qui se passe dans une boucle : 1. comme dhabitude, les instructions sont dabord excutes dans lordre, de haut en bas (che rouge) ; 2. la n des instructions, on retourne la premire (che verte) ; 3. on recommence lire les instructions dans lordre (che rouge) ; 4. et on retourne la premire (che verte) ; 5. etc., etc. Le seul hic dans ce schma, cest que a ne sarrte jamais ! Les instructions seraient rexcutes linni ! Cest 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 nest plus remplie, on sort enn de la boucle (ouf !). Voici comment faire avec une boucle simple : while.
<?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. 74
UNE BOUCLE SIMPLE : WHILE Les instructions qui sont rptes en boucle se trouvent entre les accolades { et }. Mais bon l je ne vous apprends rien, vous commencez avoir lhabitude de voir des accolades de partout. ;-) Ce nest pas beaucoup plus compliqu que a, il ny a gure plus de choses savoir. Cependant, je vais quand mme vous montrer un ou deux exemples dutilisation 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 japprends 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 dil ! Regardez ce code :
<?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 } ?>
Code web : 389572 La boucle pose la condition : TANT QUE $nombre_de_lignes est infrieur ou gal 100. Dans cette boucle, il y a deux instructions : le echo, qui permet dacher du texte en PHP. noter quil y a une balise HTML <br /> la n : cela permet daller la ligne. Vu que vous connaissez le HTML, a na rien de surprenant : chaque phrase sera crite sur une seule ligne ; ensuite, une instruction bizarre : $nombre_de_lignes++ ; Qusaco ? Regardez mon commentaire : cest exactement la mme chose. En fait, cest une faon plus courte dajouter 1 la variable. On appelle cela lincrmentation1 . Chaque fois quon fait une boucle, la valeur de la variable augmente : 1, 2, 3, 4. . . 99, 100. . . Ds que la variable atteint 101, on arrte la boucle. Et voil, on a crit 100 lignes en un clin dil. Si la punition avait t plus grosse, pas de problme ! Il aurait su de changer la condition2 . Il faut TOUJOURS sassurer que la condition sera fausse au moins une fois. Si elle ne lest jamais, alors la boucle sexcutera linni ! PHP refuse normalement de travailler plus dune quinzaine de secondes. Il sarrtera tout seul sil voit que son travail dure trop longtemps et achera un message derreur.
1 Ce
2 Par
nom barbare signie tout simplement que lon a ajout 1 la variable. exemple, mettre TANT QUE cest infrieur ou gal 500 pour lcrire 500 fois.
75
CHAPITRE 7. LES BOUCLES Nous venons donc de voir comment acher une phrase plusieurs centaines de fois sans eort. Mais est-ce vraiment utile ? On na pas besoin de faire a sur un site web !
Pas vraiment, mais comme je vous lai dit en introduction, nous apprenons ici des techniques de base que lon va pouvoir rutiliser dans les prochains chapitres de ce cours. Imaginez la n que ce systme de boucle va vous permettre de demander PHP dacher dune seule traite tous les messages de votre forum. Bien sr, il vous faudra dautres connaissances pour y parvenir, mais sans les boucles vous nauriez rien pu faire ! Je vous demande pour le moment de pratiquer et de comprendre comment a marche. Bon, un autre exemple pour le plaisir ? On peut crire de la mme manire une centaine de lignes, mais chacune peut tre dirente3 . Cet exemple devrait vous montrer que la valeur de la variable augmente chaque passage dans la boucle :
<?php $nombre_de_lignes = 1; while ($nombre_de_lignes <= 100) { echo Ceci est la ligne n . $nombre_de_lignes . <br />; $nombre_de_lignes++; } ?>
Code web : 402888 Voil, cest tout bte, et cet exemple ressemble beaucoup au prcdent. La particularit, l, cest quon ache chaque fois la valeur de $nombre_de_lignes4 . Pour information, lastuce 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 dutiliser une ou plusieurs instructions echo au milieu. On aura loccasion dutiliser cette astuce de nombreuses fois dans la suite du cours.
nest pas obligs dcrire la mme chose chaque fois. vous permet de voir que sa valeur augmente petit petit.
76
UNE BOUCLE PLUS COMPLEXE : FOR for est un autre type de boucle, dans une forme un peu plus condense et plus commode crire, ce qui fait que for est assez frquemment utilis. Cependant, sachez que for et while donnent le mme rsultat et servent la mme chose : rpter des instructions en boucle. Lune peut paratre plus adapte que lautre dans certains cas, cela dpend aussi des gots. Alors, comment a marche un for ? a ressemble beaucoup au while, mais cest la premire ligne qui est un peu particulire. Pour que vous voyiez bien la dirence avec le while, je reprends exactement lexemple prcdent, mais cette fois avec un for :
<?php for ($nombre_de_lignes = 1; $nombre_de_lignes <= 100; $nombre_de_lignes++) { echo Ceci est la ligne n . $nombre_de_lignes . <br />; } ?>
Que de choses dans une mme ligne ! Bon, vous vous en doutez, je ne vais vous expliquer que la ligne du for, le reste nayant pas chang. Aprs le mot for, il y a des parenthses qui contiennent trois lments, spars par des points-virgules ;. Dcrivons chacun de ces lments. Le premier sert linitialisation. Cest la valeur que lon donne au dpart la variable (ici, elle vaut 1). Le second, cest la condition. Comme pour le while, tant que la condition est remplie, la boucle est rexcute. Ds que la condition ne lest plus, on en sort. Enn, le troisime cest lincrmentation, qui vous permet dajouter 1 la variable chaque tour de boucle. 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 quil 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 exible : on peut faire tous les types de boucles avec mais on peut oublier de faire certaines tapes comme lincrmentation de la variable. En revanche, for est bien adapt quand on doit compter le nombre de fois que lon rpte les instructions et il permet de ne pas oublier de faire lincrmentation pour augmenter la valeur de la variable ! Si vous hsitez entre les deux, il sut simplement de vous poser la question suivante : Est-ce que je sais davance combien de fois je veux que mes instructions soient rptes ? . Si la rponse est oui, alors la boucle for est tout indique. Sinon, 77
En rsum
Les boucles demandent PHP de rpter des instructions plusieurs fois. Les deux principaux types de boucles sont : while : utiliser de prfrence lorsquon ne sait pas par avance combien de fois la boucle doit tre rpte ; for : utiliser lorsquon veut rpter des instructions un nombre prcis de fois. Lincrmentation est une technique qui consiste ajouter 1 la valeur dune variable. La dcrmentation retire au contraire 1 cette variable. On trouve souvent des incrmentations au sein de boucles for.
78
Chapitre
8
Dicult :
Les fonctions
n PHP, on naime pas avoir rpter le mme code. Pour pallier ce problme, nous avons dcouvert les boucles, qui permettent dexcuter des instructions un certain nombre de fois. Ici nous allons dcouvrir un autre type de structure indispensable pour la suite : les fonctions. Comme les boucles, les fonctions permettent dviter davoir rpter du code PHP que lon utilise souvent. Mais alors que les boucles sont de btes machines tout juste capables de rpter deux cents fois la mme chose, les fonctions sont des robots intelligents qui sadaptent en fonction de ce que vous voulez faire et qui automatisent grandement la plupart des tches courantes.
79
Fig. 8.1 Une fonction est comme un robot Vous ne savez pas ce qui se passe lintrieur de ce robot, mais vous pouvez appuyer sur un bouton pour lui demander de faire quelque chose de prcis. Avec les fonctions, cest le mme principe !
la longueur de larte : 4.
80
QUEST-CE QUUNE FONCTION ? Grce la fonction, vous navez pas eu besoin de vous souvenir de la manire dont on calcule le volume dun cube. Bon ici ctait assez simple2 , mais vous serez souvent amens 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 dterminer le volume du cube une seule fois, vous auriez pu chercher la formule dans un livre (si vous ne vous en souveniez pas) et crire le calcul la main. Mais si vous aviez le faire 5 fois ? 10 fois ? 100 fois ? En quoi est-ce dirent des boucles ? Avec les boucles on peut faire rpter le mme code plusieurs fois aussi ! Oui, mais les fonctions sont capables de sadapter en fonction des informations que vous leur envoyez. Par exemple dans notre cas, il sut de transmettre la longueur de larte du cube notre fonction pour quelle nous retourne le rsultat. Ces informations que lon donne en entre la fonction sont appeles paramtres3 . Les fonctions ne servent qu faire des calculs mathmatiques ? Je veux juste crer un site web, pas faire des maths ! Jai 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 daccord. Concrtement, les fonctions peuvent permettre de rcuprer des informations comme la date et lheure actuelles, de crypter des donnes, denvoyer des e-mails, de faire des recherches dans du texte, et bien dautres choses encore !
Appeler une fonction En PHP, comment appelle-t-on une fonction ? Par son nom, pardi ! Par exemple :
<?php calculCube(); ?>
2 Il
3 Un
81
CHAPITRE 8. LES FONCTIONS La fonction calculCube est une fonction imaginaire : elle nexiste pas4 . Par consquent, nessayez pas dexcuter ce code PHP chez vous car il ne fonctionnera pas. Lisez simplement pour bien comprendre le fonctionnement, vous aurez ensuite loccasion de pratiquer plus loin dans ce chapitre. Comme vous le voyez, jai simplement crit le nom de la fonction, suivi de parenthses vides, puis de linvitable point-virgule. En faisant cela, jappelle 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 na pas de sens de lappeler sans lui donner la longueur de larte du cube pour faire le calcul ! Si on veut lui envoyer un paramtre (un nombre, une chane de caractres, un boolen...), il faut lcrire entre les parenthses :
<?php calculCube(4); ?>
Ainsi, calculCube saura quelle doit travailler avec le nombre 4. Souvent, les fonctions acceptent plusieurs paramtres. Vous devez dans ce cas les sparer par des virgules :
<?php fonctionImaginaire(17, Vert, true, 41.7); ?>
Cette fonction recevra quatre paramtres : 17, le texte Vert , le boolen vrai et le nombre 41,7. Rcuprer la valeur de retour de la fonction Maintenant que nous savons appeler une fonction et mme lui envoyer plusieurs paramtres, il faut rcuprer ce quelle nous retourne si toutefois elle retourne quelque chose. Il y a en eet deux types de fonctions : celles qui ne retournent aucune valeur5 ; celles qui retournent une valeur. Si la fonction ne retourne aucune valeur, il ny 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 :
4 5 a
moins quon la cre nous-mmes. ne les empche pas deectuer des actions.
82
Sur une ligne comme celle-ci, il se passe en fait les deux choses suivantes (dans lordre, et de droite gauche) : 1. la fonction calculCube est appele avec le paramtre 4 ; 2. le rsultat renvoy par la fonction (lorsquelle a termin) est stock dans la variable $volume. La variable $volume aura donc pour valeur 64 aprs lexcution de cette ligne de code ! Bon savoir : comme on la vu, il est possible denvoyer en entre plusieurs paramtres une fonction ; en revanche cette dernire ne peut retourner quune seule valeur. Il existe un moyen de contourner cette limitation en combinant des variables au sein dun tableau de variables (appel array) dont on parlera dans le prochain chapitre.
83
CHAPITRE 8. LES FONCTIONS Nous allons ici dcouvrir rapidement quelques fonctions pour vous habituer les utiliser. Nous ne pourrons jamais toutes les passer en revue7 mais avec lexprience de ces premires fonctions et la documentation de PHP, vous naurez aucun mal aller plus loin tout seuls. Nous allons voir quelques fonctions qui eectuent des modications sur des chanes de caractres et une qui permet de rcuprer la date. Ce sont seulement des exemples destins vous habituer utiliser des fonctions.
Code web : 677760 Mez-vous, il se peut que le nombre de caractres soit parfois inexact. Ceci est d un bug de PHP dans la gestion des encodages de caractres. Ce sera corrig dans les prochaines versions du langage.
str_replace : rechercher et remplacer str_replace remplace une chane de caractres par une autre. Exemple :
<?php $ma_variable = str_replace(b, p, bim bam boum); echo $ma_variable; ?>
7 Jai
84
LES FONCTIONS PRTES LEMPLOI DE PHP Code web : 965520 On a besoin dindiquer trois paramtres : 1. la chane quon recherche (ici, les b 8 ) ; 2. la chane quon 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 . :D str_shuffle : mlanger les lettres Pour vous amuser mlanger alatoirement les caractres de votre chane !
<?php $chaine = Cette chane va tre mlange !; $chaine = str_shuffle($chaine); echo $chaine; ?>
Code web : 629635 strtolower : crire en minuscules strtolower met tous les caractres dune chane en minuscules.
<?php $chaine = COMMENT CA JE CRIE TROP FORT ???; $chaine = strtolower($chaine); echo $chaine; ?>
Code web : 835679 noter quil existe strtoupper qui fait la mme chose en sens inverse : minuscules majuscules.
Rcuprer la date
Nous allons dcouvrir la fonction qui renvoie lheure et la date. Il sagit de date9 . Cette fonction peut donner beaucoup dinformations. Voici les principaux paramtres connatre :
8 On 9 Un
85
CHAPITRE 8. LES FONCTIONS Paramtre H i d m Y Description Heure Minute Jour Mois Anne
Code web : 411576 Et voil le travail ! On a pu acher la date et lheure en un clin dil. Normalement, quand vous avez test le code prcdent, vous avez d avoir la date et lheure exactes10 .
10 Si lheure ntait pas bonne, sachez que cest le serveur qui donne lheure, et le serveur du Site du Zro tant situ Paris, vous comprendrez le dcalage horaire si vous habitez dans un autre pays. Nhsitez donc pas essayer dexcuter ce code source chez vous.
86
Vous voyez, cest un peu fatigant la longue. . . Alors nous allons crer une fonction qui le fait notre place !
<?php function DireBonjour($nom) { echo Bonjour . $nom . !<br />; } DireBonjour(Marie); DireBonjour(Patrice); DireBonjour(Edouard); DireBonjour(Pascale); DireBonjour(Franois); DireBonjour(Benot);
11 Jinsiste,
87
Code web : 939284 Alors quy a-t-il de dirent ici ? Cest surtout en haut quil y a une nouveaut : cest la fonction. En fait, les lignes en haut permettent de dnir la fonction (son nom, ce quelle 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 function12 . Ensuite, donnez-lui un nom. Par exemple, celle-ci sappelle DireBonjour. Ce qui est plus particulier aprs, cest ce quon met entre parenthses : il y a une variable. Cest le paramtre dont a besoin la fonction pour travailler, an quelle sache qui elle doit dire bonjour dans notre cas. Notre fonction doit forcment tre appele avec un paramtre (le nom) sans quoi elle ne pourra pas travailler. Vous avez peut-tre remarqu que cette ligne est la seule ne pas se terminer par un point-virgule. Cest normal, il ne sagit pas dune instruction mais juste dune carte didentit de la fonction (son nom, ses paramtres. . .). Ensuite, vous reprez des accolades. Elles permettent de marquer les limites de la fonction. Cette dernire commence ds quil y a un { et se termine lorsquil y a un }. Entre les deux, il y a son contenu. Ici, la fonction contient une seule instruction (echo). Jai fait simple pour commencer mais vous verrez quen pratique, une fonction contient plus dinstructions que cela. Voil, la fonction est cre, vous navez plus besoin dy toucher. Aprs, pour faire appel elle, il sut dindiquer son nom, et de prciser ses paramtres entre parenthses. Enn, il ne faut pas oublier le fameux point-virgule ( ; ) car il sagit dune instruction. Par exemple :
<?php DireBonjour(Marie); ?>
vous dessayer ! Crez une page avec cette fonction et dites bonjour qui vous voulez, vous verrez : a marche13 ! Un conseil pour que vous vous entraniez sur les fonctions : basez-vous sur mes exemples et essayez de les retoucher petit petit pour voir ce que a donne. Il peut y avoir des fonctions trs simples comme des fonctions trs compliques, alors allez-y prudemment.
12 En
13 Encore
88
Fig. 8.3 Reprsentation dun cne Si vous avez bien suivi dans le chapitre prcdent, vous tes normalement capables de comprendre le code ci-dessous. Seul problme si on a le faire plusieurs fois : cest vite rptitif. Regardez :
<?php // Calcul du volume dun 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 dun 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 />; ?>
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 acher, on veut juste quelle nous renvoie le volume quon cherche.
14 Acher
89
CHAPITRE 8. LES FONCTIONS Regardez attentivement le code ci-dessous, il prsente deux nouveauts :
<?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); echo Le volume d\un cne de rayon 3 et de hauteur 1 est de . $volume; ?>
Code web : 727395 Regardez bien la fonction, il y a linstruction : return $volume ;. Cette instruction indique ce que doit renvoyer la fonction. Ici, elle renvoie le volume. Si vous aviez tap return 15, a aurait chaque fois ach un volume de 1515 . La fonction renvoie une valeur, que lon doit donc rcuprer dans une variable :
<?php $volume = VolumeCone(3, 1); ?>
Ensuite, on peut acher ce que contient la variable laide dune instruction echo. Les possibilits de cration de fonctions sont quasi-innies. Il est clair que normalement, vous nallez pas avoir crer de fonction qui calcule le volume dun cne16 . En fait, tout ce que je vous demande ici, cest de comprendre quune fonction peut se rvler trs pratique et vous faire gagner du temps.
En rsum
Les fonctions sont des blocs de code qui excutent des instructions en fonction de certains paramtres. Les fonctions ont gnralement une entre et une sortie. Par exemple, si on donne la valeur 4 la fonction de calcul du cube, celle-ci renvoie 64 en sortie. PHP propose des centaines et des centaines de fonctions prtes lemploi pour tous types de tches : envoyer un e-mail, rcuprer lheure, crypter des mots de passe, etc. Si PHP ne propose pas la fonction dont on a besoin, il est possible de la crer avec le mot-cl function.
15 Cest 16 Qui
un peu idiot jen conviens, mais faites lessai ! est assez fou pour faire a ?
90
Chapitre
9
Dicult :
Les tableaux
ous abordons ici un aspect trs important du PHP : les arrays. Vous allez voir quil sagit de variables composes , que lon peut imaginer sous la forme de tableaux.
On peut faire normment de choses avec les arrays et leur utilisation nest 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 n prts pour la suite, qui sannonce concrte et passionnante.
91
Ici, nous allons voir quil est possible denregistrer de nombreuses informations dans une seule variable grce aux tableaux. On en distingue deux types : les tableaux numrots ; les tableaux associatifs.
$prenoms est un array : cest ce quon appelle une variable tableau . Elle na pas quune valeur, mais plusieurs1 . Dans un array, les valeurs sont ranges dans des cases direntes. Ici, nous travaillons sur un array numrot, cest--dire que chaque case est identie par un numro. Ce numro est appel cl. Attention ! Un array numrot commence toujours la case n0 ! Ne loubliez jamais, ou vous risquez de faire des erreurs par la suite. . .
1 Vous
92
LES DEUX TYPES DE TABLEAUX Construire un tableau numrot Pour crer un tableau numrot en PHP, on utilise gnralement la fonction array. Cet exemple vous montre comment crer larray $prenoms :
<?php // La fonction array permet de crer un array $prenoms = array (Franois, Michel, Nicole, Vronique, Benot); ?>
Lordre a beaucoup dimportance. Le premier lment ( Franois ) aura le n0, ensuite Michel le n1, etc. Vous pouvez aussi crer manuellement le tableau case par case :
<?php $prenoms[0] = Franois; $prenoms[1] = Michel; $prenoms[2] = Nicole; ?>
Si vous ne voulez pas avoir crire vous-mmes le numro de la case que vous crez, vous pouvez laisser PHP le slectionner automatiquement en laissant les crochets vides :
<?php $prenoms[] = Franois; // Crera $prenoms[0] $prenoms[] = Michel; // Crera $prenoms[1] $prenoms[] = Nicole; // Crera $prenoms[2] ?>
Acher un tableau numrot Pour acher un lment, il faut donner sa position entre crochets aprs $prenoms. Cela revient dire PHP : Ache-moi le contenu de la case n1 de $prenoms. Pour faire cela en PHP, il faut crire le nom de la variable, suivi du numro entre crochets. Pour acher Michel , on doit donc crire :
<?php echo $prenoms[1]; ?>
Cest tout bte du moment que vous noubliez pas que Michel est en seconde position et donc quil a le numro 12 .
2 tant
93
CHAPITRE 9. LES TABLEAUX Si vous oubliez de mettre les crochets, a ne marchera pas (a achera juste Array . . .). Ds que vous travaillez sur des arrays, vous tes obligs dutiliser les crochets pour indiquer dans quelle case on doit aller chercher linformation, sinon PHP ne sait pas quoi rcuprer.
Note importante : il ny a ici quune seule instruction (un seul point-virgule). Jaurais pu tout mettre sur la mme ligne, mais rien ne mempche de sparer a sur plusieurs lignes pour que ce soit plus facile lire. Vous remarquez quon crit une che (=>) pour dire associ . Par exemple, on dit ville associe Marseille . Nous avons cr un tableau qui ressemble la structure suivante : Cl prenom nom adresse ville Valeur Franois Dupont 3 Rue du Paradis Marseille
Il est aussi possible de crer le tableau case par case, comme ceci : 94
PARCOURIR UN TABLEAU
<?php $coordonnees[prenom] = Franois; $coordonnees[nom] = Dupont; $coordonnees[adresse] = 3 Rue du Paradis; $coordonnees[ville] = Marseille; ?>
Acher un tableau associatif Pour acher un lment, il sut dindiquer le nom de cet lment entre crochets, ainsi quentre guillemets ou apostrophes puisque ltiquette du tableau associatif est un texte. Par exemple, pour extraire la ville, on devra taper :
<?php echo $coordonnees[ville]; ?>
Ce code ache : Marseille . Quand utiliser un array numrot et quand utiliser un array associatif ?
Comme vous lavez vu dans mes exemples, ils ne servent pas stocker la mme chose. . . Les arrays numrots permettent de stocker une srie dlments du mme type, comme des prnoms. Chaque lment du tableau contiendra alors un prnom. Les arrays associatifs permettent de dcouper une donne en plusieurs sous-lments. Par exemple, une adresse peut tre dcoupe en nom, prnom, nom de rue, ville. . .
Parcourir un tableau
Lorsquun tableau a t cr, on a souvent besoin de le parcourir pour savoir ce quil contient. Nous allons voir trois moyens dexplorer un array : la boucle for ; la boucle foreach ; la fonction print_r (utilise principalement pour le dbogage).
La boucle for
Il est trs simple de parcourir un tableau numrot avec une boucle for. En eet, puisquil est numrot partir de 0, on peut faire une boucle for qui incrmente un compteur partir de 0 : 95
Code web : 355157 Quand on crit $prenoms[$numero], la variable $numero est dabord remplace par sa valeur. Par exemple, si $numero vaut 2, alors cela signie quon cherche obtenir ce que contient $prenoms[2], cest--dire. . . Nicole. Bravo, vous avez compris. :D
La boucle foreach
La boucle for a beau fonctionner, on peut utiliser un autre type de boucle plus adapt aux tableaux quon na pas encore vu jusquici : foreach. Cest 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 ? Regardez plutt :
<?php $prenoms = array (Franois, Michel, Nicole, Vronique, Benot); foreach($prenoms as $element) { echo $element . <br />; // affichera $prenoms[0], $prenoms[1] etc. } ?>
Code web : 843658 Cest le mme code que tout lheure mais cette fois bas sur une boucle foreach. chaque tour de boucle, la valeur de llment suivant est mise dans la variable $element. On peut donc utiliser $element uniquement lintrieur de la boucle an dacher llment en cours. Lavantage de foreach est quil permet aussi de parcourir les tableaux associatifs.
<?php $coordonnees = array ( prenom => Franois, nom => Dupont,
96
PARCOURIR UN TABLEAU
adresse => 3 Rue du Paradis, ville => Marseille); foreach($coordonnees as $element) { echo $element . <br />; } ?>
Code web : 723139 foreach va mettre tour tour dans la variable $element le prnom, le nom, ladresse et la ville contenus dans larray $coordonnees. On met donc entre parenthses : 1. dabord le nom de larray (ici $coordonnees) ; 2. ensuite le mot-cl as (qui signie quelque chose comme en tant que ) ; 3. enn, le nom dune variable que vous choisissez et qui va contenir tour tour chacun des lments de larray (ici $element). Entre les accolades, on nutilise donc que la variable $element. La boucle sarrte lorsquon a parcouru tous les lments de larray. Toutefois, avec cet exemple, on ne rcupre que la valeur. Or, on peut aussi rcuprer la cl de llment. On doit dans ce cas crire foreach comme ceci :
<?php foreach($coordonnees as $cle => $element) ?>
chaque tour de boucle, on disposera non pas dune, mais de deux variables : $cle, qui contiendra la cl de llment en cours danalyse ( prenom , nom , etc.) ; $element, qui contiendra la valeur de llment en cours ( Franois , Dupont , etc.). Testons le fonctionnement avec un exemple :
<?php $coordonnees = array ( prenom => Franois, nom => Dupont, adresse => 3 Rue du Paradis, ville => Marseille); foreach($coordonnees as $cle => $element) { echo [ . $cle . ] vaut . $element . <br />; } ?>
97
CHAPITRE 9. LES TABLEAUX Code web : 406399 Avec cette faon de procder, vous avez maintenant dans la boucle la cl ET la valeur. Et foreach, croyez-moi, cest une boucle vraiment pratique ! On sen sert rgulirement !
Code web : 812209 Voil, cest facile utiliser du moment quon noublie pas la balise <pre> pour avoir un achage correct. Bien entendu, vous nacherez jamais des choses comme a vos visiteurs. On peut en revanche sen servir pour le dbogage, pendant la cration du site, an de voir rapidement ce que contient larray.
La fonction renvoie un boolen, cest--dire true (vrai) si la cl est dans larray, et false (faux) si la cl ne sy trouve pas. a nous permet de faire un test facilement avec un if :
<?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 !; } ?>
Code web : 766112 On ne trouvera que nom , et pas pays (logique). Seule la premire condition sera donc excute.
Code web : 595747 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 web : 981062 Je sais que je me rpte, mais noubliez pas quun array numrot commence 0 ! Cela explique donc pourquoi on nous rpond que Banane se trouve en position 0. Voil donc les fonctions quil fallait connatre pour faire une recherche dans un array. Il y en a dautres mais vous connaissez maintenant les principales.
3 Cest--dire
100
En rsum
Les tableaux (ou arrays) sont des variables reprsentes sous forme de tableau. Elles peuvent donc stocker de grandes quantits dinformations. Chaque ligne dun tableau possde une cl (qui permet de lidentier) et une valeur. Il existe deux types de tableaux : les tableaux numrots : chaque ligne est identie par une cl numrote. La numrotation commence partir de 0 ; les tableaux associatifs : chaque ligne est identie par une courte chane de texte. Pour parcourir un tableau, on peut utiliser la boucle for que lon connat dj, mais aussi la boucle foreach qui est ddie aux tableaux. Il existe de nombreuses fonctions permettant de travailler sur des tableaux et notamment deectuer des recherches.
101
102
Deuxime partie
103
Chapitre
10
Dicult :
avez-vous ce quest une URL ? Cela signie Uniform Resource Locator, et cela sert reprsenter une adresse sur le web. Toutes les adresses que vous voyez en haut de votre navigateur, comme http://www.siteduzero.com, sont des URL.
Je me doute bien que vous ne passez pas votre temps les regarder (il y a bien mieux faire !), mais je suis sr que vous avez dj t surpris de voir que certaines URL sont assez longues et comportent parfois des caractres un peu curieux. Par exemple, aprs avoir fait une recherche sur Google, la barre dadresse contient une URL longue qui ressemble ceci : http://www.google.fr/search ?rlz=1C1GFR343&q=siteduzero Dans cet exemple, les informations aprs le point dinterrogation sont des donnes que lon fait transiter dune page une autre. Nous allons dcouvrir dans ce chapitre comment cela fonctionne.
105
Fig. 10.1 Structure dune URL Le point dinterrogation spare le nom de la page PHP des paramtres. Ensuite, ces derniers senchanent selon la forme nom=valeur et sont spars les uns des autres par le symbole &. On peut crire autant de paramtres que lon veut ?
En thorie, oui. Il sut de les sparer par des & comme je lai 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 lURL. En gnral il nest pas conseill de dpasser les 256 caractres, mais les navigateurs arrivent parfois grer des URL plus longues. Quoi quil en soit, vous aurez compris quon ne peut pas non plus crire un roman dans lURL. 106
Fig. 10.2 Lien entre index.php et bonjour.php Pour cela, ouvrez index.php (puisque cest lui qui contiendra le lien) et insrez-y par exemple le code suivant :
<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. a na rien voir avec 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. Ce lien appelle la page bonjour.php et lui envoie deux paramtres : nom : Dupont ; prenom : Jean. Vous avez srement devin ce quon 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 ? Cest ce que nous allons voir maintenant. ;-)
CHAPITRE 10. TRANSMETTRE DES DONNES AVEC LURL au nom un peu spcial : $_GET. Il sagit dun array associatif1 dont les cls correspondent aux noms des paramtres envoys en URL. Reprenons notre exemple pour mieux voir comment cela fonctionne. Nous avons fait un lien vers bonjour.php ?nom=Dupont&prenom=Jean, cela signie que nous aurons accs aux variables suivantes : Nom $_GET[nom] $_GET[prenom] Valeur Dupont Jean
On peut donc rcuprer ces informations, les traiter, les acher, bref faire ce que lon veut avec. Pour commencer, essayons tout simplement de les acher. Crez un nouveau chier PHP, appellez-le bonjour.php et placez-y le code suivant2 :
<p>Bonjour <?php echo $_GET[prenom]; ?> !</p>
Ici, nous achons le prnom qui a t pass dans lURL. Bien entendu, nous avons aussi accs au nom. Nous pouvons acher le nom et le prnom sans problme :
<p>Bonjour <?php echo $_GET[prenom] . . $_GET[nom]; ?> !</p>
Comme vous le voyez, jen ai prot pour faire une petite concatnation, comme nous avons appris le faire. Ce code que vous voyez l nest pas bien complexe : nous achons le contenu de deux cases de larray $_GET. Cest vraiment trs simple et il ny a rien de nouveau. Tout ce quil faut savoir, cest quon peut retrouver les paramtres envoys dans lURL grce un array nomm $_GET. Si vous voulez tester le rsultat, je vous propose dessayer ce que a donne directement sur le Site du Zro. Le code web suivant ouvre la page index.php. Code web : 158232 Vous devriez aussi faire le test chez vous pour vous assurer que vous comprenez bien le fonctionnement ! Si besoin est, vous pouvez tlcharger mes chiers dexemple index.php et bonjour.php : Code web : 639829
108
NE FAITES JAMAIS CONFIANCE AUX DONNES REUES ! dcouvrir quil ne faut JAMAIS faire conance aux variables qui transitent de page en page, comme $_GET que nous tudions ici. Le but de cette section est, je lavoue, de vous faire peur, car trop peu de dveloppeurs PHP ont conscience des dangers et des failles de scurit quils peuvent rencontrer, ce qui risque pourtant de mettre en pril leur site web ! Oui je suis alarmiste, oui je veux que vous ayez un peu peur ! Mais rassurez-vous : je vais vous expliquer tout ce quil faut savoir pour que a se passe bien et que vous ne risquiez rien. ;-) Ce qui compte, cest que vous ayez conscience trs tt (ds maintenant) des problmes que vous pourrez rencontrer lorsque vous recevrez des paramtres de lutilisateur.
Fig. 10.3 On peut facilement modier les paramtres dans le navigateur Essayez par exemple de modier ladresse pour : http://localhost/tests/bonjour.php ?nom=Dupont&prenom=Marc Comme vous le voyez, a marche ! Nimporte qui peut facilement modier les URL et y mettre ce quil veut : il sut simplement de changer lURL dans la barre dadresse de votre navigateur. Et alors, quel est le problme ? Cest pas plus mal, si le visiteur veut adapter lURL pour quon lui dise bonjour avec son vrai nom et son vrai prnom ? Peut-tre, mais cela montre une chose : on ne peut pas avoir conance dans les donnes quon reoit. Nimporte quel visiteur peut les changer. Dans la page index.php jai fait un lien qui dit bonjour Jean Dupont, mais la page bonjour.php ne va pas forcment acher Bonjour Jean Dupont ! puisque nimporte quel visiteur peut samuser modier lURL. 109
CHAPITRE 10. TRANSMETTRE DES DONNES AVEC LURL Je vous propose de faire des modications encore plus vicieuses et de voir ce quon peut faire pour viter les problmes qui en dcoulent.
Que fait ce code ? Il teste si les variables $_GET[prenom] et $_GET[nom] existent. Si elles existent, on dit bonjour au visiteur. Sil nous manque une des variables (ou les deux), on ache un message derreur : Il faut renseigner un nom et un prnom ! . Essayez maintenant daccder la page bonjour.php sans les paramtres, vous allez voir quon gre bien le cas o le visiteur aurait retir les paramtres de lURL. Est-ce que cest vraiment la peine de grer ce cas ? Cest vrai quoi, moi je ne mamuse jamais modier mes URL et mes visiteurs non plus, je pense ! 110
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 conance lutilisateur. Tt ou tard vous tomberez sur un utilisateur malintentionn qui essaiera de traquer lURL pour mettre nimporte 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 grave3 . Mais lorsque votre site web deviendra plus complexe, cela pourrait avoir des consquences plus ennuyeuses. 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 lenlever pour voir : 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 ! Vous nen 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.
111
On teste si le paramtre repeter existe lui aussi (avec isset($_GET[repeter])). Si tous les paramtres sont bien l, on fait une boucle4 . 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 sachera huit fois : 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 quelle puisse dire bonjour plusieurs fois, et ce nombre de fois est personnalisable dans lURL. Trs bien. Maintenant, mettez-vous dans la peau du mchant. Soyez mchants. Soyez vicieux. Que pourrions-nous faire et que nous naurions pas prvu, juste en modiant lURL ? Jai une ide ! On peut mettre un nombre de rptitions trs grand, par exemple 1984986545665156. La page PHP va boucler un trs grand nombre de fois et votre PC ne pourra probablement pas supporter une telle charge de travail. http://localhost/tests/bonjour.php ?nom=Dupont&prenom=Jean&repeter=198498 6545665156 Si vous avez peur dessayer, je vous rassure : votre PC ne va pas prendre feu en faisant a. Par contre, il va se mettre consommer normment de mmoire pour stocker tous les messages bonjour et narrivera srement pas jusquau bout5 . Ou alors sil y arrive, votre page va tre extrmement surcharge de messages bonjour . Mon dieu, cest horrible ! Comment peut-on empcher a ?
En tant plus malins et surtout plus prvoyants. Voici ce quil faut anticiper. Le cas o le nombre quon vous envoie nest pas une valeur raisonnable. Par exemple on peut dire que si on dpasse 100 fois, cest trop, et il faut refuser dexcuter la page.
4 Jai 5 PHP
choisi de faire un for, mais on aurait aussi pu faire un while. sarrte au bout dun certain temps dexcution.
112
NE FAITES JAMAIS CONFIANCE AUX DONNES REUES ! De mme, que se passe-t-il si je demande de rpter 4 fois ? a ne devrait pas tre autoris. Il faut que le nombre soit au moins gal 1. Le cas o la valeur nest pas logique, o elle nest pas du tout ce quon attendait. Rien nempche le visiteur de remplacer la valeur du paramtre repeter par du texte ! Que se passe-t-il si on essaie daccder bonjour.php ?nom=Dupont&prenom=Jean&repeter=grenouille ? Cela ne devrait pas tre autoris. Le mot grenouille na pas de sens, on veut un nombre entier positif. Que se passe-t-il si on essaie daccder 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 rsoudre ces problmes, on doit : 1. vrier que repeter contient bien un nombre ; 2. vrier ensuite que ce nombre est compris dans un intervalle raisonnable (entre 1 et 100, par exemple). Pour vrier 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 quon appelle le transtypage, une notion quon na pas encore vue jusquici mais qui est trs simple comprendre. Regardez ce code :
<?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). Voyez la gure 10.4 pour vous en convaincre.
Fig. 10.4 Transtypage Si la valeur est bien un entier (par exemple 14) alors elle nest pas modie. En revanche, si la variable contient autre chose quun entier (par exemple grenouille ), elle est transforme en entier. Ici, comme PHP ne peut pas associer de valeur grenouille, il lui donne 0. 113
CHAPITRE 10. TRANSMETTRE DES DONNES AVEC LURL Aprs avoir excut cette instruction, la variable $_GET[repeter] contient maintenant forcment un nombre entier. Il ne reste plus qu vrier que ce nombre est bien compris entre 1 et 100 laide dune condition6 . Voici donc le code nal scuris qui prvoit tous les cas pour viter dtre pris au dpourvu par un utilisateur malintentionn :
<?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 />; } }
Code web : 101769 Cela fait beaucoup de conditions pour quelque chose qui tait la base assez simple, mais ctait ncessaire. Vous devrez toujours faire trs attention et prvoir tous les cas les plus tordus, comme nous venons de le faire : vrier que tous les paramtres que vous attendiez sont bien l ; vrier quils contiennent bien des valeurs correctes comprises dans des intervalles raisonnables. Si vous gardez cela en tte, vous naurez pas de problmes. :-) Nous navons pas encore vu tous les risques lis aux donnes envoyes par lutilisateur. Cette premire approche devrait dj vous avoir sensibiliss au problme, mais nous irons plus loin dans le chapitre suivant pour nir de couvrir ce sujet. Tout ceci est un peu complexe, je suis daccord, mais cest rellement important !
6 Ce
114
En rsum
Une URL reprsente ladresse dune page web (commenant gnralement par http://). Lorsquon fait un lien vers une page, il est possible dajouter des paramtres sous la forme bonjour.php ?nom=Dupont&prenom=Jean qui seront transmis la page. La page bonjour.php dans lexemple prcdent recevra ces paramtres dans un array nomm $_GET : $_GET[nom] aura pour valeur Dupont ; $_GET[prenom] aura pour valeur Jean . Cette technique est trs pratique pour transmettre des valeurs une page, mais il faut prendre garde au fait que le visiteur peut les modier trs facilement. Il ne faut donc pas faire aveuglment conance ces informations, et tester prudemment leur valeur avant de les utiliser. La fonction isset() permet de vrier si une variable est dnie ou non. Le transtypage est une technique qui permet de convertir une variable dans le type de donnes souhait. Cela permet de sassurer par exemple quune variable est bien un int (nombre entier).
115
116
Chapitre
11
Dicult :
es formulaires constituent le principal moyen pour vos visiteurs dentrer des informations sur votre site. Les formulaires permettent de crer une interactivit.
Par exemple, sur un forum on doit insrer du texte puis cliquer sur un bouton pour envoyer son message. Sur un livre dor, sur un mini-chat, on procde de la mme faon. On a besoin des formulaires partout pour changer des informations avec nos visiteurs. Vous allez voir quil y a de nombreux rappels de HTML dans ce chapitre. . . et ce nest pas un hasard : ici, le PHP et le HTML sont intimement lis. Le HTML permet de crer le formulaire, tandis que le PHP permet de traiter les informations que le visiteur a entres dans le formulaire. Ce chapitre est particulirement important, nous rutiliserons ce que nous avons appris ici dans toute la suite du cours. Soyez attentifs !
117
On crira le contenu de notre formulaire entre les balises <form> et </form>. Si vous avez lu mon cours de HTML/CSS, vous verrez quune bonne partie de ce chapitre ne sera compose que de rappels puisque je vais vous expliquer 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 deux 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 quil existe plusieurs moyens denvoyer les donnes du formulaire (plusieurs mthodes ). Vous pouvez en employer deux. get : les donnes transiteront par lURL comme on la appris prcdemment. On pourra les rcuprer grce larray $_GET. Cette mthode est assez peu utilise car on ne peut pas envoyer beaucoup dinformations dans lURL1 . post : les donnes ne transiteront pas par lURL, lutilisateur ne les verra donc pas passer dans la barre dadresse. Cette mthode permet denvoyer autant de donnes que lon veut, ce qui fait quon la privilgie le plus souvent. Nanmoins, les donnes ne sont pas plus scurises quavec la mthode GET et il faudra toujours vrier si tous les paramtres sont bien prsents et valides, comme on la fait dans le chapitre prcdent. On ne doit pas plus faire conance aux formulaires quaux URL. Cest 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 lon utilise est post, vous crirez donc method="post" comme je lai fait.
1 Je
vous disais dans le chapitre prcdent quil tait prfrable de ne pas dpasser 256 caractres.
118
La cible
Lattribut action sert dnir la page appele par le formulaire. Cest cette page qui recevra les donnes du formulaire et qui sera charge de les traiter. Imaginons le schma de la gure 11.1.
Fig. 11.1 Appel de la page cible par le formulaire 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 (lorsquon a cliqu sur le bouton Valider ), le visiteur est redirig vers la page cible.php qui reoit les donnes du formulaire, comme vous le montre la gure 11.2.
Fig. 11.2 Fonctionnement dun formulaire Le nom de la page cible est dni grce lattribut action. La page cible ne doit pas forcment sappeler cible.php. Jutilise ce nom dans mes exemples simplement pour que vous compreniez bien que cest la page qui est appele. Remarquez quen thorie rien nempche le formulaire de sappeler lui-mme. Il surait dcrire action="formulaire.php". Dans ce cas, la page du formulaire doit tre capable aussi bien dacher le formulaire que de traiter les donnes. Cest tout fait possible de le faire mais an de ne pas compliquer les choses trop vite, on va viter de faire comme a ici. ;-) Retenez donc bien que vous travaillez normalement sur deux pages direntes : la page qui contient le formulaire (formulaire.php dans notre exemple), et celle qui reoit les donnes du formulaire pour les traiter (cible.php). 119
Fig. 11.3 Zone de texte En HTML, on linsre tout simplement avec la balise :
<input type="text" />
Pour les mots de passe, vous pouvez utiliser type="password", ce qui aura pour eet de cacher le texte entr par le visiteur. part ce dtail, le fonctionnement reste le mme. Il y a deux attributs connatre que lon peut ajouter cette balise. name (obligatoire) : cest le nom de la zone de texte. Choisissez-le bien, car cest lui qui va produire une variable. Par exemple : <input type="text" name="pseudo" />. value (facultatif) : cest ce que contient la zone de texte au dpart. Par dfaut, la zone de texte est vide mais il peut tre pratique de pr-remplir le champ. Exemple : <input type="text" name="pseudo" value="M@teo21" />. Oui, je sais que vous commencez vous inquiter car vous navez pas encore vu de PHP pour le moment mais nayez pas peur. Le fonctionnement est tout simple et a un air de dj vu. Le texte que le visiteur aura entr sera disponible dans cible.php sous la forme dune variable appele $_POST[pseudo]. Pour lexemple, je vous propose de crer un formulaire qui demande le prnom du visiteur puis qui lache rement sur la page cible.php. On va donc distinguer deux codes source : celui de la page du formulaire et celui de la page cible. Voici le code de la page formulaire.php :
<p>
Cette page ne contient que du HTML.<br /> Veuillez taper votre prnom : </p>
120
<form action="cible.php" method="post"> <p> <input type="text" name="prenom" /> <input type="submit" value="Valider" /> </p> </form>
Rappel de HTML : le champ <input type="submit" /> permet de crer le bouton de validation du formulaire qui commande lenvoi 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].
<p>Bonjour !</p> <p>Je sais comment tu tappelles, h h. Tu tappelles <?php echo $_POST[prenom]; ?> !</p> <p>Si tu veux changer de prnom, <a href="formulaire.php">clique ici</a> pour re venir la page formulaire.php.</p>
Le code web suivant ouvre la page formulaire.php pour que vous puissiez tester. Code web : 404079 Dans cible.php on a ach une variable $_POST[prenom] qui contient ce que lutilisateur a entr dans le formulaire.
121
CHAPITRE 11. TRANSMETTRE DES DONNES AVEC LES FORMULAIRES On peut y crire autant de lignes que lon veut. Cest plus adapt si le visiteur doit crire un long message, par exemple. On va utiliser le code HTML suivant pour insrer cette zone de texte :
<textarea name="message" rows="8" cols="45"> Votre message ici. </textarea>
L encore, on a un attribut name qui va dnir le nom de la variable qui sera cre dans cible.php. Dans notre cas, ce sera la variable $_POST[message]. Vous remarquerez quil ny a pas dattribut 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 ncrivez rien entre <textarea> et </textarea>. Les attributs rows et cols permettent de dnir la taille de la zone de texte en hauteur et en largeur respectivement.
La liste droulante
La gure 11.5 est une liste droulante.
Fig. 11.5 Une liste droulante On utilise le code HTML suivant pour construire une liste droulante :
<select name="choix"> <option value="choix1">Choix <option value="choix2">Choix <option value="choix3">Choix <option value="choix4">Choix </select>
Tout btement, on utilise la balise <select> laquelle on donne un nom (ici : choix ). On crit ensuite les direntes options disponibles. . . puis on referme la balise avec </select>. 122
LES LMENTS DU FORMULAIRE Ici, une variable $_POST[choix] sera cre, et elle contiendra le choix qua fait lutilisateur. Sil a choisi Choix 3 , la variable $_POST[choix] sera gale au value correspondant, cest--dire choix3. Vous pouvez aussi dnir le choix par dfaut de la liste. Normalement cest le premier, mais si vous rajoutez lattribut selected="selected" une balise <option>, alors ce sera le choix par dfaut. On pourrait par exemple crire :
<option value="choix3" selected="selected">Choix 3</option>
Fig. 11.6 Cases cocher On utilisera le code suivant pour acher des cases cocher :
<input type="checkbox" name="case" id="case" /> <label for="case"> Ma case cocher</label>
Lutilisation de la balise <label> nest pas obligatoire mais je la recommande fortement. Elle permet dassocier 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. L encore, on donne un nom la case cocher via lattribut name (ici : case ). Ce nom va gnrer une variable dans la page cible, par exemple $_POST[case]. Si la case a t coche, alors $_POST[case] aura pour valeur on . Si elle na pas t coche, alors $_POST[case] nexistera pas. Vous pouvez faire un test avec isset($_POST[case]) pour vrier si la case a t coche ou non. Si vous voulez que la case soit coche par dfaut, il faudra lui rajouter lattribut checked="checked". Par exemple :
<input type="checkbox" name="case" checked="checked" />
Comme vous pouvez le voir, les deux boutons doption ont le mme nom ( frites ). Cest trs important, car ils fonctionnent par groupes : tous les boutons doption dun mme groupe doivent avoir le mme nom. Cela permet au navigateur de savoir lesquels dsactiver quand on active un autre bouton du groupe. Il serait bte en eet de pouvoir slectionner la fois Oui et Non . Pour pr-cocher lun de ces boutons, faites comme 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 doption choisi par le visiteur, issue de lattribut value. Si on aime les frites, alors on aura $_POST[frites] = oui. Il faut bien penser renseigner lattribut value du bouton doption car cest lui qui va dterminer la valeur de la variable.
lcran, 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 ! Cest apparemment inutile, mais vous verrez que vous en aurez parfois besoin. 124
NE FAITES JAMAIS CONFIANCE AUX DONNES REUES : LA FAILLE XSS On croit par erreur que, parce que ces champs sont cachs, le visiteur ne peut pas les voir. Cest faux ! En eet, nimporte quel visiteur peut acher le code source de la page et voir quil y a des champs cachs en lisant le code HTML. Mieux, il peut mme modier la valeur du champ cach sil a les outils appropris. Que faut-il retenir ? Ce nest pas parce que le champ est cach que vous devez considrer quil est inviolable. Nimporte quel visiteur (un peu malin) peut le lire, modier sa valeur et mme le supprimer. Ne faites pas conance aux donnes envoyes par le visiteur ! Vous vous souvenez de cette rgle dont je vous ai parl dans le chapire prcdent ? Elle est plus que jamais dactualit.
CHAPITRE 11. TRANSMETTRE DES DONNES AVEC LES FORMULAIRES format que vous avez indiqu. Pour vrier si une chane de texte correspond un certain format, comme JJ/MM/AAAA , on peut utiliser une validation par expression rgulire. Les expressions rgulires feront lobjet de deux chapitres vers la n de ce livre car il sagit dun sujet assez complexe. De la mme manire, comme dans le chapitre prcdent, mme si vous demandez un nombre compris entre 1 et 100, il y aura bien quelquun pour crire 48451254523 . Soyez donc vigilants et nayez jamais conance en ce qui vient de lutilisateur, savoir les donnes issues des arrays $_GET et $_POST. Avec les formulaires, vous ne pouvez pas non plus supposer quon va vous envoyer tous les champs que vous attendiez. Un visiteur peut trs bien samuser supprimer un champ de texte, et dans ce cas votre page cible.php ne recevra jamais le texte quelle attendait ! Il faudra imprativement quelle vrie que toutes les donnes quelle attendait sont bien l avant deectuer la moindre opration. Puisque la page du formulaire se trouve sur mon site, comment peut faire un visiteur pour modier ma page web ? Il peut voir les sources mais pas les modier ! En eet, vos visiteurs ne peuvent pas modier vos pages web sur le serveur. . . Mais ils peuvent les reprendre et les modier ailleurs. Souvenez-vous du schma de la gure 11.2 page 119. La page formulaire.php contient le formulaire et cible.php traite les donnes quon lui a envoyes. Autant le code PHP nest jamais visible par vos visiteurs, autant le code HTML du formulaire, lui, peut tre vu par tout le monde. partir de l, quest-ce qui empche quelquun de crer une copie lgrement modie de votre formulaire et de la stocker sur son serveur, limage de la gure 11.8 ? Sur le schma de la gure 11.8, le mchant 3 a pris le code HTML de votre formulaire, la modi et la enregistr sur son serveur (ou mme sur son ordinateur). Lattribut action a t modi pour indiquer ladresse absolue (donc complte) de votre page cible :
<form method="post" action="http://www.monsite.com/cible.php">
Le mchant peut maintenant modier votre formulaire, ajouter des champs, en supprimer, bref faire ce quil veut avec ! Votre page cible.php ny 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 cest possible. Mme si tout nest pas totalement clair dans votre tte, vous avez au moins lide du mode de fonctionnement.
3 Nous
126
Fig. 11.8 Le formulaire modi Sil y a une chose retenir ici, cest que les formulaires sont modiables par tous les visiteurs contrairement ce quon pourrait penser. Par consquent, votre page cible.php devra tre aussi vigilante que nous lavons t dans le chapitre prcdent et ne pas faire conance aux donnes de lutilisateur4 . Il y a un moyen encore plus simple de modier 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 modier le code HTML de la page que lon visite en temps rel. Firefox peut faire de mme avec son clbre plugin Firebug.
127
CHAPITRE 11. TRANSMETTRE DES DONNES AVEC LES FORMULAIRES code suivant :
<p>Je sais comment tu tappelles, h h. Tu tappelles <?php echo $_POST[prenom]; ?> !</p>
Si le visiteur dcide dcrire du code HTML la place de son prnom, cela fonctionnera trs bien ! Par exemple, imaginons quil crive dans le champ Prnom le code : <strong>Badaboum</strong>. Le code source HTML qui sera gnr par PHP sera le suivant :
<p>Je sais comment tu tappelles, h h. Tu tappelles <strong>Badaboum</strong> !</p>
Et alors ? Sil veut mettre son prnom en gras, cest son problme, non ?
Outre le fait quil peut insrer nimporte quel code HTML (et rendre votre page invalide), ce qui nest 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 !
<p>Je sais comment tu tappelles, h h. Tu tappelles <script type="text/javas cript">alert(Badaboum)</script> !</p>
Tous les visiteurs qui arriveront sur cette page verront une bote de dialogue JavaScript sacher. Plutt gnant. Voyez la gure 11.9.
Fig. 11.9 Excution de JavaScript par la faille XSS 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 condentielles, comme votre pseudonyme et votre mot de passe sur le site ! Il est possible de forcer le visiteur qui lira le code JavaScript envoyer tous les cookies quil 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 sloignerait un peu trop du sujet, mais sachez que cest possible et quil faut donc tout prix viter quun visiteur puisse injecter du code JavaScript dans vos pages. 128
NE FAITES JAMAIS CONFIANCE AUX DONNES REUES : LA FAILLE XSS Rsoudre le problme est facile : il faut protger le code HTML en lchappant, cest-dire en achant les balises (ou en les retirant) plutt que de les faire excuter par le navigateur, comme sur la gure 11.10.
Fig. 11.10 viter la faille XSS en chappant le HTML Pour chapper le code HTML, il sut dutiliser la fonction htmlspecialchars qui va transformer les chevrons des balises HTML <> en < ; et > ; respectivement. Cela provoquera lachage de la balise plutt que son excution.
<p>Je sais comment tu tappelles, h h. Tu tappelles <?php echo htmlspecialcha rs($_POST[prenom]); ?> !</p>
Le code HTML qui en rsultera sera propre et protg car les balises HTML insres par le visiteur auront t chappes :
<p>Je sais comment tu tappelles, h h. Tu tappelles <strong>Badaboum< ;/strong> !</p>
Il faut penser utiliser cette fonction sur tous les textes envoys par lutilisateur qui sont susceptibles dtre achs sur une page web. Sur un forum par exemple, il faut penser chapper les messages posts par vos membres, mais aussi leurs pseudos6 ainsi que leurs signatures. Bref, tout ce qui est ach et qui vient la base dun visiteur, vous devez penser le protger avec htmlspecialchars.
6 Ils
129
CHAPITRE 11. TRANSMETTRE DES DONNES AVEC LES FORMULAIRES Si vous prfrez retirer les balises HTML que le visiteur a tent denvoyer plutt que de les acher, utilisez la fonction strip_tags.
Lenvoi de chiers
Vous saviez quon pouvait aussi envoyer des chiers 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 chier sur votre site. Cette section est un peu plus complexe que le reste du chapitre. Sa lecture nest dailleurs pas obligatoire pour la bonne comprhension de la suite du cours. Par consquent, nhsitez pas revenir la lire plus tard, lorsque vous en aurez besoin, si vous ne voulez pas vous attaquer de suite une partie un peu dicile . L encore, a se passe en deux temps. 1. Le visiteur arrive sur votre formulaire et le remplit (en indiquant le chier envoyer). Une simple page HTML sut pour crer le formulaire. 2. PHP rceptionne les donnes du formulaire et, sil y a des chiers dedans, il les enregistre dans un des dossiers du serveur.
Attention : lenvoi du chier peut tre un peu long si celui-ci est gros. Il faudra dire au visiteur de ne pas simpatienter pendant lenvoi. On va commencer par crer le formulaire permettant denvoyer un chier (une simple page HTML). Nous verrons ensuite comment traiter lenvoi du chier ct serveur avec PHP.
Grce enctype, le navigateur du visiteur sait quil sapprte envoyer des chiers. 130
LENVOI DE FICHIERS Maintenant que cest fait, nous pouvons ajouter lintrieur du formulaire une balise permettant denvoyer un chier. Cest une balise trs simple de type <input type="file" />. Il faut penser comme toujours donner un nom ce champ de formulaire (grce lattribut name) pour que PHP puisse reconnatre le champ par la suite.
<form action="cible_envoi.php" method="post" enctype="multipart/form-data"> <p> Formulaire denvoi de fichier :<br /> <input type="file" name="monfichier" /><br /> <input type="submit" value="Envoyer le fichier" /> </p> </form>
Voil, cest susant. Vous pouvez ajouter dautres champs plus classiques au formulaire (champ de texte, cases cocher). Vous pouvez aussi proposer denvoyer plusieurs chiers en mme temps. L, on va se contenter dun seul champ (envoi de chier) pour faire simple.
Pour chaque chier envoy, une variable $_FILES[nom_du_champ] est cre. Dans 131
CHAPITRE 11. TRANSMETTRE DES DONNES AVEC LES FORMULAIRES notre cas, la variable sappellera $_FILES[monfichier]. Cette variable est un tableau qui contient plusieurs informations sur le chier : Variable $_FILES[monfichier][name] $_FILES[monfichier][type] Signication Contient le nom du chier envoy par le visiteur. Indique le type du chier envoy. Si cest une image gif par exemple, le type sera image/gif. Indique la taille du chier envoy. Attention : cette taille est en octets. Il faut environ 1 000 octets pour faire 1 Ko, et 1 000 000 doctets pour faire 1 Mo. Attention : la taille de lenvoi est limite par PHP. Par dfaut, impossible duploader des chiers de plus de 8 Mo. Juste aprs lenvoi, le chier est plac dans un rpertoire temporaire sur le serveur en attendant que votre script PHP dcide si oui ou non il accepte de le stocker pour de bon. Cette variable contient lemplacement temporaire du chier (cest PHP qui gre a). Contient un code derreur permettant de savoir si lenvoi sest bien eectu ou sil y a eu un problme et si oui, lequel. La variable vaut 0 sil ny a pas eu derreur.
$_FILES[monfichier][size]
$_FILES[monfichier][tmp_name]
$_FILES[monfichier][error]
Si vous avez mis un second champ denvoi de chier dans votre formulaire, il y aura une seconde variable $_FILES[nom_de_votre_autre_champ] dcoupe de la mme manire que le tableau quon vient de voir ici. $_FILES[nom_de_votre_autre_champ][size] contiendra donc la taille du second chier, et ainsi de suite. Je vous propose de faire les vrications suivantes pour dcider si lon accepte le chier ou non. 1. Vrier tout dabord si le visiteur a bien envoy un chier (en testant la variable $_FILES[monfichier] avec isset()) et sil ny a pas eu derreur denvoi (grce $_FILES[monfichier][error]). 2. Vrier si la taille du chier ne dpasse pas 1 Mo par exemple (environ 1 000 000 doctets) grce $_FILES[monfichier][size]. 3. Vrier si lextension du chier est autorise7 . Dans notre cas, nous autoriserons
7 Il
faut interdire tout prix que les gens puissent envoyer des chiers PHP, sinon ils pourraient
132
LENVOI DE FICHIERS seulement les images (chiers .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. 1/ Tester si le chier a bien t envoy On commence par vrier quun chier a t envoy. Pour cela, on va tester si la variable $_FILES[monfichier] existe avec isset(). On vrie dans le mme temps sil ny a pas derreur denvoi.
<?php // Testons si le fichier a bien t envoy et sil ny a pas derreur if (isset($_FILES[monfichier]) AND $_FILES[monfichier][error] == 0) { } ?>
2/ Vrier la taille du chier On veut interdire que le chier dpasse 1 Mo, soient environ 1 000 000 doctets (jarrondis pour simplier). On doit donc tester $_FILES[monfichier][size] :
<?php // Testons si le fichier a bien t envoy et sil ny a pas derreur if (isset($_FILES[monfichier]) AND $_FILES[monfichier][error] == 0) { // Testons si le fichier nest pas trop gros if ($_FILES[monfichier][size] <= 1000000) { } ?> }
3/ Vrier lextension du chier On peut rcuprer lextension du chier dans une variable grce ce code :
<?php $infosfichier = pathinfo($_FILES[monfichier][name]); $extension_upload = $infosfichier[extension]; ?>
excuter des scripts sur votre serveur.
133
CHAPITRE 11. TRANSMETTRE DES DONNES AVEC LES FORMULAIRES La fonction pathinfo renvoie un array contenant entre autres lextension du chier dans $infosfichier[extension]. On stocke a dans une variable $extension_upload. Une fois lextension rcupre, on peut la comparer un tableau dextensions autorises (un array) et vrier si lextension rcupre fait bien partie des extensions autorises laide de la fonction in_array(). Ouf ! On obtient ce code au nal :
<?php // Testons si le fichier a bien t envoy et sil ny a pas derreur if (isset($_FILES[monfichier]) AND $_FILES[monfichier][error] == 0) { // Testons si le fichier nest pas trop gros if ($_FILES[monfichier][size] <= 1000000) { // Testons si lextension 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)) { } }
} ?>
4/ Valider lupload du chier Si tout est bon, on accepte le chier en appelant move_uploaded_file(). Cette fonction prend deux paramtres : le nom temporaire du chier (on la avec $_FILES[monfichier][tmp_name]) ; le chemin qui est le nom sous lequel sera stock le chier de faon dnitive. On peut utiliser le nom dorigine du chier $_FILES[monfichier][name] ou gnrer un nom au hasard. Je propose de placer le chier dans un sous-dossier uploads . On gardera le mme nom de chier que celui dorigine. Comme $_FILES[monfichier][name] contient le chemin entier vers le chier dorigine (C :\dossier\fichier.png par exemple), il nous faudra extraire le nom du chier. On peut utiliser pour cela la fonction basename qui renverra juste chier.png .
<?php // Testons si le fichier a bien t envoy et sil ny a pas derreur if (isset($_FILES[monfichier]) AND $_FILES[monfichier][error] == 0) { // Testons si le fichier nest pas trop gros if ($_FILES[monfichier][size] <= 1000000)
134
LENVOI DE FICHIERS
{
// Testons si lextension 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)) { // On peut valider le fichier et le stocker dfinitivement move_uploaded_file($_FILES[monfichier][tmp_name], uploads/ . basename($_FILES[monfichier][name])); echo "Lenvoi a bien t effectu !"; } } } ?>
Code web : 148786 Lorsque vous mettrez le script sur Internet laide dun logiciel FTP, vriez que le dossier uploads sur le serveur existe et quil a les droits dcriture. Pour ce faire, sous FileZilla par exemple, faites un clic droit sur le dossier et choisissez Attributs du chier . Cela vous permettra dditer les droits du dossier (on parle de CHMOD). Mettez les droits 733, ainsi PHP pourra placer les chiers uploads dans ce dossier. Ce script est un dbut, mais en pratique il vous faudra srement encore lamliorer. Par exemple, si le nom du chier contient des espaces ou des accents, a posera un problme une fois envoy sur le Web. Dautre part, si quelquun envoie un chier qui a le mme nom que celui dune autre personne, lancien sera cras ! La solution consiste en gnral choisir nous-mmes le nom du chier stock sur le serveur plutt que de se servir du nom dorigine. Vous pouvez faire un compteur qui sincrmente : 1.png, 2.png, 3.jpg, etc. Soyez toujours trs vigilants sur la scurit, vous devez viter que quelquun puisse envoyer des chiers PHP sur votre serveur. Pour aller plus loin, je vous recommande de lire le tutoriel de DHKold sur lupload de chiers par formulaire qui traite le sujet plus en dtail. Code web : 165094 Bonne lecture ! 135
En rsum
Les formulaires sont le moyen le plus pratique pour le visiteur de transmettre des informations votre site. PHP est capable de rcuprer les donnes saisies par vos visiteurs et de les traiter. Les donnes envoyes via un formulaire se retrouvent dans un array $_POST. De la mme manire que pour les URL, il ne faut pas donner sa conance absolue aux donnes que vous envoie lutilisateur. Il pourrait trs bien ne pas remplir tous les champs voire traquer le code HTML de la page pour supprimer ou ajouter des champs. Traitez les donnes avec vigilance. Que ce soit pour des donnes issues de lURL ($_GET) ou dun formulaire ($_POST), il faut sassurer quaucun texte qui vous est envoy ne contient du HTML si celui-ci est destin tre ach sur une page. Sinon, vous ouvrez une faille appele XSS qui peut tre nfaste pour la scurit de votre site. Pour viter la faille XSS, il sut dappliquer la fonction htmlspecialchars sur tous les textes envoys par vos visiteurs que vous acherez. Les formulaires permettent denvoyer des chiers. On retrouve les informations sur les chiers envoys dans un array $_FILES. Leur traitement est cependant plus complexe.
136
Chapitre
12
Dicult :
ienvenue dans votre premier TP ! Ce qui suit nest pas un chapitre comme les autres, vous nallez rien apprendre de nouveau. Mais pour la premire fois, vous allez pratiquer pour de bon et raliser votre premier script PHP !
Le but de chacun des TP est de vous montrer quoi peut servir tout ce que vous venez dapprendre. Quand vous lisez un chapitre, vous tes parfois dans le ou, vous vous dites : Ok, jai compris ce que tu veux me dire, mais je ne vois vraiment pas o tu veux en venir : comment je peux faire un site web avec tout a ? . Maintenant, place au concret ! Et bonne surprise vous avez dj le niveau pour protger le contenu dune page par mot de passe ! Cest ce que je vais vous apprendre faire dans ce chapitre.
137
CHAPITRE 12. TP : PAGE PROTGE PAR MOT DE PASSE Comme cest votre premier TP, il est probable que vous vous plantiez lamentablement (vous voyez, je ne vous cache rien). Vous aurez envie de vous pendre ou de vous jeter par la fentre, cest tout fait normal. Je connais peu de monde qui peut se vanter davoir russi du premier coup son premier script PHP. Ne vous dcouragez donc pas, essayez de suivre et de comprendre le fonctionnement de ce TP, et a ira dj mieux au prochain. :-)
Si lun de ces points est un peu ou pour vous (vous avez peut-tre oubli), nhsitez pas relire le chapitre correspondant, vous en aurez besoin pour traiter convenablement le TP. Vous verrez, il ne vous sera pas demand de faire des choses compliques. Le but est simplement dassembler toutes vos connaissances pour rpondre un problme prcis.
Votre objectif
Voici le scnario : vous voulez mettre en ligne une page web pour donner des informations condentielles certaines personnes. Cependant, pour limiter laccs cette page, il faudra connatre un mot de passe. Dans notre cas, les donnes condentielles seront les codes daccs au serveur central de la NASA1 . Le mot de passe pour pouvoir visualiser les codes daccs sera kangourou. Sauriez-vous raliser une page qui nache ces codes secrets que si lon a rentr le bon mot de passe ?
Comment procder ?
Pour coder correctement, je recommande toujours de travailler dabord au brouillon2 . a peut bien souvent paratre une perte de temps, mais cest tout fait le contraire. Si vous vous mettez crire des lignes de code au fur et mesure, a va tre coup sr le bazar. linverse, si vous prenez cinq minutes pour y rchir devant une feuille
1 Soyons 2 Vous
138
INSTRUCTIONS POUR RALISER LE TP de papier, votre code sera mieux structur et vous viterez de nombreuses erreurs (qui font, elles, perdre du temps).
1. Au problme que vous vous posez (quest-ce que je veux arriver faire ?). 2. Au schma du code, cest--dire que vous allez commencer le dcouper en plusieurs morceaux, eux-mmes dcoups en petits morceaux (cest plus facile avaler). 3. Aux fonctions et aux connaissances en PHP dont vous allez avoir besoin (pour tre srs que vous les utilisez convenablement). Et pour montrer lexemple, nous allons suivre cette liste pour notre TP.
Problme pos On doit protger laccs une page par un mot de passe. La page ne doit pas sacher si lon na pas le mot de passe.
Schma du code Pour que lutilisateur puisse entrer le mot de passe, le plus simple est de crer un formulaire. Celui-ci appellera la page protge et lui enverra le mot de passe. Un exemple de ce type de page est reprsent la gure 12.1. Laccs au contenu de la page ne sera autoris que si le mot de passe fourni par lutilisateur est kangourou.
Fig. 12.1 Page protge par mot de passe Vous devez donc crer deux pages web : formulaire.php : contient un simple formulaire comme vous savez les faire ; secret.php : contient les codes secrets mais ne les ache que si on lui donne le mot de passe. 139
CHAPITRE 12. TP : PAGE PROTGE PAR MOT DE PASSE Connaissances requises Nous avons dtaill les connaissances requises au dbut de ce chapitre. Vous allez voir que ce TP nest quune simple application pratique de ce que vous connaissez dj, mais cela sera une bonne occasion de vous entraner. ;-)
vous de jouer !
On a prpar le terrain ensemble ; maintenant, vous savez tout ce quil faut pour raliser le script ! Vous tes normalement capables de trouver le code taper par vous-mmes, et cest ce que je vous invite faire. a ne marchera probablement pas du premier coup, mais ne vous en faites pas : a ne marche jamais du premier coup ! Bon code !
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 bloqus. Si jamais vous tes bloqus, ne regardez pas toute la correction dun coup. Regardez juste la section qui vous pose problme et essayez de continuer sans la correction. Comme vous le savez, il y a deux pages crer. Commenons par la plus simple, formulaire.php :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/x html1/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=iso-8859-1" /> </head> <body> <p>Veuillez entrer le mot de passe pour obtenir les codes daccs 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 dinsister vous ne trouverez jamais le mot de passe ! ;-)</p>
140
CORRECTION
</body>
</html>
Code web : 710963 Si vous avez bien suivi le chapitre sur les formulaires, vous ne devriez avoir eu aucun mal raliser ce formulaire. Jai choisi un champ de type password puisquil sagit dun mot de passe. part a, rien de bien particulier. Maintenant, intressons-nous la page secret.php qui est appele par le formulaire.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/x html1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>Codes daccs au serveur central de la NASA</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-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 daccs :</h1> <p><strong>CRD5-GTFT-CK65-JOPM-V29N-24G1-HH28-LLFV</strong></p> <p> Cette page est rserve au personnel de la NASA. Noubliez pas de la visiter rgulirement car les codes daccs sont changs toutes les semaines.<br /> La NASA vous remercie de votre visite. </p>
<?php } else // Sinon, on affiche un message derreur { echo <p>Mot de passe incorrect</p>; } ?> </body>
</html>
CHAPITRE 12. TP : PAGE PROTGE PAR MOT DE PASSE Dans la page secrte, on vrie dabord si lon a envoy un mot de passe (avec isset) et si ce mot de passe correspond bien celui que lon attendait (kangourou). Si ces deux conditions sont remplies, on ache alors les codes daccs. Comme vous le voyez, je nai pas insr de echo pour acher tout ce texte. Quand il y a beaucoup de texte acher, il est prfrable de fermer les balises PHP aprs laccolade du if, cest plus simple et plus lisible. En revanche, pour le cas du else, comme il ny avait quune seule petite phrase acher, jai choisi de lacher avec un echo. Vous pouvez tester le fonctionnement du script en ligne laide du code web suivant si vous le dsirez. Code web : 334285 Alors, a vous plat ? Vous aurez beau chercher, on ne peut pas acher la page cache tant quon na pas entr le bon mot de passe. Vous navez qu mettre au d un ami ou un membre de votre famille, il pourra chercher des heures mais il ne verra pas la page cache sil na pas le bon mot de passe ! Cette protection est-elle vraiment ecace ?
Oui, honntement elle lest. Du moins, elle est ecace si vous mettez un mot de passe compliqu (pas simplement kangourou ). Pour moi, un bon mot de passe cest long, avec plein de caractres bizarres, des majuscules, des minuscules, des chires, etc. Par exemple, k7hYTe40Lm8Mf est un bon mot de passe qui a peu de chances dtre trouv par hasard .
Fig. 12.2 La page se renvoie les donnes On peut trs bien faire cela de faon tout fait scurise, cest juste un peu plus dicile imaginer. Il faut construire le code de votre page formulaire.php en deux grandes parties : si aucun mot de passe na t envoy (ou sil est faux) : acher le formulaire ; si le mot de passe a t envoy et quil est bon : acher les codes secrets. Toute votre page PHP sera donc construite autour dun grand if qui pourrait ressembler quelque chose comme ceci :
<?php // Le mot de passe na pas t envoy ou nest 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. Chaque fois que la page formulaire.php est appele, elle dtermine (grce au if) si on lappelle pour acher la partie secrte ou si on lappelle pour acher le formulaire de saisie du mot de passe. Voici alors ce qui se passera : 1. La premire fois que le visiteur charge la page formulaire.php, aucune donne POST nest envoye la page. Cest donc le formulaire qui sache. 2. Une fois quon a envoy le formulaire, la page formulaire.php est recharge et cette fois, elle reoit les donnes POST quon vient denvoyer. Elle peut donc les analyser et, si le mot de passe est bon, elle ache les codes secrets. Sauriez-vous refaire ce TP en une seule page en vous basant sur mes indices ? Essayez ! 143
CHAPITRE 12. TP : PAGE PROTGE PAR MOT DE PASSE Ce sera un trs bon exercice ! Et si vous avez des dicults, nhsitez pas demander de laide sur le forum PHP du Site du Zro. Code web : 932876 Vous pourriez mme aller plus loin, car dans mon schma de code prcdent, je nai pas prvu de cas pour acher Mot de passe incorrect . Cela peut se faire facilement en dcoupant votre page en trois laide dun elseif : formulaire, mot de passe incorrect, codes secrets.
144
Chapitre
13
Dicult :
ous avez probablement remarqu que les arrays $_GET et $_POST sont des variables un peu particulires : leur nom est crit en majuscules et commence par un underscore (le trait de soulignement), mais surtout ces variables sont gnres automatiquement par PHP. Ce sont ce quon appelle des variables superglobales.
Il existe dautres types de variables superglobales que nous allons dcouvrir dans ce chapitre. Parmi elles, certaines permettent de stocker des informations pendant la dure dune visite, cest le principe des sessions, mais aussi de stocker des informations sur lordinateur de vos visiteurs pendant plusieurs mois, cest le principe des cookies.
145
Je vous propose de passer en revue les principales variables superglobales existantes. Nous ne les utiliserons pas toutes, mais nous aurons fait un petit tour dhorizon pour pouvoir nous concentrer ensuite sur les plus utiles dentre elles. $_SERVER : ce sont des valeurs renvoyes par le serveur. Elles sont nombreuses et quelques-unes dentre elles peuvent nous tre dune grande utilit. Je vous propose de retenir au moins $_SERVER[REMOTE_ADDR]. Elle nous donne ladresse IP du client qui a demand voir la page, ce qui peut tre utile pour lidentier. $_ENV : ce sont des variables denvironnement toujours donnes par le serveur. Cest le plus souvent sous des serveurs Linux que lon retrouve des informations dans cette superglobale. Gnralement, on ne trouvera rien de bien utile l-dedans 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 prsence dun visiteur. Nous allons apprendre nous en servir dans ce chapitre. $_COOKIE : contient les valeurs des cookies enregistrs sur lordinateur du visiteur. Cela nous permet de stocker des informations sur lordinateur du visiteur pendant plusieurs mois, pour se souvenir de son nom par exemple. $_GET : vous la connaissez, elle contient les donnes envoyes en paramtres dans lURL. $_POST : de mme, cest une variable que vous connaissez et qui contient les informations qui viennent dtre envoyes par un formulaire. $_FILES : elle contient la liste des chiers 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 dtudier plus en dtail les sessions et les cookies. Avec a nous aurons fait le tour des principaux moyens de transmettre des variables 146
Les sessions
Les sessions constituent un moyen de conserver des variables sur toutes les pages de votre site. Jusquici, nous tions parvenus passer des variables de page en page via la mthode GET (en modiant lURL : page.php ?variable=valeur) et via la mthode POST ( laide dun formulaire). Mais imaginez maintenant que vous souhaitez transmettre des variables sur toutes les pages de votre site pendant la dure de la prsence dun visiteur. Ce ne serait pas facile avec GET et POST car ils sont plutt faits pour transmettre les informations une seule fois, dune page une autre. On sait ainsi envoyer dune page une autre le nom et le prnom du visiteur, mais ds quon charge une autre page ces informations sont oublies . Cest pour cela quon a invent les sessions.
147
CHAPITRE 13. VARIABLES SUPERGLOBALES, SESSIONS ET COOKIES 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 (cest 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 dcrire 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.
148
LES SESSIONS
</p> </body> </html>
Code web : 146303 Ne vous y trompez pas : on peut crer les variables de session nimporte o dans le code (pas seulement au dbut comme je lai fait ici). La seule chose qui importe, cest que le session_start() soit fait au tout dbut de la page. Comme vous le voyez, jai cr trois variables de session qui contiennent ici le nom, le prnom et lge du visiteur. Jai aussi fait des liens vers dautres pages de mon site. Notez quelque chose de trs important : ces liens sont tout simples et ne transmettent aucune information. Je ne moccupe de rien : ni de transmettre le nom, le prnom ou lge du visiteur, ni de transmettre lID de session. PHP gre tout pour nous. Maintenant, sur toutes les pages de mon site2 , je peux utiliser si je le souhaite les variables $_SESSION[prenom], $_SESSION[nom] et $_SESSION[age] ! Voici par exemple le code source de la page informations.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/x html1/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>Re-bonjour !</p> Je me souviens de toi ! Tu tappelles <?php echo $_SESSION[prenom] . . $_SESSION[nom]; ?> !<br /> Et ton ge hummm... Tu as <?php echo $_SESSION[age]; ?> ans, cest a ? :-D </p> </body> </html>
2 Bien
<p>
entendu, il faudra dmarrer le systme de session sur toutes les pages avec session_start().
149
CHAPITRE 13. VARIABLES SUPERGLOBALES, SESSIONS ET COOKIES Code web : 951093 Vous voyez ? On a juste fait dmarrer la session avec un session_start(), puis on a ach les valeurs des variables de session. Et l, magie ! Les valeurs des variables ont t conserves, on na rien eu faire ! En rsum, on peut crer des variables de session comme on cre des variables classiques, condition de les crire dans larray $_SESSION et davoir lanc le systme de sessions avec session_start(). Ces variables sont ainsi conserves de page en page pendant toute la dure de la prsence de votre visiteur. Si vous voulez dtruire manuellement la session du visiteur, vous pouvez faire un lien Dconnexion amenant vers une page qui fait appel la fonction session_destroy(). Nanmoins, sachez que sa session sera automatiquement dtruite au bout dun certain temps dinactivit.
3 Et
150
LES COOKIES
Les cookies
Travailler avec des cookies revient peu prs la mme chose quavec des sessions, quelques petites dirences prs que nous allons voir. Voici ce que nous allons faire pour dcouvrir les cookies : 1. on va voir ce quest exactement un cookie4 ; 2. ensuite, nous verrons comment crire un cookie : cest facile faire, si on respecte quelques rgles ; 3. enn, nous verrons comment rcuprer le contenu dun cookie : ce sera le plus simple.
Cela dpend de votre navigateur web. Gnralement on ne touche pas directement ces chiers, mais on peut acher lintrieur 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, comme sur la gure 13.1. Les cookies sont classs par site web. Chaque site web peut crire, comme vous le voyez, plusieurs cookies. Chacun deux a un nom et une valeur (que vous pouvez voir
4 Parce que si a se trouve, il y en a qui croient en ce moment mme que je vais parler de recettes de cuisine !
151
Fig. 13.1 Cookies sous Firefox la ligne Contenu sur la gure 13.1). Vous noterez que comme tout cookie qui se respecte, chacun a une date dexpiration. Aprs cette date, ils ne sont plus bons manger ils sont automatiquement supprims par le navigateur. Les cookies sont donc des informations temporaires que lon stocke sur lordinateur des visiteurs. La taille est limite quelques kilo-octets : vous ne pouvez pas stocker beaucoup dinformations la fois, mais cest en gnral susant.
crire 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 signie Placer un cookie en anglais). On lui donne en gnral trois paramtres, dans lordre suivant : 1. le nom du cookie (ex. : pseudo) ; 2. la valeur du cookie (ex. : M@teo21) ; 3. la date dexpiration du cookie, sous forme de timestamp (ex. : 1090521508). Le paramtre correspondant la date dexpiration du cookie mrite quelques explications. Il sagit dun timestamp, cest--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 actuel, on fait appel la fonction time(). Pour dnir une date dexpiration du cookie, il faut ajouter au moment actuel le nombre de secondes au bout duquel 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. 152
LES COOKIES Cela aura pour eet de supprimer votre cookie dans exactement un an. Voici donc comment on peut crer un cookie :
<?php setcookie(pseudo, M@teo21, time() + 365*24*3600); ?>
Scuriser son cookie avec le mode httpOnly Je recommande toutefois dactiver loption httpOnly sur le cookie. Sans rentrer dans les dtails, cela rendra votre cookie inaccessible en JavaScript sur tous les navigateurs qui supportent cette option5 . Cette option permet de rduire drastiquement les risques de faille XSS sur votre site, au cas o vous auriez oubli dutiliser htmlspecialchars un moment. Je vous recommande donc de crer votre cookie plutt comme ceci :
<?php setcookie(pseudo, M@teo21, time() + 365*24*3600, null, null, false, true); ?>
Le dernier paramtre true permet dactiver le mode httpOnly sur le cookie, et donc de le rendre en quelque sorte plus scuris. a ne cote rien et vous diminuez le risque quun jour lun de vos visiteurs puisse se faire voler le contenu dun cookie cause dune faille XSS. Les paramtres du milieu sont des paramtres que nous nutilisons pas, je leur ai donc envoy null.
Crer le cookie avant dcrire du HTML Il y a un petit problme avec setcookie. . . Comme pour session_start, cette fonction ne marche QUE si vous lappelez avant tout code HTML (donc avant la balise < !DOCTYPE>). Ne placez donc JAMAIS le moindre code HTML avant dutiliser setcookie. La plupart des gens qui ont des problmes avec setcookie ont fait cette erreur, donc souvenez-vous en ! Voyons maintenant comment je ferais pour crire deux cookies, un qui retient mon pseudo pendant un an, et un autre qui retient le nom de mon pays :
<?php setcookie(pseudo, M@teo21, time() + 365*24*3600, null, null, false, true); // On crit un cookie
5 Cest
153
Et voil, les cookies sont crits ! Comme vous le voyez, pour crire deux cookies il faut appeler deux fois setcookie.
Acher un cookie
Cest la partie la plus simple. Avant de commencer travailler sur une page, PHP lit les cookies du client pour rcuprer toutes les informations quils contiennent. Ces informations sont places dans la superglobale $_COOKIE, sous forme darray, comme dhabitude. De ce fait, si je veux ressortir le pseudo du visiteur que javais inscrit dans un cookie, il sut dcrire : $_COOKIE[pseudo]. Ce qui nous donne un code PHP tout bte pour acher de nouveau le pseudo du visiteur :
<p>
H ! Je me souviens de toi !<br /> Tu tappelles <?php echo $_COOKIE[pseudo]; ?> et tu viens de <?php echo $_COOKIE[pays]; ?> cest bien a ? </p>
Comme vous le voyez encore une fois, le gros avantage cest que les superglobales sont accessibles partout. Vous avez besoin de savoir ce que contient le cookie pseudo ? Achez donc le contenu de la superglobale $_COOKIE[pseudo] ! noter que si le cookie nexiste pas, la variable superglobale nexiste pas. Il faut donc faire un isset pour vrier si le cookie existe ou non. 154
LES COOKIES Les cookies viennent du visiteur. Comme toute information qui vient du visiteur, elle nest pas sre. Nimporte 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 modis, donc soyez prudents et nayez pas une conance aveugle en leur contenu !
Notez qualors le temps dexpiration du cookie est remis zro pour un an.
En rsum
Les variables superglobales sont des variables automatiquement cres par PHP. Elles se prsentent sous la forme darrays contenant dirents types dinformations. Dans les chapitres prcdents, nous avons dcouvert deux superglobales essentielles : $_GET (qui contient les donnes issues de lURL) et $_POST (qui contient les donnes issues dun formulaire). La superglobale $_SESSION permet de stocker des informations qui seront automatiquement transmises de page en page pendant toute la dure de visite dun internaute sur votre site. Il faut au pralable activer les sessions en appelant la fonction session_start(). La superglobale $_COOKIE reprsente le contenu de tous les cookies stocks par votre site sur lordinateur du visiteur. Les cookies sont de petits chiers que lon peut crire sur la machine du visiteur pour retenir par exemple son nom. On cre un cookie avec la fonction setcookie().
155
156
Chapitre
14
Dicult :
es variables sont simples utiliser, mais elles ne contiennent que des informations temporaires. La dure de vie dune variable nest en eet jamais trs longue. Or, vous aurez certainement besoin sur votre site de stocker des informations dnitivement.
Par exemple, il est impossible de stocker les messages dun forum dans des variables. . . puisque celles-ci seront supprimes la n de lexcution de la page ! Pour stocker ces informations longtemps, il faut les crire sur le disque dur. Quoi de plus logique pour cela que de crer des chiers ? PHP permet justement denregistrer des donnes dans des chiers sur le disque dur du serveur.
157
Fig. 14.1 Modier les permissions dun chier En gnral, vous devriez avoir un menu CHMOD ou Permissions de chier (comme moi). Cela devrait ouvrir une fentre qui ressemble peu prs la gure 14.2. Et cest l que se trouve la solution tous nos problmes ! Sans rentrer dans les dtails parce quil nest pas question de faire un cours sur Linux ici, voil comment a fonctionne : il y a trois types de personnes qui ont le droit de lire/modier des chiers. Le propritaire : cest lutilisateur sous Linux qui a cr le chier. Lui, il a en
1 Vous
pouvez utiliser celui que vous voulez, la manipulation est quasiment la mme.
158
Fig. 14.2 CHMOD 777 pour activer lcriture gnral tous les droits : lire, crire, excuter. Selon les droits quil possde, le premier chire du CHMOD change. Ici, cest 7 : a veut dire quil a tous les droits. Le groupe : a ne nous concerne pas trop l non plus. Ce sont les droits du groupe dutilisateurs auquel appartient le chier. Cela correspond au deuxime chire du CHMOD (ici : 7). Permissions publiques : ah ! L, a devient intressant. Les permissions publiques concernent tout le monde, cest--dire mme vos chiers PHP. Cest le troisime chire du CHMOD (par dfaut 5, il faut mettre cette valeur 7). Si vous rentrez 777 comme valeur pour le CHMOD, cela signie que tous les programmes du serveur ont le droit de modier le chier, notamment PHP. Il faut donc rentrer 777 pour que PHP puisse modier le chier en question. Vous pouvez aussi modier le CHMOD dun dossier. Cela dterminera si on a le droit de lire/crire dans ce dossier. Cela vous sera notamment utile si vous avez besoin de crer des chiers dans un dossier en PHP. Pour ceux qui veulent en savoir plus sur les CHMOD, je traite le sujet beaucoup plus en dtail dans mon cours sur Linux. Nhsitez pas aller lire le tutoriel si le sujet vous intresse. Code web : 525702
CHAPITRE 14. LIRE ET CRIRE DANS UN FICHIER Maintenant, on va crer un chier PHP qui va travailler sur compteur.txt. Votre mission, si vous lacceptez : compter le nombre de fois quune page a t vue sur votre site et enregistrer ce nombre dans ce chier. Voici comment nous allons procder :
<?php // 1 : on ouvre le fichier $monfichier = fopen(compteur.txt, r+); // 2 : on fera ici nos oprations sur le fichier... // 3 : quand on a fini de lutiliser, on ferme le fichier fclose($monfichier); ?>
Il y a trois tapes respecter. 1. On ouvre le chier avec fopen. Cette fonction renvoie une information que vous devez mettre dans une variable (ici : $monfichier). Cela nous sera utile tout lheure pour fermer le chier. On indique tout dabord fopen le chier quon veut ouvrir (compteur.txt), puis comment on veut louvrir (ici jai mis r+). Voici, regroupes dans le tableau ci-dessous, les principales possibilits notre disposition. Mode r r+ Explication Ouvre le chier en lecture seule. Cela signie que vous pourrez seulement lire le chier. Ouvre le chier en lecture et criture. Vous pourrez non seulement lire le chier, mais aussi y crire (on lutilisera assez souvent en pratique). Ouvre le chier en criture seule. Mais il y a un avantage : si le chier nexiste pas, il est automatiquement cr. Ouvre le chier en lecture et criture. Si le chier nexiste pas, il est cr automatiquement. Attention : le rpertoire doit avoir un CHMOD 777 dans ce cas ! noter que si le chier existe dj, le texte sera rajout la n.
a a+
Ici, on a cr le chier avant, donc pas besoin dutiliser a+. 2. On fait nos oprations de lecture/criture sur le chier. Nous allons voir comment a fonctionne un peu plus loin. 3. Enn, quand on a ni dutiliser le chier, on fait un fclose pour le fermer. On doit prciser quel chier doit tre ferm : mettez-y la variable $monfichier pour que PHP sache duquel il sagit, et cest bon. 160
LIRE ET CRIRE DANS UN FICHIER Vous ntes absolument pas obligs de donner lextension .txt votre chier. Vous pouvez lappeler comme vous voulez : compteur.cpt, compteur.num, ou mme compteur tout court.
Lire
Pour lire, on a deux 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 chier. On se sert donc assez peu de fgetc qui est plutt lourd utiliser2 . Dans notre cas, on va supposer que notre chier ne contient quune ligne : le nombre de pages qui ont t vues sur le site. Pour rcuprer ce nombre, il faudra procder comme ceci :
<?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 lutiliser, on ferme le fichier fclose($monfichier); ?>
Il faut indiquer fgets le chier lire. On lui donne notre variable $monfichier qui lui permettra de lidentier. 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 chier. Et si mon chier fait quinze 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.
2 Il
161
CHAPITRE 14. LIRE ET CRIRE DANS UN FICHIER Cest un peu lourd, mais si on stocke assez peu dinformations dans le chier, cela peut sure. Sinon, si on a beaucoup dinformations stocker, on prfrera utiliser une base de donnes (on en parlera dans la prochaine partie).
crire
Pour lcriture, on na quune seule possibilit : utiliser fputs. Cette fonction va crire la ligne que vous voulez dans le chier. Elle sutilise comme ceci :
<?php fputs($monfichier, Texte crire); ?>
Toutefois, il faut savoir o lon crit le texte. En eet, le fonctionnement dun chier est assez trange. . . 1. Vous louvrez avec fopen. 2. Vous lisez par exemple la premire ligne avec fgets. 3. Oui mais voil : maintenant, le curseur de PHP se trouve la n de la premire ligne (vu quil vient de lire la premire ligne), comme dans la gure 14.3.
Fig. 14.3 Le curseur de PHP est la n de 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 lon veut dans le chier. En loccurence, on va replacer le curseur au dbut du chier en faisant : fseek($monfichier, 0) ; Notre curseur sera alors repositionn au dbut, voyez donc la gure 14.4.
Fig. 14.4 Le curseur de PHP est replac lendroit choisi Si vous avez ouvert le chier avec le mode a ou a+, toutes les donnes que vous crirez seront toujours ajoutes la n du chier. La fonction fseek naura donc aucun eet dans ce cas. 4. Ouf, notre curseur est au dbut du chier, on peut maintenant faire un fputs. La ligne va scrire par-dessus lancienne, ce qui fait que lancien texte sera cras (remplac par le nouveau). 162
LIRE ET CRIRE DANS UN FICHIER 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 :
<?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>; ?>
Code web : 666284 Ce ntait pas si dur, vous voyez. Voici la description des quatre lignes du milieu (les plus importantes) : 1. on rcupre la premire ligne du chier, qui est le nombre de pages qui ont t vues pour le moment sur le site ; 2. on ajoute 1 la variable $pages_vues. Si elle valait 15, elle vaudra dsormais 16 ; 3. on replace notre fameux curseur au dbut du chier (parce que sinon, il se trouvait la n de la premire ligne et on aurait crit la suite) ; 4. on crit notre nouveau nombre de pages vues dans le chier, en crasant lancien nombre. Si vous avez oubli de mettre un CHMOD 777 sur le chier compteur.txt, vous aurez lerreur suivante : Warning : fopen(compteur.txt) : failed to open stream : Permission denied . Ici, PHP essaie de vous dire quil na pas russi ouvrir le chier car il na pas le droit dcrire dedans. Il faut donc absolument mettre ce CHMOD si vous voulez pouvoir toucher au chier ! Voil, vous venez de voir comment on se sert dun chier : ouverture, lecture, criture, fermeture. Pour un gros chier, cela devient vite compliqu, mais pour un petit chier comme celui-ci, cela convient trs bien. Dans la suite de ce cours, nous allons dcouvrir une mthode plus ecace pour stocker des donnes : nous allons utiliser une base de donnes MySQL. 163
En rsum
PHP permet denregistrer des informations dans des chiers sur le serveur. Il faut au pralable sassurer que les chiers autorisent PHP les modier. Pour cela, il faut changer les permissions du chier (on parle de CHMOD) laide dun logiciel FTP comme FileZilla. Donnez la permission 777 au chier pour permettre PHP de travailler dessus. La fonction fopen permet douvrir le chier, fgets de le lire ligne par ligne et fputs dy crire une ligne. moins de stocker des donnes trs simples, lutilisation des chiers nest pas vraiment la technique la plus adapte pour enregistrer des informations. Il est vivement recommand de faire appel une base de donnes.
164
Troisime partie
165
Chapitre
15
Dicult :
our linstant, vous avez dcouvert le fonctionnement du langage PHP mais vous ne vous sentez probablement pas encore capables de crer de vrais sites web avec ce que vous avez appris. Cest parfaitement normal car il vous manque un lment crucial : la base de donnes. Une base de donnes permet denregistrer des donnes de faon organise et hirarchise. Certes, vous connaissez les variables, mais celles-ci restent en mmoire seulement le temps de la gnration de la page. Vous avez aussi appris crire dans des chiers, mais cela devient vite trs compliqu ds que vous avez beaucoup de donnes enregistrer. Or, il va bien falloir stocker quelque part la liste de vos membres, les messages de vos forums, les options de navigation des membres. . . Les bases de donnes constituent le meilleur moyen de faire cela de faon simple et propre. Nous allons les tudier durant toute cette partie du livre !
167
LE LANGAGE SQL ET LES BASES DE DONNES Nous allons utiliser MySQL, mais sachez que lessentiel de ce que vous allez apprendre fonctionnera de la mme manire avec un autre SGBD. Cette partie est construite an que vous ayez le moins de choses possible apprendre de nouveau si vous choisissez de changer de SGBD.
Le principal objectif de cette partie du livre sera dapprendre utiliser ce langage SQL pour que vous soyez capables de donner nimporte 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.
Fig. 15.1 Communication entre PHP et MySQL Maintenant que nous avons fait les prsentations, il va falloir dcouvrir comment est organise une base de donnes. Bien en comprendre lorganisation est en eet absolument indispensable.
170
Tab. 15.1 Table visiteurs Numro 1 2 3 4 ... Pseudonyme Kryptonic Serial_Killer M@teo21 Bibou ... E-mail kryptonic@free.fr serialkiller@unitedgamers.com top_secret@siteduzero.com bibou557@laposte.net ... ge 24 16 18 29 ...
Trs souvent, on cre un champ Numro , aussi appel ID (identiant). Comme nous le verrons plus tard, il est trs pratique de numroter ses entres, mme si ce nest pas obligatoire. Et pour nir, voici lindispensable schma, en gure 15.2, pour que tout a soit clair.
Fig. 15.2 Organisation dune base de donnes MySQL La base de donnes contient plusieurs tables (on peut en mettre autant que lon veut lintrieur). 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 lon peut tre amen crer pour les besoins de son site web : news : stocke toutes les news qui sont aches laccueil ; livre_or : stocke tous les messages posts sur le livre dor ; forum : stocke tous les messages posts sur le forum ; newsletter : stocke les adresses e-mail de tous les visiteurs inscrits la newsletter.
Voil, vous devriez commencer comprendre pourquoi vous allez avoir besoin dune BDD sur votre site. Si quelque chose ne vous parat pas clair, si vous avez limpression de mlanger un peu bases , tables , champs ou entres , relisez de nouveau cette partie. Il faut que vous soyez capables de reproduire le schma tout seuls sur un bout de papier. 171
En rsum
Une base de donnes est un outil qui stocke vos donnes de manire organise et vous permet de les retrouver facilement par la suite. On communique avec MySQL grce au langage SQL. Ce langage est commun tous les systmes de gestion de base de donnes2 . PHP fait lintermdiaire entre vous et MySQL. Une base de donnes contient plusieurs tables. Chaque table est un tableau o les colonnes sont appeles champs et les lignes entres .
2 Avec
172
Chapitre
16
Dicult :
phpMyAdmin
ous 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 daccder sa base de donnes et dy faire des modications. On peut utiliser une ligne de commande (console), excuter les requtes en PHP ou faire appel un programme qui nous permet davoir rapidement une vue densemble. 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 vous en servir tout de suite. Presque tous les hbergeurs permettent dutiliser phpMyAdmin ; renseignez-vous auprs du vtre pour savoir comment y accder.
173
Fig. 16.1 Accueil de phpMyAdmin Vous pouvez remarquer deux endroits importants, signals par des numros sur ma capture dcran. 1. Liste des bases : cest la liste de vos bases de donnes. Le nombre entre parenthses est le nombre de tables quil y a dans la base. Sur ma capture dcran, on a donc deux bases : information_schema, qui contient 28 tables, et mysql, qui en contient 23. 2. Crer une base : pour crer une nouvelle base de donnes, entrez un nom dans le champ de formulaire droite, cliquez sur Crer et hop ! cest fait. Pour le moment, deux bases existent dj : information_schema et mysql. Ny touchez pas, elles servent au fonctionnement interne de MySQL. Nous allons maintenant crer une nouvelle base test dans laquelle nous travaillerons 174
CRER UNE TABLE tout le temps par la suite. Utilisez le formulaire droite pour crer cette base : entrez le nom test et cliquez sur le bouton Crer. Lcran de la gure 16.2 devrait alors sacher si la base a bien t cre.
Fig. 16.2 La base de test a t cre, vide On vous indique quaucune table na t trouve dans la base. Et si on en crait une ? Dans le champ Crer une nouvelle table sur la base test , entrez le nom news et le nombre de champs 3, comme vous le montre la gure 16.3.
Fig. 16.3 Crer une table Cliquez sur Excuter . La table nest pas immdiatement cre : il faut maintenant indiquer le nom des champs et les donnes quils peuvent contenir. Je vous propose de faire simple car pour linstant on cherche juste tester phpMyAdmin. Pour cette table, on va crer les trois champs suivants. id : comme bien souvent, vous allez devoir crer un champ appel id (prononcez langlaise aille di ). Cest le numro didentication. Grce lui, toutes vos entres seront numrotes, ce qui est bien pratique. Il y aura ainsi la news no 1, no 2, no 3, etc. titre : ce champ contiendra le titre de la news. contenu : enn, ce champ contiendra la news elle-mme. Soyons clairs : je ne suis pas en train de vous apprendre crer un systme de news pour votre site. Nous aurons loccasion dy travailler un peu plus tard. Pour le moment nous cherchons seulement dcouvrir le fonctionnement de phpMyAdmin. 175
CHAPITRE 16. PHPMYADMIN Vous devriez avoir la gure 16.4 sous les yeux.
Fig. 16.4 Cration dune table MySQL Chaque colonne reprsente un champ. Nous avons demand trois champs, il y a donc trois colonnes. phpMyAdmin vous demande beaucoup dinformations mais rassurez-vous, il nest pas ncessaire de tout remplir. La plupart du temps, les sections les plus intressantes seront : Champ : permet de dnir le nom du champ (trs important !) ; Type : le type de donnes que va stocker le champ (nombre entier, texte, date. . .) ; Taille/Valeurs : permet dindiquer la taille maximale du champ, utile pour le type VARCHAR notamment, an de limiter le nombre de caractres autoriss ; Index : active lindexation du champ. Ce mot barbare signie dans les grandes lignes que votre champ sera adapt aux recherches. Le plus souvent, on utilise lindex PRIMARY sur les champs de type id ; AUTO_INCREMENT : permet au champ de sincrmenter tout seul chaque nouvelle entre. On lutilise frquemment sur les champs de type id. Je vous propose de remplir le formulaire comme je lai fait. Veillez bien cocher AUTO_INCREMENT et dnir un index PRIMARY sur le champ id. Une fois que cest fait, cliquez sur le bouton Sauvegarder en bas de la page. Votre table est cre ! Avant daller plus loin, je voudrais revenir un peu plus en dtail sur les types de champs et les index, notamment lindex PRIMARY quon a utilis.
Fig. 16.5 Types de donnes MySQL tenant (int, string, bool. . .), MySQL propose une quantit trs importante 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 dirents 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, utiles pour ceux qui font de la cartographie. Ce ne sera pas notre cas, donc nous nen parlerons pas ici. En fait, phpMyAdmin a eu la bonne ide de proposer au tout dbut de cette liste les quatre types de donnes les plus courants : INT : nombre entier ; VARCHAR : texte court (entre 1 et 255 caractres) ; TEXT : long texte (on peut y stocker un roman sans problme) ; DATE : date (jour, mois, anne).
Nous naurons besoin de jongler quentre ces quatre types, donc ce sont eux quil faut retenir. Cela couvrira 99 % de nos besoins. Une petite remarque propos de VARCHAR : cest un type adapt aux textes courts, comme le titre dune 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 lai fait dans lexemple prcdent.
177
Fig. 16.6 Liste des tables Si vous cliquez sur le mot news , le contenu de la table sache droite de lcran. 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), cest la structure de la table (gure 16.7) qui sachera dans les deux cas. Ce tableau vous rappelle de quels champs est constitue votre table : cest sa structure. Notez que le champ id est soulign car cest la cl primaire de la table. Il ny a rien de bien intressant faire ici, mais sachez quil est possible dajouter ou de supprimer des champs tout moment. Ce nest pas parce que votre table a t cre quelle est ge. Vous avez des options pour renommer les champs, les supprimer, en ajouter, etc. Jetez dj un il aux onglets du haut : Structure , Acher , SQL , etc. Cela vous amnera vers direntes options que nous verrons plus loin. Nous allons 178
Fig. 16.7 Structure de la table news commencer par nous intresser longlet Insrer , qui va nous permettre dajouter des entres la table. Une page souvre dans laquelle vous pouvez entrer des valeurs pour chacun des champs. Cela va tre pour nous loccasion dinsrer notre premire news, comme le suggre la gure 16.8.
Fig. 16.8 Insertion dun nouvel enregistrement Seule la colonne Valeur nous intresse. Vous pouvez entrer une valeur pour chacun des trois champs. Vous remarquerez que je nai pas mis de valeur pour lid : cest normal, le numro did est automatiquement calcul grce loption auto_increment. Ne vous en occupez pas et choisissez plutt un titre puis insrez un contenu. Lid 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. Sil ny a pas de news no 15 par exemple, cela ne pose aucun problme. Ce qui compte, cest quil ny ait pas deux news avec le mme id. Cest dailleurs justement ce que permet dviter la cl primaire : elle interdit que deux entres aient le mme id. 179
CHAPITRE 16. PHPMYADMIN Une fois que vous avez insr le texte que vous vouliez, cliquez sur le premier bouton Excuter de la page. Il y a dautres champs en dessous : ignorez-les. Ils vous permettent dajouter plusieurs entres la fois, mais nous nen avons pas besoin. Recommencez une ou deux fois en faisant la mme manipulation et en laissant le champ id vide. Achez maintenant le contenu de la table. Vous pouvez cliquer soit sur longlet Acher , en haut, soit sur le nom de la table dans le menu gauche. La gure 16.9 vous prsente le contenu que vous devriez voir.
Fig. 16.9 Contenu de la table news Vous reprez ici les champs id , titre et contenu . Cette table possde trois entres, et comme vous pouvez le voir MySQL a bien fait les choses puisque les numros did se sont crs tout seuls. Vous pouvez modier ou supprimer chacun des lments que vous voyez lcran. Il y a beaucoup dautres options en dessous que je vous laisse regarder. Pour linstant, ce qui compte, cest que vous ayez compris la procdure pour ajouter des lments la table et que vous soyez capables de lister son contenu. 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 message des forums ? Non, bien sr que non. Comme son nom lindique, phpMyAdmin est un outil dadministration. Il permet de voir rapidement la structure et le contenu de vos tables. Il est aussi possible dajouter 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 oertes par phpMyAdmin et nous aurons termin notre tour dhorizon de cet outil.
Autres oprations
Nous avons jusquici dcouvert le rle de trois onglets : 180
AUTRES OPRATIONS Acher : ache le contenu de la table ; Structure : prsente la structure de la table (liste des champs) ; Insrer : permet dinsrer de nouvelles entres dans la table. Je souhaite vous prsenter six autres onglets : SQL ; Importer ; Exporter ; Oprations ; Vider ; Supprimer.
SQL
Cliquez sur longlet SQL , prsent sur la gure 16.10.
Fig. 16.11 criture dune requte SQL Cest ici que vous pouvez excuter ce que lon appelle des requtes SQL pour demander MySQL de faire quelque chose. Cest dans la grande zone de texte que vous pouvez taper ces requtes. Par exemple on nous propose ici :
SELECT * FROM news WHERE 1
Cela signie : Acher tout le contenu de la table news . Cest justement ce langage SQL que nous allons dcouvrir tout au long des prochains chapitres. 181
CHAPITRE 16. PHPMYADMIN Notez quil est aussi possible dcrire des requtes SQL dans une nouvelle fentre. Pour ouvrir une nouvelle fentre de requte SQL, cliquez sur le bouton SQL en haut du menu de gauche, ainsi que vous le propose la gure 16.12.
Fig. 16.12 Ouvrir une nouvelle fentre SQL Cette nouvelle fentre se rvlera souvent trs pratique.
Importer
Il y a aussi un onglet Importer (gure 16.13).
Fig. 16.13 Onglet Importer Dans la page qui sache, vous pouvez envoyer un chier de requtes SQL (gnralement un chier .sql) MySQL pour quil les excute (gure 16.14). Seul le premier champ en haut devrait nous intresser : il nous permet dindiquer un chier 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 dirence y a-t-il entre crire la requte SQL (comme on vient de le voir juste avant) et envoyer un chier contenant des requtes SQL ? Cest la mme chose, sauf que parfois quand on doit envoyer un trs grand nombre de requtes, il est plus pratique dutiliser un chier. Dailleurs, dans les prochains chapitres du livre, je vous donnerai un chier de requtes excuter, et il faudra utiliser cette mthode. 182
AUTRES OPRATIONS
Exporter
Nous nous intressons maintenant longlet Exporter . Cest ici que vous allez pouvoir rcuprer votre base de donnes sur le disque dur sous forme de chier texte .sql (qui contiendra des tonnes de requtes SQL). Ce chier que lon va exporter , est-ce que cest le mme que celui dont tu nous parlais tout lheure ? Celui situ dans C:\wamp\mysql\data ? Non, pas du tout. Ce que je vous ai montr tout lheure, ctait quelque chose dillisible. Je vous avais dit quon ny toucherait pas, je ne vous ai pas menti. Le chier que vous allez obtenir grce lexportation de phpMyAdmin, cest un chier qui dit MySQL comment recrer votre base de donnes (avec des requtes en langage SQL).
CHAPITRE 16. PHPMYADMIN transmettre votre base de donnes sur Internet : pour le moment, votre base de donnes se trouve sur votre disque dur. Mais lorsque vous voudrez hberger votre site sur Internet, il faudra utiliser la base de donnes en ligne de votre hbergeur ! Le chier .sql que vous allez gnrer vous permettra de reconstruire la base de donnes grce loutil dimportation de phpMyAdmin1 ; faire une copie de sauvegarde de la base de donnes : on ne sait jamais, si vous faites une btise ou si quelquun russit dtruire toutes les informations sur votre site (dont la base de donnes), vous serez bien contents davoir une copie de secours sur votre disque dur ! Votre cran doit ressembler la gure 16.15.
Fig. 16.15 Exportation dune table Je vous conseille de laisser les options par dfaut, cest largement susant. Distinguez simplement la structure des donnes de la table. La structure dune table se rsume en quelques lignes : ce sont en fait les noms des champs, leurs types, etc. En revanche, les donnes correspondent aux entres, et il peut y en avoir beaucoup ! Pour
1 En gnral, les hbergeurs proposent eux aussi phpMyAdmin pour que vous puissiez eectuer facilement des oprations sur votre base en ligne.
184
AUTRES OPRATIONS 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. 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 chier : cest tout fait normal. Nhsitez pas regarder ce quil y a dans ce chier : vous allez voir quil contient plusieurs requtes SQL. Cest 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. Renseignez-vous pour en connatre ladresse. Par exemple, chez Free cest http://phpmyadmin.free.fr/phpMyAdmin (il faudra indiquer votre login et mot de passe). Une fois dessus, rendez-vous dans longlet Importer quon a vu tout lheure. Cliquez sur Parcourir pour indiquer o se trouve le chier SQL que vous venez de crer sur votre disque dur. Faites Excuter , attendez quil soit envoy, et cest bon ! Votre base de donnes est alors recre sur Internet !
Oprations
Ici, vous pouvez eectuer diverses oprations sur votre table. Je ne vais pas les numrer une une, ni vous expliquer comment elles fonctionnent vu que cest 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 placer 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 quelle ait un nom dirent) ; optimiser la table : force dutiliser une table, surtout si elle est grosse, on nit par avoir des pertes qui font que la table nest plus bien organise. Un clic l-dessus et hop ! cest de nouveau arrang.
Vider
Vide tout le contenu de la table. Toutes les entres vont disparatre, seule la structure de la table restera (cest--dire les champs). 185
Supprimer
Pour supprimer la totalit de la table (structure et donnes), cliquez sur cet onglet. L encore, rchissez-y deux fois avant de tout supprimer, car vous ne pourrez rien rcuprer par la suite, moins davoir fait une sauvegarde au pralable avec loutil dexportation.
En rsum
phpMyAdmin est un outil qui nous permet de visualiser rapidement ltat de notre base de donnes ainsi que de la modier, sans avoir crire de requtes SQL. On cre gnralement un champ nomm id qui sert numroter les entres dune table. Ce champ doit avoir un index PRIMARY (on dit quon cre une cl primaire) et loption AUTO_INCREMENT qui permet de laisser MySQL grer la numrotation. MySQL gre dirents types de donnes pour ses champs, la manire de PHP. On trouve des types adapts au stockage de nombres, de textes, de dates, etc. phpMyAdmin possde un outil dimportation et dexportation des tables qui nous permettra notamment denvoyer notre base de donnes sur Internet lorsque nous mettrons notre site en ligne.
186
Chapitre
17
Dicult :
ans ce chapitre, nous retournons nos pages PHP. partir de maintenant, nous allons apprendre communiquer avec une base de donnes via PHP. Ce sera loccasion de dcouvrir le langage SQL, que nous tudierons tout au long des prochains chapitres.
Ici, nous allons nous entraner