Vous êtes sur la page 1sur 105

Support de cours PHP Mme Saidi -- 2007

1 - Avant toutes choses ! 2 - Bien dmarrer avec EasyPHP 3 - Dclarer des variables 4 - A icher le contenu des variables ! - "es variables #rd inies $ - %oncatner deu& cha'nes ( - "es structures de contr)les * - "ire et crire dans un ichier te&te + - ,cu#rer les donnes des ormulaires 1- - "es onctions utilisateurs 11 - .ntroduction au& bases de donnes 12 - %ration des tables en /0" 13 - 1onctions PHP #our 2y/0" 14 - A icher les donnes de votre base 1! - .nsrer des donnes dans votre base 1$ - 2odi ier des donnes de votre base 1( - /u##rimer des donnes de votre base 1* - "es coo3ies 1+ - "es variables 4lobales 2- - "es sessions 21 - "e dbu44a4e 22 - "a #orte des variables 23 - "a librairie 5D 24 - "es e&#ressions r4uli6res 2! - "a #ro4rammation ob7et 8conce#ts ondamentau&9 2$ - "a #ro4rammation ob7et 8#remi6re a##roche9 2( - "es variables dynami:ues

Support de cours PHP Mme Saidi -- 2007

Avant toutes choses ! Descri#ti


Avant de commencer crire vos pages en PHP, il aut d!a"ord conna#tre un minimum de c$oses sur ce ormida"le langage% PHP &o iciellement, ce sigle est un acron'me rcursi pour (PHP) H'perte*t Preprocessor(+ est un langage de scripts gnraliste, ,pen Source, et spcialement con-u pour le dveloppement d!applications .e"% /l peut 0tre intgr acilement vos pages H1M2% 2e code PHP 3ue vous alle4 insrer dans vos pages 567 sera repr par un serveur 567 &si il est muni de l!e*tension PHP+ 3u!il l!enverra PHP pour l!interprter &8e parle "ien d!interprtation et non de compilation+% Pour in ormation sac$e4 3ue PHP est support par de nom"reu* serveurs 567, dont le ameu* pro8et Apac$e% 9r:ce ces portions de code PHP 3ue vous alle4 insrer dans vos pages 567, PHP vous permettra d!crire rapidement des pages 567 contenus d'nami3ues% Surtout si il est coupl avec un serveur de "ases de donnes relationnelles tel 3ue M'S;2%

"e onctionnement
/l est noter une di rence avec les autres scripts <9/ crits dans d!autres langages tels 3ue le Perl ou le < ) au lieu d!crire un programme avec de nom"reuses lignes de commandes a in de gnrer une page H1M2, avec PHP, vous crive4 une page H1M2 avec du code PHP inclus l!intrieur a in de raliser une action prcise% 2e code PHP est inclus entre une "alise de d"ut et une "alise de in 3ui permettent au serveur .e" de passer en (mode PHP(% 2a connaissance du code H1M2 est donc vivement conseille, voir m0me indispensa"le pour commencer ses premi=res pages en PHP &ceci car le PHP ne ait 3ue gnrer du code H1M2 > et 3u!il est inconceva"le de gnrer 3uel3ue c$ose 3ue l!on ne ma#trise pas+% /l aut galement savoir 3ue lors3ue vous insre4 le moindre petit "out de code PHP dans une page H1M2, vous devre4 c$anger l!e*tension de ce ic$ier en %p$p &en clair ) si vous ave4 une page nomme inde*%$tm et 3ue vous ' insre4 du code PHP, il vous audra la renommer en inde*%p$p+% <omme nous venons de le voir, il est tout ait possi"le de mlanger, au sein d!une m0me page 567, des instructions H1M2 et des instructions PHP% Seulement, pour 3ue le serveur 3ui vous $"erge puisse reprer les portions de code en PHP, il su it simplement de lui indi3uer le d"ut ainsi 3ue la in du code PHP% <es mar3ues 3ui dlimitent la portion de code, s!appellent des "alises ) - on utilisera la "alise ?@p$p pour mar3uer le d"ut d!une portion de code PHP - on utilisera la "alise @A pour mar3uer la in d!une portion de code PHP 2es instructions du code PHP se placeront naturellement entre ces deu* "alises% 2

Support de cours PHP Mme Saidi -- 2007 e*emple1


<html> <head> <title>Test</title> </head> <body> <p>un bout de code en HTML</p> <?php echo 'Mon premier script en PHP'; ?> </body> </html>

Be vous in3uite4 pas pour le moment, on dcrira plus tard ce 3ue produit cette ligne de PHP% <e petit e*emple est 8uste l pour vous montrer comment on ins=re du code PHP dans une page 567% <omme tout "on langage de programmation, PHP o re la possi"ilit de commenter son code% Pour cela, deu* tec$ni3ues ) - pour commenter une seule ligne de code PHP, on prcdera cette ligne de deu* slas$s CC - pour commenter une portion de code, on prcdera la premi=re ligne de code 3ue l!on sou$aite commenter par un CD et on era suivre la derni=re ligne de code 3ue l!on sou$aite commenter par un DC e*emple2
<?php // ceci est un commentaire sur une seule ligne /* ceci est un commentaire sur plusieures lignes */ ?>

<e 3ui distingue le PHP des langages de script comme le Eavascript est 3ue le code est e*cut sur le serveur% Si vous ave4 un script similaire sur votre serveur, le client ne re-oit 3ue le rsultat du script, sans aucun mo'en d!avoir acc=s au code 3ui a produit ce rsultat% Fous pouve4 con igurer votre serveur .e" a in 3u!il anal'se tous vos ic$iers H1M2 comme des ic$iers PHP% Ainsi, il n!' a aucun mo'en de distinguer les pages 3ui sont produites d'nami3uement des pages stati3ues% 2e grand avantage de PHP est 3u!il est e*tr0mement simple pour les nop$'tes, mais o re des onctionnalits avances pour les e*perts% Be craigne4 pas de lire la longue liste de onctionnalits PHP% Fous pouve4 vous plonger dans le code, et en 3uel3ues instants, crire des scripts simples% 7ien 3ue le dveloppement de PHP soit orient vers la programmation pour les sites .e", vous pouve4 en aire "ien d!autres usages%

"es besoins #our bien commencer


Pour "ien commencer, il vous aut deu* c$oses essentielles ) - un diteur de te*te pour crire vos portions de code en PHP - un environnement de dveloppement a in de tester ces portions de code G

Support de cours PHP Mme Saidi -- 2007 6n ce 3ui concerne les diteurs de te*tes, vous pourre4 en trouver des di4aines sur la toile, suivant votre s'st=me d!e*ploitation et vos diverses e*igences de onctionnalits% Pour vous dcider, vous pouve4 consulter des sites comparants des nom"reu* diteurs% Pour l!environnement de dveloppement, si vous ne voule4 pas trop vous compli3uer la vie est installant Apac$e, PHP et M'S;2 la main, 8e vous conseille d!utiliser des (pacHages( proposant des solutions pretes l!emploi% 6n 3uel3ues clics, votre environnement sera install et onctionnel% Foici 3uel3ues sites proposant ce genre d!environnement ) - 6as'PHP &5indo.s+ - .ampserver &5indo.s+ - mamp &Apple+ - 7igApac$e

%onclusion
Peu de c$oses dire pour ce premier cours, si ce n!est 3u!il aut "ien comprendre le onctionnement de PHP ) PHP travaille du cIt serveur et non du cIt client% <!est dire 3ue PHP va gnrer des pages compr$ensi"les par les navigateurs 567 des clients, soit de l!H1M2 &un navigateur 567 ne comprend pas le PHP+% A ne pas ou"lier ) - insertion de code PHP l!aide des "alises ?@p$p et @A - renommer les ic$iers H1M2 contenant du PHP en %p$p - crire des commentaires sur son code PHP avec un CC ou un CD %%% DC

Bien dmarrer avec EasyPHP


A in de "ien dmarrer la programmation PHP sous 5indo.s, le mieu* est d!utiliser 6as'PHP &3ue vous pouve4 tlc$arger ici+% 6n e et, 8e vous rappelle 3u!6as'PHP &voir le site o iciel ici+ est une petite application 3ui onctionne sous 5indo.s et 3ui est en ait une sorte de pacHage 3ui vous installera tout ce dont vous ave4 "esoin pour d"uter en PHP ) - un serveur $ttp &Apac$e+ - PHP - un serveur de "ase de donnes &M'S;2+ - un script d!administration de vos "ases de donnes &PHPM'Admin+ J

Support de cours PHP Mme Saidi -- 2007 Bote ) ce cours traite de l!installation d!6as'PHP version 1%K% Lepuis la parution de ce cours, de nouvelles versions d!6as'PHP ont pu sortir, et des variantes dans la mt$ode d!installation peuvent donc e*ister% Mne ois l!e*cuta"le tlc$arg, dou"le cli3uer dessus a in de dmarrer l!installation% Fous devrie4 alors voir la en0tre suivante )

Accepter, et de m0me, prene4 connaissance du contrat de licence% <$oisisse4 ensuite le rpertoire d!installation d!6as'PHP &nous, nous avons laisser le rpertoire propos par l!installateur, c!est--dire le rpertoire <)Program Niles6as'PHP+%

<on irme4, l!installation devrait ensuite se poursuivre sans aucun pro"l=me% Mne ois l!installation ac$eve, vous devrie4 vous retrouver devant l!cran suivant )

Support de cours PHP Mme Saidi -- 2007

1erminer l!installation en cli3uant sur 1erminer &ils sont orts c$e4 6as'PHP 3uand m0me $ein PP+% Mne ois ceci ait, dans votre "arre des tac$es 5indo.s &en "as droite+, vous devrie4 avoir une icIne reprsentant un 6% 6n approc$ant votre souris dessus, une petite "ulle d!aide devrait vous dire 3u!6as'PHP est arr0t%

Si tel est le cas, aites un clic droit dessus, et dans le menu 3ui s!a ic$e, slectionner l!option Lmarrer%

2e petit 6 devrait maintenant vous in ormer 3ue votre 6as'PHP est en tat de marc$e% Qemar3uer au passage, 3u! cIt du 6, un petit point rouge devrait clignoter%

Naites maintenant un clic droit &tou8ours sur le 6+ et dans le menu conte*tuel, c$oisisse4 l!option 5e" local% K

Support de cours PHP Mme Saidi -- 2007

2a en0tre 5e" suivante devrait alors s!ouvrir sous vos 'eu*% Boter 3u!il n!' a aucun rpertoire la racine d!Apac$e, ce 3ui est normal puis3ue nous n!avons, pour l!instant, crit aucun script PHP%

Qende4-vous alors dans le rpertoire <)Program Niles6as'PHP... &naturellement, si vous ave4 un autre rpertoire d!installation 3ue celui propos par d aut, vous deve4 aller votre rpertoire d!installation+% Be supprimer surtout pas le ic$ier inde*%p$p &en e et, c!est gr:ce ce ic$ier 3ue nous avons pu avoir la page 5e" prcdente+% <rer alors un rpertoire du nom de votre c$oi* &nous, nous l!avons nomm premierRscript+%

Support de cours PHP Mme Saidi -- 2007

,uvrer alors ce rpertoire, et dedans, crer un nouveau ic$ier PHP &inde*%p$p par e*emple+% ,uvrer ce ic$ier, et place4 ' dedans, le code suivant )
<?php phpin o!"; ?>

Nermer votre ic$ier en le sauvegardant au passage, puis retourner votre 5e" local% Qa ra#c$isse4 votre page, et normalement, vous devrie4 avoir l!cran suivant )

6n e et, c!est l 3ue nous vo'ons l!intr0t du ic$ier inde*%p$p &pas le notre, celui du rpertoire ...+ ) en ait, il scanne le rpertoire ... la rec$erc$e de tous les rpertoires &vous devre4 par la suite crer un rpertoire pour c$acun de vos pro8ets PHP+% <li3uer alors sur le lien premierRscript% 2!cran suivant devrait maintenant appara#tre%

Support de cours PHP Mme Saidi -- 2007

6n e et, 3ue s!est il pass @ 6t "ien, en ouvrant ce rpertoire, Apac$e est parti la rec$erc$e d!un ic$ier de t'pe inde*% /l l!a trouv, et il s!est rendu compte 3ue c!tait un ic$ier p$p% /l a alors pass la main PHP 3ui s!est mis interprt le code p$p contenu dans ce ic$ier &notre p$pin o&++, ce 3ui a permis Apac$e de nous a ic$er le rsultat de l!interprtation du code PHP% Naites maintenant un clic droit sur le 6 3ui est dans la "arre des tac$es% Slectionner l!option Administration dans le menu conte*tuel% 2!cran suivant devrait alors appara#tre )

<li3uer sur PHPM'Admin &a in de grer toutes vos "ases de donnes+%

Support de cours PHP Mme Saidi -- 2007

2!cran suivant appara#t alors% /l s!agit de PHPM'Admin, un script 3ui vous permettra d!administrer toutes vos "ases de donnes sur une page 567 &ce 3ui est "eaucoup plus prati3ue 3ue de le aire directement en ligne de commande via M'S;2+%

Mne ois votre utilisation termine d!6as'PHP, n!ou"lie4 surtout pas de l!teindre UUU Pour cela, aites un clic droit sur le 6 de votre "arre des tac$es, et c$oisisse4 l!option Arr0ter du menu conte*tuel% <ela aura pour e et de couper votre serveur $ttp &Apac$e+ ainsi 3ue votre serveur de "ases de donnes &M'S;2+%

10

Support de cours PHP Mme Saidi -- 2007

6n e et, si vous ne coupe4 pas votre 6as'PHP, il aut 3ue vous sac$ie4 3ue si votre port S0 est consulta"le de l!e*trieur, n!importe 3ui peut accder la racine de votre Apac$e, et donc de voir sur 3uoi vous travaille4 en ce moment m0me% Baturellement, cette personne doit conna#tre votre adresse /P pour pouvoir aire ceci% 6t voila, vous voici in pr0t atta3uer tous les autres cours de ce site, pour en in, aire vos tous premiers scripts PHP )+

Dclarer des variables


6tudions dans un premier cours la dclaration des di rents t'pes de varia"les% Pour simpli ier les c$oses, nous allons admettre 3u!une varia"le correspond un espace de la mmoire oV l!on peut stocHer une in ormation% ,r, a in de pouvoir rcuprer cette in ormation lors3ue l!on en a "esoin, nous allons attri"uer un nom notre varia"le &si mes pro m!entendaient parler, ils me 4apperaient tous mes diplImes+% 6n PHP, les varia"les sont reprsentes par une c$a#ne de caract=res, a'ant tou8ours comme premier caract=re, le caract=re dollar &W+% 2es varia"les peuvent avoir n!importe 3uelle lettre en deu*i=me caract=re du moment 3u!il ne s!agit pas d!un c$i re% Le plus, on ne peut mettre d!espace dans le nom d!une varia"le% Puis, pour assigner une valeur une varia"le, on tac$era d!utiliser l!oprateur X, tout en prenant soin de tou8ours placer la varia"le 3ui re-oit le rsultat d!une opration gauc$e du signe X% Lmonstration ) - 2ors3ue l!on dsire a ecter une c$a#ne de caract=res une varia"le, il aut placer cette c$a#ne de caract=res entre deu* (% - 2ors3ue l!on dsire a ecter une valeur numri3ue une varia"le, il ne aut pas placer de ( autour cette valeur &en ait, c!est possi"le de mettre des ( autour d!une valeur numri3ue, mais ensuite, il aut 0tre vraiment vigilent, car on pourrait aire la con usion entre une valeur numri3ue et une c$a#ne de caract=res+% Foici 3uel3ues e*emples de dclarations de varia"les ) 11

<?phpphp #nom $ %L& 'L()*L+%; // #nom contient alors la cha,ne de caract-res L& 'L()*L+. #mon/chi re $ 01; // #mon/chi re contient la 2aleur num3ri4ue 01.

Support de cours PHP Mme Saidi -- 2007

#5toto $ %test%; // 6ette d3claration n'est pas 2alide car le nom de la 2ariable commence par un chi ?>

re

Fo'ons maintenant la dclaration des varia"les de t'pe ta"leau &arra'+% Pour ceu* 3ui sont d"utants en programmation, nous allons prendre un e*emple plutIt simplet a in de comprendre ce 3u!est un ta"leau% /maginons un classeur d!colier &ce sera notre ta"leau+ contenant di rentes euilles &3ui seront les indices du ta"leau+% /maginons galement 3ue ces euilles soient numrotes, et c$a3ue euille contienne un te*te particulier% Ls lors, on peut c$erc$er le contenu d!une euille de ce classeur gr:ce son numro &on c$erc$e donc l!in ormation contenu dans le classeur la page numro *+% 6n in ormati3ue, un ta"leau, c!est e*actement la m0me c$ose 3ue notre classeur% /l s!agit d!une varia"le contenant di rentes in ormations &les te*tes+ et ces in ormations sont classes suivant le numro de l!indice &c!est dire le numro de la euille+% Par e*emple, supposons 3ue l!on ai la varia"le W ruit de t'pe arra'% ,n pourrait alors avoir le code suivant )
<?php # ruit789 $ % raise%; # ruit709 $ %banane%; # ruit719 $ %abricot%; ?>

6n reprenant l!e*emple du classeur, c!est comme si nous avions un classeur de nom ruit, a'ant G pages ) - sur la page 0, on aurait l!in ormation raise - sur la page 1, on aurait l!in ormation "anane - sur la page 2, on aurait l!in ormation a"ricot Bous venons, dans ce "out de code, de dclarer une varia"le de t'pe arra' 3ui comporte G lments &les pages+% Bous aurions eu le m0me rsultat en e*cutant le "out de code suivant )
<?php # ruit79 $ % raise%; # ruit79 $ %banane%; # ruit79 $ %abricot%; ?>

6n revanc$e, cette s'nta*e est moins lisi"le, vu 3ue souvent, on n!arrive plus vraiment savoir 3uelle page se trouve l!in ormation rec$erc$e &on s!emm0le dans les indices+% 12

Support de cours PHP Mme Saidi -- 2007 Apart U - Au lieu d!utiliser des c$i res pour les indices &comme dans notre e*emple oV nous avons utilis les indices 0, 1 et 2+ nous pouvons tr=s "ien utiliser des c$a#nes de caract=res% <e 3ui pourrait alors donner )
<?php # ruit7'le/meilleur'9 $ % raise%; # ruit7'le/pre ere/de/:ulien'9 $ %banane%; # ruit7'mon/pre ere'9 $ %abricot%; ?>

,r dans ce cas, il aut videment utiliser pour c$a3ue indice du ta"leau, une c$a#ne de caract=re uni3ue% - nous pouvons galement dclarer des ta"leau* plusieurs lments% Pour ceu* 3ui dsirent vraiment e*ploiter cette possi"ilit, 8e vous invite aller consulter la documentation o icielle PHP%

1G

Support de cours PHP Mme Saidi -- 2007

A icher le contenu des variables


2ors de cet e*ercice, nous allons mettre en prati3ue notre premier "out de code en PHP% /l aut galement savoir 3ue toutes les varia"les en PHP commencent par le signe dollar &W+, et il aut galement ne pas ou"lier de placer un > c$a3ue in d!instruction PHP% 6tudions le code suivant )
<?php #nom $ %L& 'L()*L+%; echo ')on;our '; echo #nom; echo ' <'; ?>

<e 3ui a ic$era l!cran ) 7on8our 2A 92,7M26 U 6n e et, nous avons plac la c$a#ne de caract=res 2A 92,7M26 dans la varia"le Wnom, puis nous avons demander PHP d!crire la c$a#ne de caract=res 7on8our, puis le contenu de la varia"le Wnom &3ui contient donc la c$a#ne 2A 92,7M26+, et en in, nous a ic$ons un U% <e 3ui donne "ien comme rsultat (7on8our 2A 92,7M26 U( &Qemar3uons au passage 3u!une varia"le contenant une c$a#ne de caract=res se dclare en mettant le nom de la varia"le puis un signe X et en in, la c$a#ne de caract=res entre deu* (+% Au passage, remar3uons galement 3ue nous venons d!apprendre notre premi=re commande PHP, la commande ec$o&+% <ette onction nous permet d!a ic$er l!cran des c$a#nes de caract=res, 3ui peuvent 0tre d inies directement par l!utilisateur &comme lors3ue l!on ait un ec$o !7on8our !>+ ou 3ui peuvent 0tre des contenus de varia"les &lors3ue l!on ait ec$o Wnom>+% Attention UUU 6n e et, si nous avions cris le code suivant )
<?php #nom $ %L& 'L()*L+%; echo ')on;our '; echo '#nom'; echo ' <'; ?>

Bous aurions eu l!cran ) 7on8our Wnom U Attention donc "ien utiliser les ! 3ui ne servent 3u! dlimiter les c$a#nes de caract=res, et donc, il ne aut surtout pas les utiliser pour a ic$er le contenu d!une varia"le% 6n e et, lors3ue l!on tape ec$o !Wnom!> PHP pense 3ue l!on dsire a ic$er la c$a#ne de caract=res Wnom et non le contenu de la varia"le Wnom% 1J

Support de cours PHP Mme Saidi -- 2007 Prenons un autre e*emple oV nous allons a ic$er la date et l!$eure du 8our% ,n a le code suivant )
<?php #date/du/;our $ date !%d=m=>%"; #heure/courante $ date !%H?i%"; echo '@ous sommes le ? '; echo #date/du/;our; echo ' +t il est ? '; echo #heure/courante; ?>

<e 3ui a ic$era l!cran ) Bous sommes le 17-0T-2002 6t il est 12)10 Lans ce cas, nous venons d!utiliser la onction date&+ 3ui nous permet d!a ic$er la date du 8our ainsi 3ue l!$eure courante &en ait, la date du serveur+% Lans un premier temps, nous avons a ect la varia"le WdateRduR8our le contenu 3ue retourne la onction date&+ munie des param=tres (d-m-Y(, soit 17-0T-2002, puis nous avons a ect la varia"le W$eureRcourante le contenu 3ue retourne la onction date&+ munie des param=tres (H)i(, soit 12)10% Foici la liste des param=tres possi"les pour la onction date&+ ) - a ) (am( &matin+ ou (pm( &apr=s-midi+ - A ) (AM( &matin+ ou (PM( &apr=s-midi+ - d ) Eour du mois, sur deu* c$i res &ventuellement avec un 4ros+ ) (01( (G1( - L ) Eour de la semaine, en trois lettres &et en anglais+ ) par e*emple (Nri( &pour Fendredi+ - N ) Mois, te*tuel, version longue> en anglais, i%e% (Eanuar'( &pour Eanvier+ - $ ) Heure, au ormat 12$, (01( (12( - H ) $eure, au ormat 2J$, (00( (2G( - g ) Heure, au ormat 12$ sans les 4ros initiau*, (1( (12( - 9 ) Heure, au ormat 2J$ sans les 4ros initiau*, (0( (2G( - i ) Minutes> (00( (OT( - 8 ) Eour du mois sans les 4ros initiau*) (1( (G1( - l ) Eour de la semaine, te*tuel, version longue> en anglais, i%e% (Nrida'( &pour Fendredi+ - 2 ) 7oolen pour savoir si l!anne est "isse*tile &(1(+ ou pas &(0(+ - m ) Mois> i%e% (01( (12( - n ) Mois sans les 4ros initiau*> i%e% (1( (12( - M ) Mois, en trois lettres &et en anglais+ ) par e*emple (Ean( &pour Eanvier+ - s ) Secondes> i%e% (00( (OT( - S ) Su i*e ordinal d!un nom

1O

Support de cours PHP Mme Saidi -- 2007

"es variables #rd inies


Fo'ons maintenant les varia"les d!environnements% 6n e et, PHP propose toute une srie de varia"les 3ui sont d8 prsentes dans le langage sans 3ue vous n!a'e4 les dclarer% <es varia"les s!crivent tou8ours en ma8uscules et nous ournissent divers renseignements% Foici la liste des varia"les d!environnement e*istantes ) )) Faria"le )) WRS6QF6QZ!L,<MM6B1RQ,,1![ WRS6QF6QZ!H11PRA<<6P1R2AB9MA96![ WRS6QF6QZ!H11PRH,S1![ WRS6QF6QZ!H11PRMS6QRA96B1![ WRS6QF6QZ!PA1HR/BN,![ WRS6QF6QZ!PA1HR1QABS2A16L![ WRS6QF6QZ!Q6;M6S1RMQ/![ WRS6QF6QZ!Q6M,16RALLQ![ WRS6QF6QZ!Q6M,16RP,Q1![ WRS6QF6QZ!;M6QYRS1Q/B9![ WRS6QF6QZ!S6QF6QRALLQ![ WRS6QF6QZ!S6QF6QRALM/B![ WRS6QF6QZ!S6QF6QRBAM6![ WRS6QF6QZ!S6QF6QRS/9BA1MQ6![ WRS6QF6QZ!Q6;M6S1RM61H,L![ )) Lescription )) Qacine du serveur 2angage accept par le navigateur Bom de domaine du serveur 1'pe de navigateur <$emin 567 du script <$emin complet du script <$emin du script Adresse /P du client Port de la re3u0te H11P 2iste des param=tres passs au script Adresse /P du serveur Adresse de l!administrateur du serveur Bom local du serveur 1'pe de serveur Mt$ode d!appel du script

<es varia"les peuvent 0tre utilises n!importe 3uand dans vos scripts% Foici un e*emple oV vous pouve4 a ic$er l!adresse /P de la personne 3ui se connecte sur votre site )
<?php echo 'Aotre adresse BP est ? '.#/C+DA+D7'D+M(T+/&EED'9; ?>

<e 3ui a ic$era l!cran ) Fotre adresse /P est ) S0%12%JO%2K &par e*emple+

1K

Support de cours PHP Mme Saidi -- 2007

%oncatner deu& cha'nes


Fo'ons maintenant la concatnation de c$a#ne de caract=res% L8, il aut "ien savoir ce 3u!est la concatnation de c$a#ne de caract=res% Prenons un e*emple simple avec deu* c$a#nes de caract=res ) - la premi=re c$a#ne de caract=res sera ) (E!apprend ( - la seconde c$a#ne sera ) (le PHP( 6n aisant une concatnation de ces deu* c$a#nes, nous o"tiendrons la c$a#ne suivante ) (E!apprend le PHP(% 1ac$ons maintenant de mettre alors en vidence l!importance de la concatnation de c$a#ne de caract=res avec l!e*emple de l!e*ercice prcdent% ,n avait alors comme code PHP )
<?php #nom $ %L& 'L()*L+%; echo ')on;our '; echo #nom; echo ' <'; ?>

,r, les trois lignes avec l!instruction ec$o&+ peuvent se simpli ier en une seule gr:ce la concatnation% 6n PHP, la concatnation de c$a#ne s!e ectue gr:ce au point% ,n a alors )
<?php #nom $ %L& 'L()*L+%; echo ')on;our '.#nom.' <'; ?>

<e 3ui a ic$era l!cran ) 7on8our 2A 92,7M26 U Qsumons les c$oses ) ,n a ic$e en ait la c$a#ne 7on8our concatne avec le contenu de la varia"le Wnom, soit 2A 92,7M26, galement concat=ne avec la c$a#ne U, ce 3ui au inal, se rsume par l a ic$age de la c$a#ne 7on8our 2A 92,7M26% 2a encore, il aut aire attention car si l!on avait crit ec$o !7on8our Wnom U!> donc sans l!oprateur de concatnation 3u!est le point, on aurait eu l!cran l!a ic$age suivant ) 7on8our Wnom U

17

Support de cours PHP Mme Saidi -- 2007 &<ar dans ce cas, PHP comprend 3ue l!on dsire a ic$er la c$a#ne Wnom et non le contenu de la varia"le Wnom+%

1S

Support de cours PHP Mme Saidi -- 2007

"es structures de contr)les


Apres avoir vu un premier aper-u du langage PHP, nous allons maintenant tudier les di rentes structures de contrIles du langage% 2es structures de contrIles nous permettrons de aire des tests entre les varia"les et d!e*cuter diverses "oucles% Foici un petit rcapitulati des principales structures de contrIles ) )) /nstruction )) i else elsei s.itc$ or .$ile XX UX ? A ?X AX and ou \\ or ou ]] )) Signi ication )) Si Sinon Sinon si Selon Pour c$a3ue &"oucle+ 1ant 3ue &"oucle+ Strictement gal Li rent Strictement in rieur Strictement suprieur /n rieur ou gal Suprieur ou gal 61 logi3ue ,M logi3ue

Bous allons maintenant illustrer toutes ces structures de contrIles% - i , else, elesi ) Bous allons initialiser une varia"le numri3ue Wnom"re la valeur 11 par e*emple, et aire di rent tests dessus%
<?php #nombre $ 00 ; i !#nombre >$ 8 FF #nombre < 08" G // on teste si la 2aleur de notre 2ariable est comprise entre 8 et H echo #nombre.' est compris entre 8 et H'; I elsei !#nombre >$ 08 FF #nombre < 18" G // on teste si la 2aleur de notre 2ariable est comprise entre 08 et 0H echo #nombre.' est compris entre 08 et 0H'; I else G // si les deuJ tests pr3c3dents n'ont pas aboutisK alors on tombe dans ce cas echo #nombre.' est plus grand 4ue 0H'; I ?>

A l!a ic$age on aura ) 1T

Support de cours PHP Mme Saidi -- 2007 11 est compris entre 10 et 1T &Qemar3uons d8 3ue les instructions 3ui doivent 0tre e*cutes lors3u!un test est valid sont s'stmati3uement comprises entre des croc$ets ^ _+% 6n e et, rsumons ce 3ui vient de se passer% Lans un premier temps, on teste si Wnom"re est suprieur ou gal 0 et strictement in rieur 10, et dans ce cas, et seulement dans ce cas, on crira alors sur l!cran, Wnom"re est compris entre 0 et T% ,r vu 3ue Wnom"re est gal 11, on se rend compte 3ue ce test ne sera pas satis ait% ,n a alors deu* solutions% Soit on crit directement le cas Sinon &else+, soit on peut aire un autres test, ce 3ui correspond un SinonSi &elsei +% Bous avons c$oisis de aire un second test &elsei +% 2a, on teste si Wnom"re est suprieur ou gal 10 et strictement in rieur 20 &ce 3ui est notre cas car Wnom"re est gal 11+% 2e test est donc valid, et l!on e*cute alors les instructions prsentes entre les croc$ets ^ _ du elsei % ,n a ic$era donc l!cran ) 11 est compris entre 10 et 1T Fiens ensuite le cas else 3ui est e*cut seulement si aucunes des conditions d inies par les i et les elsei n!est vri ies% - s.itc$ ) 2e s.itc$ reprsente e*actement la m0me c$ose 3u!une succession d!un i et de plusieurs elsei % 6n revanc$e, utiliser un s.itc$ un certain avantage compar un i et plusieurs elesi , c!est 3ue sa structure est "eaucoup moins lourde et nettement plus agra"le lire% Prenons un e*emple simple% Bous allons dclarer une varia"le contenant une c$a#ne de caract=res, puis nous allons tester cette c$a#ne gr:ce au s.itc$% ,n aura alors le code suivant )
<?php #nom $ %L& 'L()*L+%; sLitch !#nom" G case ':ean' ? echo 'Aotre nom est :ean.'; breaM; case ')eno,t' ? echo 'Aotre nom est )eno,t.'; breaM; case 'L& 'L()*L+' ? echo 'Aotre nom est L& 'L()*L+.'; breaM; de ault ? echo ':e ne sais pas 4ui 2ous Ntes <<<'; I ?>

Lans notre cas, vu 3ue Wnom contient la c$a#ne de caract=re 2A 92,7M26, on verra alors s!a ic$er l!cran la p$rase suivante ) Fotre nom est 2A 92,7M26%

20

Support de cours PHP Mme Saidi -- 2007 6n revanc$e, si la varia"le Wnom avait contenu la c$a#ne de caract=re (toto(, ce m0me code aurait a ic$ l!cran ) Ee ne sais pas 3ui vous 0tes UUU 6n utilisant un i puis une succession de elsei , le code suivant aurait e*actement eu le m0me a ic$age sur l!cran )
<?php #nom $ %L& 'L()*L+%; i !#nom $$ %:ean%" G echo 'Aotre nom est :ean.'; %)eno,t%" G nom est )eno,t.'; %L& 'L()*L+%" G nom est L& 'L()*L+.'; sais pas 4ui 2ous Ntes <<<';

I elsei !#nom $$ echo 'Aotre I elsei !#nom $$ echo 'Aotre I else G echo ':e ne I ?>

Attention U Bote4 "ien l!utilisation de "reaH dans c$a3ue cas de votre s.itc$% Si celui-ci est omis, tous les messages s!a ic$eront% - or &pour c$a3ue+ ) 2a structure de contrIle or nous permet d!crire des "oucles% 6n clair, cela veut dire 3ue nous allons e*cuter une srie d!instructions un nom"re de ois "ien dtermin% Prenons l!e*emple suivant )
<?php #chi re $ 5; // E3but de la boucle or !#i$8; #i < #chi re; #iOO" G echo '@otre chi re est di 3rent de '.#i.'<br />'; I // Pin de la boucle echo '@otre chi ?> re est 3gal Q '.#i;

<e 3ui a ic$era l!cran ) Botre c$i Botre c$i Botre c$i Botre c$i re est di re est di re est di re est di rent de 0 rent de 1 rent de 2 rent de G 21

Support de cours PHP Mme Saidi -- 2007 Botre c$i re est di rent de J Botre c$i re est gal O 6n e et, on initialise notre varia"le Wc$i re O% ,n dmarre la "oucle or 3ui dit 3ue l!on va e*cuter les instructions situes entre les croc$ets de la "oucle &^ _+ pour i variant de 0 Wc$i re-1 &donc 8us3u! J+, i tant incrmenter c$a3ue passage de "oucle &Wi``+% &Wi varie de 0 W$i re-1 car on impose 3ue Wi soit strictement in rieur Wc$i re+% ,n e*cute alors J ois les instructions prsentes dans la "oucle, et c$a3ue passage, Wi verra sa valeur augmente de 1% Apart ) 2!utilisation des "oucles est e*tr0mement importante &et indispensa"le+ en programmation% 2a compr$ension de ce passage est capital% - .$ile &tant 3ue+ Fo'ons maintenant l!autre "oucle, la "oucle .$ile &dite "oucle tant 3ue+% /l aut d8 savoir 3ue la "oucle .$ile n!est pas vraiment d!une ncessit a"solue &elle est a"sente dans certains langages de programmation+ vu 3u!elle est tou8ours rempla-a"le par une "oucle or% Qeprenons l!e*emple prcdent, et crivons le l!aide de la "oucle .$ile, on a )
<?php #chi re $ 5; #i $ 8; // E3but de la boucle Lhile !#i < #chi re" G echo '@otre chi re est di #i $ #i O 0; I // Pin de la boucle echo '@otre chi ?>

3rent de '.#i.'<br />';

re est 3gal Q '.#i;

<e 3ui a ic$era l!cran e*actement la m0me c$ose 3ue ce 3u!a ic$e le code 3ue l!on a utilise pour la "oucle or% /ci, on initialise notre varia"le Wc$i re O, puis la varia"le Wi 0% 6nsuite, nous aisons le test suivant ) (tant 3ue Wi ? Wc$i re, alors a ic$er Botre c$i re est di rent de !%Wi%! et augmenter la valeur de Wi de 1( Puis d=s 3ue la condition Wi ? Wc$i re n!est plus vri ie, nous sortons de la "oucle pour inir l!e*cution des instructions 3ui suivent%

22

Support de cours PHP Mme Saidi -- 2007

"ire et crire dans un ichier te&te


1entons maintenant de lire et d!crire dans un ic$ier te*te, ic$ier se trouvant sur votre serveur N1P% A in de mettre en prati3ue cet e*ercice, vous alle4 crer un ic$ier donnees%t*t 3ue vous alle4 placer dans le m0me rpertoire 3ue le script PHP% Supposons 3ue ce ic$ier te*te contienne la ligne suivante ) (Salut tous )+(% Soit alors, le code PHP suivant )
<?php // Bnstruction 0 # p $ open !%donnees.tJt%K %r%"; // Bnstruction 1 #contenu/du/ ichier $ gets !# pK 155"; // Bnstruction R close !# p"; // Bnstruction S echo '@otre ichier contient ? '.#contenu/du/ ichier; ?>

<e 3ui a ic$era l!cran ) Botre ic$ier contient ) Salut tous )+

Ltaillons alors ce 3ui se passe ) - /nstruction 1 ) on ouvre le ic$ier donnees%t*t en lecture seule l!aide de la onction open&+ &la lecture seule est o"tenue l!aide du param=tre r > nous dtaillerons plus loin tous les param=tres possi"les de cette onction+% - /nstruction 2 ) on lit le contenu du ic$ier l!aide de la onction gets&+ et l!on place le contenu de ce ic$ier dans la varia"le WcontenuRduR ic$ier &le param=tre 2OO pass la onction gets&+ correspond au nom"re de caract=res lire ) ici, on a donn 2OO, ce 3ui correspond a un c$oi* totalement ar"itraire% 6n e et, vous pouve4 mettre n!importe 3uel nom"re% 6n revanc$e, si vous mette4 20 et 3ue votre ic$ier comporte 12S caract=res, seuls les 20 premiers seront lus+% - /nstruction G ) on re erme le ic$ier donnees%t*t l!aide de la onction close&+% 6n e et, nous avons d8 le contenu du ic$ier dans la varia"le WcontenuRduR ic$ier, alors le ic$ier ne nous intresse plus% - /nstruction J ) on a ic$e donc le contenu du ic$ier donnees%t*t &note4 encore une ois l!utilit de la concatnation des c$a#nes de caract=res+% Apart Fous n!0tes a"solument pas o"lige de mettre ce ic$ier te*te dans le m0me rpertoire 3ue le script PHP% 6n 2G

Support de cours PHP Mme Saidi -- 2007 e et, si votre script PHP est la racine de votre site et 3ue le ic$ier lire se trouve dans le rpertoire Ctoto, vous crire4 alors votre script de la mani=re suivante )
<?php # p $ open !%toto/donnees.tJt%K %r%"; #contenu/du/ ichier $ gets !# pK 155"; close !# p"; echo '@otre ichier contient ? '.#contenu/du/ ichier; ?>

<e 3ui produira un rsultat tout a ait identi3ue% 6tudions maintenant tous les param=tres possi"les de la onction open&+ ) - r ) ouvre en lecture seule, et place le pointeur de ic$ier au d"ut du ic$ier% - r` ) ouvre en lecture et criture, et place le pointeur de ic$ier au d"ut du ic$ier% - . ) ouvre en criture seule> place le pointeur de ic$ier au d"ut du ic$ier et rduit la taille du ic$ier 0% Si le ic$ier n!e*iste pas, on tente de le crer% - .` ) ouvre en lecture et criture> place le pointeur de ic$ier au d"ut du ic$ier et rduit la taille du ic$ier 0% Si le ic$ier n!e*iste pas, on tente de le crer% - a ) ouvre en criture seule> place le pointeur de ic$ier la in du ic$ier ile% Si le ic$ier n!e*iste pas, on tente de le crer% - a` ) ouvre en lecture et criture> place le pointeur de ic$ier la in du ic$ier% Si le ic$ier n!e*iste pas, on tente de le crer% Mn e*emple concret ) un mini compteur du nom"re de visites% 1ac$ons maintenant de voir un e*emple concret de lecture et d!criture dans un ic$ier te*te% 6n e et, nous allons raliser un mini compteur de visites ait gr:ce PHP et au* lectureCcriture dans un ic$ier te*te% 1out d!a"ord vous alle4 crer un ic$ier compteur%t*t 3ue vous alle4 placer dans le m0me rpertoire 3ue le script 3ui va suivre% Place4 le c$i re (0( dans ce ic$ier% Soit alors le "out de code PHP suivant )
<?php // Bnstruction 0 # p $ open !%compteur.tJt%K %rO%"; // Bnstruction 1 #nb/2isites $ gets !# pK 00"; // Bnstruction R #nb/2isites $ #nb/2isites O 0; // Bnstruction S seeM !# pK 8"; // Bnstruction 5 puts !# pK #nb/2isites"; // Bnstrcution T close !# p"; // Bnstrcution U echo '6e site compte '.#nb/2isites.' 2isiteurs <'; ?>

,n a alors ) - /nstruction 1 ) on ouvre le ic$ier compteur%t*t en lecture et en ecriture% - /nstruction 2 ) on lit le contenu du ic$ier et on place ce contenu &3ui est donc le nom"re de visiteurs de notre 2J

Support de cours PHP Mme Saidi -- 2007 page+ dans la varia"le Wn"Rvisites% - /nstruction G ) on augmente le nom"re de visites de 1% - /nstruction J ) on place le pointeur du ic$ier l!o set 0 gr:ce l!instruction seeH&+% 6n clair, on se positionne au tout d"ut de notre ic$ier% - /nstruction O ) gr:ce l!instruction puts&+, on crit dans notre ic$ier la nouvelle valeur correspondant au nom"re de visites% - /nstruction K ) on erme le ic$ier% - /nstruction 7 ) on a ic$e le nom"re de visites de notre page UUU

2O

Support de cours PHP Mme Saidi -- 2007

,cu#rer les donnes des ormulaires


Fo'ons maintenant comment crer des ormulaires, et surtout comment "ien les utiliser% 2es ormulaires vont permettre vos visiteurs de soumettre des in ormations, 3ue ce soit un nom, un prnom, un c$i re, etc%%% Prenons le code suivant )
<html> <head> <title>Ma page de test</title> </head> <body> < orm action $ %traitement.php% method$%post%> Aotre nom ? <input type $ %teJt% name $ %nom%><br /> Aotre onction ? <input type $ %teJt% name $ % onction%><br /> <input type $ %submit% 2alue $ %+n2oyer%> </ orm> </body> </html>

<e 3ui donnera l!cran )

Fotre nom ) Fotre onction )


Envoyer

Puis, lors3ue l!utilisateur cli3uera sur le "outon (6nvo'er(, les donnes du ormulaire seront envo'es sur la page traitement%p$p% 6t dans la page traitement%p$p, nous allons rcuprer une varia"le de t'pe ta"leau &WRP,S1 ) car notre ormulaire a comme met$od la valeur post+% 6n clair, dans la page traitement%p$p, on aura une varia"le WRP,S1Z!nom![ 3ui contiendra la c$a#ne de caract=res 3u!aura saisi le visiteur dans le c$amp (Fotre nom ) ( &on a la varia"le WRP,S1Z!nom![, car dans l!attri"ut name de notre ormulaire pour le c$amp concernant le nom+% Le m0me, on aura une varia"le WRP,S1Z! onction![ 3ui contiendra la c$a#ne de caract=res 3u!aura saisi le visiteur dans la c$amp (Fotre onction ) ( &encore une ois, on a la varia"le WRP,S1Z! onction![ car l!attri"ut name du c$amp prend la valeur onction+% Prenons ensuite le code suivant pour la page traitement%p$p )
<html> <head> <title>Ma page de traitement</title> </head> <body> <?

2K

// on teste la d3claration de nos 2ariables i !isset!#/P(CT7'nom'9" FF isset!#/P(CT7' onction'9"" G // on a iche nos r3sultats echo 'Aotre nom est '.#/P(CT7'nom'9.' et 2otre onction est '.#/P(CT7' onction'9; I ?> </body> </html>

Support de cours PHP Mme Saidi -- 2007

6n supposant 3ue l!on crive (2A 92,7M26( dans le c$amp (Fotre nom( et (5e"master( dans le c$amp (Fotre onction(, on verra alors s!a ic$er l!cran ) Fotre nom est 2A 92,7M26 et votre onction est 5e"master PS ) dans le cas oV le ormulaire utilise une mt$ode get, nous utilisons la varia"le ta"leau WR961% Fo'ons maintenant le cas des ormulaires munis d!un c$amp de t'pe ile & ormulaire permettant le tlc$argement de ic$iers sur votre site+% /maginons 3ue l!on ai le ormulaire suivant )
<html> <head> <title>Ma page de test</title> </head> <body> < orm action $ %traitement.php% method$%post%> Aotre ichier ? <input type $ % ile% name $ %mon/ ichier%><br /> <input type $ %hidden% name$%M&V/PBL+/CBW+% 2alue$%18888%> <input type $ %submit% 2alue $ %+n2oyer%> </ orm> </body> </html>

Pour rcuprer votre ic$ier, vous ave4 votre disposition le ta"leau WRN/26S 3ui aura plusieurs entres ) - WRN/26SZ!monR ic$ier![Z!tmpRname![ ) le nom temporaire du ic$ier sur le serveur - WRN/26SZ!monR ic$ier![Z!name![ ) le nom original du ic$ier sur la mac$ine cliente - WRN/26SZ!monR ic$ier![Z!t'pe![ ) le t'pe M/M6 du ic$ier - WRN/26SZ!monR ic$ier![Z!si4e![ ) la taille du ic$ier Baturellement, vous pourre4 utiliser ces valeurs pour tester votre ic$ier% Si il correspond vos attentes, vous pourre4 inaliser votre tlc$argement l!aides des onctions cop' ou moveRuploadedR ile &a in de copier le ic$ier tlc$arg sur le dis3ue dur du serveur+%

27

Support de cours PHP Mme Saidi -- 2007

"es onctions utilisateurs


Fous save4 tous 3ue PHP comprend, de "ase, une liste asse4 impressionnante de onctions mises votre disposition% 6n revanc$e, vous aussi, vous pouve4 tr=s "ien crire vos propres onctions% Bous allons donc crire une onction 3ui va nous permettre d!crire un te*te en gras, tout en spci iant la couleur de ce te*te, ainsi 3ue sa taille% ,n a alors le code suivant )
<?php unction a ichage/teJte !#tailleK #couleurK #teJte" G echo '< ont siXe $ %'.#taille.'% color $ %'.#couleur.'%>'.#teJte.'</ ont>'; I ?>

Placons ce code dans un ic$ier nomm onctions%p$p% Attention UUU Placer 8uste et S6M26M6B1 ce "out de code dans le ic$ier onctions%p$p% Soit ensuite le code du ic$ier inde*%p$p )
<?php // on inclut le code de onctions.phpK donc le code de notre include !' onctions.php'"; // on a iche un teJte a ichage/teJte !%1%K %red%K %Mon teJte%"; ?> onction

<e 3ui a ic$era l!cran ) Mon te*te

2S

Support de cours PHP Mme Saidi -- 2007

.ntroduction au& bases de donnes


Bous allons maintenant aire une petite introduction sur les "ases de donnes% 6n e et, les "ases de donnes prennent au8ourd!$ui une proportion tellement importante dans les sites 567 3ue vous devrie4 sarement en utiliser un 8our pour un site dvelopp en PHP% Pour l!in ormation, sac$e4 3ue ce site 567 utilise prati3uement 3ue les donnes d!une "ase de donnes &tous les tutoriau*, les astuces, etc%%% sont contenus dans une "ase de donnes+% Le plus, en utilisant les "ases de donnes, vous alle4 vraiment dcouvrir toutes les possi"ilits d!un environnement PHP C M'S;2% <ette introduction pourra vous para#tre vraiment longue et inutile, nanmoins, 8e vous recommande c$audement de la lire attentivement dans son intgralit% 6lle comporte normment de notions capitales comprendre% Prenons un e*emple simple et concret ) supposons 3ue l!on dsire dvelopper une "ase de donnes contenant une liste de <L audio% <ette liste de <L sera en ait compose de tous les <L 3ue poss=de c$a3ue personne d!un groupe d!amis% 6t ceci, a in de pouvoir se pr0ter mutuellement les di rents <L, et de savoir e*actement 3ui 3uoi comme <L% ,n suppose 3ue le groupe d!amis est compos de G personnes ) - 2A 92,7M26 - Eerem' - 7eno#t <$a3ue personne a un numro de tlp$one, et c$a3ue personne poss=de un certain nom"re de <L% ,n prendra aussi en considration le titre de l!al"um et le nom de l!interpr=te% ,n aurait alors tr=s "ien pu o"tenir &sous orme d!un ta"leau+ la "ase de donnes suivante ) Propritaire 2A 92,7M26 2A 92,7M26 Eerem' Eerem' 7eno#t B% tl 0K-JSSO-20-OJ 0K-JSSO-20-OJ 0K-JS7J-2K-01 0K-JS7J-2K-01 0K-J701-OT-GK Auteur <assius La t PunH <assius 1lpopmusiH <lamaran 1itre Au r0ve Liscover' Au r0ve 9enetic .orld Qelease 'oursel

Bote4 "ien 3ue ce ta"leau, en terme de "ase de donnes, se nomme une ta"le et 3ue c$a3ue ligne du ta"leau se nomme un tuple% 2a premi=re ligne du ta"leau comporte les attri"uts de la ta"le &Propritaire, B% tl, Auteur et 1itre sont les attri"uts de notre ta"le+% Bote ) une "ase de donnes peut contenir plusieurs ta"les%

2T

Support de cours PHP Mme Saidi -- 2007 Naisons maintenant 3uel3ues interrogations sur cette "ase de donnes ) ;ui poss=de un al"um de <assius @ AA rponse ) 2A 92,7M26 et Eerem' ;uel est le numro de tlp$one de 7eno#t @ AA rponse ) 0K-J7-01-OT-GK ;uels sont les al"ums des La t PunH disponi"les dans la liste de <L @ AA rponse ) Liscover' &il n!' en a 3u!un seul+ A premi=re vue donc, le principe des "ases de donnes est tr=s acilement assimila"le% /l aut galement savoir 3ue dans la ta"le d!une "ase de donnes, on ne peut pas avoir 2 tuples &donc 2 lignes du ta"leau+ a'ant les m0mes lments &en e et, il serait 3uand m0me "0te 3u!une personne ai un <L en dou"le+% /maginons maintenant 3ue Eerem' vienne de se aire picH-pocHetter son tout nouveau porta"le &un "eau SG10+ dans le mtro, et 3u!il c$ange alors naturellement de numro% Supposons 3ue son nouveau numro est 0K-SO-TS-7S-12 et 3u!en plus il vienne de s!ac$eter un nouveau <L ) Paradise de 7o" Sinclar% ,n ins=re alors une nouvelle ligne dans notre ta"le &un nouveau tuple+, et l!on o"tient donc ) Propritaire 2A 92,7M26 2A 92,7M26 Eerem' Eerem' 7eno#t Eerem' B% tl 0K-JSSO-20-OJ 0K-JSSO-20-OJ 0K-JS7J-2K-01 0K-JS7J-2K-01 0K-J701-OT-GK 0K-SOTS-7S-12 Auteur <assius La t PunH <assius 1lpopmusiH <lamaran 7o" Sinclar 1itre Au r0ve Liscover' Au r0ve 9enetic .orld Qelease 'oursel Paradise

/maginons maintenant 3ue 8!interroge nouveau ma "ase de donnes% ;uel est le numro de tlp$one de Eerem' @ AA rponse ) 0K-SO-TS-7S-12 ou "ien 0K-JS-7J-2K-01 Bous remar3uons tout de suite 3u!un pro"l=me ma8eur arrive ) c!est dire 3ue Eerem' poss=de deu* numros de tlp$one alors 3u!il ne devrait &en t$orie+ n!en possder 3u!un seul% Pour remdier a ce pro"l=me, il audrait, par e*emple modi ier tous les premiers tuples et ainsi mettre 8our le numro de tlp$one de Eerem'% Lans notre cas, cette solution n!est pas vraiment g0nante, en revanc$e, lors3ue la ta"le comporte 3uel3ues centaines voir milliers de tuples, c!est d8 "eaucoup plus g0nant% G0

Support de cours PHP Mme Saidi -- 2007 6n ait, ce pro"l=me survient gnralement cause d!une mauvaise conception de la "ase de donnes% 6n e et, au lieu de crer une seule ta"le contenant toutes les in ormations, nous aurions du crer deu* ta"les ) - une contenant la liste des <L &Auteur et 1itre+ - une contenant les in ormations des propritaires des <L &Propritaire et B% de tel+ 6nsuite, il nous resterait a aire un lien entre les ta"les, nous permettant de savoir 3ui poss=de tel ou tel <L% Mettons cette solution en prati3ue% ,n a alors notre ta"le contenant la liste des propritaires 3ui aura les attri"uts suivants ) - numro du propritaire - nom du propritaire - numro de tlp$one du propritaire 6t la ta"le contenant la liste de <L, aura les attri"uts suivants ) - numro du propritaire du <L - Auteur du <L - 1itre du <L &6t c!est gr:ce au numro du propritaire 3ue l!on era la liaison entre les deu* ta"les, l!opration se nommant une 8ointure+ ,n aura alors ) B% du propritaire 1 2 G B% du propritaire 1 1 2 2 G 2 Propritaire B% tl 2A 92,7M26 0K-JS-SO-20-OJ Eerem' 0K-SO-TS-7S-12 7eno#t 0K-J7-01-OT-GK Auteur 1itre <assius Au r0ve La t PunH Liscover' <assius Au r0ve 1lpopmusiH 9enetic .orld <lamaran Qelease 'oursel 7o" Sinclar Paradise

6n ici, on remar3ue acilement 3ue si une personne c$ange de numro de tlp$one, et "ien nous avons 3u!une seule modi ication e ectuer &vu 3ue c$a3ue numro de tlp$one n!appara#t 3u!une ois dans toute la "ase+% Puis dans ce cas, nous remar3uons galement 3ue c!est le B% de propritaire 3ui e ectue la liaison entre les deu* ta"les &c!est dire la 8ointure+% 6n conclusion ) Naites e*tr0mement attention au moment oV vous crer les ta"les de votre "ase de donnes a in de ne pas se retrouver dans une situation oV tout retour en arri=re serait impossi"le ) visualiser "ien votre ide, crive4 sur papier ce dont vous ave4 rellement "esoin pour votre "ase de donnes, et tente4 au ma*imum d!viter d!avoir des redondances dans vos ta"les% G1

Support de cours PHP Mme Saidi -- 2007

%ration des tables en /0"


2e S;2 &Structured ;uer' 2angage+ est un langage de re3u0tes 3ui nous permet de aire des interrogations &les re3u0tes+ sur un S97L &S'st=me de 9estion de 7ase de Lonnes+% Bous venons de aire une petite introduction sur les "ases de donnes, et maintenant, nous allons voir en dtail comment utiliser le S;2 pour developper cette "ase de donnes% 1out le code donn dans ce tutorial ne peut 0tre interprt 3ue par votre S97L% <e code ne pourra pas 0tre inclus dans vos pages PHP% 6n e et, vous devre4 utiliser ce code dans votre PHPM'Admin par e*emple% Qeprenons l!e*emple prcdent, et on o"serve comment aire pour crer nos deu* ta"les% <rons tout d!a"ord la ta"le listeRproprietaire ) <Q6A16 1A726 listeRproprietaire & numero /B1&O+ B,1 BM22, nom FAQ<HAQ&20+ B,1 BM22, telep$one FAQ<HAQ&1J+ B,1 BM22 + 1YP6XM'/SAM> Bous venons ici de crer notre ta"le listeRproprietaire, ta"le contenant trois attri"uts ) - numero 3ui correspond un nom"re entier &/B1+ de O c$i re - nom 3ui correspond une suite de caract=res &FAQ<HAQ+ de 20 caract=res - telep$one 3ui correspond une suite de caract=res &FAQ<HAQ+ de 1J caract=res Bous utilisons FAQ<HAQ pour des c$a#nes de caract=res pouvant m0ler du te*te et des nom"res% 1oute ois, la in de ce tutorial, nous allons passer en revue tous les t'pes d!attri"uts possi"les% Le plus, pour c$acun de ces attri"uts, nous imposons 3ue pour c$a3ue tuple donn, aucun attri"ut ne peut 0tre vide &on a mis un B,1 BM22 pour tous les attri"uts+% 6n in, le t'pe M'/SAM prcise 3ue nous avons a aire une "ase de donnes de t'pe M'S;2% <rons ensuite la ta"le listeRdis3ue ) <Q6A16 1A726 listeRdis3ue & numero /B1&O+ B,1 BM22, auteur FAQ<HAQ&O0+ B,1 BM22, titre FAQ<HAQ&O0+ B,1 BM22 + 1YP6XM'/SAM> Fu 3ue les attri"uts ressem"lent "eaucoup la premi=re ta"le, nous ne erons aucun commentaire sur cette ta"le% 6n revanc$e, nous aurions pu utiliser l!e*tra AM1,R/B<Q6M6B1 pour les attri"uts numero de la ta"le listeRproprietaire% 6n e et, si on imagine la page 567 nous permettant d!insrer des mem"res dans la liste des G2

Support de cours PHP Mme Saidi -- 2007 propritaires, on s!imagine mal 3u!il aille prciser a c$a3ue ois le numro du nouveau propritaire% A in de palier ce lger dsagrment, nous allons appli3ue un e*tra l!attri"ut de la premi=re ta"le, nous permettant de aire en ait une incrmentation automati3ue c$a3ue insertion d!un nouveau propritaire% ,n aura alors la ta"le listeRproprietaire d init comme ceci ) <Q6A16 1A726 listeRproprietaire & numero /B1&O+ B,1 BM22 AM1,R/B<Q6M6B1, nom FAQ<HAQ&20+ B,1 BM22, telep$one FAQ<HAQ&1J+ B,1 BM22, PQ/MAQY b6Y &numero+ + 1YP6XM'/SAM>

Qemar3uons alors la ligne PQ/MAQY b6Y &numero+ 3ui nous indi3ue 3ue la cl primaire de notre ta"le est l!attri"ut numero% <eci veut dire 3ue l!on est capa"le d!identi ier n!importe 3uel tuple de la ta"le rien 3u! partir de l!attri"ut numero% Passons maintenant en revue l!intgralit des t'pes possi"les pour les attri"uts d!une ta"le S;2% ,n a alors ) - 1/BY/B1 ) entier de 0 2OO &non sign+ - SMA22/B1 ) entier de 0 KO OGO &non sign+ - M6L/MM/B1 ) entier de 0 1K 777 21O &non sign+ - /B1 ) entier de 0 J 2TJ TK7 2TO &non sign+ - 7/9/B1 ) entier de 0 1S JJK 7JJ 07G 70T OO1 K1O &non sign+ - L6</MA2 ) un nom"re virgule lottante &soit un nom"re rel+ - LA16 ) une date allant du 1000-01-01 au TTTT-12-G1 - LA161/M6 ) une date comportant une $eure allant du 1000-01-01 00)00)00 au TTTT-12-G1 2G)OT)OT - 1/M6S1AMP ) une date comportant une $eure e*prime en secondes depuis le 1er 8anvier 1T70 8us3u! l!instant prsent - 1/M6 ) une mesure de l!$eure 3ui va de -SGS)OT)OT SGS)OT)OT - Y6AQ ) une anne 3ui va de 1T01 21OO - <HAQ ) une c$a#ne de caract=res de taille i*e &de 1 2OO caract=res+ - FAQ<HAQ ) une c$a#ne de caract=res de taille varia"le &de 1 2OO caract=res+ - 1/BY16c1 ou 1/BY72,7 ) un o"8et 72,7 ou 16c1 a'ant une longueur ma*imale de 2OO caract=res - 16c1 ou 72,7 ) un o"8et 72,7 ou 16c1 a'ant une longueur ma*imale de KO OGO caract=res - M6L/MM16c1 ou M6L/MM72,7 ) un o"8et 72,7 ou 16c1 a'ant une longueur ma*imale de 1K 777 21O caract=res - 2,B916c1 ou 2,B972,7 ) un o"8et 72,7 ou 16c1 a'ant une longueur ma*imale de J 2TJ TK7 2TO caract=res Attention UUU /l est tout de ois possi"le de crer des ta"les directement partir d!une page en PHP% Lans ce cas, pour crer les ta"les, il n!est a"solument pas ncessaire de passer par votre PHPM'Admin, c$ose 3ue 8e dconseille ortement pour les d"utants% 6n clair, au d"ut, utiliser PHPM'Admin pour crer vos ta"les, puis, une ois 3ue vous aure4 "ien compris le principe, vous pourre4 alors crer vos ta"les directement partir de vos scripts &ce 3ui est tout de m0me dconseill+% GG

Support de cours PHP Mme Saidi -- 2007

1onctions PHP #our 2y/0"


Bous venons de voir comment crer nos ta"les S;2 l!aide d!un PHPM'Admin &par e*emple+% Avant de voir comment aire pour insrer, modi ier, supprimer et a ic$er des tuples de notre "ase de donnes, il est "on de conna#tre les onctions PHP permettant de manoeuvrer ces tuples% <e tutorial est un peu comme une documentation, a in 3ue les tutoriau* suivants ne ressortent pas vos 'eu* comme des c$oses provenant de Mars ou de Eupiter% /l aut d8 savoir 3ue les onctions PHP pour M'S;2 commence tou8ours par m's3lR ce 3ui est plutIt "ien pens, non @ Foici donc la liste de ces onctions &nous tudierons 3ue les principales, regarde4 la documentation pour de plus amples connaissances+ ) )) Nonction )) )) Signi ication )) Nerme la conne*ion une "ase m's3lRclose de donnes 6ta"lit une conne*ion vers la m's3lRconnect "ase de donnes spci ie dans les arguments Qetourne la description te*tuelle m's3lRerror d!une erreur gnre par une action sur une "ase de donnes Qetourne un ta"leau 3ui reprsente tous les tuples slectionns &un indice du m's3lR etc$Rarra' ta"leau correspond un attri"ut des tuples o"tenus+% <$a3ue appel rcup=re le tuple suivant 8us3u! ce 3u!il n!' en ait plus 2i"=re la mmoire associ la m's3lR reeRresult re3u0te spci ie Qetourne le nom"re de tuple m's3lRnumRro.s dans un rsultat Permet d!e*cuter une re3u0te m's3lR3uer' S;2 sur une "ase de donnes Slectionne la "ase de donnes m's3lRselectRd" par d aut Fo'ons maintenant comment aire pour se connecter une "ase de donnes% 6n e et, a in de pouvoir utiliser tous les lments contenus dans une "ase de donnes, vous deve4 indi3uer, sur toutes vos pages PHP oV vous utilise4 votre "ase, di rents param=tres de conne*ion votre "ase% 6tudions le code suivant )
<?php #base $ mys4l/connect !'mon/ser2eur'K 'login'K 'passLord'";

GJ

mys4l/select/db !'ma/base/de/donnees'K #base" ; ?>

Support de cours PHP Mme Saidi -- 2007

2a c$a#ne de caract=res monRserveur doit 0tre remplac par celle 3ui correspond au nom de votre serveur &en r=gle gnrale, il s!agit de local$ost > si ce n!est pas le cas, veuille4 contacter votre $"ergeur pour de plus amples in ormations+% login correspond votre login pour accder votre "ase% pass.ord, votre mot de passe% 6t maR"aseRdeRdonnees correspond au nom de votre "ase de donnes% 9r:ce ce code nous allons donc pouvoir e ectuer toutes nos re3u0tes S;2 sur les ta"les de notre "ase de donnes ra#c$ement cre% Attention UUU <e code doit tou8ours 0tre prsent avant toute opration sur votre "ase de donnes &une seule ois par page su it par contre+% Mon conseil ) aites vous un ic$ier connectR"ase%p$p%inc ou appara#tra seulement ce morceau de code, et dans c$a3ue page ou vous sou$aite4 utiliser votre "ase de donnes, vous n!aure4 alors 3u! include&+ ce ic$ier de conne*ion%

GO

Support de cours PHP Mme Saidi -- 2007

A icher les donnes de votre base


Maintenant 3ue les ta"les de votre "ase de donnes sont cres, nous allons pouvoir voir comment aire pour pouvoir interroger cette "ase de donnes, et par cons3uent a ic$er les rsultats sur vos pages 567 )+ Avant de plonger l!inconnu dans le code PHP pour aire ces interrogations, nous allons voir comment s!e ectuent ces interrogations par le "iais de re3u0tes S;2% 6t pour ce aire, nous allons nous "aser sur l!e*emple 3ue nous avons suivi lors du tutorial sur l!introduction au* "ases de donnes% Ee vous rappelle 3ue l!on avait alors deu* ta"les 3ui peuvent 0tre reprsentes ainsi ) 2a ta"le listeRproprietaire ) B% du propritaire 1 2 G Propritaire B% tl 2A 92,7M26 0K-JS-SO-20-OJ Eerem' 0K-SO-TS-7S-12 7eno#t 0K-J7-01-OT-GK

2a ta"le listeRdis3ue ) B% du propritaire 1 1 2 2 G 2 Auteur 1itre <assius Au r0ve La t PunH Liscover' <assius Au r0ve 1lpopmusiH 9enetic .orld <lamaran Qelease 'oursel 7o" Sinclar Paradise

Bous allons alors interroger la ta"le pour conna#tre par e*emple le numro de tlp$one de 2A 92,7M26% ,n aura alors &en S;2 8e vous le rappelle, on verra plus tard comment o"tenir le m0me rsultat dans une page 567+ ) S626<1 telep$one NQ,M listeRproprietaire 5H6Q6 nomX(2A 92,7M26(> 6tudions ce code ) - on slectionne l!attri"ut 3ue l!on dsire o"tenir &ici l!attri"ut telep$one 3ui correspond e ectivement au numro de tlp$one des propritaires+% - on utilise la ta"le listeRproprietaire pour aire notre slection &en ait, on n!a "esoin 3ue de cette ta"le pour aire notre slection, on verra plus tard 3ue la clause NQ,M peut contenir plusieurs ta"les, notamment dans le GK

Support de cours PHP Mme Saidi -- 2007 cas des 8ointures+% - on impose une condition, en e et, on veut le tlp$one de 3ui @ Le 2A 92,7M26, donc en crivant 5H6Q6 nomX(2A 92,7M26(, on impose au S97L de ne slectionner dans notre ta"le 3ue les tuples 3ui poss=dent l!attri"ut nom 3ui est gal 2A 92,7M26% 6n revanc$e, en n!crivant pas cette ligne, on aurai o"tenu tous les numros de tlp$one de notre ta"le &car dans ce cas, on n!aurait eu aucune condition 3uand au nom du propritaire+% 6tudions maintenant le cas ou l!on e ectue une slection lors3ue l!on doit e ectuer une 8ointure entre deu* ta"les% /nterrogeons alors notre "ase de donnes pour conna#tre le nom des propritaires de l!al"um Au r0ve de <assius% ,n aura alors ) S626<1 listeRproprietaire%proprietaire NQ,M listeRproprietaire, listeRdis3ue 5H6Q6 listeRdis3ue%auteur X (<assius( ABL listeRdis3ue%titre X (Au r0ve( ABL listeRproprietaire%numero X listeRdis3ue%numero ,QL6Q 7Y listeRproprietaire%proprietaire AS<> 6tudions ce code ) - on slectionne l!attri"ut proprietaire &ce 3ue l!on veut o"tenir+ tout en indi3uant 3ue cet attri"ut aire partie de la ta"le listeRproprietaire &ceci se ait gr:ce au % 3ui relie le nom de l!atti"ut la ta"le+% 6n revanc$e, ici, il n!est pas vraiment ncessaire de prciser 3ue l!on slectionne l!attri"ut proprietaire de la ta"le listeRproprietaire puis3ue cet attri"ut de ta"le n!appara#t 3ue dans une seule ta"le &en l!occurrence la ta"le listeRproprietaire+% 6n e et, si l!attri"ut proprietaire avait e*iste dans plusieurs ta"les, nous aurions da prciser de 3uelle ta"le il s!agit &le S97L n!aurait pas su de 3uelle ta"le l!attri"ut dont nous parlons ait partie+% 1oute ois, 8e vous recommande c$audement &sau dans les cas e*tr0mement simple, de tou8ours prciser au S97L 3uelle ta"le appartient l!attri"ut 3ue vous slectionne4+% - ,n utilise les ta"les listeRproprietaire et listeRdis3ue pour aire notre re3u0te% - ,n ait notre rec$erc$e sur la liste de dis3ue en ne retenant 3ue les dis3ues dont l!auteur est <assius% - Puis on retient les dis3ues dont le titre est Au r0ve% - 6nsuite &le plus important+, on e ectue une 8ointure entre les ta"les, en disant 3ue l!attri"ut numero de la ta"le listeRproprietaire correspond l!attri"ut numero de la ta"le listeRdis3ue% - 6n in, on impose au S97L de nous ournir les rsultats dans l!ordre alp$a"ti3ue des noms de propritaire &et ceci gr:ce la clause ,QL6Q 7Y+% Botes ) - Pour organiser les rsultats suivant l!ordre inverse de l!ordre alp$a"ti3ue, on aurait pu mettre en derni=re condition, la condition ,QL6Q 7Y listeRproprietaire%proprietaire L6S<% - 2a clause ,QL6Q 7Y est galement vala"le dans le cas d!attri"ut numri3ue% Lans ce cas, le S97L organise les rsultats suivant un ordre croissant &lors3ue l!on met AS< la in+ ou dcroissant &lors3ue l!on met L6S< la in+% - <ette astuce onctionne galement dans le cas oV l!attri"ut est de t'pe date% Qemar3ue ) Bous avons 3ue dans nos re3u0tes S;2 nous pouvions imposer au S97L de ne slectionner 3ue les tuples dont G7

Support de cours PHP Mme Saidi -- 2007 on impose la valeur de certains attri"uts &comme par e*emple en imposant 3ue l!attri"ut auteur soit gal <assius par le "iais de la ligne 5H6Q6 listeRdis3ue%auteur X (<assius(+% 6n revanc$e, nous pouvons galement aire une rec$erc$e en n!imposant pas rellement la valeur de l!attri"ut mais plutIt en ne slectionnant 3ue les tuples dont l!attri"ut commence par une certaine c$a#ne de caract=res ou "ien m0me de ne slectionner 3ue les tuples dont l!attri"ut ne ait 3ue contenir une c$a#ne de caract=res% 1out ceci se era gr:ce la clause 2/b6% Prenons l!e*emple suivant ) S626<1 listeRproprietaire%proprietaire NQ,M listeRproprietaire, listeRdis3ue 5H6Q6 listeRdis3ue%auteur 2/b6 (<d( ABL listeRdis3ue%titre X (Au r0ve( ABL listeRproprietaire%numero X listeRdis3ue%numero ,QL6Q 7Y listeRproprietaire%proprietaire AS<> Lans ce cas, nous n!avons plus la ligne 5H6Q6 listeRdis3ue%auteur X (<assius( mais la ligne 5H6Q6 listeRdis3ue%auteur 2/b6 (cd(% <e c$angement impli3ue 3ue nous allons c$oisir non pas les dis3ues dont l!auteur est <assius mais les dis3ues dont l!auteur commence par la lettre c% ,n aurait galement pu aire ) S626<1 listeRproprietaire%proprietaire NQ,M listeRproprietaire, listeRdis3ue 5H6Q6 listeRdis3ue%auteur 2/b6 (dsd( ABL listeRdis3ue%titre X (Au r0ve( ABL listeRproprietaire%numero X listeRdis3ue%numero ,QL6Q 7Y listeRproprietaire%proprietaire AS<> 6t dans ce cas, nous aurions slectionn les tuples dont l!attri"ut auteur de la ta"le listeRdis3ue contient la lettre s% Qemar3ue ) 2a clause 2/b6 n!est pas limite une seule lettre% 6n e et, on peut tr=s "ien aire un 2/b6 avec un mot complet%

Maintenant 3ue vous connaisse4 tout de la slection de tuples en langage S;2, nous allons voir comment intgrer ces re3u0tes S;2 vos pages PHP% <rons une page PHP nous permettant de raliser e*actement la m0me re3u0te 3ue la premi=re de ce tutorial, c!est--dire la slection du numro de tlp$one de 2A 92,7M26% ,n a alors le code suivant )

GS

<?php // on se connecte Q notre base #base $ mys4l/connect !'ser2eur'K 'login'K 'pass'"; mys4l/select/db !'ma/base'K #base" ; ?> <html> <head> <title>@um3ro de t3l3phone de L& 'L()*L+</title> </head> <body> <? // lancement de la re4uete #s4l $ 'C+L+6T telephone PD(M liste/proprietaire YH+D+ nom $ %L& 'L()*L+%'; // on lance la re4uNte !mys4l/4uery" et on impose un message d'erreur si la re4uNte ne se passe pas bien !or die" #re4 $ mys4l/4uery!#s4l" or die!'+rreur CZL <<br />'.#s4l.'<br />'.mys4l/error!""; // on recupere le resultat sous orme d'un tableau #data $ mys4l/ etch/array!#re4"; // on lib-re l'espace m3moire allou3 pour cette interrogation de la base mys4l/ ree/result !#re4"; mys4l/close !"; ?> Le num3ro de t3l3phone de L& 'L()*L+ est ?<br /> <? echo #data7'telephone'9; ?> </body> </html>

Support de cours PHP Mme Saidi -- 2007

<e 3ui a ic$era l!cran ) 2e numro de tlp$one de 2A 92,7M26 est ) 0K-JS-SO-20-OJ Mettons maintenant dans le cas oV l!interrogation de la "ase de donnes ne retourne pas un, mais un certain nom"re de tuples &nom"re 3ue l!on ne conna#t pas+% 6n e et, rec$erc$ons tous les noms de propritaires de dis3ue, ainsi 3ue leur numro de tlp$one% ,n aura alors le code suivant )
<?php // on se connecte Q notre base #base $ mys4l/connect !'ser2eur'K 'login'K 'pass'"; mys4l/select/db !'ma/base'K #base" ; ?> <html> <head> <title>@om et t3l des membres</title> </head> <body> <? // lancement de la re4uNte !on impose aucune condition puis4ue l'on d3sire obtenir la lis te compl-te des propri3taires #s4l $ 'C+L+6T telephoneK nom PD(M liste/proprietaire'; // on lance la re4uNte !mys4l/4uery" et on impose un message d'erreur si la re4uNte ne se passe pas bien !or die"

GT

#re4 $ mys4l/4uery!#s4l" or die!'+rreur CZL <<br />'.#s4l.'<br />'.mys4l/error!""; // on 2a scanner tous les tuples un par un Lhile !#data $ mys4l/ etch/array!#re4"" G // on a iche les r3sultats echo '@om ? '.#data7'nom'9.'<br />'; echo 'Con t3l ? '.#data7'telephone'9.'<br /><br />'; I mys4l/ ree/result !#re4"; mys4l/close !"; ?> </body> </html>

Support de cours PHP Mme Saidi -- 2007

6t ainsi, gr:ce la "oucle .$ile, nous pouvons parcourir tous les tuples o"tenus par la re3u0te S;2% Pour inir, nous pouvons 8uste dire 3ue lors3ue l!on e ectue une slection 3ui contient une 8ointure, le principe reste e*actement le m0me% ;ue aire en plus @ A in d!amliorer vos slections, vous pouve4 aire dpendre vos slections du rsultat o"tenu par un ormulaire% 6n e et, imaginons une premi=re page avec un ormulaire nous permettant de c$oisir le nom d!un propritaire via un menu droulant% 6nsuite, dans la page oV vous alle4 aire votre re3u0te &3ui donc 0tre galement la page contenue dans le c$amp action de votre ormulaire+, vous alle4 rcuprer une varia"le, par e*emple WRP,S1Z!nomRproprio![ &c % le tutorial sur la rcupration des donnes par le "iais des ormulaires+% Le plus, imaginons 3ue l!on dsire retrouver le numro de tlp$one de ce propritaire &celui c$oisi dans le menu-droulant+% ,n aura alors &page pointe par le c$amp action du ormulaire+)
<?php // on se connecte Q notre base #base $ mys4l/connect !'ser2eur'K 'login'K 'pass'"; mys4l/select/db !'ma/base'K #base" ; ?> <html> <head> <title>@um3ro de t3l3phone du membre choisi</title> </head> <body> <? // on teste si notre 2ariable est d3clar3e i !isset!#/P(CT7'nom/proprio'9"" G // lancement de la re4uNte #s4l $ 'C+L+6T telephone PD(M liste/proprietaire YH+D+ nom $ %'. #/P(CT7'nom/proprio'9.'%'; // on lance la re4uNte !mys4l/4uery" et on impose un message d'erreur si la re4uN te ne se passe pas bien !or die" #re4 $ mys4l/4uery!#s4l" or die!'+rreur CZL <<br />'.#s4l.'<br />'.mys4l/error!"" ; // on r3cup-re le r3sultat sous orme d'un tableau #data $ mys4l/ etch/array!#re4"; // on lib-re l'espace m3moire allou3 pour cette interrogation de la base mys4l/ ree/result !#re4";

J0

mys4l/close !"; // on a I else G I ?> </body> </html>

Support de cours PHP Mme Saidi -- 2007

iche le r3sultat echo 'Le num3ro de t3l3phone est ? '.#data7'telephone'9; echo 'La 2ariable nom/proprio n['est pas d3clar3e';

J1

Support de cours PHP Mme Saidi -- 2007

.nsrer des donnes dans votre base


Bous allons maintenant voir comment aire pour insrer des donnes dans les ta"les de votre "ase de donnes% <omme pour le tutorial prcdent, nous allons le aire en se "asant sur l!e*emple pris lors du tutorial aisant une introduction sur les "ases de donnes% 6t tout comme dans le tutorial prcdent, nous allons tout d!a"ord voir comment aire ces insertions en S;2, puis nous verrons comment les aire directement partir de vos pages 567% Pour vous remettre les ides au clair, 8e vous 3ue l!on avait alors deu* ta"les, dont la structure ressem"le ) 2a ta"le listeRproprietaire ) B% du propritaire 1 2 G Propritaire B% tl 2A 92,7M26 0K-JS-SO-20-OJ Eerem' 0K-SO-TS-7S-12 7eno#t 0K-J7-01-OT-GK

2a ta"le listeRdis3ue ) B% du propritaire 1 1 2 2 G 2 Auteur 1itre <assius Au r0ve La t PunH Liscover' <assius Au r0ve 1lpopmusiH 9enetic .orld <lamaran Qelease 'oursel 7o" Sinclar Paradise

Supposons alors 3ue l!on dcide d!a8outer un nouveau propritaire de dis3ues ) ti"o par e*emple% Pour insrer ce nouveau propritaire, il aut ournir au S97L les in ormations lui permettant d!insrer ce nouveau tuple dans la ta"le listeRproprietaire% <es in ormations sont ) - le numro du nouveau propritaire - le nom du nouveau propritaire - son numro de tlp$one 7re , vous le vo'e4 par vous-m0me, il s!agit en it de ournir tous les attri"uts de la ta"le a in de produire un nouveau tuple% 6n revanc$e, comme nous allons le voir, il n!est pas ncessaire de ournir au S97L le numro du nouveau propritaire car cet attri"ut t dclar AM1,R/B<Q6M6B1 lors de la cration de la ta"le% <eci impli3ue 3ue le S97L sait, lors d!une nouvelle insertion, 3u!il aut 3u!il prenne dans la ta"le listeRproprietaire le numro le plus grand et 3u!il l!augmente de un, et ce nouveau numro &augmente de un+ correspondra au numro de notre nouveau propritaire% ,n aura alors ) J2

Support de cours PHP Mme Saidi -- 2007 /BS6Q1 /B1, listeRproprietaire FA2M6S &!!,!ti"o!,!0K-TS-J2-01-GK!+> ,n remar3ue tout de suite 3ue la s'nta*e pour une insertion est relativement simple% 6n e et, tudions ce code ) ,n insre oV @ --A dans la ta"le listeRproprietaire ,n insrer 3uoi @ --A la valeur des di rents attri"uts, c!est--dire une premi=re valeur 3ui correspond l!attri"ut numero &3ui 8e vous le rappelle est AM1,R/B<Q6M6B1, on n!a donc pas l!utilit de prciser sa valeur, le S97L sac$ant 3uoi mettre+, puis on ins=re la valeur ti"o pour l!attri"ut nom, et en in la valeur 0K-TSJ2-01-GK pour l!attri"ut telep$one% Simple, non @ Passons tout de suite l!insertion d!un nouveau tuple, et ce, partir d!une page 567% Supposons 3ue l!on dsire insrer e*actement le m0me tuple 3ue dans l!e*emple prcdent &c!est--dire 3ue ti"o ait tellement partie de nos amis, 3u!on a envie de partager nos dis3ues avec lui+% ,n aura alors )
<?php // on se connecte Q notre base #base $ mys4l/connect !'ser2eur'K 'login'K 'pass'"; mys4l/select/db !'ma/base'K #base" ; ?> <html> <head> <title>Bnsertion de tibo dans la base</title> </head> <body> <? // lancement de la re4uete #s4l $ 'B@C+DT B@T( liste/proprietaire A&L*+C !%%K %tibo%K %8T=H\=S1=80=RT%"'; // on insere le tuple !mys4l/4uery" et au cas o]K on 3crira un petit message d'erreur si la re4uNte ne se passe pas bien !or die" mys4l/4uery !#s4l" or die !'+rreur CZL <'.#s4l.'<br />'.mys4l/error!""; // on erme la conneJion Q la base mys4l/close!"; ?> Tibo 2ient d'Ntre inser3 dans la base. </body> </html>

/maginons, alors 3ue l!on dsire alors a8outer la "ase un dis3ue gr:ce la contri"ution de ti"o% Lans l!a"solu, r lc$issons une minute sur ce 3ue nous avons "esoin ) - il s!agit d!un nouveau dis3ue &soit son auteur et son titre+% - mais aussi, nous avons "esoin du numro 3u!a pris le propritaire ti"o dans la ta"le listeRproprietaire% <omment 3u!on ait donc ce truc @ 6n e et, on voit "ien 3ue si l!on ins=re directement un nouveau dis3ue, la 8ointure entre les deu* ta"les ris3ue de ne pas se aire% 6n ait, il audrait tout d!a"ord slectionner le numro 3u!a pris ti"o dans la ta"leRproprietaire &par le "iais d!un re3uete S;2 de t'pe S626<1, 8e vous renvoies au tutorial prc=dent pour revoir la rcupration des donnes d!une "ase+% JG

Support de cours PHP Mme Saidi -- 2007 <ependant, imaginons 3ue nous n!avons pas encore insr le propritaire ti"o dans notre "ase de donnes, et 3ue l!on dsire directement insrer ce nouveau propritaire ainsi 3u!un dis3ue lui appartenant% Bous allons voir comment rcuprer simplement le nouveau numero 3ui vient d!0tre insr &donc celui de ti"o+ et ainsi l!utiliser pour insrer notre dis3ue% ,n a )
<?php // on se connecte Q notre base #base $ mys4l/connect !'ser2eur'K 'login'K 'pass'"; mys4l/select/db !'ma/base'K #base" ; ?> <html> <head> <title>Bnsertion de tibo et d'un nou2eau dis4ue dans la base</title> </head> <body> <? // on pr3pare la re4uNte #s4l $ 'B@C+DT B@T( liste/proprietaire A&L*+C!%%K %tibo%K %8T=H\=S1=80=RT%"'; // on ins-re le tuple !mys4l/4uery" et au cas o]K on 3crira un petit message d'erreur si la re4uNte ne se passe pas bien !or die" mys4l/4uery !#s4l" or die !'+rreur CZL <'.#s4l.'<br />'.mys4l/error!""; // on r3cup-re le dernier num3ro ins3r3K soit le num3ro de tibo #numero/insere $ mys4l/insert/id!"; // on ins-re le tuple !mys4l/4uery" et au cas o]K on 3crira un petit message d'erreur si la re4uNte ne se passe pas bien !or die" #s4l $ 'B@C+DT B@T( liste/dis4ue A&L*+C !%'.#numero/insere.'%K %The supermen lo2ers%K %Th e player%"'; // on ins-re le tuple !mys4l/4uery" et au cas o]K on 3crira un petit message d'erreur si la re4uNte ne se passe pas bien !or die" mys4l/4uery !#s4l" or die !'+rreur CZL <'.#s4l.'<br />'.mys4l/error!""; // on erme la conneJion Q la base mys4l/close!"; ?> Tibo 2ient d'Ntre inser3 dans la baseK ainsi 4ue son nou2eau dis4ue ? The player des Cupe rmen lo2ers. </body> </html>

;ue aire en plus @ 6t "ien, tout comme dans le tutorial prcdent, vous pouve4 rendre vos insertions vraiment d'nami3ues en e ectuant tout simplement vos insertions partir des valeurs ournies par un ormulaire% /maginons 3ue l!on dsire insrer des nouveau* dis3ues% Supposons 3ue l!on dispose d!une page $tml contenant un ormulaire permettant de saisir le nom du propritaire, et 3ue ce ormulaire vous demande galement le titre d!un al"um ainsi 3ue son interpr=te &on suppose galement 3ue le c$amp action de notre ormulaire correspond au nom de la page PHP 3ui traite les donnes, soit la page contenant le code ci-dessous+% ,n suppose en in, 3ue le c$amp du ormulaire contenant le nom du propritaire porte le nom proprio &on pourra alors utiliser la varia"le WRP,S1Z!proprio![ dans notre page PHP, tout en supposant de notre ormulaire une mt$ode P,S1 et npn 961+, 3ue le c$amp contenant l!interpr=te porte le nom interprete et 3ue le c$amp JJ

Support de cours PHP Mme Saidi -- 2007 contenant le titre porte le nom titre% ,n aura alors )
<?php // on se connecte Q notre base #base $ mys4l/connect !'ser2eur'K 'login'K 'pass'"; mys4l/select/db !'ma/base'K #base" ; ?> <html> <head> <title>Bnsertion de nou2eauJ dis4ues dans la base</title> </head> <body> <? // on teste si les 2ariables du ormulaire sont bien d3clar3es i !isset!#/P(CT7'proprio'9" FF isset!#/P(CT7'interprete'9" FF isset!#/P(CT7'titre'9"" G // on pr3pare la re4uNte pour r3cup3rer le numero du propri3taire #s4l $ 'C+L+6T numero PD(M liste/proprietaire YH+D+ nom $ %'. #/P(CT7'proprio'9.'%'; // on lance la re4uNte !mys4l/4uery" et on impose un message d'erreur si la re4uN te ne se passe pas bien !or die" #re4 $ mys4l/4uery!#s4l" or die!'+rreur CZL <<br />'.#s4l.'<br />'.mys4l/error!"" ; // on r3cup-re le r3sultat sous orme d'un tableau #data $ mys4l/ etch/array!#re4"; // on lib-re l'espace m3moire allou3 pour cette interrogation de la base mys4l/ ree/result !#re4"; // on ins-re le tuple !mys4l/4uery" et au cas o]K on 3crira un petit message d'er reur si la re4uNte ne se passe pas bien !or die" #s4l $ 'B@C+DT B@T( liste/dis4ue A&L*+C!%'.#data7'numero'9.'%K %'. #/P(CT7'interprete'9.'%K %'.#/P(CT7'titre'9.'%"'; // on ins-re le tuple !mys4l/4uery" et au cas o]K on 3crira un petit message d'er reur si la re4uNte ne se passe pas bien !or die" mys4l/4uery !#s4l" or die !'+rreur CZL <'.#s4l.'<br />'.mys4l/error!""; // on erme la conneJion Q la base mys4l/close!"; echo '@ous 2enons d['ins3rer un nou2eau dis4ue ? '.#/P(CT7'titre'9.' de '. #/P(CT7'interprete'9.' appartenant Q '.#/P(CT7'proprio'9; I else G echo 'Les 2ariables du ormulaire ne sont pas d3clar3es'; I ?> </body> </html>

JO

Support de cours PHP Mme Saidi -- 2007

.nsrer des donnes dans votre base


Bous allons maintenant voir comment aire pour insrer des donnes dans les ta"les de votre "ase de donnes% <omme pour le tutorial prcdent, nous allons le aire en se "asant sur l!e*emple pris lors du tutorial aisant une introduction sur les "ases de donnes% 6t tout comme dans le tutorial prcdent, nous allons tout d!a"ord voir comment aire ces insertions en S;2, puis nous verrons comment les aire directement partir de vos pages 567% Pour vous remettre les ides au clair, 8e vous 3ue l!on avait alors deu* ta"les, dont la structure ressem"le ) 2a ta"le listeRproprietaire ) B% du propritaire 1 2 G Propritaire B% tl 2A 92,7M26 0K-JS-SO-20-OJ Eerem' 0K-SO-TS-7S-12 7eno#t 0K-J7-01-OT-GK

2a ta"le listeRdis3ue ) B% du propritaire 1 1 2 2 G 2 Auteur 1itre <assius Au r0ve La t PunH Liscover' <assius Au r0ve 1lpopmusiH 9enetic .orld <lamaran Qelease 'oursel 7o" Sinclar Paradise

Supposons alors 3ue l!on dcide d!a8outer un nouveau propritaire de dis3ues ) ti"o par e*emple% Pour insrer ce nouveau propritaire, il aut ournir au S97L les in ormations lui permettant d!insrer ce nouveau tuple dans la ta"le listeRproprietaire% <es in ormations sont ) - le numro du nouveau propritaire - le nom du nouveau propritaire - son numro de tlp$one 7re , vous le vo'e4 par vous-m0me, il s!agit en it de ournir tous les attri"uts de la ta"le a in de produire un nouveau tuple% 6n revanc$e, comme nous allons le voir, il n!est pas ncessaire de ournir au S97L le numro du nouveau propritaire car cet attri"ut t dclar AM1,R/B<Q6M6B1 lors de la cration de la ta"le% <eci impli3ue 3ue le S97L sait, lors d!une nouvelle insertion, 3u!il aut 3u!il prenne dans la ta"le listeRproprietaire le numro le plus grand et 3u!il l!augmente de un, et ce nouveau numro &augmente de un+ correspondra au numro de notre nouveau propritaire% ,n aura alors ) JK

Support de cours PHP Mme Saidi -- 2007 /BS6Q1 /B1, listeRproprietaire FA2M6S &!!,!ti"o!,!0K-TS-J2-01-GK!+> ,n remar3ue tout de suite 3ue la s'nta*e pour une insertion est relativement simple% 6n e et, tudions ce code ) ,n insre oV @ --A dans la ta"le listeRproprietaire ,n insrer 3uoi @ --A la valeur des di rents attri"uts, c!est--dire une premi=re valeur 3ui correspond l!attri"ut numero &3ui 8e vous le rappelle est AM1,R/B<Q6M6B1, on n!a donc pas l!utilit de prciser sa valeur, le S97L sac$ant 3uoi mettre+, puis on ins=re la valeur ti"o pour l!attri"ut nom, et en in la valeur 0K-TSJ2-01-GK pour l!attri"ut telep$one% Simple, non @ Passons tout de suite l!insertion d!un nouveau tuple, et ce, partir d!une page 567% Supposons 3ue l!on dsire insrer e*actement le m0me tuple 3ue dans l!e*emple prcdent &c!est--dire 3ue ti"o ait tellement partie de nos amis, 3u!on a envie de partager nos dis3ues avec lui+% ,n aura alors )
<?php // on se connecte Q notre base #base $ mys4l/connect !'ser2eur'K 'login'K 'pass'"; mys4l/select/db !'ma/base'K #base" ; ?> <html> <head> <title>Bnsertion de tibo dans la base</title> </head> <body> <? // lancement de la re4uete #s4l $ 'B@C+DT B@T( liste/proprietaire A&L*+C !%%K %tibo%K %8T=H\=S1=80=RT%"'; // on insere le tuple !mys4l/4uery" et au cas o]K on 3crira un petit message d'erreur si la re4uNte ne se passe pas bien !or die" mys4l/4uery !#s4l" or die !'+rreur CZL <'.#s4l.'<br />'.mys4l/error!""; // on erme la conneJion Q la base mys4l/close!"; ?> Tibo 2ient d'Ntre inser3 dans la base. </body> </html>

/maginons, alors 3ue l!on dsire alors a8outer la "ase un dis3ue gr:ce la contri"ution de ti"o% Lans l!a"solu, r lc$issons une minute sur ce 3ue nous avons "esoin ) - il s!agit d!un nouveau dis3ue &soit son auteur et son titre+% - mais aussi, nous avons "esoin du numro 3u!a pris le propritaire ti"o dans la ta"le listeRproprietaire% <omment 3u!on ait donc ce truc @ 6n e et, on voit "ien 3ue si l!on ins=re directement un nouveau dis3ue, la 8ointure entre les deu* ta"les ris3ue de ne pas se aire% 6n ait, il audrait tout d!a"ord slectionner le numro 3u!a pris ti"o dans la ta"leRproprietaire &par le "iais d!un re3uete S;2 de t'pe S626<1, 8e vous renvoies au tutorial prc=dent pour revoir la rcupration des donnes d!une "ase+% J7

Support de cours PHP Mme Saidi -- 2007 <ependant, imaginons 3ue nous n!avons pas encore insr le propritaire ti"o dans notre "ase de donnes, et 3ue l!on dsire directement insrer ce nouveau propritaire ainsi 3u!un dis3ue lui appartenant% Bous allons voir comment rcuprer simplement le nouveau numero 3ui vient d!0tre insr &donc celui de ti"o+ et ainsi l!utiliser pour insrer notre dis3ue% ,n a )
<?php // on se connecte Q notre base #base $ mys4l/connect !'ser2eur'K 'login'K 'pass'"; mys4l/select/db !'ma/base'K #base" ; ?> <html> <head> <title>Bnsertion de tibo et d'un nou2eau dis4ue dans la base</title> </head> <body> <? // on pr3pare la re4uNte #s4l $ 'B@C+DT B@T( liste/proprietaire A&L*+C!%%K %tibo%K %8T=H\=S1=80=RT%"'; // on ins-re le tuple !mys4l/4uery" et au cas o]K on 3crira un petit message d'erreur si la re4uNte ne se passe pas bien !or die" mys4l/4uery !#s4l" or die !'+rreur CZL <'.#s4l.'<br />'.mys4l/error!""; // on r3cup-re le dernier num3ro ins3r3K soit le num3ro de tibo #numero/insere $ mys4l/insert/id!"; // on ins-re le tuple !mys4l/4uery" et au cas o]K on 3crira un petit message d'erreur si la re4uNte ne se passe pas bien !or die" #s4l $ 'B@C+DT B@T( liste/dis4ue A&L*+C !%'.#numero/insere.'%K %The supermen lo2ers%K %Th e player%"'; // on ins-re le tuple !mys4l/4uery" et au cas o]K on 3crira un petit message d'erreur si la re4uNte ne se passe pas bien !or die" mys4l/4uery !#s4l" or die !'+rreur CZL <'.#s4l.'<br />'.mys4l/error!""; // on erme la conneJion Q la base mys4l/close!"; ?> Tibo 2ient d'Ntre inser3 dans la baseK ainsi 4ue son nou2eau dis4ue ? The player des Cupe rmen lo2ers. </body> </html>

;ue aire en plus @ 6t "ien, tout comme dans le tutorial prcdent, vous pouve4 rendre vos insertions vraiment d'nami3ues en e ectuant tout simplement vos insertions partir des valeurs ournies par un ormulaire% /maginons 3ue l!on dsire insrer des nouveau* dis3ues% Supposons 3ue l!on dispose d!une page $tml contenant un ormulaire permettant de saisir le nom du propritaire, et 3ue ce ormulaire vous demande galement le titre d!un al"um ainsi 3ue son interpr=te &on suppose galement 3ue le c$amp action de notre ormulaire correspond au nom de la page PHP 3ui traite les donnes, soit la page contenant le code ci-dessous+% ,n suppose en in, 3ue le c$amp du ormulaire contenant le nom du propritaire porte le nom proprio &on pourra alors utiliser la varia"le WRP,S1Z!proprio![ dans notre page PHP, tout en supposant de notre ormulaire une mt$ode P,S1 et npn 961+, 3ue le c$amp contenant l!interpr=te porte le nom interprete et 3ue le c$amp JS

Support de cours PHP Mme Saidi -- 2007 contenant le titre porte le nom titre% ,n aura alors )
<?php // on se connecte Q notre base #base $ mys4l/connect !'ser2eur'K 'login'K 'pass'"; mys4l/select/db !'ma/base'K #base" ; ?> <html> <head> <title>Bnsertion de nou2eauJ dis4ues dans la base</title> </head> <body> <? // on teste si les 2ariables du ormulaire sont bien d3clar3es i !isset!#/P(CT7'proprio'9" FF isset!#/P(CT7'interprete'9" FF isset!#/P(CT7'titre'9"" G // on pr3pare la re4uNte pour r3cup3rer le numero du propri3taire #s4l $ 'C+L+6T numero PD(M liste/proprietaire YH+D+ nom $ %'. #/P(CT7'proprio'9.'%'; // on lance la re4uNte !mys4l/4uery" et on impose un message d'erreur si la re4uN te ne se passe pas bien !or die" #re4 $ mys4l/4uery!#s4l" or die!'+rreur CZL <<br />'.#s4l.'<br />'.mys4l/error!"" ; // on r3cup-re le r3sultat sous orme d'un tableau #data $ mys4l/ etch/array!#re4"; // on lib-re l'espace m3moire allou3 pour cette interrogation de la base mys4l/ ree/result !#re4"; // on ins-re le tuple !mys4l/4uery" et au cas o]K on 3crira un petit message d'er reur si la re4uNte ne se passe pas bien !or die" #s4l $ 'B@C+DT B@T( liste/dis4ue A&L*+C!%'.#data7'numero'9.'%K %'. #/P(CT7'interprete'9.'%K %'.#/P(CT7'titre'9.'%"'; // on ins-re le tuple !mys4l/4uery" et au cas o]K on 3crira un petit message d'er reur si la re4uNte ne se passe pas bien !or die" mys4l/4uery !#s4l" or die !'+rreur CZL <'.#s4l.'<br />'.mys4l/error!""; // on erme la conneJion Q la base mys4l/close!"; echo '@ous 2enons d['ins3rer un nou2eau dis4ue ? '.#/P(CT7'titre'9.' de '. #/P(CT7'interprete'9.' appartenant Q '.#/P(CT7'proprio'9; I else G echo 'Les 2ariables du ormulaire ne sont pas d3clar3es'; I ?> </body> </html>

JT

Support de cours PHP Mme Saidi -- 2007

2odi ier des donnes de votre base


Apr=s avoir vu comment on a ic$e les donnes d!une "ase de donnes et comment on les ins=re, vo'ons maintenant comment modi ier ces donnes% Qeprenons les deu* ta"les 3ue nous tudions depuis le d"ut des tutoriau* sur les "ases de donnes% Ee vous rappelle 3ue l!on avait alors ) 2a ta"le listeRproprietaire ) B% du propritaire 1 2 G J Propritaire B% tl 2A 92,7M26 0K-JS-SO-20-OJ Eerem' 0K-SO-TS-7S-12 7eno#t 0K-J7-01-OT-GK 1i"o 0K-TS-J2-01-GK

2a ta"le listeRdis3ue ) B% du propritaire 1 1 2 2 G 2 J

Auteur <assius La t PunH <assius 1lpopmusiH <lamaran 7o" Sinclar 1$e supermen lovers

1itre Au r0ve Liscover' Au r0ve 9enetic .orld Qelease 'oursel Paradise 1$e pla'er

Fo'ons, en S;2 tout d!a"ord comment modi i un tuple de la ta"le listeRproprietaire% Supposons 3ue 7eno#t vienne de c$anger son numro de porta"le &et 3ue son nouveau numro est ) 0K-OO-TT10-00+, il audra alors aire la modi ication dans la "ase de donnes a in 3ue soit ancien numro soit remplac par le nouveau% ,n aura alors ) MPLA16 listeRproprietaire S61 telep$oneX(0K-OO-TT-10-00( 5H6Q6 nomX(7eno#t(> 6n e et, on modi ie 3uelle ta"le @ ,n modi ie listeRproprietaire% ;uel attri"ut modi ie-t-on @ ,n modi ie l!attri"ut telep$one &3ui prendra la valeur 0K-OO-TT-10-00+% O0

Support de cours PHP Mme Saidi -- 2007 6t on ait les modi ications pour 3uel&s+ tuple&s+ @ ,n modi ie le&s+ tuple&s+ oV l!attri"ut nom prend la valeur 7eno#t &dans notre cas, seul un tuple sera modi i car notre ta"le comporte 3u!un seul tuple oV l!attri"ut nom prend la valeur 7eno#t+% Simple non @ 6n revanc$e, note4 "ien 3ue dans notre clause 5H6Q6, nous n!avons mis 3u!une seule condition% 7ien videmment, tout est possi"le, vous pouve4 en mettre plusieurs &ainsi 3ue des clauses utilisant le 2/b6 vu dans les tutoriau* prcdents+% 1out dpend des tuples 3ue vous voule4 modi ier% <ependant, imaginons 3ue nous dsirons modi ier plusieurs attri"uts d!un m0me tuple% 6n e et, supposons alors 3ue nous possdons dans notre "ase de donnes une ta"le ressem"lant la ta"le listeRproprietaire &3ue nous avons d8 tudi+, mais 3ui comportera plus d!attri"uts, comme par e*emple l!adresse du propritaire ainsi 3ue son age% ,n pourrait alors tr=s "ien avoir une ta"le ressem"lant ceci ) B% Bom 2A 1 92,7M26 2 Eerem' G 7eno#t J 1i"o B% tl 0K-JS-SO20-OJ 0K-SO-TS7S-12 0K-OO-TT10-00 0K-TS-J201-GK Adresse 2, rue des lilas J, rue des auvettes 2, rue des tulipes Age 2G 22 KK

S, rue du acteur 2G

Supposons alors 3ue l!on se soit tromp dans l!age de 7eno#t et 3u!au lieu d!avoir KK ans &il n!est pas si vieu* 3ue -a notre 7eno#t U+, et "ien, il a tout simplement KO ans )+ Supposons galement 3ue l!adresse de 7eno#t soit errone et 3u!il n!$a"ite pas 2 rue des tulipes, mais G rue des tulipes% ,n aura alors ) MPLA16 listeRproprietaire S61 adresseX(G, rue des tulipes(, ageX(KO( 5H6Q6 nomX(7eno#t(> ,n remar3ue alors 3u!il su it de sparer les diverses modi ications opres sur un m0me tuple par une simple virgule% Fo'ons maintenant comment e ectuer ces modi ications dans une page PHP% Pour ce aire, prenons notre deu*i=me modi ication, celle concernant l!adresse et l!age de 7eno#t% ,n aura alors )
<?php // on se connecte Q notre base #base $ mys4l/connect !'ser2eur'K 'login'K 'pass'"; mys4l/select/db !'ma/base'K #base" ;

O1

?> <html> <head> <title>Modi ication du t3l et de l'adresse de )eno,t</title> </head> <body> <? // lancement de la re4uNte #s4l $'*PE&T+ liste/proprietaire C+T adresse$%RK rue des tulipes%K age$%T5% YH+D+ nom$%)e no,t%'; // on eJ3cute la re4uNte !mys4l/4uery" et on a iche un message au cas o] la re4uNte ne s e passait pas bien !or die" mys4l/4uery!#s4l" or die!'+rreur CZL <'.#s4l.'<br />'.mys4l/error!""; // on erme la conneJion Q la base mys4l/close!"; ?> L'adresse et l'age de )eno,t 2iennent d'Ntre modi i3s. </body> </html>

Support de cours PHP Mme Saidi -- 2007

Attention UUU 6n e et, les modi ications peuvent 0tre vraiment dangereuses pour votre "ase de donnes% 6n e et, si vous ne prene4 pas un minimum de prcaution pour e ectuer vos modi ications, vous pouve4 tr=s "ien modi ier un tuple d!une ta"le et perde en m0me temps la 8ointure avec une autre ta"le% 6n e et, nous savons 3ue nos ta"les listeRdis3ue et listeRproprietaire sont lies par l!intermdiaire du numro de propritaire &la 8ointure+% <eci impli3ue donc 3ue si pour une raison ou pour une autre, nous sommes amen modi ier ce numro &dans la ta"le listeRproprietaire par e*emple+, il audra galement penser aire la modi ication de ce m0me numro dans l!autre ta"le &listeRdis3ue+ a in 3ue la 8ointure entre les deu* ta"les soit tou8ours onctionnelle% ;ue aire en plus @ 6t "ien comme dans les tutoriau* prcdents, vous pouve4 e ectuer des modi ications de tuples par le "iais de ormulaires% Par e*emple, supposons 3ue l!on dispose d!un page 567 comportant un ormulaire disposant des c$amps suivants ) - un menu droulant &de BAM6 proprio+ permettant de c$oisir le nom d!un propritaire% - un c$amps te*te classi3ue &de BAM6 nouvelleRadresse+ permettant l!utilisateur de saisir une nouvelle adresse pour le propritaire slectionne dans le menu droulant Supposons ensuite 3ue ce ormulaire a pour "alise A<1/,B la page traitement%p$p 3ui nous permet de modi ier l!adresse du propritaire en 3uestion% ,n aura alors le code suivant &pour la page traitment%p$p+ )
<?php // on se connecte Q notre base #base $ mys4l/connect !'ser2eur'K 'login'K 'pass'"; mys4l/select/db !'ma/base'K #base" ;

O2

?> <html> <head> <title>Modi ication de l'adresse d'un propri3taire</title> </head> <body> <? // on teste si les 2ariables du ormulaire sont d3clar3es i !isset!#/P(CT7'nou2elle/adresse'9" FF isset!#/P(CT7'proprio'9"" G

Support de cours PHP Mme Saidi -- 2007

// lancement de la re4uNte #s4l $ '*PE&T+ liste/proprietaire C+T adresse$%'.#/P(CT7'nou2elle/adresse'9.'% YH +D+ nom$%'.#/P(CT7'proprio'9.'%'; // on eJ3cute la re4uNte !mys4l/4uery" et on a iche un message au cas o] la re4u Nte ne se passait pas bien !or die" mys4l/4uery!#s4l" or die!'+rreur CZL <'.#s4l.'<br />'.mys4l/error!""; // on erme la conneJion Q la base mys4l/close!"; // un petit message permettant de se rendre compte de la modi ication e echo 'La nou2elle adresse de '.#/P(CT7'proprio'9.' est ? '. #/P(CT7'nou2elle/adresse'9; I else G echo 'Les 2ariables du ormulaire ne sont pas d3clar3es'; I ?> </body> </html> ectu3e

OG

Support de cours PHP Mme Saidi -- 2007

/u##rimer des donnes de votre base


Apr=s avoir vu l!a ic$age des donnes provenant d!une "ase de donnes, l!insertion et la modi ication de ces m0mes donnes, vo'ons maintenant la derni=re opration ondamentale concernant ces "ase de donnes ) la suppression de tuples% Qeprenons alors nos deu* ta"les listeRproprietaire et listeRdis3ue 3ue nous avons utilise pendant tous les tutoriau* concernant les "ases de donnes% Ee vous rappelle 3ue l!on avait alors ) 2a ta"le listeRproprietaire ) B% du propritaire 1 2 G J Propritaire B% tl 2A 92,7M26 0K-JS-SO-20-OJ Eerem' 0K-SO-TS-7S-12 7eno#t 0K-OO-TT-10-00 1i"o 0K-TS-J2-01-GK

2a ta"le listeRdis3ue ) B% du propritaire 1 1 2 2 G 2 J

Auteur <assius La t PunH <assius 1lpopmusiH <lamaran 7o" Sinclar 1$e supermen lovers

1itre Au r0ve Liscover' Au r0ve 9enetic .orld Qelease 'oursel Paradise 1$e pla'er

Fo'ons alors, en S;2, comment supprimer un tuple de la ta"le listeRproprietaire% Supposons 3ue l!on dsire supprimer 1i"o de notre "ase de donnes% ,n crira alors ) L62616 rom listeRproprietaire 5H6Q6 nomX(1i"o(> 6n e et, on e ace un tuple &ou plusieurs, tout dpend de la clause 5H6Q6+ de 3uelle ta"le @ Le la ta"le listeRproprietaire% ;uel&s+ tuple&s+ e ace-t-on @ ,n e ace tous les tuples de la ta"le listeRproprietaire ou l!attri"ut nom prend la valeur 1i"o &dans notre cas, un seul tuple porte la valeur 1i"o pour l!attri"ut nom+% OJ

Support de cours PHP Mme Saidi -- 2007 Bote4 "ien 3ue la clause 5H6Q6 peut tr=s "ien contenir plusieurs conditions, elles seront alors spars par des oprateurs "oolens &ABL correspondant un 61 logi3ue ou ,Q correspondant un ,M logi3ue+% <ependant, 8e vous rappelle 3ue des re3u0tes S;2 peuvent 0tre "eaucoup plus comple*es, et dans ce cas, 8e vous renvoie la documentation M'S;2, ce 3ui notre niveau &d"utant+ n!est pas vraiment intressant &cela ne sert rien de vous em"rouiller les ides d=s le dpart+% Attention UUU 2ors3ue l!on e ectue une suppression de tuples, il aut tou8ours aire attention e acer non seulement les tuples de la ta"le dont on veut supprimer le&s+ lment&s+ mais ventuellement les autres tuples d!une autre ta"le &si les deu* ta"les sont 8ointes par le "iais d!un attri"ut+% 6n e et, dans notre e*emple, nous venons de supprimer de la ta"le listeRproprietaire le tuple dont l!attri"ut nom valait 1i"o% <ependant, on remar3ue 3ue la ta"le listeRdis3ue comporte des lments 3ui taient lis 1i"o% ,r, vu 3ue ces elements ne nous servent plus rien maintenant &car on a supprimer 1i"o de la liste+, il aut galement penser les supprimer &a in d!avoir une "ase de donnes $omog=ne+% Fo'ons maintenant comment e ectuer ces suppressions par le "iais d!une page 567 crite en PHP% Prenons par e*emple le cas d!une page PHP permettant la suppression de 1i"o de la "ase de donnes ainsi 3ue de toutes les in ormations le concernant &c!est--dire les dis3ues lui appartenant+% ,n aura alors )
<?php // on se connecte Q notre base #base $ mys4l/connect !'ser2eur'K 'login'K 'pass'"; mys4l/select/db !'ma/base'K #base" ; ?> <html> <head> <title>Cuppression de Tibo de la base</title> </head> <body> <? // lancement de la re4uNte pour e acer Tibo #s4l $'E+L+T+ rom liste/proprietaire YH+D+ nom$%Tibo%'; // on eJ3cute la re4uNte !mys4l/4uery" et on a iche un message au cas o] la re4uNte ne s e passait pas bien !or die" mys4l/4uery!#s4l" or die!'+rreur CZL <'.#s4l.'<br />'.mys4l/error!""; // lancement de la re4uNte pour e acer les dis4ues de Tibo !;e 2ous rappelle 4ue Tibo Q le num3ro S" #s4l $'E+L+T+ rom liste/dis4ue YH+D+ numero$%S%'; // on eJ3cute la re4uNte !mys4l/4uery" et on a iche un message au cas o] la re4uNte ne s e passait pas bien !or die" mys4l/4uery!#s4l" or die!'+rreur CZL <'.#s4l.'<br />'.mys4l/error!""; // on erme la conneJion Q la base mys4l/close!"; ?> Tibo et tous ces dis4ues ont 3t3s supprim3s de la base de donn3es. </body> </html>

OO

Support de cours PHP Mme Saidi -- 2007

;ue aire en plus @ <omme dans les tutoriau* prcdents, a in de rendre vos pages "eaucoup plus d'nami3ues, il serait intressant de aire une page 567 contenant un ormulaire possdant un menu droulant permettant de c$oisir le nom du mem"re e acer% ,n suppose alors 3ue ce menu droulant le c$amp BAM6 3ui prend la valeur proprio, et 3ue le ormulaire a son c$amp A<1/,B 3ui prend la valeur traitement%p$p% <eci impli3ue 3ue dans la page traitement%p$p, on aura une varia"le Wproprio 3ui contient le nom du propritaire supprimer% ,n aura alors le code suivant &pour la page traitement%p$p place dans le m0me rpertoire 3ue la page 567 contenant le ormulaire+ )
<?php // on se connecte Q notre base #base $ mys4l/connect !'ser2eur'K 'login'K 'pass'"; mys4l/select/db !'ma/base'K #base" ; ?> <html> <head> <title>Cuppression d'un membre de la base</title> </head> <body> <? // on teste si la 2ariable du ormulaire est bien d3clar3e i !isset!#/P(CT7'proprio'9"" G // on recherche le numero du membre Q supprimer #s4l $ 'C+L+6T numero PD(M liste/proprietaire YH+D+ nom $ %'.#/P(CT7proprio9.'%'; // on lance la re4uNte !mys4l/4uery" et on impose un message d'erreur si la re4uN te ne se passe pas bien !or die" #re4 $ mys4l/4uery!#s4l" or die!'+rreur CZL <<br />'.#s4l.'<br />'.mys4l/error!"" ; // on recupere le resultat sous orme d'un tableau #data $ mys4l/ etch/array!#re4"; // on recupere la 2aleur 4ui nous intersse #numero/du/proprio $ #data7'numero'9; // on lib-re l'espace m3moire allou3 pour cette interrogation de la base mys4l/ ree/result !#re4"; // lancement de la re4uNte pour e acer notre membre #s4l $'E+L+T+ rom liste/proprietaire YH+D+ nom$%'.#/P(CT7'proprio'9.'%'; // on eJ3cute la re4uNte !mys4l/4uery" et on a iche un message au cas o] la re4u Nte ne se passait pas bien !or die" mys4l/4uery!#s4l" or die!'+rreur CZL <'.#s4l.'<br />'.mys4l/error!""; // lancement de la re4uNte pour e acer les dis4ues de notre membre #s4l $'E+L+T+ rom liste/dis4ue YH+D+ numero$%'.#numero/proprio.'%'; // on eJ3cute la re4uNte !mys4l/4uery" et on a iche un message au cas o] la re4u Nte ne se passait pas bien !or die" mys4l/4uery!#s4l" or die!'+rreur CZL <'.#s4l.'<br />'.mys4l/error!""; // on erme la conneJion Q la base

OK

mys4l/close!";

Support de cours PHP Mme Saidi -- 2007

// un petit message a in de 2oir ce 4ui s'est pass3 echo '@ous 2enons de supprimer '.#/P(CT7'proprio'9.' de la base ainsi 4ue tous ce s dis4ues'; I else G echo 'La 2ariable de notre ormulaire n['est pas initialis3e.'; I ?> </body> </html>

O7

Support de cours PHP Mme Saidi -- 2007

"es coo3ies
Lans ce tutorial, nous allons voir comment crer des cooHies, et surtout comment "ien les manipuler% 1out de suite, mettons les c$oses au clair% 6n e et, "eaucoup de personnes d!imaginent 3ue les cooHies sont des petites "0tes malveillantes &alors 3ue c!est totalement au*+, tout simplement parce 3u!elles ne savent pas e*actement de 3uoi il s!agit% Mn cooHie est un petit ic$ier te*te & aisant au ma*imum KO bo+ stocH sur le dis3ue dur du visiteur du site% <e ic$ier te*te permet de sauvegarder diverses in ormations concernant ce visiteur a in de pouvoir les rutiliser &les in ormations+ lors de la proc$aine visite du visiteur sur ce m0me site% Par e*emple, on pourrait tr=s "ien stocHer dans ce cooHie le nom du visiteur et par la suite, a ic$er son nom c$a3ue ois 3u!il se connectera sur le site &ceci "ien sur, s!il n!e ace pas les cooHies de son dis3ue dur+% <ependant, tout cela n!arrive pas par le saint esprit% 6n e et, ceci n!est possi"le 3ue si le visiteur entr lui-m0me ses in ormations dans un ormulaire sur le site% 2es cooHies sont stocHs, selon votre navigateur /nternet, un certain endroit de votre dis3ue dur% Par e*emple, avec un s'st=me compos de 5indo.s et du navigateur /B16QB61 6cP2,Q6Q &le plus usit+% Lans cette con iguration, les cooHies sont stocHs dans le rpertoire <)5indo.s1emporar' /nternet Niles comme ci-dessous )

Fo'ons prsent comment crer de tels cooHies, gr:ce la onction setcooHie&+% Soit alors la portion de code suivante )
<?php // on d3 init une dur3e de 2ie de notre cooMie !en secondes"K donc un an dans notre cas #temps $ RT5*1S*RT88; // on en2oie un cooMie de nom pseudo portant la 2aleur L& 'L()*L+ setcooMie !%pseudo%K %L& 'L()*L+%K time!" O #temps"; ?>

6*plications ) OS

Support de cours PHP Mme Saidi -- 2007 9r:ce ce code, nous venons d!envo'er, c$e4 le client &donc le visiteur du site+ un cooHie de nom pseudo portant la valeur 2A 92,7M26% Le plus, time&+ retournant le nom"re de secondes coules depuis le 1er 8anvier 1T70 8us3u! l!instant prsent, nous imposons 3ue le cooHie ai une dure de vie de un an &soit en ait l!instant prsent plus un an, donc un an+% 6n in, maintenant, si le visiteur ne supprime pas ce cooHie, et "ien, dans toutes les pages 567 de notre site, on pourra accder la varia"le Wpseudo 3ui contiendra la c$a#ne de caract=res 2A 92,7M26% 6n revanc$e, l!envoie d!un cooHie a'ant la m0me valeur pour tous les visiteurs d!un site, ce n!est pas vraiment intressant% Supposons alors 3ue sur une page de notre site 567, nous sou$aitons aire en sorte 3ue si le visiteur vient pour la premi=re ois &ou 3u!il a supprimer ses cooHies+, et "ien, il aurait alors, la possi"ilit de saisir son nom dans un ormulaire, ou "ien s!il ne s!agit pas de sa premi=re visite, d!a ic$er tout simplement 7on8our puis son nom% ,n aurait alors le code suivant pour notre page &par e*emple inde*%p$p+ )
<html> <head> <title>BndeJ du site</title> <body> <? // on teste la d3claration de notre cooMie i !isset!#/6((^B+7'pseudo'9"" G echo ')on;our '.#/6((^B+7'pseudo'9.' <'; // si le cooMie n'eJiste pasK on a iche un ormulaire permettant au 2isiteur de saisir son nom echo '< orm action$%./traitement.php% method$%post%>'; echo 'Aotre nom ? <input type $ %teJte% name $ %nom%><br />'; echo '<input type $ %submit% 2alue $ %+n2oyer%>'; I else G I ?> </body> </html> echo '@otre cooMie n['est pas d3clar3.';

6t le code pour la page traitement%p$p )


<?php B !isset!#/P(CT7'nom'9"" G // on d3 init une dur3e de 2ie de notre cooMie !en secondes"K donc un an dans not re cas #temps $ RT5*1S*RT88; // on en2oie un cooMie de nom pseudo portant la 2aleur de la 2ariable #nomK c'est =Q=dire la 2aleur 4u'a saisi la personne 4ui a rempli le ormulaire setcooMie !%pseudo%K #/P(CT7'nom'9K time!" O #temps"; // onction nous permettant de aire des redirections unction redirection!#url"G i !headers/sent!""G print!'<meta http=e4ui2$%re resh% content$%8;*DL$'.#url.'%>'"; I

OT

else G header!%Location? #url%"; I I

Support de cours PHP Mme Saidi -- 2007

// on e ectue une redirection 2ers la page d'accueil redirection !'indeJ.php'"; I else G I ?> echo 'La 2ariable du ormulaire n['est pas d3clar3e.';

Attention UUU Plusieurs conditions sont respecter a in 3ue l!utilisation des cooHies se passe au mieu* ) - l!envoie d!un cooHie doit 0tre la premi=re onction PHP 3ue vous utilise4 dans votre script, ce 3ui veut dire 3ue vous deve4 utiliser la onction setcooHie&+ tout en $aut de votre script &AM<MB ANN/<HA96 61 AM<MB <,L6 <,L6 H1M2 AFAB1 MB S61<,,b/6+% Si d!autres onctions interviennent avant l!envoie du cooHie, celui-ci ne onctionnera pas% - Si vous envo' un cooHie sur un poste client celui-ci e acera automati3uement l!ancien cooHie 3ui portait le m0me nom &si il ' en avait un+, autrement il le crera% Bote ) Pour e acer un cooHie, vous deve4 lancer un cooHie 3ui aura le m0me nom 3ue le cooHie 3ue vous voule4 e acer, tout en lui donnant une valeur nulle &vous pouve4 galement l!envo'er avec un temps de vie dpass+%

K0

Support de cours PHP Mme Saidi -- 2007

"es sessions
Fo'ons maintenant un tutorial vraiment important pour la scurit de vos scripts ) les sessions% 6n e et, a in de transmettre des varia"les de pages en pages, plusieurs possi"ilits s!o rent vous ) - les divers c$amps des ormulaires, 3u!ils soient $idden ou non% - passer les varia"les directement travers les liens% - utiliser les cooHies% - utiliser les sessions% <ependant, toutes ces possi"ilits n!o rent pas le m0me niveau de scurit% 6n e et, certaines de ces possi"ilits sont vraiment prati3uent dans leurs modes d!utilisation &comme les cooHies par e*emple mais tout le monde n!est pas o"lig d!accepter les cooHies+, ce 3ui impli3ue, dans la ma8orit des cas, un "as niveau de scurit &cas du passage des varia"les par les liens, ce 3ui impli3ue 3ue les varia"les seront visi"les de tout le monde+% Le m0me, aire dans c$a3ue page un ormulaire contenant des c$amps $idden permettant de aire circuler les di rentes varia"les travers toutes les pages du site n!est pas vraiment prati3ue% <!est pour3uoi, dans tous ces cas oV la scurit de vos donnes est primordiale, vous devre4 utiliser les sessions 3ui vous permettront de aire circuler di rentes varia"les &comme un mot de passe par e*emple+ travers les pages de votre site, tout en tant asse4 con orta"les l!emploi% Pour utiliser les sessions, di rentes onctions PHP s!o rent nous% Foici d8 un petit ta"leau vous permettant de vous amiliariser avec ces di rentes onctions &3ue nous dtaillerons "ien sur dans la suite de ce tutorial+ ) )) Nonction )) sessionRstart )) Signi ication )) Lmarre une session 6nregistre une varia"le de sessionRregister session sessionRunregister 6 ace une varia"le de session Fri ie si une varia"le est sessionRisRregistered dclare pour la session en cours Qetourne l!id de la session en sessionRid cours Qetourne le nom de la session sessionRname en cours Letruit toutes les varia"les de sessionRunset la session en cours sessionRdestro' Lestruit la session en cours Sac$e4 galement 3u!ils e*istent d!autres onctions agissant sur les sessions% 6n revanc$e, tant donn 3u!elles ne sont pas ncessaires la compr$ension de notre tutorial, nous ne les dtaillerons pas ici &c % la documentation pour de plus amples in ormations+% <ependant, ces onctions commencent tou8ours par session% K1

Support de cours PHP Mme Saidi -- 2007 Attention UUU Avant d!aller plus loin dans le tutorial, vous deve4 savoir 3ue les sessions ne sont accessi"les 3u! partir de PHP J% <ependant, 8e vous rassure, la plupart des $"ergeurs sont au8ourd!$ui ait voluer leur PHP en PHP J% A in de voir concr=tement comment onctionnent les sessions, prenons alors un e*emple simple ) - imaginons 3ue notre site poss=de une section mem"re oV c$a3ue mem"re devra se logu avant de pouvoir ' entrer% - de plus, on aimerait "ien 0tre sur 3u!il s!agisse tou8ours de ce m0me mem"re 3ui est connect% ,n aura alors une page contenant un ormulaire permettant notre visiteur de se connecter une section mem"re &page inde*%$tm+ )
<html> <head> <title>Pormulaire d'identi ication</title> </head> <body> < orm action$%login.php% method$%post%> Aotre login ? <input type$%teJt% name$%login%> <br /> Aotre mot de pass3 ? <input type$%passLord% name$%pLd%><br /> <input type$%submit% 2alue$%6onneJion%> </ orm> </body> </html>

L!apr=s cette page, vous pouve4 remar3uer 3ue lors3ue le visiteur le remplira et 3u!il cli3uera sur le "outon de conne*ion, on se retrouvera au niveau de la page login%p$p avec une varia"le Wlogin 3ui contiendra le login de notre visiteur ainsi 3u!une varia"le Wp.d contenant son mot de passe > varia"les 3u!il audra naturrellement tester avant de dmarrer notre session &car seuls les mem"res pourront accder notre espace mem"re, espace oV l!on utilisera notre session+% ,n aura alors par e*emple &page login%p$p+ )
<?php // (n d3 init un login et un mot de passe de base pour tester notre eJemple. 6ependantK 2 ous pou2eX tr-s bien interroger 2otre base de donn3es a in de sa2oir si le 2isiteur 4ui s e connecte est bien membre de 2otre site #login/2alide $ %moi%; #pLd/2alide $ %lemien%; // on teste si nos 2ariables sont d3 inies i !isset!#/P(CT7'login'9" FF isset!#/P(CT7'pLd'9"" G // on 23ri ie les in ormations du ormulaireK Q sa2oir si le pseudo saisi est bie n un pseudo autoris3K de mNme pour le mot de passe i !#login/2alide $$ #/P(CT7'login'9 FF #pLd/2alide $$ #/P(CT7'pLd'9" G // dans ce casK tout est oMK on peut d3marrer notre session // on la d3marre ?" session/start !"; // on enregistre les param-tres de notre 2isiteur comme 2ariables de sess ion !#login et #pLd" !noteX bien 4ue l'on utilise pas le # pour enregistrer ces 2ariables

K2

"

Support de cours PHP Mme Saidi -- 2007


#/C+CCB(@7'login'9 $ #/P(CT7'login'9; #/C+CCB(@7'pLd'9 $ #/P(CT7'pLd'9; // on redirige notre 2isiteur 2ers une page de notre section membre header !'location? page/membre.php'";

I else G // Le 2isiteur n'a pas 3t3 reconnu comme 3tant membre de notre site. (n utili se alors un petit ;a2ascript lui signalant ce ait echo '<body onLoad$%alert!'Membre non reconnu...'"%>'; // puis on le redirige 2ers la page d'accueil echo '<meta http=e4ui2$%re resh% content$%8;*DL$indeJ.htm%>'; I I else G echo 'Les 2ariables du ormulaire ne sont pas d3clar3es.'; I ?>

Qemar3uer galement 3ue nous utilisons notre sessionRstart avant tout code H1M2% Fo'ons alors le code de la page de notre section mem"re, la page pageRmem"re%p$p% ,n a )
<?php // (n d3marre la session !ceci est indispensable dans toutes les pages de notre section m embre" session/start !"; // (n r3cup-re nos 2ariables de session i !isset!#/C+CCB(@7'login'9" FF isset!#/C+CCB(@7'pLd'9"" G // (n teste pour 2oir si nos 2ariables ont bien 3t3 enregistr3es echo '<html>'; echo '<head>'; echo '<title>Page de notre section membre</title>'; echo '</head>'; echo '<body>'; echo 'Aotre login est '.#/C+CCB(@7'login'9.' et 2otre mot de passe est '. #/C+CCB(@7'pLd'9.'.'; echo '<br />'; // (n a iche un lien pour ermer notre session echo '<a hre $%./logout.php%>E3connection</a>'; echo 'Les 2ariables ne sont pas d3clar3es.';

I else G I ?>

Fo'ons alors le code de la page permettant au mem"re de se dconnecter &la page logout%p$p+% ,n aura alors )
<?php // (n d3marre la session session/start !"; // (n d3truit les 2ariables de notre session session/unset !";

KG

Support de cours PHP Mme Saidi -- 2007


// (n d3truit notre session session/destroy !"; // (n redirige le 2isiteur 2ers la page d'accueil header !'location? indeJ.htm'"; ?>

Qsumons alors tout ce 3ue nous venons de voir ) - c$a3ue session un id di rent &ce 3ui permet d!viter la con usion entre les conne*ions+% - c$a3ue page oV notre session doit 0tre active, on doit placer un sessionRstart en tout d"ut de page &avant tout code H1M2+% - toutes les varia"les enregistres au cours de notre session, seront accessi"les dans les pages de notre session% - n!ou"lie4 EAMA/S de dtruire vos varia"les de session lors de la dconne*ion% 6n respectant ces r=gles vous pourre4 tr=s rapidement aire vous-m0me votre espace mem"re, voir m0me pour3uoi pas une "outi3ue en ligne )+

KJ

Support de cours PHP Mme Saidi -- 2007

"e dbu44a4e
Maintenant 3ue vous 0tes asse4 amilier avec le PHP, il vous est sarement d8 arriv de rester coince par un "ug pendant &et oui, -a arrive PP+ des $eures enti=res% 2a partie de d"uggage est une p$ase essentielle de la programmation d!une application, ne serait 3ue pour aire un rapport de tests ) tester c$a3ue onction a in de voir ce 3u!il se passe dans tous les cas% 2e d"uggage est galement ncessaire lors3ue l!on "lo3ue sur un truc 3ue l!on ne comprend pas% Avant de tom"er dans un tel cas de "ug oV l!on ne peut plus avancer, il e*iste de nom"reuses r=gles respecter a in de minimiser le ris3ue de "ug%

Arer le code
Arer le code est tr=s important% <ela ne sert strictement rien de vouloir aire de la compression de code en ne sautant pas de lignes dans son code, et ce, en crivant des instructions les unes la suite des autres sans sauter de lignes &si si, 8!ai d8 vu de tels cas PP+% 6*emple de code non ar )
<?php #toto $ R; #titi $ S; #somme $ #toto O #titi; echo #somme; ?>

Foici ce m0me e*emple, "ien ar )


<?php #toto $ R; #titi $ S; #somme $ #toto O #titi; echo #somme; ?>

Baturellement, cet e*emple peut para#tre tout "0te, mais lors3ue votre code commence aire des centaines de lignes, le premier e*emple &non ar+ devient vite tr=s nervent ) vous ne vous retrouve4 plus%

.ndenter le code
7ien indenter le code vous permet de voir rapidement de voir un aper-u de la structure de votre code% 2!indentation consiste placer certains lments cls du code &comme les accolades par e*emple+ un endroit "ien prcis et de s!' tenir a in de lire aisment votre code% /l e*iste plusieurs tec$ni3ues &toutes d enda"les+ pour indenter un code, mais seules deu* tec$ni3ues sont KO

Support de cours PHP Mme Saidi -- 2007 rellement utilises% Mne premi=re orme d!indentation, consiste placer une seule instruction par ligne &la dessus, en gnral, tout le monde est d!accord PP+, et lors3ue l!on place une conditionnelle ou "ien une "oucle, et "ien nous pla-ons l!accolade ouvrante en in de ligne de conditionnelle ou de "oucle, puis nous utilisons une ta"ulation sur les instructions contenues dans cette conditionnelle ou dans cette "oucle% 6n in, l!accolade ermante de notre conditionnelle ou de notre "oucle se placera au niveau de la conditionnelle ou de la "oucle% 6*emple )
<?php #toto $ 1; i !#toto $$ 1" G echo '#toto 2aut 1'; I elsei !#toto $$ R" G echo '#toto 2aut R'; I else G echo '#toto n['est pas 3gal Q 1 ou R'; I ?>

Pour les partisans de l!autre tec$ni3ue, les grandes lignes restent les m0mes, mais la di rence se 8oue au niveau de l!accolade ouvrante des conditionnelles ou des "oucles% 6n e et, certains mettent l!accolade ouvrante, non pas la in de la ligne de conditionnelle ou de "oucle, mais la ligne suivante, et l!accolade tant au m0me niveau 3ue la conditionnelle ou de la "oucle% 6n reprenant l!e*emple prc=dent, nous aurons donc )
<?php #toto $ 1; i !#toto $$ 1" G echo '#toto 2aut 1'; I elsei !#toto $$ R" G echo '#toto 2aut R'; I else G echo '#toto n['est pas 3gal Q 1 ou R'; I ?>

1out comme pour l!aration du code, vous deve4 "ien vous rendre compte 3u!un code "ien indent sera "eaucoup plus lisi"le 3u!un code mal indent oV il aut c$a3ue ois deviner oV se terminent les conditionnelles et les "oucles% Alors 3ue l, en regardant votre diteur de te*te, pour voir oV se termine une conditionnelle, vous n!ave4 3u! suivre des 'eu* le niveau &de ta"ulation+ de votre conditionnelle et de aire d iler le te*te% L=s 3ue vous tom"ere4 sur une accolade ermante, et "ien c!est cette accolade 3ui reprsente la in de votre conditionnelle &vous n!ave4 pas "esoin r lc$ir de l!endroit oV se trouve l!accolade ermant cette conditionnelle+% KK

Support de cours PHP Mme Saidi -- 2007

%ommenter le code
<ommenter votre code UUU Ee me rappelle encore d!un pro esseur 3ui me disait 3u!un code sans commentaire ne servait strictement rien% 6n e et, sur le moment &lors3ue l!on est "ien c$aud PP+, on crit des di4aines de lignes de code &et des ois, vraiment pas videntes au premier a"ord+ 3ue l!on comprend par aitement &parce 3ue l!on a l!algorit$me en t0te+% Mais dans un mois @ Lans un an @ Serie4 vous aussi sur de comprendre en 2 minutes ce 3ue vous ave4 crit 3uel3ues mois plus tIt @ Pas sur%%% Sans commentaires, votre code est pauvre% /maginons galement 3u!un autre programmeur lise votre code% Sera-t-il capa"le de comprendre le c$eminement de votre pense @ Pour toutes ces raisons, 8e vous invite c$audement commenter votre code% 6t 8!en ai m0me personnellement ait les rais% <om"ien de ois 8e ne me suis 8amais demand ce 3ue 8!avais dans la t0te le 8our oV 8!ai pondu ce code *, et ce, m0me pour des langages oV 8e me sens l!aise% Attention aussi ne pas tom"er dans l!e*c=s de commentaires% 6n e et, cela ne sert strictement rien de mettre un commentaire de ce genre )
<?php // on a iche la somme echo #somme; ?>

/l ne aut pas non plus prendre tous les programmeurs &ainsi 3ue vous au passage PP+ pour des cruc$es )+ 2a documentation PHP e*iste% Si la personne 3ui lit votre code ne conna#t pas l!utilit de la onction ec$o, il lui su it d!ouvrir son manuel PHP et de voir le rIle cette onction% Placer des commentaires sur vos onctions &2 C G lignes de commentaires avant le code de la onction dcrivant les param=tres de la onction et son rIle ne peut 0tre 3u!utile+, sur vos sections criti3ues dans votre code &par e*emple sur une di icult algorit$mi3ue+, dans vos ent0tes de classes pour dcrire le rIle de votre classe, le genre d!o"8ets 3u!elle gn=re%

%omment dbu44er
Si, malgr toutes les prcautions 3ue nous avons vu prcdemment, vous rester "lo3uer avec un script rcalcitrant 3ui ne onctionne pas comme vous le sou$aite4 &alors 3u!il le devrait selon vous PP+, il va alloir d"ugger% Pour d"ugger, il aut d8 notamment retirer tout ce 3ui est inutile au onctionnement du script% Betto'er notamment le code PHP de tous ses ec$o de code $tml &laisser 8uste des $istoire d!' voir un peu clair 3uand m0me PP+% K7

Support de cours PHP Mme Saidi -- 2007 6n e et, pour le moment, votre script "ug% 1aper directement dans le vi % Pour le design, on verra apr=s% L!ailleurs, pour viter d!avoir ce genre de pro"l=me, 8e vous conseille de aire tous vos scripts sans aucun arti ice de design &une ois 3ue votre script onctionnera sans pro"l=me, vous pourre4 alors vous occuper de sa mise en page+% 1ou8ours dans le "ut de d"ugger, prene4 l!$a"itude lors de la p$ase de conception d!un script, d!a ic$er le contenu de vos varia"les &a in de "ien voir ce 3u!elles ont dans le ventre lors de l!e*cution du script+% Mne petite astuce pour a ic$er tout ce 3ui est varia"le de t'pe c$a#ne de caract=res% 2ors3ue vous voule4 a ic$er leur contenu, a ic$er leur contenu entre deu* points par e*emple &a in de voir si la varia"le ne contient pas en d"ut ou en in de c$a#ne un espace 3ui peut 0tre source de "ug+%
<?php #chaine $ % test%; echo '.'.#chaine.'.'; ?>

6n ce 3ui concerne les varia"les de t'pe ta"leau &arra'+, vous pouve4 visualiser leur contenu l!aide de la onction printRr% 6*emple )
<?php #tablo $ array !'a' $> 'pomme'K 'b' $> 'banane'K 'c' $> array !'J'K 'y'K 'X'""; print/r !#tablo"; ?>

<e 3ui a ic$era ) Arra' & Za[ XA pomme Z"[ XA "anane Zc[ XA Arra' & Z0[ XA * Z1[ XA ' Z2[ XA 4 + + Mn conseil, lors3ue vous aites un printRr, visualiser le en a ic$ant la source de votre page &sous /nternet 6*plorer ) Menu a ic$age Source+% Fous verre4 ainsi le contenu de votre ta"leau tout indent ce 3ui est "eaucoup plus lisi"le% PS ) printRr peut 0tre utilis sur tous vos t'pes de varia"les%

%as des conditionnelles


KS

Support de cours PHP Mme Saidi -- 2007 /l peut arriver 3ue les conditionnelles n!aient pas le comportement sou$ait l!origine% 6n e et, 3uel3ues ois, votre script ne rentre pas dans le i mais dans le else alors 3u!il devrait aire le contraire% Prene4 la m0me mt$ode 3ue prcdemment en a ic$ant le contenu de vos varia"les a in de voir ce 3ui cloc$e% Prene4 galement attention au* tests de votre conditionnelle% 6n e et, en crivant par e*emple )
<?php #toto $ 5; i !#toto $ S" G echo '#toto 2aut S'; I ?>

6t "ien votre code passera tou8ours dans le i , et il a ic$era tou8ours Wtoto vaut J% <eci est du l!utilisation d!un seul X pour aire votre test &vous aites en ait une a ectation au lieu d!une comparaison 3ui elle se ait avec XX+%

%as des boucles


2e cas des "oucles est plus ou moins similaire celui des conditionnelles% 6n e et, si votre "oucle ne dmarre pas du tout, vri ier la valeur de votre compteur l!initialisation de la "oucle% Le m0me, si votre "oucle sem"le tourner l!in ini, vri ier "ien 3ue la valeur pour la sortie de la "oucle arrivera coup sur% Si par contre votre "oucle e ectue des traitements non voulus sur vos donnes, prene4 l!$a"itude de placer un ec$o dans votre "oucle a in de voir la valeur de vos varia"les c$a3ue passage de "oucle% Pour pourre4 ainsi mieu* apprcier le comportement de votre "oucle sur vos varia"les% 6*emple )
<?php #toto $ 1; or !#i $ 8; #i < 5; #iOO" G #resultat $ #toto * #i; echo 'Passage num3ro '.#i.' $> multiplication $ '.#resultat; echo '<br />'; I ?>

%as des ichiers


2es erreurs arrivent asse4 acilement avec l!utilisation des ic$iers si l!on ne prend pas garde certains points% 2ors3ue vous ave4 des erreurs en utilisant des ic$iers, vri ier tou8ours ) KT

Support de cours PHP Mme Saidi -- 2007 - d!une part le c$emin pour accder votre ic$ier &c$emins relati s C a"solus+ - d!autre part le c$mod de ce ic$ier &a in de voir si vous ave4 les droits pour accder ce ic$ier+%

Probl6mes avec 2y/0"


Foici plusieurs conseils 3ui vous permettront d!viter certaines erreurs incompr$ensi"les avec M'S;2% 1out d!a"ord, prene4 l!$a"itude de placer vos re3u0tes S;2 dans des varia"les% <ela peut para#tre rd$i"itoire au dpart, mais cela a plusieurs avantages% 6n e et, en pla-ant vos re3u0tes S;2 dans une varia"le &par e*emple Ws3l, au lieu de aire directement un m's3lR3uer'+ vous alle4 pouvoir a ic$er votre re3u0te S;2 &via un ec$o Ws3l+, ce 3ui constitue un rel avantage dans le cas de re3u0tes contenant des varia"les gres par PHP &cela vous permet de "ien voir si la re3u0te contient les "onnes valeurs pour c$acun des lments grs par PHP+% Mn autre avantage dcoule aussi de ce premier conseil% 6n e et, si votre re3u0te l!air de "ien passer mais 3ue, a priori, la rcupration des lments de la re3u0te pose pro"l=me, il arrive souvent 3ue l!on se demande si c!est la re3u0te 3ui s!est "ien droule et 3ui ne retourne aucun rsultat ou "ien si c!est notre code de rcupration 3ui pose pro"l=me% A in d!en avoir le coeur net, aites un ec$o de votre Ws3l, et copier coller votre re3u0te dans votre PHPM'Admin ) si PHPM'Admin sort "ien un rsultat, c!est 3ue votre code de rcupration n!est pas ameu*% 6n revanc$e, si votre PHPm'Admin ne retourne rien, c!est "ien 3ue re3u0te ne retourne aucun rsultat% Le m0me, en avan-ant tou8ours dans cette direction, compter tou8ours le nom"re de rsultat retourn de votre re3u0te S;2 l!aide d!un m's3lRnumRro.s, ce 3ui va vous permettre d!a ic$er un te*te au lieu de ne rien avoir sur l!cran et de ne pas comprendre pour3uoi il n!' a rien sur l!cran% 6*emple )
<?php #s4l $ 'C+L+6T toto PD(M table YH+D+ test$%oM%'; #re4 $ mys4l/4uery!#s4l" or die!'+rreur CZL <<br />'.#s4l.'<br />'.mys4l/error!""; #nb $ mys4l/num/roLs !#re4"; i !#nb $$ 8" G echo '&ucun r3sultat retourn3.'; ichage

I else G // D3cup3ration des r3sultats et a I mys4l/ ree/result !#re4"; ?>

Prene4 galement l!$a"itude de mettre un or die muni de la onction m's3lRerror sur vos lancement de re3u0tes S;2 a in de voir &si la re3u0te ne passe pas+ ce 3ui pose pro"l=me% Naites aussi tou8ours un m's3lR reeRresult sur votre re3u0te de t'pe S626<1 lors3ue celle-ci est termine a in de li"rer la mmoire ncessaire l!e*cution de votre re3u0te%

70

Support de cours PHP Mme Saidi -- 2007 6n e et, d!une part, cela soulage le serveur, et d!autre part, cela vite de rcuprer les rsultats d!une autre re3u0te aite prcdemment%

"es messa4es d;erreurs r:uents


6n in, si malgr toutes ces prcautions, il vous arrive de "lo3uer sur une erreur, voici un ta"leau regroupant les erreurs les plus communes 3ue l!on peut avoir en programmant avec PHP accompagnes de petits indices vous permettant de les rsoudre% )) 6rreur )) )) Qem=de )) /l s!agit d!une erreur de s'nta*e% Fri ie4 si vous n!ave4 pas ou"li un > mar3uant la in d!une instruction% Feri ier Parse error) parse galement si il ne man3ue pas error in ****%p$p on un W &dollar+ devant le nom line ' d!une varia"le% B!$site4 pas contrIler les lignes prcdentes% 2!erreur se trouve souvent 8uste audessus% Fous ave4 tent d!initialiser un cooHie apr=s 3ue l!ent0te 5arning) H11P soit envo' au client% p$pRSet<ooHie called Fri ie4 si une sortie &ec$o, a ter $eader $as "een print, message d!erreur, ligne sent in ****%p$p on "lanc$e, code $tml avant les line ' tags p$p+ ne se ait pas avant votre initialisation de cooHie 5arning) M'S;2 6rreur de conne*ion la "ase <onnection Nailed) M'S;2% Fri ie4 vos Access denied or param=tres de conne*ion user) %%%% 5arning) Mna"le to 2e c$emin vers le rpertoire create Zc$emin[ Bo sens contenir le ic$ier ou suc$ ile or director' "ien le c$emin du rpertoire in 'our script on line dans le3uel le ic$ier doit 0tre Znumero[ cre est incorrect 6rreur pro"a"le au niveau de la re3u0te S;2% Fri ie4 votre 5arning) 0 is not a re3u0te S;2 ) en particulier M'S;2 result inde* les c$amps manipuls, le nom in ****%p$p on line ' de ou des ta"les impli3ues, etc%%% 5arning) Faria"le Fous tente4 de manipuler une W4444 is not an arra' valeur numri3ue avec une or string in ****%p$p onction ddie au* c$a#nes on line ' ou au* ta"leau*% 5arning) Faria"le Fous tente4 de manipuler une W4444 is not an arra' valeur numri3ue avec une 71

or o"8ect in ****%p$p on line ' 5arning) <annot add $eader in ormation $eaders alread' sent in ****%p$p on line '

Natal error) Ma*imum e*ecution time e*ceeded in ****%p$p on line '

Natal error) Allo.ed memor' si4e o SGSSK0S "'tes e*$austed &tried to allocate * "'tes+ in ''''%p$p on line 4

Natal 6rror) <all to unde ined unction) ****&+ in '''%p$p on line 4

Natal 6rror) <annot redeclare ****&+ in '''%p$p on line 4

Support de cours PHP Mme Saidi -- 2007 onction ddie au* ta"leau* ou au* o"8ets% Fous ave4 tent d!e ectuer un Header apr=s 3ue l!ent0te H11P ait envo' au client% Fri ie4 si une sortie &ec$o, print, message d!erreur, voir m0me du code $tml+ ne s!e*cute pas avant votre Header PHP dispose d!un mcanisme permettant de se prmunir des scripts suscepti"les d!engendrer un temps d!e*cution trop important pouvant saturer un serveur% Par d aut, ce temps est de G0 secondes% PHP dispose d!un mcanisme permettant de se prmunir des scripts suscepti"les d!engendrer une consommation mmoire trop importante pouvant saturer un serveur% Par d aut, une limite est i*e environ S Mo &SGSSK0S octets+% 2a onction 3ue vous appele4 n!e*iste pas% <e peut-0tre une onction lie une li"rairie e*terne &9L, eli", PLN, etc%+% Lans ce cas, un simple p$pin o&+ vous renseignera sur les param=tres de compilation de votre version de PHP% Peut-0tre s!agit-il sinon d!une de vos propres onctions% Fri ie4 alors 3u!elle e*iste &notamment si votre script ' accde "ien si elle se trouve dans un autre ic$ier+% 6t dans tous les cas, contrIle4 de plus pr=s le nom de la onction appele &ort$ograp$e, etc%+% Mne erreur de rappe est vite arrive% Fous ave4 certainement dclar plusieurs ois la m0me onction% <ontrIle4 nouveau l!ensem"le des onctions 3ue vous ave4 cres% 6t n!$site4 pas vri ier galement dans les ventuels ic$iers inclus% 72

Support de cours PHP Mme Saidi -- 2007 <!est souvent dans un script secondaire 3ue vous trouvere4 le dou"lon% Feille4 aussi ne pas utiliser le nom d!une onction propre PHP ou l!une de ses li"rairies% Fri ie4 vos include et Natal error) /nput in re3uire% /l ' a ort croire 3ue le* scanner ailed in vous ave4 indi3u un c$emin **** on line ' incomplet &genre CusrClocalC sans prciser de ic$ier+% 2e ic$ier n!a pas pu 0tre inclus dans votre script, car Nailed opening !ds! PHP n!a pas pu ' accder ) or inclusion vri ie4 les droits &utilisateur &includeRpat$X!ds!+ PHP, droits du ic$ier+, les noms et c$emins du ic$ier inclus% Pro"l=me d!acc=s un ic$ier avec la onction ile&+% Fri ie4 "ien 3ue l!MQ2 est ile&(ds(+ - 7ad ile valide% &l!MQ2 descriptor ($ttp)CC...%super%p$p(+ est invalide alors 3u!une erreur de t'pe J0J sera valide% 2a onction est appele avec un nom"re insu isant de param=tre, ou "ien avec trop 5rong parameter de param=tres% <ertaines count or ds&+ onctions ont "esoin d!un minimum de param=tres &arra'&++, et gnralement d!un ma*imum% /mpossi"le d!accder au stat ailed or ds ic$ier &pro"l=me de droits ou &errnoXdd - ds+ de c$emin d!acc=s+%

7G

Support de cours PHP Mme Saidi -- 2007

"a #orte des variables


Fo'ons maintenant un caract=re propre "eaucoup de langages de programmation onctionnels, dits, de $aut niveau* ) la porte des varia"les% 6n PHP, 8us3u! prsent, lors3ue vous dclarie4 une varia"le dans votre script, vous avie4 l!$a"itude d!accder cette varia"le dans tout le reste de votre page% 6n e et, d!apr=s le code suivant )
<?php #toto $ 5; // in du script ?>

Wtoto est une varia"le 3ui sera accessi"le par votre script PHP une ois sa dclaration aite, c!est--dire 8uste apr=s l!instruction Wtoto X O% ,n peut o"server le m0me comportement lors3ue l!on utilise des include% 6n e et, une ois 3ue l!on a dclar une varia"le, cette varia"le est accessi"le directement dans tous les scripts 3ue l!on inclut notre script courant% 6*emple )
<?php #toto $ 5; include !'script.php'"; ?>

/ci, Wtoto sera accessi"le, c!est dire 3ue l!on pourra l!appeler directement &elle contiendra alors sa valeur ) O+ dans le script script%p$p% Fous save4 galement, 3u!une varia"le dclare dans le corps d!une onction n!est accessi"le 3ue dans le corps de cette m0me onction% Par e*emple )
<?php #toto $ 5; unction ma/ onction !" G echo #toto; I ma/ onction!"; ?>

Lans ce cas, l!e*cution de ce code PHP n!a ic$era rien vu 3ue Wtoto &contenu dans le code de la onction maR onction&++ n!a strictement aucun rapport avec la varia"le Wtoto contenu dans le script courant% 7J

Support de cours PHP Mme Saidi -- 2007 ,n appellera la varia"le Wtoto &celle contenue dans le code de la onction+ comme tant une varia"le locale la onction maR onction&+ &elle n!est pas glo"ale au script+%

"e mot cl 4lobal


Sac$e4 3u!il est possi"le d!utiliser dans le code m0me de vos onctions des varia"les 3ue vous ave4 dclares dans votre script courant l!aide du mot cl glo"al% Qeprenons notre e*emple prcdent )
<?php #toto $ 5; unction ma/ onction !" G global #toto; echo #toto; I ma/ onction!"; ?>

<et e*emple a ic$era ) O 6n e et, dans ce script, nous dclarons la varia"le &3ui tait 8us3ue l locale+ Wtoto comme tant une varia"le glo"ale du script% PHP sait alors 3u!il doit rcuprer la valeur de cette varia"le dans le script courant% /l n!' a aucune limite au nom"re de varia"les glo"ales 3ui peuvent 0tre manipules par une onction% Fous pouve4 galement e ectuer la m0me opration en utilisant le ta"leau associati WR92,7A2S% 2e code suivant donnera le m0me rsultat 3ue le code prcdent )
<?php #toto $ 5; unction ma/ onction !" G echo #/'L()&LC7%toto%9; I ma/ onction!"; ?>

<omme vous le vo'e4, le ta"leau W92,7A2S est un ta"leau associati avec le nom des varia"les glo"ales comme cle et les valeurs des lments du ta"leau comme valeur des varia"les, ce 3ui ressem"le un peu au* ta"leau associati s 3ue vous connaisse4 d8 comme WRP,S1 ou WR961 3ui vous permettent de rcuprer la valeur des c$amps de vos ormulaires%

"e mot cl static


7O

Support de cours PHP Mme Saidi -- 2007 2es amateurs de programmation par o"8ets doivent "ien conna#tre ce terme de static )+ Mne varia"le dite static est une varia"le locale une onction mais 3ui a la particularit de se souvenir de sa valeur% Prenons comme e*emple le code suivant )
<?php unction ma/ onction !" G #toto $ 0; echo #toto; #totoOO; I ?>

Si 8e lance cette onction O0 ois, vous alle4 tous penser 3ue cette onction a ic$era O0 ois la valeur 1, et vous aure4 raison )+ Lans ce cas, l!incrmentation ne sert rien puis3ue lors3ue l!on a ini d!e*cuter cette onction PHP (perd connaissance( de la valeur de la varia"le Wtoto% 6n revanc$e, si on dclare la varia"le Wtoto comme tant une varia"le stati3ue &gr:ce au mot cl static+, le comportement de cette onction sera totalement di rent% 6n e et, vu 3ue Wtoto est stati3ue, PHP se souviendra de sa valeur lors de la derni=re e*cution de la onction% Avec le code suivant )
<?php unction ma/ onction !" G static #toto $ 0; echo #toto; #totoOO; I ?>

Si 8e lance O0 ois ma onction, et "ien nous verrons sur l!cran, la suite des nom"res entre 1 et O0% 6*plication ) c$a3ue appel, PHP se souvient de la prcdente valeur de la varia"le Wtoto &parce 3u!elle est static+ et notre onction incrmente alors cette valeur pour ensuite l!a ic$er%

"e #assa4e #ar r rence


Lans nos e*emples prcdents, vous ave4 3ue gr:ce au mot cl static, les onctions pouvaient rcuprer les valeurs des varia"les glo"ales% Sac$e4 3u!il est galement possi"le de modi ier la valeur d!une varia"le d!un script &une varia"le glo"ale+ gr:ce une onction en utilisant un passage de varia"le par r rence% 2e passage par r rence se caractrise par l!utilisation d!un \ avant le nom de votre varia"le dans les arguments de votre onction% 7K

Support de cours PHP Mme Saidi -- 2007 6*emple )


<?php #toto $ 5; unction ma/ onction !#2ar" G #2arOO; I ma/ onction!F#toto"; echo #toto; ?>

<e script a ic$era ) K Pour les personnes 3ui ont ait du <, le passage par r rence s!assimile la notion de pointeur% 6n passant une varia"le par r rence une onction, nous ne passons pas en ait la varia"le en elle-m0me &la preuve ) notre onction utilise une varia"le Wvar alors 3u!elle modi ie tout de m0me la valeur de la varia"le Wtoto du script courant+ mais une r rence vers la 4one mmoire oV est stocHe la valeur de notre varia"le Wtoto% Botre onction modi ie alors directement cette 4one mmoire en lui donnant une nouvelle valeur, ce 3ui e*pli3ue 3ue dans le script courant, et "ien la valeur de Wtoto a c$ang%

77

Support de cours PHP Mme Saidi -- 2007

"a librairie 5D
Bous allons donc voir dans ce tutorial comment aire des images d'nami3ues &c!est--dire 3ui c$angent suivant certains param=tres+ gr:ce PHP, 3ui les gnrera% 2a li"rairie 9L peut 0tre sc$matise par (un ic$ier( 3ui comporte de nom"reuses onctions permettant de travailler les images% 9r:ce cette li"rairie, vous alle4 pouvoir modi ier vos images, rcuprer des in ormations sur ces images, voir m0me, crer vous-m0me vos propres images% Avant de nous lancer dans la cration de super"es images, une petite vri ication s!impose% 6n e et, si la li"raire 9L n!est pas installe sur votre serveur &votre $"ergeur+ cela ne sert rien de poursuivre ce tutorial, vu 3ue les onctions 3ue nous allons utiliser ne seront pas actives% Pour savoir si la li"rairie 9L est installe sur votre serveur, vous deve4 aire un p$pin o% Pour cela, crer un ic$ier, par e*emple p$pin o%p$p, dans le3uel vous alle4 placer le code suivant )
<?php phpin o!"; ?>

6nsuite, dans votre navigateur avori, a ic$e4 la page ainsi cre% Naites d iler cette page 8us3u!au moment oV vous vo'e4 3uel3ue c$ose 3ui ressem"le ceci )

2, si comme ici, le 9L Support est ena"led, c!est tout "on, vous pouve4 continuer la lecture de ce tutorial% 6n in sac$e4 galement, 3ue depuis la version 2%0 de la li"rairie, le ormat 9/N n!est plus support, et il a t avantageusement remplac par le ormat PB9% Pour ceu* 3ui n!ont pas la li"rairie d!installe, le seul rem=de est de demander gentiment leur $"ergeur de l!installer )+ Passons de suite la cration de notre premi=re image d'nami3ue% Prenons par e*emple le code suivant, tr=s "asi3ue, permettant l!a ic$age d!une image% ,n a par e*emple une page 3ue l!on nommera inde*%p$p, et 3ui contiendra ) 7S

<html> <head> <title>@otre page de test</title> </head> <body> <img src$%./mon/image.php%> </body> </html>

Support de cours PHP Mme Saidi -- 2007

6t vous note4 3ue "ien le lien vers notre image dsigne un ic$ier PHP% <!est tout ait normal, vu 3ue c!est PHP 3ui va gnrer notre image% Fo'ons prsent le code de la page monRimage%p$p% /maginons 3ue l!on dsire dessiner un rectangle rouge &en ait nous n!allons pas dessiner un rectangle, nous allons en ait crer une image vide remplie avec de la couleur rouge+% ,n aura alors &pour la page monRimage%p$p+, le code suivant )
<?php // on sp3ci ie le type de document 4ue l'on 2a cr3er !ici une image au header !%6ontent=type? image/png%"; ormat P@'

// on dessine une image 2ide de 188 piJels sur 088 #image $ _Bmage6reate !188K 088" or die !%+rreur lors de la cr3ation de l'image%"; // on appli4ue Q cette image une couleur de ondK les couleurs 3tant au ra donc ici une couleur rouge #couleur/ ond $ Bmage6olor&llocate !#imageK 155K 8K 8"; // on dessine notre image P@' BmagePng !#image"; ?> ormat DA)K on au

6t voila notre premi=re image gnre par PHP% <ependant, 3uel3ues e*plications sont ncessaires et e*tr0mement importantes ) - lors3ue l!on cre une page 567 avec PHP, on n!est pas o"lig de dire PHP 3ue l!on cre une page 567, en revanc$e, lors3ue l!on cre une image, on est o"lig de le spci ier avec l!instruction )
header !%6ontent=type? image/png%";

- naturellement, si l!on dsire crer une image de t'pe EP9, on prendra soin d!crire )
header !%6ontent=type? image/;peg%";

- l!appel la onction /mage<reate nous retourne en ait une ressource &Wimage+ correspondant l!image 3ue nous sommes en train de crer% - nous aisons ensuite appel la onction /mage<olorAllocate 3ui a deu* onctions principales ) premi=rement, elle cre une couleur stocHe dans une varia"le pouvant 0tre rutilise ultrieurement &ici WcouleurR ond+, et deu*i=mement, elle enregistre cette couleur dans la palette de l!image Wimage% Bote4 aussi, et c!est e*tr0mement important, 3ue cette couleur tant la premi=re couleur enregistre dans la 7T

Support de cours PHP Mme Saidi -- 2007 palette, elle correspondra en ait la couleur de ond de notre image &en ait, la premi=re couleur enregistre dans la palette de couleur correspond la couleur de ond de l!image+% - on utilise alors la onction /magePng pour a ic$er notre ressource, soit donc notre image &Wimage+% - note4 galement 3ue si nous avions cr une image de t'pe EP9, nous aurions utilis ici l!instruction /mageEpeg% Apr=s ce premier e*emple tout simple, vous deve4 sarement vous dire 3u!il n!' a rien de d'nami3ue dans tout cela, et 3ue votre P$otos$op erait "ien mieu*% A premi=re vue, oui% Mais vu 3ue notre image est gnre par PHP, nous pouvons lui ournir des param=tres% 6t l!avantage, il est l% <!est--dire 3ue vous alle4 pouvoir crer des images di rentes en onction de certains param=tres% Qeprenons alors le code de notre inde*%p$p, au3uel nous allons gre er un petit ormulaire permettant de c$oisir la couleur de notre image% ,n aura alors, par e*emple &pour la page inde*%p$p+ )
<html> <head> <title>@otre page de test</title> </head> <body> C3lectionner l'intensit3 des di 3rentes teintes ?<br /> < orm action$%./mon/image.php% method$%post%> Douge !un nombre entre 8 et 155" ? <input type$%teJt% name$%rouge%><br /> Aert !un nombre entre 8 et 155" ? <input type$%teJt% name$%2ert%><br /> )leu !un nombre entre 8 et 155" ? <input type$%teJt% name$%bleu%><br /> <input type$%submit% 2alue$%Aoir%> </ orm> </body> </html>

6t prenons par e*emple le code suivant pour la page monRimage%p$p &nous ne erons pas ici la vri ication des c$amps du ormulaire ) en e et, on supposera 3ue l!utilisateur saisi "ien c$a3ue ois un nom"re entre 0 et 2OO+ )
<?php // on teste nos R 2ariables pour nos couleurs i !isset!#/P(CT7'rouge'9" FF isset!#/P(CT7'2ert'9" FF isset!#/P(CT7'bleu'9"" G // on sp3ci ie le type de document 4ue l'on 2a cr3er !ici une image au header !%6ontent=type? image/png%"; ormat P@'

// on dessine une image 2ide de 188 piJels sur 088 #image $ _Bmage6reate !188K 088" or die !%+rreur lors de la cr3ation de l'image%" ; // on appli4ue Q cette image une couleur de ondK les couleurs 3tant au ormat DA)K on obtiendra ici la couleur 4ue l'utilisateur aura sp3ci i3 en param-tre du o rmulaire #couleur/ ond $ Bmage6olor&llocate !#imageK #/P(CT7'rouge'9K #/P(CT7'2ert'9K #/P( CT7'bleu'9"; // on dessine notre image P@' BmagePng !#image";

S0

I else G I ?>

Support de cours PHP Mme Saidi -- 2007


echo 'Les 2ariables du ormulaire ne sont pas d3clar3es.';

Pas mal, non @ Maintenant 3ue vous ave4 vu une premi=re approc$e de l!utilisation de cette li"rairie, un petit rappel est ncessaire% 6n e et, en r=gle gnrale, lors3ue l!on dessine en programmation, l!origine du rep=re reprsentant la position des pi*els de notre image est situe dans le coin suprieur gauc$e de l!image% <ela di =re donc des rep=res classi3ues mat$mati3ues oV l!origine du rep=re est tou8ours situ dans le coin in rieur gauc$e% 6n e et, on peut sc$matiser ce rep=re par le dessin suivant )

6t ceci est tr=s important% 6n e et, prati3uement toutes les onctions de cette li"rairie vous demanderont les coordonnes de di rents points% Autant se mettre tout de suite en accord avec le s'st=me% <onseil ) Fu 3ue l!a*e des * est orient de la (gauc$e( vers la (droite(, lors3ue vous alle4 utiliser des onctions permettant de dessiner des rectangles, des droites, etc, l!idal est de tou8ours ournir en arguments les coordonnes du point le plus gauc$e de votre igure, puis les coordonnes du point le plus droite% Apr=s cette petite prcision, voici un autre e*emple intressant de l!utilisation de la li"rairie 9L% 6n e et, vous a ic$e4 par ois des images sur vos sites 567, et "eaucoup de vos p$otos partent dans la nature &pilles la plupart du temps par des visiteurs peu attentionns+% Be serait-il pas s'mpat$i3ue de pouvoir protger vos p$otos l!aide d!une petite incrustation permettant de (cop'rig$ter( votre image @ 6t "ien c!est tout ait possi"le% 6n e et, partir de )

S1

Support de cours PHP Mme Saidi -- 2007

et de )

/l est tout ait possi"le d!o"tenir )

Pour ce aire, vo'ons le code pour notre ic$ier PHP contenant le code gnrant cette image (cop'rig$te( & ic$ier monRimage%p$p par e*emple+ )
<?php // on sp3ci ie le type de ichier cr3er !ici une image de type ;peg" header !%6ontent=type? image/;peg%"; // on cr3e deuJ 2ariables contenant les chemins d'acc-s Q nos deuJ ichiers ? # ichier/so urce contenant le lien 2ers l'image Q %copyrighter%K # ichier/copyright contenant le lien 2ers la petite 2ignette contenant le copyright !bien surK on prendra soin de placer les i mages sources dans un r3pertoire %cach3% sinon le copyright ne sert Q rien si les 2isiteu rs ont acc-s auJ images sources" # ichier/source $ %./gd.;pg%; # ichier/copyright $ %./copyright.;pg%; // on cr3e nos deuJ ressources de type image !par le biais de la :peg" #im/source $ Bmage6reateProm:peg !# ichier/source"; #im/copyright $ Bmage6reateProm:peg !# ichier/copyright"; // on calcule la largeur de l'image 4ui 2a Ntre copyright3e onction Bmage6reateProm

S2

#larg/destination $ imagesJ !#im/source";

Support de cours PHP Mme Saidi -- 2007

// on calcule la largeur de l'image correspondant Q la 2ignette de copyright #larg/copyright $ imagesJ !#im/copyright"; // on calcule la hauteur de l'image correspondant Q la 2ignette de copyright #haut/copyright $ imagesy !#im/copyright"; // on calcule la position sur l'aJe des abscisses de la 2ignette #J/destination/copyright $ #larg/destination = #larg/copyright; // on r3alise la superpositionK le dernier param-tre 3tant le degr3 de transparence de la 2ignette !cependantK alleX 2oir la in de ce mNme tutorial pour une d3 inition compl-te d e tous les arguments de cette onction" _image6opyMerge !#im/sourceK #im/copyrightK #J/destination/copyrightK 8K 8K 8K #larg/copyrightK #haut/copyrightK U8"; // on a iche notre image copyright3e Bmage;peg !#im/source"; ?>

6nsuite, a in de voir le rsultat, il su it d!crire une page toute simple a ic$ant l!image monRimage%p$p, avec une insertion d!image du genre &par e*emple+ )
<img src$%./mon/image.php%>

7ien sur, pour rendre ce script vraiment d'nami3ue, il su it de passer l!image en param=tre le nom du ic$ier image (cop'rig$ter(% 6n e et, comme dans le premier e*emple avec l!image "asi3ue, on peut aire un lien ressem"lant )
<img src$%mon/image.php? ichier$toto.;pg%>

6t ensuite, dans le script monRimage%p$p, on rcup=re la varia"le WR961Z! ic$ier![ 3ui sera en ait le nom du ic$ier de l!image (cop'rig$ter(% Ee vous ais con iance pour cette partie )+ Fo'ons maintenant un autre e*emple de l!utilisation de cette li"rairie ) la cration de miniatures% 6n e et, vous voule4 mettre vos p$otos en ligne, et 8us3u!ici, vous aisie4 vos miniatures la main ) - c!tait long - pas tou8ours russi 6t pourtant les miniatures sont e*tr0mement prati3ues pour a ic$er plus rapidement vos grandes images% 6n e et, il est tou8ours agra"le de voir une liste de petites images &les miniatures+ munies d!un lien permettant d!a ic$er ces m0mes images dans leur taille originelle% 6t "ien, avec la li"rairie 9L, partir de cette image, vous alle4 pouvoir crer une miniature ressem"lant ceci )

SG

Support de cours PHP Mme Saidi -- 2007

Ltaillons maintenant le code permettant de crer vos miniatures% 6n revanc$e, ici, la di rence des e*emples prcdents, nous n!allons pas a ic$er la vole une image gnre par PHP% 6n e et, nous allons en ait crire un script PHP, 3ui, avec le lien vers une image de t'pe EP9, va crer une miniature de cette m0me image 3ui sera sauvegarde sur votre espace dis3ue% 2e nom de la miniature sera en ait le nom du ic$ier original, prcd de la mention miniR% ,n aura alors le code suivant pour ce script de cration de miniatures )
<?php // on donne Q PHP le lien 2ers notre image Q miniaturiser #Bmage $ %metae ect/880.;pg%; // on impose la taille de la largeur ou de la hauteur de la photo !le choiJ entre la larg eur ou la hauteur se ait automati4uementK sui2ant 4ue la photo est %horiXontale% ou %2er ticale%" #ratio $ 058; // on cr3e une ressource repr3sentant en #src$imagecreate rom;peg!#Bmage"; ait l'image Q miniaturiser

// on r3cup-re les param-tres de notre image !getimagesiXe est une onction 4ui retourne un tableau contenant les param-tres d'une image ? sa largeurK son hauteurK son typeK etc. .." #siXe $ getimagesiXe!#Bmage"; // on test si la largeur de l'image est sup3rieur Q sa longueur i !#siXe789 > #siXe709" G // on cr3e une ressource pour notre miniature #im$imagecreate!round!!#ratio/#siXe709"*#siXe789"K #ratio"; // on place dans la ressource 4ue nous 2enons de cr3er une copie de l'image originell eK redimensionn3e et r3echantillon3e imagecopyresampled!#imK #srcK 8K 8K 8K 8K round!!#ratio/#siXe709"*#siXe789"K#ratioK # siXe789K #siXe709"; I else G // si la largeur est in 3rieure ou 3gale Q la hauteurK on entre dans ce cas // on cr3e une ressource pour notre miniature #im$imagecreate!#ratioK round!!#ratio/#siXe789"*#siXe709""; // on place dans la ressource 4ue nous 2enons de cr3er une copie de l'image originell eK redimensionn3e et r3echantillon3e imagecopyresampled!#imK #srcK 8K 8K 8K 8K #ratioK round!#siXe709*!#ratio/#siXe789""K #siXe789K #siXe709"; I // on d3 init le nom de notre miniature #miniature $ %mini/#Bmage%; // on cr3e notre miniature Bmage:peg !#imK #miniature"; ?>

SJ

Support de cours PHP Mme Saidi -- 2007 6t surtout, remar3ue4 "ien 3ue nous n!avons pas utilis la onction $eader% 6n e et, ici, on ne c$erc$e pas (a ic$er( une image gnre la vole% <e script inspecte en ait une image, et partir de celle-ci, il en cre une nouvelle% Pour voir le rsultat de cette opration, et donc voir votre miniature, vous devre4 crer une page $tml contenant la "alise suivante )
<img src$%mini/metae ect/880.;pg %>

6n in, a in d!accro#tre vos talents de Picasso des temps modernes, vo'ons un dernier e*emple ) la cration d!un $istogramme pour un script de statisti3ues par e*emple% 6n e et, "on nom"re de scripts de statisti3ues a ic$ent la popularit de vos pages sur de 8olis dessins% 6t "ien sac$e4 3ue c!est possi"le de aire 3uel3ue c$ose d!3uivalent l!aide de la li"rairie 9L% Pour ce aire, 8e vous propose la cration d!un $istogramme permettant d!a ic$er des (":tons( reprsentants le nom"re de pages vues de votre site sur une anne &un ":ton reprsentant un mois de l!anne+% Pour ce aire, voici par e*emple le code du script statsR'ear%p$p &il s!agira d!une image d'nami3ue, cre la vole, l!utilisation d!un $eader sera donc ncessaire+ )
<?php // on d3 init un tableau contenant le nombre de page 2ues par mois ? par eJempleK on supp ose 4ue 0588 pages du site ont 3t3 2ues en ;an2ierK 1S58 en 32rierK etc... )ien surK pou r 4ue ce script soit 2raiment 2alidesK 2ous n'alleX pas d3clarer ce tableauK car sinonK l es b`tons seront tou;ours les mNmes ?" Aous alleX plutat e ectuer une re4uNte CZL sur 2o tre base de donn3es permettant de r3cup3rer le nombre de pages 2ues de 2otre site par moi s. +nsuiteK il su ira d'appeler le script a2ec ces 01 param-tres dans 2otre page html !e n aisant par eJemple ? <img src$%./images/stats/year.php? 2isite/par/mois709$0588.......%>" #2isite/par/mois709$0588; #2isite/par/mois719$1S58; #2isite/par/mois7R9$\88; #2isite/par/mois7S9$0U\8; #2isite/par/mois759$0H88; #2isite/par/mois7T9$1S58; #2isite/par/mois7U9$0T\S; #2isite/par/mois7\9$0\S5; #2isite/par/mois7H9$RS58; #2isite/par/mois7089$H\8; #2isite/par/mois7009$01RS; #2isite/par/mois7019$588; // on calcule le nombre de pages 2ues sur l'ann3e #maJ/2isite $ maJ!#2isite/par/mois"; // on sp3ci ie le type d'image 4ue l'on 2a cr3erK ici ce sera une image au header !%6ontent=type? image/png%"; // on d3 init la largeur et la hauteur de notre image #largeur $ 558; #hauteur $ R88; // on cr3e une ressource pour notre image 4ui aura comme largeur #largeur et #hauteur com me hauteur !on place 3galement un or die si la cr3ation se passait mal a in d'a2oir un pe tit message d'alerte" #im $ _Bmage6reate !#largeurK #hauteur" or die !%+rreur lors de la cr3ation de l'image%"; // on place tout d'abord la couleur blanche dans notre table des couleurs !;e 2ous rappel le donc 4ue le blanc sera notre couleur de ond pour cette image". #blanc $ Bmage6olor&llocate !#imK 155K 155K 155"; ormat P@'

SO

Support de cours PHP Mme Saidi -- 2007


// on place aussi le noir dans notre paletteK ainsi 4u'un bleu #noir $ Bmage6olor&llocate !#imK 8K 8K 8"; #bleu/ once $ Bmage6olor&llocate !#imK U5K 0R8K 0H5"; #bleu/clair $ Bmage6olor&llocate !#imK H5K 0T8K 1S8"; onc3 et un bleu clair

// on dessine un trait horiXontal pour repr3senter l'aJe du temps BmageLine !#imK 18K #hauteur=S8K #largeur=05K #hauteur=S8K #noir"; // on a iche le num3ro des 01 mois or !#i$0; #i<$01; #iOO" G i !#i$$0" G BmageCtring !#imK 1K S1K #hauteur=R\K #iK #noir"; I else G BmageCtring !#imK 1K !#i"*S1K #hauteur=R\K #iK #noir"; I I // on dessine un trait 2ertical pour repr3senter le nombre de pages 2ues BmageLine !#imK 18K R8K 18K #hauteur=S8K #noir"; // on a iche les legendes sur les deuJ aJes ainsi 4ue di 3rents teJtes !note ? pour 4ue le script trou2e la police 2erdanaK 2ous de2reX placer la police 2erdana dans un repertoi re / onts/" imagett teJt!#imK 0SK 8K #largeur=U8K #hauteur=08K #noirK %./ onts/2erdana.tt %K %Mois%"; imagett teJt!#imK 0SK 8K 08K 18K #noirK %./ onts/2erdana.tt %K %@b. de pages 2ues%"; imagett teJt!#imK 0SK 8K #largeur=158K 18K #noirK %./ onts/2erdana.tt %K %Ctatisti4ues po ur l'ann3e 188R%"; // on parcourt les douXe mois de l'ann3e or !#mois$0; #mois <$ 01; #moisOO" G i !#2isite/par/mois7#mois9<$%8%" G // on calcule la hauteur du baton #hauteurBmageDectangle $ ceil!!!!#2isite/par/mois7#mois9"*!#hauteur=58""/ #maJ/2isite""; i !#mois$$%0%" G // si le mois est ;an2ierK on a iche notre premier baton // on a iche le premier baton noir BmagePilledDectangle !#imK S1K #hauteur=#hauteurBmageDectangleK S1O0SK #haute ur=S0K #noir"; // on a iche le second batonK bleu onc3K 4ui sera un peu plus petit 4ue le noir a in de recou2rir une partie du noir BmagePilledDectangle !#imK SSK #hauteur=#hauteurBmageDectangleO1K S1O01K #hau teur=S0=0K #bleu/ once"; // on a iche le dernier batonK bleu clairK 4ui sera un peu plus petit 4ue le bleu onc3 a in de recou2rir une partie du bleu onc3 !on obtiendra ainsi un e et de d3g rad3" BmagePilledDectangle !#imK S\K #hauteur=#hauteurBmageDectangleO1K S1O\K #haut eur=S0=0K #bleu/clair"; I else G // si le mois est di erent de ;an2ierK on a iche les autres batons BmagePilledDectangle !#imK !#mois"*S1K #hauteur=#hauteurBmageDectangleK !#moi s"*S1O0SK #hauteur=S0K #noir"; BmagePilledDectangle !#imK !#mois"*S1O1K #hauteur=#hauteurBmageDectangleO1K ! #mois"*S1O01K #hauteur=S0=0K #bleu/ once"; BmagePilledDectangle !#imK !#mois"*S1OTK #hauteur=#hauteurBmageDectangleO1K ! #mois"*S1O\K #hauteur=S0=0K #bleu/clair"; I I I // on dessine le tout

SK

Bmagepng !#im"; ?>

Support de cours PHP Mme Saidi -- 2007

Fous notere4 3uel3ue c$ose de tr=s important ) en e et, pour aire les dgrads sur les ":tons, nous avons en ait dessin plusieurs rectangles les uns sur les autres &et donc des rectangles de plus en plus petits+% 6n e et, on a utilis 9L comme si on utilisait un logiciel de dessin% 6n clair, 3uand on dessine par-dessus 3uel3ue c$ose, et "ien ce 3uel3ue c$ose dispara#t au pro it de la nouvelle orme 3ue l!on vient de dessiner &tout comme des cal3ues sous P$otos$op+% 6t voici le rsultat )

Aller $op, vos pinceau* maintenant, et surtout n!ou"lie4 pas d!aller 8eter un coup d!oeil sur le manuel PHP a in de dcouvrir toutes les descriptions des instructions utilises dans ce cours%

S7

Support de cours PHP Mme Saidi -- 2007

"es e&#ressions r4uli6res


Maintenant 3ue nous avons une certaine assurance avec PHP, il serait grand temps de commencer r lc$ir au* e*pressions rguli=res% 6n e et, les e*pressions rguli=res vous permettront d!anal'ser di rentes c$a#nes de caract=res &principalement saisies par un client dans un ormulaire+ et ainsi vri ier 3ue la c$a#ne correspond "ien ce 3ue l!on demande% Le plus, les e*pressions ne servent pas 3u! la vri ication de la (con ormit( d!une c$a#ne de caract=re, puis3u!elles vont permettront galement d!amliorer grandement l!utilisation de votre site% 2es e*pressions rguli=res ont t empruntes au s'st=me P,S/c% Le nom"reu* scripts Perl les utilisent galement% /l s!agit d!un s'st=me e*tr0mement ingnieu* permettant de retrouver un mot, voir m0me une p$rase compl=te &d!une certaine orme+ dans un te*te, suivant un mod=le 3ue l!on aura d ini, le pattern% Par e*emple, l!aide des e*pressions rguli=res, vous pourre4 acilement vri ier l!adresse email 3u!un visiteur dans un c$amps d!un ormulaire de votre site &ceci en testant l!allure de la c$a#ne de caract=re saisie par ce client ) on testera entre autre si il ' a "ien un f dans cette c$a#ne de caract=res, mais 8uste un seul, 3ue la c$a#ne 3ui suit ce f est "ien un nom de domaine, et 3ue la c$a#ne 3ui prc=de le f est "ien un identi iant valide, c!est-dire sans caract=res interdits, etc%%%+% ,u encore, avec les e*pressions rguli=res, vous pourre4 intgrer dans votre script de ne.s &ou pour3uoi pas m0me votre orum+ un s'st=me anal'sant la c$a#ne de caract=re de votre ne.s &de vos messages du orum+ en ' rec$erc$ant des MQ2, et si elles sont prsentes dans votre c$a#ne, et "ien de aire un lien vers cette MQ2, et ce, tout automati3uement% Pour la suite du cours, 8e vais vous parle4 seulement des mod=les &pattern+% <e sont ces mod=les, 3ui sont en ait des sortes de mas3ues 3ue l!on appli3ue sur une c$a#ne de caract=res ou un te*te pour trouver une suite de caract=res "ien prcise% Par la suite, il e*iste diverses onctions utilisant ces mod=les a in d!isoler ces suites de caract=res, et d!agir sur eu*, et 8e vous renvoies donc la documentation pour les tudier &8e vous rappelle 3ue ce n!est pas de la ainantise de ma part de ne pas vous parler de ces onction, mais il ' en a tellement, 3ue le cours serait gigantes3ue > et de plus, si vous arriver crer vos propres mod=les, vous n!aure4 aucun mal utiliser ces onctions avec ces mod=les+% 2es s'm"oles P et W Lans une e*pression rguli=re, le s'm"ole P reprsente le d"ut d!un mod=le, et le s'm"ole W reprsente la in d!un mod=le% Fo'ons de suite 3uel3ues e*emples )

P2a glo"ule ) identi ie une c$a#ne de caract=res 3ui commence par (2a glo"ule( en inW ) identi ie une c$a#ne de caract=res 3ui se init par (en in( SS

Support de cours PHP Mme Saidi -- 2007 PmotW ) identi ie une c$a#ne de caract=res 3ui commence par (mot( et 3ui ini par (mot(, il s!agit donc de la c$a#ne de caract=res (mot( elle-m0me test) identi ie une c$a#ne de caract=res 3ui contient le mot (test(

Eus3ue l, tout va "ien% 6n e et, vous pouve4 remar3uer 3ue si vous n!emplo'er ni P ni W &dernier e*emple+, cela impli3ue 3ue votre mod=le peut se reproduire n!importe oV l!intrieur de votre c$a#ne de caract=res, puis3ue le mod=le n!est ni coll au d"ut de la c$a#ne &on utilise pas de P+ ni la in de la c$a#ne &on utilise pas de W+% 2es s'm"oles D, ` et @ Lans les e*pressions rguli=res, les s'm"oles D, ` et @ servent indi3uer le nom"re de ois 3u!un caract=re ou une suite de caract=res puisse appara#tre% 6n e et, ces s'm"oles agissent sur les lments &un caract=re ou "ien une suite de caract=res+ 3ui les prcdent% D indi3uera 3ue le caract=re &ou la suite de caract=res+ 3ui le prc=de ne pourra appara#tre 3ue soit, aucune ois, soit plusieurs ois% ` indi3uera 3ue le caract=re &ou la suite de caract=res+ 3ui le prc=de ne pourra appara#tre soit, une ois, soit plusieurs ois% @ indi3uera 3ue le caract=re &ou la suite de caract=res+ 3ui le prc=de ne pourra appara#tre soit, aucune ois, soit une et une seule ois% Fo'ons alors 3uel3ues e*emples )

a"D ) identi ie une c$a#ne de caract=re contenant un a suivi d!un ou d!aucun " &par e*emple, les c$a#nes (a(, (a"(, (a"""( respectent ce mod=le+ a"` ) identi ie une c$a#ne de caract=re contenant un a suivi d!au moins un " &par e*emple, les c$a#nes (a"(, (a""(, (a"""( respectent ce mod=le+ a"@ ) identi ie une c$a#ne de caract=re contenant un a suivi d!un ou d!aucun " &par e*emple, les c$a#nes (a(, (a"( respectent ce mod=le, alors 3ue (a""( ne le respecte pas+ a@"`W ) identi ie une c$a#ne de caract=res compose d!aucun ou d!un seul a, suivi d!un ou de plusieurs ", le tout tant situ la in de la c$a#ne

2es accolades ^_ Par e*tensions au* s'm"oles prcdents, vous pouve4 galement des limites 3ui s!utilisent l!intrieur d!accolades et 3ui indi3uent le nom"re d!occurrence de la c$a#ne rec$erc$e% Le m0me, comme pour les s'm"oles D, ` et @> elles a ectent l!lment 3ui les prc=de% Fo'ons tout de suite des e*emples )

a"^2_ ) identi ie une c$a#ne de caract=re compose d!un a suivit d!e*actement deu* " &en clair, seule la c$a#ne (a""( passe travers ce mod=le+ a"^2,_ ) identi ie une c$a#ne de caract=re compose d!un a suivi d!au moins deu* " &par e*mple, (a""( ou (a"""( respectent ce mod=le+ a"^G,O_ ) identi ie une c$a#ne de caract=re compose d!un a suivi de trois cin3 " &(a"""(, (a""""( et (a"""""( sont les seules c$a#nes 3ui respectent ce mod=le+

Sac$e4 3ue vous deve4 tou8ours indi3uer le premier c$i re dans vos accolades, alors 3ue le second n!est pas ST

Support de cours PHP Mme Saidi -- 2007 o"ligatoire% Fous pouve4 galement remar3uer 3ue l!on peut retrouver la onction des s'm"oles D, ` et @ avec des limites appropries% 6n e et, le s'm"ole )

D correspond en ait la limite ^0,_ ` correspond en ait la limite ^1,_ @ correspond en ait la limite ^0,1_

2es parent$=ses A in de 3uanti ier une c$a#ne de caract=res, vous deve4 utiliser des parent$=ses% 2es e*emples tant "eaucoup plus parlant 3ue du "la-"la, voici 3uel3ues e*emples )

a&"c+D ) identi ie une c$a#ne de caract=res commen-ant par un a suivi d!aucune ou de plusieurs s3uence de caract=res ("c( a&"c+^1,O_D ) identi ie une c$a#ne de caract=res commencant par un a suivi d!une cin3 ois la s3uence de caract=res ("c(

2e s'm"ole ] 2e s'm"ole ] onctionne comme l!oprateur "oolen ,M% Fo'ons 3uel3ues e*emples )

toto]titi ) identi ie une c$a#ne de caract=res contenant le mot (toto( ou le mot (titi( &"]cd+e ) identi ie une c$a#ne de caract=res 3ui contient la s3uence de caract=res ("e ( ou "ien la s3uence de caract=res (cde ( &a]"+Dc ) indenti ie une c$a#ne de caract=res 3ui contient une alternance de a et de ", c$a#ne se terminant par un c &("a"a"""aac( respecte ce mod=le, tout comme (c(, ("c( par e*emple+

2e s'm"ole % 2e s'm"ole % &le point+ reprsente n!importe 3uel caract=re uni3ue% 6*emple )

P%^G,_W ) identi ie une c$a#ne de caract=res comportant e*actement trois caract=res

2es croc$ets Z[ 2es e*pressions entre croc$ets & Z[+ indi3uent les caract=res 3ui sont permis un endroit prcis d!un mod=le% 2es e*emples )

Za"[ ) identi ie une c$a#ne de caract=res contenant un (a( ou un ("( &ce 3ui revient au m0me d!crire le mod=le a]"+ T0

Support de cours PHP Mme Saidi -- 2007 Za-d[ ) identi ie une c$a#ne de caract=res 3ui contient les lettres minuscules comprises entre le (a( et le (d( &ce 3ui 3uivalent de a]"]c]d ou de Za"cd[+ PZa-4A-e[ ) identi ie une c$a#ne de caract=res 3ui commence par une lettre minuscules ou "ien par une lettre ma8uscule Z0-T[d ) identi ie une c$a#ne de caract=res 3ui contient un pourcentage un seul c$i re ,Za-4A-e0-T[W ) identi ie une c$a#ne de caract=res 3ui init par une virgule suivi d!un caract=re &lettre ou c$i re+

Bote 1 ) Fous pouve4 galement lister les caract=res 3ue vous ne voule4 pas en utilisant le s'm"ole P comme premier s'm"ole dans vos croc$ets% 6*emple ) dZPa-4A-e[d ) identi ie une c$a#ne de caract=res avec un caract=re 3ui n!est pas une lettre &soit en ait un c$i re ou autres c$ose, mais pas une lettre+ entre deu* signes pourcentage Bote 2 ) Pour utiliser les caract=res P, %, Z, W, &, +, ], D, `, ^, dans vos e*pressions rguli=res, vous devre4 les protger avec un g 8uste avant ceu*-ci &car en e et, ces caract=res ont une signi ication spciale, et donc pour pouvoir les utiliser, il aut les protger+% Sous - note ) B!ou"lie4 pas 3ue les e*pressions entre croc$ets sont une e*ception cette r=gle% 6n e et l!intrieur des croc$ets, tous les caract=res spciau*, ' compris l!antislas$ , perdent leurs puissances spciales &en clair, dans les croc$ets, vous ne deve4 pas protger les caract=res spciau* avec un g+% 6n in UUU A premi=re vue, les e*pressions rguli=res ne sont pas simple d!utilisation, mais cro'e4 moi, elles sont e*tr0mement puissantes% 6t maintenant 3ue vous 0tes amilier avec les mod=les, pour3uoi ne pas aller aire un tour du cIt de la documentation, a in de voir avec 3uelles onctions s!utilisent ces prcieuses e*pressions rguli=res @

T1

Support de cours PHP Mme Saidi -- 2007

"a #ro4rammation ob7et 8conce#ts ondamentau&9


6n programmation, un mod=le est une a"straction de la ralit% Par cons3uent, un mod=le est une vue su"8ective de la ralit, mais toute ois, cette vue est tou8ours pertinente% 6n e et, un mod=le d init une ronti=re entre la ralit et la perspective de l!o"servateur% /l ne s!agit donc pas de la ralit, mais d!une vue tr=s su"8ective de la ralit% Par cons3uent, un mod=le doit permettre de aciliter la compr$ension d!un s'st=me tudie, mais aussi, de simuler ce s'st=me% Au8ourd!$ui, en programmation, il e*iste deu* principau* mod=le de reprsentation du monde ) le mod=le onctionnel &3ue vous connaisse4 d8+ et le mod=le o"8et &3ue nous allons donc tudier+% Eus3u! au8ourd!$ui, vous connaissie4 la programmation en PHP avec une approc$e onctionnelle% A in de mieu* comprendre les di rences entre ces deu* approc$es, nous allons donc dtailler les deu* approc$es, et voir ainsi leurs avantages et leurs inconvnients% Avec une approc$e onctionnelle, vos programmes taient composs d!une srie de onctions, 3ui ensem"le, assuraient certains services% /l s!agit d!une approc$e logi3ue, co$rente et intuitive de la programmation% <ette approc$e a un avantage certain 3ue l!on appelle la actorisation des comportements% 6n e et, une dcoupe onctionnelle intelligente consiste actoriser certains comportements d!une application, ce 3ui veut dire 3ue pour crer une onction d!une application, rien ne vous emp0c$e d!utiliser un autre ensem"le de onctions &3ui sont donc d8 crites+% Mais &il ' a tou8ours un mais PP+, l!approc$e onctionnelle a aussi ses d auts, comme par e*emple une maintenance comple*e en cas d!volution de votre application% 2a actorisation des comportements n!a pas 3ue des avantages% 6n e et, si on ' r lc$it deu* minutes, maintenant, nos onctions sont devenues interdpendantes% 6t ceci impli3ue 3u!une simple mise 8our de l!application un point donn peut impacter en cascade sur d!autres onctions de notre application% Baturellement, nous pouvons tou8ours essa'er d!crire des onctions les plus gnri3ues possi"les mais cela rend le dveloppement de l!application "eaucoup plus comple*e% Le plus, en cas d!volution de l!application, m0me si la structure gnrale de l!application reste valide, la multiplication des points de maintenance &dus au c$a#nage des onctions cause de la actorisation des comportements+ rend l!adaptation e*tr0mement di icile% 6t dans ce cas, l!application sera alors retouc$e dans sa glo"alit% Prenons un e*emple concret ) on a en notre possession une application permettant de grer une "i"liot$=3ue, et suite la demande du client, notre application doit maintenant 0tre capa"le de grer une mdiat$=3ue, c!est-dire 3ue l!on pourra emprunter, non seulement des livres, mais aussi, des <L-Q,M, des LFL, etc%%% Pour aire voluer notre application, nous devrons aire voluer les structures de donnes 3ui sont manipules par les onctions, puis nous devrons adapter les traitements, 3ui l!origine, ne manipulaient 3u!un seul t'pe de document ) les livres% Bous devrons donc aire voluer toutes les portions de code 3ui utilisent la "ase documentaire, et ce, a in de T2

Support de cours PHP Mme Saidi -- 2007 grer les donnes et les actions propres au* di rents t'pe de documents% 6*emple ) notre application, alors 3u!elle ne grait 3ue des livres, pouvait mettre une sorte de carton 8aune un emprunteur lors3u!il ne rendait pas son livre dans les temps% ,r, maintenant 3ue notre "i"liot$=3ue est devenue une mdiat$=3ue, et si l!on dsire 3ue le dlai avant le ameu* carton 8aune dpende du document emprunt &le carton 8aune arrivera plus ou moins tard, suivant le document emprunt ) un livre, un <L-Q,M, un LFL, etc%%%+, et "ien il va alloir prvoir une r=gle de calcul pour c$a3ue t'pe de document% Au inal, c!est prati3uement la totalit de l!application 3u!il va alloir adapter pour grer les nouveau* t'pes de documents et les traitements correspondants% 2es modi ications 3ue nous avons apportes notre application de mdiat$=3ue, nous permettent de penser 3u!une approc$e o"8et sera "eaucoup plus avantageuse 3uant la rutilisation du code d8 crit% Mais 3u!est ce 3u!un o"8et @ Mn o"8et est une entit comportant des ronti=res prcises et 3ui poss=de une identit &un nom+% Le plus, un ensem"le d!attri"uts caractrisent l!tat d!un o"8et, et l!on dispose d!un ensem"le d!oprations &les mt$odes+ 3ui permettent d!agir sur le comportement de notre o"8et% Mn o"8et est l!instance d!une classe, et une classe, est un t'pe de donnes a"strait, caractris par des proprits &ses attri"uts et ses mt$odes+ communes des o"8ets et elle permet de crer des o"8ets possdant ces proprits% 6*emple ) prenons le cas de notre "i"liot$=3ue% <rons alors une classe 2ivre 3ui va nous permettre de crer des o"8ets (2ivre(% ,n aura alors )

6t une instance de la classe 2ivre &un o"8et+ )

TG

Support de cours PHP Mme Saidi -- 2007 titre et auteur sont les attri"uts de notre classe, c!est--dire les caractristi3ues communes tous nos o"8ets (2ivre(% 6n clair, tous les livres auront un titre et un auteur% Le plus, notre classe dispose des mt$odes emprunter&+ et rendre&+ 3ui s!appli3uerons nos o"8ets (2ivre( &on agira alors directement sur notre o"8et (2ivre(+% mon2ivre reprsente 3uant lui, une instance de la classe 2ivre, il s!agit donc d!un o"8et 3ui porte le nom mon2ivre% 2es autres concepts importants de l!approc$e o"8et sont ) - l!encapsulation - l!$ritage &ainsi 3ue le pol'morp$isme+ - l!agrgation 2!encapsulation consiste mas3uer les dtails d!implmentation d!un o"8et, et ce, en d inissant une inter ace% 6n clair, vous n!ave4 pas "esoin de savoir comment est con-u cet o"8et la "ase pour pouvoir l!utiliser% Mne inter ace est 3uant elle, une vue e*terne d!un o"8et et elle d init les services accessi"les pour modi ier le comportement de l!o"8et% 2!encapsulation acilite l!volution d!une application car elle sta"ilise l!volution des o"8ets% 6n e et, nous pouvons tr=s "ien modi ier l!implmentation des attri"uts d!un o"8et sans pour autant modi ier son inter ace% 6lle garantit de plus l!intgrit des donnes vu 3u!elle permet d!interdire l!acc=s direct au* attri"uts des o"8ets &on doit alors passer par des assesseurs+% Mn assesseur tant une mt$ode d!acc=s pour conna#tre ou modi ier la valeur d!un attri"ut d!un o"8et% 2!$ritage est un mcanisme de transmission des proprits d!une classe &ses attri"uts et ses mt$odes+ vers une sous-classe &la sous-classe $ritant de la classe principale+% 9r:ce l!$ritage, une classe peut aussi 0tre spcialise en d!autres classes, a in d!' a8outer des caractristi3ues spci i3ues &a8out de mt$odes par e*emple+ ou d!en adapter certaines% Plusieurs classes peuvent aussi 0tre gnralises en une classe 3ui les actorise, et ce, a in de regrouper les caractristi3ues communes d!un ensem"le de classes% 2a spcialisation et la gnralisation permettent de construire des $irarc$ies de classes% 2!avantage principal de l!$ritage est 3u!il vous permet de d!viter la duplication de code, et il encourage la rutilisation de m0me code% 6*emple d!une $irarc$ie de classes )

TJ

Support de cours PHP Mme Saidi -- 2007

L!apr=s ce grap$i3ue, vous pouve4 voir 3ue la classe 2ivre $rite des proprits de la classe Locument% <e 3ui veut dire 3ue les o"8ets 2ivre auront un auteur, un diteur, mais aussi un numro et un titre% Le plus, comme on peut emprunter&+ ou rendre&+ un document, on pourra galement emprunter&+ et rendre&+ un livre &ceci, parce 3ue la classe 2ivre $rite de la classe Locument+% ,n pourra galement lire&+ ou p$otocopier&+ un livre% 6n revanc$e, un document n!aura pas d!auteur ni d!diteur, et on ne pourra pas le lire, ni m0me le p$otocopier &ces proprits ont partie de la classe 2ivre, or un document n!est pas un livre ) c!est un livre 3ui est un document, et non l!inverse+% ;uand au pol'morp$isme, celui-ci reprsente la acult d!une mt$ode pouvoir s!appli3uer des o"8ets de classes di rentes% /l augmente donc la gnricit de votre code% 6*emple d!un pol'morp$isme )

TO

Support de cours PHP Mme Saidi -- 2007

Fous pouve4 voir ici 3ue c$acune des trois classes &Foiture, 1rain et Avion+ $ritent des mt$odes de la classe F$icule% <es trois classes, auront donc acc=s la mt$ode deplacer&+ de la classe F$icule% ,r, dans ces trois (sous classes(, nous avons c$oisit de red inir la mt$ode deplacer&+ de la classe F$icule% Bous adaptons en ait cette mt$ode suivant l!o"8et 3ue nous tudions &un avion se dplace dans les airs, un train sur des rails et une voiture sur la route+% 2!agrgation constitue une relation entre deu* classes, spci iant 3ue les o"8ets d!une classe sont des composants de l!autre classe% Mne relation d!agrgation permet donc de d inir des o"8ets composs d!autres o"8ets% 2!agrgation permet d!assem"ler des o"8ets de "ase, a in de construire des o"8ets plus comple*es% 6*emple d!une agrgation )

Fous vo'e4 "ien 3ue notre o"8et eau de t'pe molcule est en ait une com"inaison de trois o"8ets ) TK

Support de cours PHP Mme Saidi -- 2007 - $'drogene1 3ui est un o"8et de la classe atome &c!est une instance de la classe atome+% - $'drogene2 3ui est un o"8et de la classe atome &c!est une instance de la classe atome+% - o*'gene 3ui est un o"8et de la classe atome &c!est une instance de la classe atome+% Botre molcule est donc compose de trois atomes ) $'drogene1, $'drogene2 et o*'gene% 6n conclusion, vous deve4 savoir 3ue le concept o"8et est un concept sta"le et prouv% <!est un concept ancien &Simula, le premier langage de programmation implmenter le concept de t'pe a"strait l!aide de classe date de 1TK7+, mais il n!a 8amais t autant d!actualit% A cela, deu* raisons principales ) - l!approc$e onctionnelle n!est pas adapte au dveloppement d!applications 3ui voluent sans cesse et dont la comple*it croit continuellement &plusieurs di4aines de milliers de lignes de code+% - l!approc$e o"8et a t invente pour aciliter l!volution d!applications comple*es% Le nos 8ours, les outils orients o"8ets sont ia"les et per ormants &les compilateurs <`` par e*emple produisent un code ro"uste et optimis+% Mais, malgr les apparences, il est "eaucoup plus naturel pour nous, 0tres $umains, de dcomposer un pro"l=me in ormati3ue sous orme d!une $irarc$ie de onctions atomi3ues et de donnes, 3u!en terme d!o"8ets et d!interaction entre ces o"8ets% Le plus, le voca"ulaire prcis est souvent un acteur d!c$ec important dans la mise en oeuvre d!une approc$e o"8et% <!est pour cela 3u!il aut penser o"8et des le dpart, au lieu d!essa'er de convertir une srie de onction en une classe%

T7

Support de cours PHP Mme Saidi -- 2007

"a #ro4rammation ob7et 8#remi6re a##roche9


Apres avoir vu les concepts ondamentau* de la programmation o"8et, attardons nous sur la programmation o"8et vu du cIt de PHP% Pour cela, 8e vous propose de raliser notre premier classe ) une classe 3ui vous servira envo'er des mails% Eus3u! prsent, pour envo'er des mails, vous devie4 recopier tou8ours le m0me code avec des en-t0tes n!en plus inir% 1out ceci sera ini avec votre classe d!envois de mails ) vous crire4 une ois pour toute votre code, et ensuite, vous rutilisere4 ce m0me code c$a3ue ois 3ue vous aure4 l!envie envo'er des mails% A in de commencer sur de "onnes "ases, 8e vous conseille de stocHer votre classe de mails dans un ic$ier PHP, comme par e*emple sendmail%class%p$p, puis d!include ce ic$ier dans vos scripts lors3ue vous en aure4 "esoin% Atta3uons tout de suite le code de notre classe U Foici les premi=res lignes de code de notre classe )
<?php class CendMail G 2ar #destinataire; 2ar #ob;et; 2ar #teJte; I ?>

<omme vous le vo'e4, la dclaration d!une classe en PHP dmarre par le mot cl class suivi du nom de la classe% Bous ouvrons alors une accolade ouvrante 3ui dlimite le d"ut de la dclaration des mt$odes et des attri"uts de la classe &la dclaration de la classe se terminant avec une accolade ermante+% 6nsuite, nous 8oignons G varia"les notre classe ) Wdestinataire, Wo"8et et Wte*te% <es G varia"les sont en ait les caractristi3ues communes des o"8ets &les attri"uts+ 3ue nous allons pouvoir crer gr:ce notre classe% Boter 3ue l!on dclare ces attri"uts avec le mot rserv var% 6n clair, cela veut dire 3ue tous les o"8ets 3ue nous allons crer avec cette classe &des mails en l!occurrence+ auront tou8ours un destinataire, un o"8et et un te*te% Fous pouve4 dclarer autant d!attri"uts de classe 3ue vous le sou$aite4% Premier e*emple d!utilisation )
<?php // on inclut le code de notre classe include !%./sendmail.class.php%"; // on d3clare notre ob;et !en nce de la classe CendMail" #message $ neL CendMail !"; aitK dans le langage ob;etK on dit 4ue l'on cr3e une insta

// on a ecte des 2aleurs auJ attributs de notre ob;et #message=>destinataire $ %toto_toto.com%;

TS

#message=>ob;et $ %Ccoop mondial <%; #message=>teJte $ %Aoici mon premier mail utilisant une classe mail ?"%; ?>

Support de cours PHP Mme Saidi -- 2007

Boter l!utilisation de l!oprateur -A 3ui permet d!a ecter des valeurs au* attri"uts de notre o"8et% Bous verrons par la suite 3ue cet oprateur nous permet galement d!appli3uer les mt$odes de la classe sur notre o"8et% Fous vous doute4 "ien 3u! ce niveau l, aucun mail n!a t envo' )+ <ependant, vous pouve4 vri ier 3ue notre o"8et poss=de "ien les attri"uts 3ue nous lui avons ourni en aisant des )
<?php echo #message=>destinataire; // retournera ? toto_toto.com echo #message=>ob;et; // retournera ? Ccoop mondial < echo #message=>teJte; // retournera ? mon premier mail utilisant une classe mail ?" ?>

Pour envo'er notre mail, nous allons crire une mt$ode pour notre classe 3ui utilisera la onction mail de PHP ainsi 3ue les attri"uts de notre o"8et% ,n aura alors &pour notre classe+ )
<?php class CendMail G 2ar #destinataire; 2ar #ob;et; 2ar #teJte; unction en2oyer!" G mail !#this=>destinataireK #this=>ob;etK #this=>teJte";

I I ?>

Ltaillons la mt$ode envo'er&+% Botre mt$ode utilise la onction de mail de PHP, et elle prend en argument les valeurs des attri"uts de notre classe% <ependant, remar3ue4 l!utilisation de Wt$is% Wt$is indi3ue l!instance courante de notre classe% <et o"8et reprsente donc notre o"8et Wmessage 3ue nous utilisons dans notre script% Fous pouve4 crire autant de mt$odes 3ue vous le sou$aite4 pour votre classe% <ependant, sac$e4 3ue vous ne pouve4 crire 3u!une seule mt$ode a'ant le m0me nom 3ue le nom de votre classe &il s!agit en ait du constructeur de la classe 3ui a un rIle particulier au sein de la classe, nous le dtaillerons plus tard+% 6nvo'ons maintenant notre mail gr:ce notre mt$ode envo'er&+ )
<?php include !%./sendmail.class.php%"; #message $ neL CendMail !";

TT

Support de cours PHP Mme Saidi -- 2007


#message=>destinataire $ %toto_toto.com%; #message=>ob;et $ %Ccoop mondial <%; #message=>teJte $ %Aoici mon premier mail utilisant une classe mail ?"%; // on appli4ue la m3thode en2oyer!" Q notre ob;et #message gr`ce Q l'op3rateur => #message=>en2oyer!"; ?>

PlutIt prati3ue non @ )+ 6n e et, la programmation par o"8et a cet avantage indnia"le, c!est 3ue vous n!ts pas o"liger de comprendre comment onctionne une classe% Lu moment 3ue vous save4 3uoi servent vos mt$odes &leur rIle+, vous pouve4 les utiliser sans comprendre ce 3u!il se passe derri=re &le code de la classe en elle-m0me+% Mais vous pouve4 aussi rutilise4 vos classes dans d!autres scripts &ce 3ui reste l!avantage principal de cette orme de programmation+% Fo'ons maintenant le constructeur d!une classe% 6n e et, toute classe contient une mt$ode dite (constructeur( et cette mt$ode a tou8ours le m0me nom 3ue le nom de la classe en 3uestion% Sans le savoir, lors3ue vous ave4 crit le code )
<?php #message $ neL CendMail !"; ?>

6t "ien vous ave4 appel le constructeur par d aut de la classe SendMail% <ependant, comme vous l!ave4 remar3u, notre classe SendMail ne comporte pas de mt$ode SendMail&+ &le constructeur d!une classe est la mt$ode de cette classe 3ui porte le m0me nom 3ue le nom de la classe+, et "ien dans ce cas, PHP utilise un constructeur par d aut 3ui n!a ecte en rien sur les proprits de notre o"8et% 1oute ois, vous pouve4 vous-m0me crire un constructeur dans votre classe% Mais il aut savoir 3ue le code 3ue vous alle4 mettre dans votre constructeur va se rpercuter sur tous les o"8ets 3ui seront instances de votre classe% Prenons un e*emple simple ) /maginer 3ue vous a'e4 une classe 7on$omme% Mn des attri"uts de cette classe serait Wnom, reprsentant le nom de notre "on$omme% Si vous instancier votre classe simplement &en aisant donc un ne. 7on$omme&+ tout simple+ alors 3ue vous n!ave4 pas spci i de constructeur, PHP va vous crer un 7on$omme sans nom &l!attri"ut Wnom de notre o"8et sera vide+% <ependant, vous pouve4 tr=s "ien crire vous-m0me votre propre constructeur pour donner un nom votre 7on$omme d=s sa cration% Qevenons alors notre classe SendMail, et nous allons lui spci ier un constructeur 3ui va permettre de d inir si le mail envo' sera au ormat te*te ou $tml% ,n aura alors ) 100

<?php class CendMail G 2ar #destinataire; 2ar #ob;et; 2ar #teJte;

Support de cours PHP Mme Saidi -- 2007

// on a;oute un attribut #entete Q notre classe 2ar #entete; // le constructeur de notre classe 4ui prend un param-tre unction CendMail !#type $ %teJte%" G i !#type $$ %teJte%" G #this=>entete $ %6ontent=type? teJt/plain; charset$iso=\\5H=0n%; I elsei !#type $$ %html%" G #this=>entete $ %6ontent=type? teJt/html; charset$iso=\\5H=0n%; I I unction en2oyer!" G mail !#this=>destinataireK #this=>ob;etK #this=>teJteK #this=>entete"; I ?> I

Fous remar3uere4 alors 3ue gr:ce notre constructeur, nous allons pouvoir rapidement crer des mails au ormat te*te ou "ien au ormat $tml% 6*emple )
<?php include !%./sendmail.class.php%"; // #message sera un mail au #message $ neL CendMail !"; ormat teJte

// #message1 sera un mail au ormat teJte #message1 $ neL CendMail !%teJte%"; // #messageR sera un mail au ormat html #messageR $ neL CendMail !%html%"; ?>

6n rsum, le constructeur de la classe sert souvent initialiser certains attri"uts des o"8ets cres partir de la classe% Attention, une classe ne peut contenir 3u!un seul constructeur% <e cours vous a donc prsent 3uel3ues rudiments de la programmation par o"8et en PHP, cependant, vous ave4 du remar3ue4 3ue contrairement au premier cours &les concepts ondamentau*+, de nom"reu* concepts n!ont pas ts traits ici% <es concepts seront traits dans un utur cours a in de ne pas trop vous em"rouille4 les ides ) trop de notions nouvelles d!un coup peut nuire la compr$ension de cette orme de programmation d8 "ien comple*e%

101

Support de cours PHP Mme Saidi -- 2007

"es variables dynami:ues


<ela ne vous est 8amais arriv de vous demander si il tait possi"le de crer des varia"les d'nami3ues @ <!est dire des varia"les a'ant un nom c$angeant au cours du script @ 6t "ien c!est tout ait possi"le de aire ceci en PHP% 6n e et, gr:ce au* varia"les d'nami3ues vous alle4 pouvoir utiliser des noms de varia"les 3ui sont eu* m0mes &les noms+, varia"les, ce 3ui veut dire 3ue vous alle4 utiliser des noms de varia"les 3ui sont a ects et utiliss d'nami3uement dans votre script% L!apr=s ce 3ue l!on vient dire, une varia"le d'nami3ue serait alors une varia"le 3ui aurait comme nom la valeur d!une varia"le, par e*emple Wvar% 6n e et, si nous d inissons la varia"le W$ello, avec en valeur la c$a#ne de caract=res <oucou, on aurait la c$ose suivante )
<?php #2ar $ 'hello'; #hello $ '6oucou'; echo #G#2arI; ?>

;ui a ic$era ) <oucou <!est dire la valeur de la varia"le W$ello% 6n utilisant le code )
<?php #2ar $'hello'; #hello $ '6oucou'; echo #hello; ?>

Bous aurions eu e*actement le m0me rsultat% Fous remar3ue4 alors au passage le onctionnement d!une varia"le d'nami3ue ) - on initialise une varia"le a'ant une certaine valeur - on veut utiliser une autre varia"le a'ant comme nom la valeur de notre varia"le prcdente ) pour cela, nous dclarons notre varia"le avec un W, puis avec l!intitul de notre varia"le prcdent entre deu* croc$ets, ce 3ui donne ) W^Wvar_ Malgr, cette "r=ve description des varia"les d'nami3ues, 8 ai comme l!impression 3ue vous n!0tes pas du tout convaincu% Mais 3uoi "on peuvent elles "ien servir ces varia"les d'nami3ues @ 1out simplement aire du d'nami3ue )+ 102

Support de cours PHP Mme Saidi -- 2007 /maginons 3ue l!on ai dans notre script PHP deu* varia"les de t'pe ta"leau &ou arra'+ et 3ue l!on dsire accder l!un de ces ta"leau*% Au lieu de aire des tests ous pour savoir 3uel ta"leau on veut accder, il nous su it de crer une varia"le de t'pe c$a#ne de caract=res contenant le nom de notre ta"leau &celui 3ue l!on dsire parcourir+ et d!utiliser une varia"le d'nami3ue pour accder notre ta"leau% 6*emple )
<?php #tableau0 $ array !'test'K 'toto'K 'titi'"; #tableau1 $ array !'hump 'K 'grmbl'"; #2ar $ 'tableau0'; #nb/elements $ count !#G#2arI"; or !#i$8; #i<#nb/elements; #iOO" G // on accede auJ 3l3ments du tableau #tableau0 echo #G#2arI7#i9.'<br />'; I ?>

<e 3ui a ic$era donc ) test toto titi 2!e*emple peut vous para#tre un peu "0te, mais regarde4 le de plus pr=s ) en e et, si nous dcidons du 8our au lendemain de c$anger le nom de notre ta"leau &a in de parser un autre ta"leau+, nous n!aurons 3u!une seule ligne modi ier )
<?php #2ar $ 'tableau0'; ?>

&,n aurait en ait crit le nom d!un nouveau nom de ta"leau+ Alors 3u!en n!utilisant pas les varia"les d'nami3ues, nous aurions du modi ier cette m0me ligne, mais aussi la ligne concernant le comptage du nom"re d!lment de notre ta"leau mais aussi la ligne contenue dans notre "oucle or &le ec$o+% 2es varia"les apportent alors leur lot d!avantages ) - la clart du code - du code d'nami3ue rutilisa"le - des solutions des pro"l=mes lis la d'nami3ue d!un script &comme par e*emple gnr un ormulaire contenant un nom"re ind ini de c$amps+ Avant de poursuivre ce cours, sac$e4 galement 3ue le nom"re de varia"les d'nami3ues utilises est t$ori3uement sans limites% Fous pouve4 tr=s "ien aire, par e*emple )
<?php #2ar $ 'toto';

10G

#toto $ 'test'; #test $ 'hump '; echo #G#G#2arII; ?>

Support de cours PHP Mme Saidi -- 2007

<e 3ui a ic$era ) Hump Fo'ons maintenant un cas concret sur le3uel il est intressant d!utiliser les varia"les d'nami3ues% /magine4 3ue vous a'e4 un ormulaire, et dans la page de traitement de ce ormulaire, plusieurs actions sont possi"les% Eus3u! prsent, pour aire votre page de traitement, vous devie4 enc$a#ner une srie de i elsei else &ou m0me mieu* en utilisant un case+ a in de savoir dans 3uel cas vous vous trouvie4, et de plus, vous devie4 crire un "on pa3uet de ligne de code pour dcrire c$a3ue action% 1out ceci peut-0tre largement simpli i gr:ce au* varia"les d'nami3ues% 6n e et, imaginons 3ue notre ormulaire contienne un c$amp cac$ contenant une des valeurs suivantes &au c$oi*+ ) - insert - delete - update - select Foici alors le code d!une page de traitement possi"le de ce ormulaire )
<?php #champ/cache $ #/P(CT7'champ/cache'9; unction insert!" G // code unction delete!" G // code unction update!" G // code I unction select!" G // code I i !#champ/cache $$ 'insert' bb #champ/cache $$ 'delete' bb #champ/cache $$ 'update' bb # champ/cache $$ 'select'" G #champ/cache!"; I ?>

Lans ce cas prcis, on parlera de onction d'nami3ue% <ar comme vous pouve4 le constater, on utilise la valeur d!une varia"le pour dsigner le nom d!une onction% Fo'ons un autre cas d!utilisation, oV l, nous allons pouvoir gnrer d'nami3uement un ormulaire% 10J

Support de cours PHP Mme Saidi -- 2007 9nrer un ormulaire d'nami3uement veut dire 3ue la personne utilisant le ormulaire pourra c$oisir, ellem0me, le nom"re de c$amps de t'pe te*t contenu dans ce ormulaire, et gr:ce au* varia"les d'nami3ues, nous allons pouvoir rcuprer la valeur de ces c$amps sans conna#tre auparavant le nom"re de c$amps de ce ormulaire &vu 3ue ce nom"re est dcid par la personne utilisant le ormulaire+ Foici le code )
<?php // si l'utilisateur soumet le ormulaire on a iche la 2aleur de tous les champs du laire i !isset!#/P(CT7'submit'9" FF #/P(CT7'submit'9 $$ %+n2oyer%"G // on a iche le nombre de champs du ormulaire echo '@ombre de champs ? '.#/P(CT7'nb/champs'9.'<br />'; // on a iche la 2aleur des champs du ormulaire or !#i$0; #i<$#/P(CT7'nb/champs'9; #iOO"G #dynami4ue $ 'champs/'.#i; #2alue $ #/P(CT7#dynami4ue9; echo 'Aaleur du champ '.#i.' ? '.#2alue.'<br />'; I I // sinon on a iche le ormulaire a2ec la possibilit3 d'a;out des champs au ormulaire elseG // on d3 ini le nombre initial de champs i !<isset!#/P(CT7'nb/champs'9""G #/P(CT7'nb/champs'9 $ 0; I // si la personne clic sur %un champs en O%K on a;oute un champs i !isset!#/P(CT7'submit'9" FF #/P(CT7'submit'9 $$ %*n champs en O%"G #/P(CT7'nb/champs'9OO; I // on a iche le ormulaire echo '<P(DM M+TH(E$%post%>'; // on place un champ cach3 contenant un entier ayant comme 2aleur le nombre de ch amps du ormulaire echo '<B@P*T T>P+$%hidden% @&M+$%nb/champs% A&L*+$%'.#/P(CT7'nb/champs'9.'%>'; // on a iche tous les champs du ormulaire or !#i$0; #i<$#/P(CT7'nb/champs'9; #iOO"G echo '<B@P*T T>P+$%teJt% name$%champs/'.#i.'%><br />'; I // on place un bouton permettant de ra;outer un champs echo '<B@P*T T>P+$%submit% @&M+$%submit% A&L*+$%*n champs en O%><br />'; // on place un bouton permettant de soumettre le ormulaire echo '<B@P*T T>P+$%submit% @&M+$%submit% A&L*+$%+n2oyer%>'; echo '</P(DM>'; ormu

I ?>

10O