Académique Documents
Professionnel Documents
Culture Documents
&.2.1 >9ile classique................................................................................................................. 2" &.2.2 do ... >9ile........................................................................................................................2" &.3 for.............................................................................................................................................2& &.4 foreac9..................................................................................................................................... 2& &." 4rea? et continue...................................................................................................................... 27 &.& s>itc9....................................................................................................................................... 27 &.7 return........................................................................................................................................ 2! &.! require et include @AonceB........................................................................................................ 2! 7 /es fonctions....................................................................................................................................2. 7.1 #ynta3e et porte......................................................................................................................2. 7.2 )rgu ents................................................................................................................................2. 7.3 7aleur de retour....................................................................................................................... 30 7.4 Conctions internes.................................................................................................................... 30 ! %estion des for ulaires en PHP......................................................................................................31 !.1 %85 et P;#5........................................................................................................................... 31 !.2 Dcupration par ta4leau..........................................................................................................31 !.3 Dcupration directe................................................................................................................ 32 !.4 Utiliser des ta4leau3.................................................................................................................32 . Date et 9eure.................................................................................................................................... 34 ..1 /ocalisation..............................................................................................................................34 ..2 Dcuprer la date et l(9eure...................................................................................................... 34 ..2.1 date@B................................................................................................................................ 34 ..2.2 date locale strfti e@B........................................................................................................ 3" ..2.3 Detour par ta4leau getdate@B............................................................................................. 3& ..2.4 /(9eure localti e@B........................................................................................................... 37 ..3 Dcuprer n(i porte quelle date...............................................................................................37 10 6y#E/.......................................................................................................................................... 3! 10.1 Prsentation............................................................................................................................3! 10.2 ;utils......................................................................................................................................3! 10.2.1 P9p6y)d in................................................................................................................. 3! 10.2.2 6ysql$$........................................................................................................................ 3. 10.3 $rer une 4ase........................................................................................................................3. 10.4 Utilisateurs et droits............................................................................................................... 3. 10." $rer et odifier des ta4les................................................................................................... 40 10.".1 5ypes Fu riques..........................................................................................................40 10.".1.1 5ypes entiers...........................................................................................................40 10.".1.2 5ypes rels @flottantsB............................................................................................. 40 10.".1.3 5ypes 4oolens....................................................................................................... 40 10.".2 5ypes caract:res............................................................................................................. 40 10.".2.1 5ypes $H)D.......................................................................................................... 41 10.".2.2 5ypes 58G5........................................................................................................... 41 10.".2.3 5ype 8FU6........................................................................................................... 41 10.".2.4 5ype #85................................................................................................................42 10.".3 5ypes date...................................................................................................................... 42 10.".3.1 Cor ats supports...................................................................................................43 10.".3.2 5ype D)585I68...................................................................................................43 10.".3.3 5ype D)58............................................................................................................ 43 10.".3.4 5ype 5I68#5)6P................................................................................................43 10.".3." 5ype 5I68 ............................................................................................................ 44 10.".3.& 5ype H8)D............................................................................................................ 44 10.".4 $ration 2 #ynta3e #E/..................................................................................................44 S. ROHAUT Cours Programmation PHP Page 3/93
10."." 5ypes de ta4les @6yI#)6 et InnoD1B.......................................................................... 4" 10.".& Inde3 CU//58G5..........................................................................................................4& 10.".&.1 $ration.................................................................................................................. 4& 10.".&.2 Dec9erc9e............................................................................................................... 4& 10.".&.3 Dec9erc9e 4oolenne..............................................................................................47 10.& 6y#E/ et PHP...................................................................................................................... 47 10.&.1 $onne3ion ' une 4ase de donnes..................................................................................47 10.&.1.1 $onne3ion au serveur............................................................................................. 47 10.&.1.2 $9oi3 d(une 4ase.....................................................................................................4! 10.&.1.3 Cer eture d(une conne3ion.................................................................................... 4! 10.&.1.4 #quence co pl:te pour une 4ase.......................................................................... 4! 10.&.2 /es requItes ...................................................................................................................4! 10.&.2.1 83cuter une requIte.............................................................................................. 4! 10.&.2.2 Fo 4re de lignes affectes.................................................................................... 4. 10.&.2.3 Fo 4re de lignes retournes.................................................................................. 4. 10.&.2.4 Dcuprer les rsultats............................................................................................4. 10.&.2." Insertion avec autoJincr ent................................................................................ "0 10.&.3 Dcupration des erreurs................................................................................................ "0 11 /e syst: e de fic9iers...................................................................................................................."1 11.1 5ravail sur les fic9iers............................................................................................................"1 11.1.1 ;uverture........................................................................................................................"1 11.1.2 /ecture............................................................................................................................"1 11.1.2.1 fgets@B......................................................................................................................"1 11.1.2.2 fread@BK.................................................................................................................... "1 11.1.2.3 fscanf@B...................................................................................................................."2 11.1.2.4 fgetc@B..................................................................................................................... "2 11.1.2." fgetss@B.................................................................................................................... "2 11.1.2.& fgetcsv@B.................................................................................................................."2 11.1.2.7 Denvoyer un fic9ier par la sortie standard.............................................................."2 11.1.3 8criture..........................................................................................................................."3 11.1.4 Dplace ent..................................................................................................................."3 11.1.4.1 fsee?@B..................................................................................................................... "3 11.1.4.2 ftell@B....................................................................................................................... "3 11.1.4.3 re>ind@B.................................................................................................................. "3 11.1." Cin de fic9ier.................................................................................................................. "3 11.1.& Cer eture....................................................................................................................... "4 11.2 5ravail sur les rpertoires......................................................................................................."4 11.2.1 Dpertoire actuel............................................................................................................ "4 11.2.2 #e dplacer .................................................................................................................... "4 11.2.3 ;uvrirL listerL fer er...................................................................................................... "4 11.2.4 Dcuprer toutes les entres........................................................................................... "4 11.3 5ravail sur le syst: e de fic9iers..........................................................................................."" 11.3.1 Infor ations sur le fic9ier.............................................................................................. "" 11.3.2 )ctions sur les fic9iers et rpertoires............................................................................. "& 11.4 Upload de fic9iers.................................................................................................................. "7 12 5ravail sur c9a-nes.........................................................................................................................". 12.1 Conctions pour code H56/ et 6y#E/.................................................................................". 12.1.1 %estion des caract:res verrouills.................................................................................. ". 12.1.2 4alises et caract:res spciau3 H56/.............................................................................". 12.2 Conctions te3te gnrales.......................................................................................................&0 12.2.1 Dcouper une c9a-ne...................................................................................................... &0 S. ROHAUT Cours Programmation PHP Page 4/93
12.2.2 Dec9erc9er et co parer..................................................................................................&1 13 #essions et coo?ies........................................................................................................................ &2 13.1 /es coo?ies.............................................................................................................................&2 13.1.1 $ration.......................................................................................................................... &2 13.1.2 )cc:s.............................................................................................................................. &2 13.1.3 #uppression.................................................................................................................... &3 13.2 Identification H55P............................................................................................................... &3 13.2.1 $onne3ion...................................................................................................................... &3 13.2.2 Dconne3ion.................................................................................................................. &4 13.3 #essions PHP......................................................................................................................... &4 13.3.1 Principe.......................................................................................................................... &4 13.3.2 Utilisation.......................................................................................................................&4 13.3.2.1 ;uverture................................................................................................................&4 13.3.2.2 7aria4les de session............................................................................................... &4 13.3.3 83piration de la session..................................................................................................&" 13.3.4 $9anger l(acc:s par dfaut..............................................................................................&& 14 I ages............................................................................................................................................&7 14.1 PrJrequis i portants............................................................................................................. &7 14.2 $rer une i age..................................................................................................................... &7 14.2.1 5ypes possi4les.............................................................................................................. &7 14.2.2 $ration.......................................................................................................................... &! 14.2.2.1 Fouvelle i age dyna ique.................................................................................... &! 14.2.2.2 Dcupration d(une i age e3istante....................................................................... &! 14.2.3 Pu4lication..................................................................................................................... &! 14.2.4 $9arge ent via une autre page...................................................................................... &. 14.3 5ravailler sur les I ages........................................................................................................ &. 14.3.1 Dcuprer des infor ations............................................................................................&. 14.3.2 /es couleurs................................................................................................................... &. 14.3.3 Dessin.............................................................................................................................70 14.3.3.1 De plissage............................................................................................................70 14.3.3.2 Point....................................................................................................................... 70 14.3.3.3 /igne.......................................................................................................................70 14.3.3.4 Dectangle................................................................................................................ 70 14.3.3." $ercleL ellipse......................................................................................................... 70 14.3.3.& Polygones............................................................................................................... 71 14.3.3.7 5e3te si ple........................................................................................................... 71 1" /a progra ation o4,et................................................................................................................ 71 1".1 #tructure.................................................................................................................................71 1".2 $ration d(un o4,et................................................................................................................. 71 1".3 )cc:s au3 e 4res............................................................................................................... 72 1".3.1 PHP 4 et "...................................................................................................................... 72 1".3.2 PHP "............................................................................................................................. 72 1".4 /(oprateur 22.......................................................................................................................... 72 1"." /es varia4lesL protection........................................................................................................ 73 1".".1 PHP 4.3.......................................................................................................................... 73 1".".2 PHP ".3.......................................................................................................................... 73 1".".2.1 Protection des varia4les et fonctions...................................................................... 73 1".".2.2 attri4uts et t9odes statiques................................................................................73 1".".2.3 constantes de classe................................................................................................ 74 1".& Hritage et poly orp9is e....................................................................................................74 1".7 /es otsJcls parent et self....................................................................................................7" S. ROHAUT Cours Programmation PHP Page 5/93
1".! $onstructeurs......................................................................................................................... 7& 1".!.1 PHP 4 et "...................................................................................................................... 7& 1".!.2 PHP "............................................................................................................................. 7& 1".. $onstructeurs et classes drives........................................................................................... 7& 1"...1 PHP 4 et "...................................................................................................................... 7& 1"...2 PHP "............................................................................................................................. 77 1".10 Destructeur...........................................................................................................................7! 1".10.1 PHP 4........................................................................................................................... 7! 1".10.2 PHP "........................................................................................................................... 7! 1".11 )ffectation d(o4,ets.............................................................................................................. 7! 1".11.1 $ode co un.............................................................................................................. 7! 1".11.2 PHP 4........................................................................................................................... 7. 1".11.3 PHP "........................................................................................................................... 7. 1".12 $o paraison d(o4,ets...........................................................................................................!0 1".12.1 PHP 4........................................................................................................................... !0 1".12.2 PHP "........................................................................................................................... !2 1& Fouveauts en PHP ".................................................................................................................... !3 1&.1 /es o4,ets .............................................................................................................................. !3 1&.1.1 /a fonction AAautoload.................................................................................................. !3 1&.1.2 /es classes a4straites......................................................................................................!3 1&.1.3 $lassesL t9odes et varia4les finales........................................................................... !4 1&.1.4 /es interfaces o4,et.........................................................................................................!4 1&.1." %estion dyna ique des t9odes et attri4uts................................................................ !& 1&.1.& /es itrations d(o4,ets..................................................................................................... !& 1&.1.7 5ype 9inting................................................................................................................... !7 1&.2 /es e3ceptions........................................................................................................................!! 1&.2.1 try ... catc9...................................................................................................................... !! 1&.2.2 Dclenc9e ent avec t9ro>............................................................................................ !! 1&.2.3 classe 83ception et classes personnalises.....................................................................!! 1&.2.4 PHP 2 8rreur ou 83ception *.......................................................................................... !. 1&.2." 83ception par dfaut...................................................................................................... .0 17 #auvegarder ses o4,ets....................................................................................................................1 17.1 $as d(une session................................................................................................................... .1 17.2 )utres cas................................................................................................................................2
S. ROHAUT
Page 6/93
1 Introduction
1.1 Dfinition
PHP est un langage de script H56/ e3cut du c=t du serveur. Il veut dire M PHP 2 Hyperte3t Preprocessor N. #a synta3e est large ent inspire du langage $L de Oava et de PerlL avec des a liorations spcifiques. /e 4ut du langage est d(crire rapide ent des pages H56/ dyna iques.
1.2 Historique
/(origine de PHP re onte ' 1.." quand Das us /erdorf a cr PHP<CIL une li4rairie de scripts Perl utiliss pour la pu4lication de son $7 sur son site personnel. )u fur et ' esure des volutionsL la li4rairie a t porte en $ et agr ente de nouvelles fonctionnalits pour crer des pages dyna iques si ples pour le >e4 et accder ' quelques sources de donnes. PHP<CI signifie Personal Ho e Page<Cor s Interpreter. PHP<CI 2.0 sort en 1..7L tou,ours dvelopp par une seule personne. $(est le succ:s 2 "0000 sites @1P des no s de do ainesB disent l(utiliser ou le supporter. /es contri4uteurs affluent. PHP 3.0 sort en ,uin 1..!L c(est la pre i:re version dveloppe con,ointe ent par Das us /erdorfL )ndi %ut ans et Qeev #uras?i et enti:re ent rcrite @les versions prcdentes taient trop lentes pour une application co ercialeB. ;utre les perfor ancesL PHP 3 est odulaire et e3tensi4leL per ettant de lui greffer des )PI suppl entairesL ce qui n(a pas anqu avec le support de no 4reuses 4ases de donnesL de for ats et de protocolesL une synta3e plus co9rente et un support 4asique de l(o4,et. Il a t install sur 10P du parc ondial des serveurs >e4 avec des di+aines de illiers de dveloppeurs et des centaines de illiers de sites. /e oteur de PHP 4 a t repens afin d(en a liorer les perfor ances pour des applications co ple3es et d(aug enter encore la odularit. Un nouveau oteur a vu le ,ourL appel Qend 8ngine @contraction de Qeev et )ndiB. PHP 4 sort officielle ent en ai 2000 et apporte des perfor ances accruesL le supports de plusieurs serveurs >e4L les sessionsL une scurit accrue. $(est actuelle ent la derni:re version sta4le @nous ne co ptons pas les 4.1L 4.2 et 4.3B. 8t PHP " * )ctuelle ent en version 4etaL un cycle qui peut durer plusieurs oisL le 4ut de PHP " est une a lioration des perfor ances du oteur Qend @Qend 8ngine 2BL un od:le o4,et tendu et tr:s proc9e du $RRL une co pati4ilit accrue avec de nouveau3 standards et les anciens @DP$L G6/L .F85L ...B
Coru s et 6essageries $o erce lectronique 1anque < $o ptes en ligne Pu4lication en ligne 6oteurs de rec9erc9e 5out ce que vous voule+L @sauf les ,eu3B
Dsu ons quelques sigles que nous allons utiliser par la suite. HTML 2 Hyperte3t 6ar?up /anguage PHP 2 People Hate Perl... Fon 2 PHPL Hyperte3t PreProcessor S. ROHAUT Cours Programmation PHP Page 7/93
SQL 2 #tructured Euery /anguage MySQL 2 serveur de 4ase de donnes et les outils pour y accder LAMP 2 /inu3 S )pac9e S 6y#E/ S PHPL le quatuor gagnant des serveurs >e4.
)P)$H8
PHP /inu3
6y#E/
Tindo>s )#P et 71#cript sont utiliss pour l(acc:s au3 )ctiveGL co posants 4ien pratiques ais vrita4les gruy:res pour la scurit. Il n(e3iste pas ' ce ,our de portage de )ctiveG sur d(autres syst: es que Tindo>s. PHP est disponi4le pour toutes les plateJfor es et per et de faire la I e c9oseL sinon plusL que )#P et 71#cript. F(ou4lions pas que PHP dispose de plus de 2700 )PIs U
tous les navigateurs supportant ce standard. )vec une 4onne dclaration @entIte H56/B les navigateurs I8&L 6o+illa 1."L ;pera 7L %aleonL VonquerorL etcL sont co pati4les avec ces standards. /(utilisation de 4alises propritaires ' un navigateur @4lin? par e3e pleB ou de v4script @sous I8B est ' proscrire. /a derni:re nor e H56/ valide est H56/ 4.01 #5DI$5. GH56/ qui ' ter e re placera dfinitive ent H56/ est aussi 4ien support. /a derni:re nor e $## et la 2. $ependant dans ce cas prfre+ $##J1 car seul ;pera supporte $##J2. Prene+ l(9a4itude quand c(est possi4le de tester votre site sur deu3 ou trois navigateurs 2 I8& car c(est le plus rpanduL ;pera car il est e3trI e ent respectueu3 des standards et 6o+illa car c(est /8 c9allenger et pro4a4le ent re plaWant ' ter e de I8 @qui n(aura plus d(volution de version avant /ongHornB.
S. ROHAUT
Page !/93
2 Bases :Prsentation
PHP est langage tr:s souple prenant ses sources dans divers langages co e le $L le PerlL le $RR. Il est donc possi4le d(avoir plusieurs styles de scripts @progra ation classique dite procdurale ou progra ation o4,etL ou progra ation 4ordliqueB. $ette souplesse per et une tr:s grande li4ertL un peu co e en Perl. /(inconvnient est qu(on peut tr:s vite o4tenir du code illisi4le @4ordliqueBL I e si Wa arc9e tr:s 4ien. Prene+ donc l(9a4itude de co enter votre codeL de l(indenter et de ne placer qu(une instruction par ligne.
/(utilisation de 4alises pour l(intgration de code dans une page >e4 est tr:s souple et per et de ,ongler facile ent avec du code PHP et du code H56/ 2
<?php i ! e"pression # $ ?> <strong>%eci est &rai.</strong> <?php ' else $ ?> <strong>%eci est au".</strong> <?php ' ?>
S. ROHAUT
Page
/93
2.4 !ommentaires
/es co entaires s(utilisent co e en $ et en $RR avec /( .. (/ et //. Fote+ qu(une 4alise fer ante fer e le co entaire en cours.
<?php /( echo "salut !" (/ // %ommentaire sur cette ligne ?>
S. ROHAUT
Page 2/93
// )*claration et r+gles ,&ar=-; // ,&ar est . ,/ar=0; // , /ar est . 0 ,1toto=23alut2; // 45 ,6petitscochons=7; // 8n&alide 9 commence par un chi
re
/eur type dpend de leur valeur et de leur conte3te d(utilisation. 6ais on peut forcer @castB ponctuelle ent une varia4le ' un type de donnesL ce qui s(appelle le transtypage. De I e co e le type de varia4le peut c9anger en fonction de son utilisation ou du conte3teL PHP effectue auto atique ent un transtypageL ce qui peut parfois fournir des rsultats surprenants. ;n affecte une valeur ' une varia4le avec le signe gal M \ N avec ou sans espace avant ou apr:s.
// )*claration et transtypage ,&ar=202; // :ne cha;ne 0 ,&ar<=-; // ,&ar est maintenant un entier 6 ,&ar=,&ar<=.6; // ,&ar est maintenant un r*el de type double 6.6 ,&ar=7 < "6 petits cochons"; // ,&ar est un entier >ui &aut ?
Par dfaut les varia4les sont assignes par valeur 2 la valeur assigne ' la varia4le est recopie dans la varia4le. PHP peut aussi travailler par rfrence. Une varia4le peut donc rfrencer une autre varia4le. ;n dit alors que la varia4le devient un aliasL ou pointe sur une autre varia4le. ;n assigne par rfrence en utilisant le signe M ] N devant la varia4le assigne
,&ar=0; ,re =@,&ar; // ,re de&ient une r* *rence de ,&ar echo ,re ; // a iche 0 ,&ar=6; echo ,re ; // a iche 6 ,re =A; echo ,&ar; // a iche A
)ttention ' la valeur constante FU// insensi4le ' la casse. )ffecter une valeur FU// ' une varia4le signifie ne pas puis affecter de valeur.
,a=-; // globale par d* aut unction oo!# $ echo ,a; // c2est une &ariable locale . la '
onction 9 n2a
iche rien
Pour accder ' une varia4le glo4ale dans une fonctionL il faut utiliser le
,a=-; // globale par d* aut ,b=0; // idem unction oo!# $ global ,aB,b; // on r*cup+re les &ariables globales ,b=,a<,b; ' echo ,b; // a iche 6
otJcl global.
'
unction test1static!# $ static ,a==; echo ,a; // <- . cha>ue passage dans la ,a<<;
onction
[A%/;1)/# 2 ta4leau des varia4les glo4ales. /a cl est le no de la varia4le. [A#8D78D 2 varia4les fournies par le serveur >e4L par e3e ple (#8D78DAF)68( [A%85 2 varia4les fournies par H55P par la t9ode %85 @for ulairesB [AP;#5 2 ide ais pour la t9ode P;#5 [A$;;VI8 2 les varia4les fournies par un coo?ie [ACI/8# 2 varia4les sur le tlc9arge ent d(un fic9ier @uploadB [A8F7 2 acc:s au3 varia4les d(environne ent du serveur [A#8##I;F 2 les varia4les de session @voir cours sur les sessionsB
Fote 2 avant la version 4.2.0 de PHPL les varia4les passes par la t9ode %85L P;#5 @for ulaires et UD/B et ainsi de suite taient auto atique ent cres dans le script de destination. 9ttp2<<>>>.toto.fr<page.p9p*action\enr crait auto atique ent la varia4le [action qui prenait la valeur (enr(. _input type\`9idden` na e\`cac9e` value\`toto`X crait dans la page ci4le @action du for B une varia4le [cac9e de valeur `toto`. $e n(est plus auto atique depuis PHP 4.2.0. Il faut passer par les ta4leau3 superglo4au3 ciJdessus. ;n peut cependant passer outre en odifiant la valeur registerAglo4als dans le p9p.ini.
S. ROHAUT
Page 4/93
)ttention avec les ta4leau3 U Pour viter toute a 4iguatL il est prfra4le de placer la varia4le entre accolades.
5ous les types peuvent Itre convertis en 4oolens. 7oici les cas o^ une varia4le retournera C)/#8 en 4oolen suivant le type 2
1oolen 2 C)/#8 8ntier 2 0 @+roB Fo 4re flottant 2 0.0 @+roB $9a-ne 2 c9a-ne vide `` ou `0` @+roB 5a4leau 2 ta4leau vide sans aucun l ent ;4,et 2 o4,et vide sans aucun l ent $onstante spciale FU//
Dans tous les autres casL la valeur retourne est 5DU8. )ttention 2 J1 est considr co e vrai donc 5DU8. $o e en $L les tests de conditions dans les structures de contr=les effectuent une convertion 4oolenne du la condition.
i !,&ar==true# echo "o5"; i !,&ar# echo "o5"; // 8denti>ue
3. .2 !ntiers
Un entier est l(ense 4le des no 4res naturelsL c(est ' dire dans virguleL positifs ou ngatifs. /es entiers sont gnrale ent cods sur 32 4its ais cela dpend de l(arc9itecture. #i on affecte un no 4re entier qui dpasse la capacit de la varia4leL celleJci sera transfor e en rel @floatB. 8nfin il n(y a pas de notion d(entier non sign. /ors de la conversion d(un 4oolen en entierL C)/#8 devient 0 et 5DU8 devient 1. /ors de la conversion d(un no 4re ' virgule flottanteL le no 4re sera arrondi ' la valeur infrieure s(il est S. ROHAUT Cours Programmation PHP Page 5/93
positifL ou suprieure s(il est ngatif @conversion vers +roB. Pour la conversion depuis les c9a-nesL voir ' ce type.
3. .3 "ir#ule $lottante
;n parte ici des no 4res relsL dou4le ou floatL c(est ' dire les no 4res ' virgules. /a virgule est spcifie par le point M . N. /a puissance de 10 s(e3pri e avec le M e N ou le M 8 N.
,&ar=-.06A; ,&ar0=-.-eA; // -.- ( -=HA 9 --===
3. .% &'a(nes de caractres
Une c9a-ne est une squence de caract:res. PHP travaille en )#$II soit 2"& caract:resL ais ne supporte pas encore le for at UnicodeL prvu dans la version ". Il n(y a pas de li ite t9orique pour la taille de la c9a-ne. ;n distingue trois synta3es pour utiliser un c9a-ne
/es guille ets si ples (...( @apostrop9esB 2 $o e en s9ellL tous les caract:res inclus dans la c9a-ne sont sortis tels quels sans interprtation. #i vous deve+ affic9er un guille et si pleL il faudra l(c9apper 2 b( /es guille ets dou4les `...` 2 $ertaines squences de caract:res sont interprtes et les varia4les sont su4stitues @re places par leur valeurB. HereDoc 2 Identique au3 Here#cripts en #9ell. /e te3te saisi ,usqu(' un dli iteur spcifi est plac dans la varia4le.
7oici le ta4leau issu de la docu entation PHP des squences pouvant Itre utiliss avec les guille ets dou4les. S uence In Ir It II I, I" IJ=KLM$-B6' I"J=KNFKEaK M$-B0' !aleur Fouvelle ligne @linefeedL /C ou 030) @10B en )#$IIB Detour ' la ligne @carriage returnL $D ou 030D @13B en )#$IIB 5a4ulation 9ori+ontale @H5 ou 030. @.B en )#$IIB )ntislas9 $aract:re [ %uille ets dou4les Une squence de caract:res qui per et de rec9erc9er un no 4re en notation octale. Une squence de caract:res qui per et de rec9erc9er un no 4re en notation 9e3adci ale.
echo 2Fttention lI2abus dI2alcool est dangereu"2; ,&ar=06A7; echo "la &aleur de I,&ar est ,&arIn"; ,toto= <<<E8O
S. ROHAUT
Page 6/93
F(i porte quelle varia4le peut Itre affic9e dans une c9a-ne co e ciJdessus ais attention si deu3 varia4les ont un no proc9e U Il faut alors utiliser les accolades Y Z co e en s9ell. 8nfin on peut accder ' n(i porte quel caract:re dans une c9a-ne en indiquant sa position @qui co ence ' +roB entre deu3 accolades colles ,uste apr:s le no de la varia4le.
, ic=2toto. ic2; , ics=2riri i i loulou2; echo ", ics ,$ ic's"; // a iche riri echo ", ic$6'"; // a iche o
;n peut facile ent concatner deu3 c9a-nes avec l(oprateur point M . N. ;n peut a,outer du te3te ' une c9a-ne avec l(oprateur point gal M .\ N.
,str="3alut les Fmis !In"; ,str.="%omment Pa &a ?"; // "3alut les Fmis !In%omment Pa &a ? ,str0=,str."In"; // "3alut les Fmis !In%omment Pa &a ?In
#i vous deve+ utiliser une c9a-ne de caract:res co e valeur nu rique @dans une addition par e3e pleL attention ' son contenu. /a c9a-ne sera de type dou4le @relB si elle contient un (e( ou un (8(. #inon ce sera un entier. /a valeur nu rique est ensuite dfinie par le d4ut de la c9a-ne. #i la c9a-ne co ence par une valeur nu riqueL elle sera utiliseL sinon elle sera gale ' 0 +ro. #i la pre i:re e3pression est une c9a-neL le type de varia4le dpend de la seconde e3pression.
,&al=-=<"0.77"; // loatB -0.77 ,&al=-<"toto0"; // - < = = ,&al=0<"6 petits cochons"; // 0 < 6 = 7 !le 6 est en premier dans la cha;ne#
3. . )es tableaux
Un ta4leau PHP est une association ordonne. Une association fait correspondre des valeurs ' des cls. /es ta4leau3 sont tr:s souplesL ils peuvent avoir de ultiples di ensionsL Itre inde3s par une cl nu rique ou te3teL Itre utiliss co e ta4le de 9ac9ageL une pileL une queueL ... Une valeur de ta4leau peut Itre elleJ I e un ta4leauL pour crer des ar4res par e3e ple. Un ta4leau est cr avec la fonction array!# qui prend co e argu ents des paires M 5ey => &alue N spares par des virgules. /a cl peut Itre soit un entier soit du te3te. )ttentionL ! est un entierL 0! une c9a-ne U #i la cl est a4sente alors c(est la derni:re cl enti:re plus 1 qui est c9oisie. #i c(est la pre i:reL c(est 0 +ro. ;n acc:de au3 l ents d(un ta4leau ' l(aide des croc9ets M c et d N. ;n place entre ces croc9ets la cl enti:re ou la c9a-ne.
,&ar=array!-=B-7B-LB06BN#; echo ,&arJ=M; // -= echo ,&arJ6M; // -L ,tab=array!"a"=>-0B"nom"=>"toto"B"pipo"B-LBA=>7#; echo ,tabJ=M; // pipo echo ,tabJ-M; // -L echo ,tabJ2a2M; // -0 echo ,tabJ2nom2M; // toto
S. ROHAUT
Page 7/93
/(utilisation de la fonction array n(est pas o4ligatoire et on peut dclarer un ta4leau ' la vole.
,tab0J-M=0; ,tab0JM=Q; // e>ui&aut ,tab0J0M=Q ,tab0J2test2M=2Ra cha;ne2;
t9odes prcdentes.
,tab=array!"un"=>array!"riri"B-=>" i i"B0=>2loulou2#B0=>array!-B0B6#Barray!2un2B 2deu"2B2trois2##; echo ,tabJ2un2MJ=M; // riri echo ,tabJ0MJ-M; // 0 echo ,tabJ6MJ0M; // trois ,tab0J2un2MJ2deu"2M=2test2; // cr** un tableau . deu" dimensions
Il e3iste une fonction tr:s pratique pour lister le contenu d(un ta4leauL ou pour 2 oreach!#.
,tab=array!-=>2un2B0=>2deu"2B6=>2trois2#; oreach!,tab as ,&aleur# $ echo ",&aleur In"; // a iche un deu" trois ' oreach!,tab as ,cle => ,&aleur# $ echo ",cle => ,&aleurIn"; // a iche - => unB 0 => deu"B 6 => trois '
3. .* )a variable ob+et
/es o4,ets se crent avec l(instruction class. Pour crer une instace de l(o4,et il faut utiliser le cl neS.
class test $ unction a iche1hello!# $ echo "Hello !"; ' ' ,obT=neS test; ,obTK>a iche1hello!#;
ot
une constante ne co ence pas par un [ une constante est accessi4le depuis n(i porte quel endroit du code une constante ne peut pas Itre redfinie une constante ne peut contenir d(un scalaire @entierL 4oolenL c9a-neL dou4leB.
S. ROHAUT
Page 8/93
S. ROHAUT
Page 9/93
% )es o,rateurs
4.1 /a pr den e des oprateurs
$(est l(ordre dans lequel les valeurs doivent Itre analyses. )insi l(e3pression 4 R 3 e 7 n(est pas lue de gauc9e ' droite et ne retourne pas 4. ais 2". 7oici le ta4leau des priorits des oprateurs par ordre croissant de priorit 2 Associativit gauc9e gauc9e gauc9e gauc9e droite gauc9e gauc9e gauc9e gauc9e gauc9e gauc9e gauc9e -prateurs L or 3or and print \ R\ J\ e\ <\ .\ P\ ]\ f\ g\ h\ __\XX\ *2 ff ]] f g ]
nonJassociative \\ U\ \\\ U\\ nonJassociative _ _\ X X\ gauc9e gauc9e gauc9e droite droite __ XX RJ. e<P U h RR JJ @intB @dou4leB @stringB @arrayB @o4,ectB i c
nonJassociative ne>
sur la gauc9eB et __ @[a __ [4 dcalage de [4 4its sur la droiteB. Un dcalage de 4its sur la gauc9e quivaut ' une ultiplication par deu3L un dcalage sur la droite ' une division par deu3.
Il y a aussi l(oprateur ternaire M *2 N e3pr1*e3pr22e3pr3 #i e3pr1 est vrai alors e3pr2 sinon e3pr3.
de varia4le.
e en P8D/. )insi 2
S. ROHAUT
Page 2 /93
S. ROHAUT
Page 22/93
)a notion d-ex,ression
8n PHPL une e3pression peut Itre rsu e en M tout ce qui a une valeur N. $eci ditL on re arque vite que en PHP tout ou presque est une e3pression. Une varia4le ou une constante se voient affects des valeurs. $ette valeur est donc l(e3pression de la varia4le ou de la constante. Fous pouvons rsu er en disant qu(une e3pression reprsente tout ce qui peut Itre valu. ;n ne peut valuer que les valeurs... Une fonction peut aussi Itre une e3pression si elle retourne une valeur. ;n dit gnrale ent qu(une fonction a retourn telle valeur. Une co paraison est aussi une e3pression 2 elle retourne une valeur 4oolenne. Un calcul est aussi une e3pressionL puisqu(une valeur est retourneL affecteL calcule. PHP est orient e3pression ce qui fait que tout ou presque en PHP est une e3pression. PHP c9erc9e donc ' dco poser tout ce qui est possi4le en e3pressions ' valuerL pour opti iser ses traite ents. 7oici quelques e3e ples.
,a=0;
;n distingue au pre ier coup d(oeil deu3 valeurs 2 la varia4le [a et la valeur 2L la varia4le [a tant ise ' ,our avec la valeur 2. ;r en interne il y a une troisi: e valeur qui rentre en ,eu2 la valeur de l(assignationL ici elleJ I e assigne ' 2. $ette ligne signifie en fait 2 M [a\2 est une e3pression qui vaut 2 N.
,b=,a=0;
/es assignations sont analyses de droite ' gauc9e. Ici nous avons l(e3pression [a\2 qui vaut donc 2. [4 vaut donc 2 aussi. $(est plus rapide ' crire et ' e3cuter que [a\2K [4\2K
,a=,a<6;
PHP value d(a4ord l(e3pression [aR3 soit la valeur de [a incr ente de 3L et assigne la nouvelle valeur ' [a.
,a<=6;
/e rsultat est le I eL ais il est plus rapide car [a n(est valu qu(une seule fois. ;n peut en arriver ' avoir des e3pressions surprenantes 2
,a=0; ,b=,a<=6;
/a varia4le [a est incr ente de 3 et vaut donc ". /(e3pression [aR\3 vaut ". [4 se voit assign la valeur ". /(e3pression vaut donc ". Derni:re c9ose 2
,a?,b9,c
si l(e3pression [a est vraiL l(e3pression [4 est valueL sinon l(e3pression [c est value.
S. ROHAUT
Page 23/93
iche 0
S. ROHAUT
Page 24/93
Il y a aussi le M elseif NL co 4inaison du if et du else. /e elseif en un ot peut aussi s(crire en deu3 ots 2 le rsultat est le I e. ;n peut crire des elseif en c9a-ne. /e pre ier dont l(e3pression est vrai est e3cut.
8 !e"pression# commande ou $ bloc de commandes ' elsi !e"pression# commande ou $ bloc de commandes ' elsi !e"pression# commande ou $ bloc de commandes ' ...
e co
ande.
;n peut aussi utiliser une synta3e alternative 2 on ouvre le 4loc @,uste apr:s le ifL le else ou le elseifB avec les M 2 N deu3 pointsL et on fer e l(instruction avec M endif N.
<?php i !,a == 7#9 print "a = 7"; print "..."; elsei !,a == Q#9 print "a = Q"; print "!!!"; else9 print "a ne &aut ni 7 ni Q"; endi ; ?>
oins une foisL car l(e3pression conditionnelle est teste en fin de 4oucle.
do $ bloc de commandes ' Shile!e"pression#
$.3 for
/e M for N du PHP est identique au M for N du $.
or!e"pr-;e"pr0;e"pr6# commande ou $ bloc de commandes '
M e3pr1 N est e3cute ' la pre i:re entre dans la 4oucle. M e3pr2 N est e3cute ' c9aque d4ut d(itration ,usqu(' ce que l(e3pression soit fausse auquel cas on sort de la 4oucle. M e3pr3 N est e3cute ' la fin de l(itration. /(usage 9a4ituel d(une telle 4oucle est de placer l(tat initial en e3pr1L la condition de sortie en e3pr2 et le calcul en e3pr3. 6ais on peu effectuer toutes sortes de c9oses.
// de - . or !,i = // in ini or!;;# // de - . or !,i = -= -; ,i <= -=; print ,iB ,i<<# -= -; ,i <= -=; print ,iB ,i<<# ;
$.4 forea 7
/a 4oucle M foreac9 N est peutJItre l(une des plus intressantes pour la anipulation de ta4leau3 ou de rsultats de requItes #E/. 8lle per et de lister les ta4leau3. 8lle dispose de deu3 synta3es.
oreach!array1e"pression as ,&alue# commandes oreach!array1e"pression as ,5ey => ,&alue# commandes
/a pre i:re synta3e rcup:re les l ents du ta4leau un par unL squentielle ent. /a valeur de l(l ent courant du ta4leau est place dans [value. /a seconde synta3e est presque identiqueL sauf qu(en plus la cl @l(inde3B de l(l ent actuel est place dans [?ey. )ttention 2 odifier la valeur de [value @ou de [?eyB ne odifie pas le ta4leau car cette 4oucle travaille sur une copieL pas une rfrence. Par contre dans le second casL co e on dispose de la clL rien n(e pIc9e d(assigner quoi que ce soit ' l(l ent courant. De arque 2 un appel ' foreac9 M re 4o4ine N auto atique ent le ta4leau ' son pre ier l ent. 6ais pas dans les autres 4ouclesL il faut alors utiliser M reset N.
reset!,arr#; Shile !list!B ,&alue# = each !,arr## $ echo "/aleur9 ,&alue<br>In"; '
S. ROHAUT
Page 26/93
' ,a = array ! "un" => -B "deu"" => 0B "trois" => 6B "di"Ksept" => -L #;
'
$.$ s:it 7
/e M s>itc9 N est quivalent ' une srie de if et per et de co parer avec un grand no 4re de valeurs.
sSitch !,i# $ case =9 print "i brea5; case -9 print "i brea5; case 09 print "i brea5; de ault9 print "i '
/e s>itc9 s(arrIte ' la pre i:re e3pression case vraie puis e3cute le code suivant dans l(ordre indiquL ,usqu(' la pre i:re instruction 4rea?. #(il n(y a pas de 4rea?L tout le code ,usqu(' la fin du s>itc9 est e3cut. Dans l(e3e ple suivantL si [i vaut 0L tous les print seront affic9s U
sSitch !,i# $ case =9 print "i egale ="; case -9 print "i egale -"; case 09 print "i egale 0"; '
Fote+ aussi que le default doit intervenir en dernierL sinon il n(a aucun intrIt. 8nfin on peut e ployer une synta3e alternative avec M 2 N et M ends>itc9 N. S. ROHAUT Cours Programmation PHP Page 27/93
sSitch !,i#9 case =9 print "i egale ="; brea5; case -9 print "i egale -"; brea5; endsSitch
$.% return
$ontraire ent ' d(autres langagesL M return N n(est pas une fonction ais une instruction. Dans une fonctionL return sert ' sortir de celleJci et ' retourner une valeur. Dans un scriptL elle sort de celuiJci. )ttention cependant dans les scripts inclus @voir require et includeB 2 le return dans ce type de code consid:re qu(il sort de la fonction M require N ou M include N et donc ne sort pas du script ou de la fonction dans lesquels ce code a t inclus U $o e return est un l ent du langage et pas une fonction il y a pas 4esoin d(utiliser les parent9:ses.
S. ROHAUT
Page 28/93
1 )es $onctions
%.1 Synta8e et porte
7oici la synta3e d(une fonction.
unction onc!,arg-B ,arg0B ,arg6B ...B ,argn# $ bloc de commandes return ,&aleur
'
Une fonction n(a pas 4esoin d(Itre dclare avant d(Itre utilise @sauf si vous voule+ rester co pati4le avec PHP3BL du o ent qu(elle appara-t dans le script. Il y a cependant deu3 e3ceptions 2 si la fonction est conditionnelleL c(est ' dire dclare dans un ifL ou si la fonction est dclare dans une autre fonction. Dans le pre ier cas elle sera inconnue du reste du code tant que la condition du if n(est pas vraie. Dans le second cas elle ne sera connue que quand la pre i:re fonction sera e3cute. 7oici un e3e ple tir du anuel. Pour le pre ier cas 2
,ma5e oo = true; /( 8mpossible d2appeler oo!# iciB car cette Rais nous pou&ons utiliser bar!# (/ bar!#; i ' onction n2e"iste pas.
!,ma5e oo# $ unction oo !# $ echo "\e n2e"iste pas tant >ue le programme n2est pas pass* ici.In";
'
'
'
/( 8mpossible d2appeler bar!# ici car il n2e"iste pas. (/ oo!#; /( RaintenantB nous pou&ons appeler bar!#B car l2utilisation de accessible. (/ bar!#; oo!# l2a rendu
%.2 (rguments
;n peut passer autant d(argu ents que sou9ait ' une fonction PHPL de tous types. /es argu ents S. ROHAUT Cours Programmation PHP Page 29/93
sont spars par des virgules. Par dfaut ils sont passs par copie.
unction a iche!,msg# $ echo ,msg;
'
Il est possi4le de passer des argu ents par rfrenceL on peut donc en c9anger la valeur ' l(intrieur de la fonction. Pour cela on ra,oute un M ] N devant l(argu ent. ;n peut passer ponctuelle ent une varia4le par rfrence en plaWant un M ] N devant son no lors de l(appel de la fonction.
unction modi !@,msg# $ ,msg="coucou";
;n peut aussi dfinir des valeurs par dfaut valeurs par dfaut doivent Itre en dernier.
'
8nfin on peut utiliser un no 4re varia4le d(argu ents avec les fonctions funcAnu AargsL funcAgetAarg et funcAgetAargs.
unction oo!# $ ,numargs = unc1num1args!#; echo "Oombre d2arguments9 ,numargsIn"; oo !-B 0B 6#; // a iche 2Oombre d2arguments9 62
'
S. ROHAUT
Page 3!/93
I aginons l(appel d(une page test.p9p par une UD/ co 9ttp2<<>>>. onsite.co <test.p9p*id\1 Ici on trans et une varia4le via une UD/ et donc la dans un code PHP on peut donc faire 2
<?php echo ,1_DTJ2id2M; echo ,1CD^:D3TJ2id2M; ?>
e ceci 2
[A%85 ne contiendra que les varia4les de type %85. [AP;#5 ne contiendra que les varia4les de type P;#5. [AD8EU8#5 contient les varia4les de type P;#5 et %85 ais aussi les varia4les de coo?ies. Il est aussi possi4le de procder autre ent en rcuprant le no du c9a p directe ent en tant que varia4le sans passer par un ta4leau. Pour cela il faut vrifier dans le fichier php.ini ue la valeur re"ister&"lobals est % on. Dans ce cas les no s des c9a ps de for ulaire seront les S. ROHAUT Cours Programmation PHP Page 3 /93
no s des varia4les 2
<?php echo ,username; echo ,email; ?>
P < p 2 varia4les de type P;#5 % < g 2 varia4les de type %85 $ < c 2 varia4les de type coo?ie
;n peut cu uler l(ense 4le ais attention ' l(ordre U /e second para :tre est le prfi3e qu(on sou9aite donner au no des varia4les qu(on va rcuprer. 7oici deu3 e3e ples 2
<?php import1re>uest1&ariables!"p"#; echo ,username; ?> <?php import1re>uest1&ariables!"]"B"]ost1"#; echo ,]ost1username; ?>
;n peut aussi passer par la fonction M e3tract N qui per et d(e3porter un ta4leau en varia4les. )insi pour le ta4leau [AP;#5 2
<?php e"tract!,1]43T#; echo ,username; ?>
S. ROHAUT
Page 32/93
<input type="hidden" name="action" &alue="submitted"> <input type="submit" name="submit" &alue="submit me!"> </ orm>
Dans l(e3e ple prcdent si par e3e ple on slectionne plusieurs vins @e3 2 4ordeau3 et 4eau,olaisB on aura dans [vinc0d 4ordeau3 et [vinc1d 4eau,olais.
S. ROHAUT
Page 33/93
5 6ate et 'eure
..1 /o alisation
/e for at de date et d(9eure @for at et langueB est dpendant de l(environne ent d(e3cution du code PHP. %nrale ent la plupart des serveurs >e4 incorporant PHP sont configurs en langue anglaise avec une gestion des infor ations de localisation en anglais. Il peut Itre prfra4le de passer en franWais pour un site francop9one ce qui si plifie large ent la tkc9e. ;n peut effectuer cela avec la fonction M setlocale N. 7oici deu3 e3e ples 2 un sous F5<2000 et un autre sous /inu3.
i !substr!php1uname!#B =B L# != "WindoSs"# $ setlocale!G%1T8RDB" r1ECUeuro"#; ' else $ setlocale!G%1T8RDB" r"#; '
Dans cet e3e pleL nous vrifions d(a4ord ' quel syst: e nous avons ' faire @fonction p9pAuna eB puis en fonction du rsultat nous passons en localisation franWaise selon deu3 t9odes. )pr:s ce c9ange entL les appels au3 fonctions retournant des ,ours de la se aine ou des ois le feront en franWais.
a J `a ` @ atinB ou `p ` @apr:sJ idiB ) J `)6` @ atinB ou `P6` @apr:sJ idiB 1 J Heure Internet #>atc9 d J Oour du oisL sur deu3 c9iffres @ventuelle ent avec un +roB 2 `01` ' `31` D J Oour de la se aineL en trois lettres @et en anglaisB 2 par e3e ple `Cri` @pour 7endrediB C J 6oisL te3tuelL version longueK en anglaisL i.e. `Oanuary` @pour OanvierB g J HeureL au for at 129L sans les +ros initiau3 i.e. `1` ' `12` % J HeureL au for at 249L sans les +ros initiau3 i.e. `0` ' `23` 9 J HeureL au for at 129L `01` ' `12` H J 9eureL au for at 249L `00` ' `23` i J 6inutesK `00` ' `".` I @i a,usculeB J `1` si l(9eure d(t est activeL `0` si l(9eure d(9iver . ois sans les +ros initiau32 `1` ' `31` , J Oour du
S. ROHAUT
Page 34/93
l J @(/( inusculeB J Oour de la se aineL te3tuelL version longueK en anglaisL i.e. `Criday` @pour 7endrediB / J 1oolen pour savoir si l(anne est 4isse3tile @`1`B ou pas @`0`B J 6oisK i.e. `01` ' `12` 6 J 6oisL en trois lettres @et en anglaisB 2 par e3e ple `)pr` @pour )vrilB n J 6ois sans les +ros initiau3K i.e. `1` ' `12` ; J Diffrence d(9eures avec l(9eure de %reen>ic9L e3pri e en 9euresK i.e. `R0200` r J Cor at de date DC$ !22K i.e. `59uL 21 Dec 2000 1&201207 R0200` @a,out en PHP 4.0.4B s J #econdesK i.e. `00` ' `".` # J #uffi3e ordinal d(un no 4reL en anglaisL sur deu3 lettres 2 i.e. `t9`L `nd` t J Fo 4re de ,ours dans le 5 J Cuseau 9oraire de la ois donnL i.e. `2!` ' `31` ac9ine K i.e. `685`
U J #econdes depuis une poque > J Oour de la se aineL nu riqueL i.e. `0` @Di anc9eB to `&` @#a ediB T J Fu ro de se aine dans l(anne I#;J!&01 2 les se aines co PHP 4.1.0B H J )nneL 4 c9iffresK i.e. `1...` y J )nneL 2 c9iffresK i.e. `..` + J Oour de l(anneK i.e. `0` ' `3&"` Q J Dcalage 9oraire en secondes @i.e. `J43200` ' `43200`B encent le lundi @a,out en
5out autre caract:re peut Itre e ploy et ne sera pas interprt. #i vous dsire+ e ployer l(un de ces caract:resL il faut le verrouiller avec un antislas9. ATT./T0-/ A!.1 1.TT. 2-/1T0-/ L. 3.SULTAT .ST ./ A/4LA0S. ;n peut rcuprer le ti esta p actuel avec la fonction M time N. /a co effet que la prcdente 2
echo date!"d/m/`"B time!##; // =Q/=-/0==A
ande suivante a la
I e
Pa J no P) J no P4 J no P1 J no
a4rg du ,our de la se aine @localB. co plet du ,our de la se aine @localB. a4rg du co plet du ois @localB. ois @localB.
Pc J reprsentation prfre pour les dates et 9euresL en local. P$ J nu ro de si:cle @l(anneL divise par 100 et arrondie entre 00 et ..B Cours Programmation PHP Page 35/93
S. ROHAUT
Pd J ,our du
ois en nu rique @intervalle 01 ' 31B ois. /es c9iffres sont prcds d(un espace @de ( 1( ' (31(B
PD J identique ' P <Pd<Py Pe J nu ro du ,our du P9 J identique ' P4 PH J 9eure de la ,ourne en nu riqueL et sur 24J9eures @intervalle de 00 ' 23B PI J 9eure de la ,ourne en nu riqueL et sur 12J 9eures @intervalle 01 ' 12B P, J ,our de l(anneL en nu rique @intervalle 001 ' 3&&B P J ois en nu rique @intervalle 1 ' 12B inute en nu rique P6 J
Pn J ne>line c9aracter Pp J soit ja ( ou jp ( en fonction de l(9eure a4solueL ou en fonction des valeurs enregistres en local. Pr J l(9eure au for at a. . et p. . PD J l(9eure au for at 249 P# J secondes en nu rique Pt J ta4ulation P5 J l(9eure actuelle @gal ' PH2P62P#B Pu J le nu ro de ,our dans la se aineL de 1 ' 7. @1 reprsente /undiB PU J nu ro de se aine dans l(anneL en considrant le pre ier di anc9e de l(anne co pre ier ,our de la pre i:re se aine. e le
P7 J le nu ro de se aine co e dfini dans l(I#; !&0121.!!L sous for e dci aleL de 01 ' "3. /a se aine 1 est la pre i:re se aine qui a plus de 4 ,ours dans l(anne couranteL et dont /undi est le pre ier ,our. PT J nu ro de se aine dans l(anneL en considrant le pre ier lundi de l(anne co pre ier ,our de la pre i:re se aine P> J ,our de la se aineL nu riqueL avec Di anc9e \ 0 P3 J for at prfr de reprsentation de la date sans l(9eure PG J for at prfr de reprsentation de l(9eure sans la date Py J l(anneL nu riqueL sur deu3 c9iffres @de 00 ' ..B PH J l(anneL nu riqueL sur quatre c9iffres PQ J fuseau 9oraireL ou no ou a4rviation PP J un caract:re jP( littral e le
S. ROHAUT
Page 36/93
`9ours` J 9eures ` day` J ,our du ` on` J ois `>day` J ,our de la se aineL nu rique. 02 di anc9e ,usqu(' &2 sa edi oisL nu rique `year` J anneL nu rique `yday` J ,our de l(anneL nu riqueK i.e. `2..` `>ee?day` J ,our de la se aineL te3te co plet @en anglaisBK i.e. `Criday` ` ont9` J oisL te3te co plet @en anglaisBK i.e. `Oanuary`
,auTourdhui = getdate!#; ,mois = ,auTourdhuiJ2month2M; ,mTour = ,auTourdhuiJ2mday2M; ,annee = ,auTourdhuiJ2year2M; echo ",mTour/,mois/,annee";
`t Asec` J secondes `t A in` J inutes ois `t A9our` J 9eure `t A day` J ,our du `t A on` J ois de l(anne
`t Ayear` J )nneL inco pati4le an 2000 `t A>day` J Oour de la se aine `t Ayday` J Oour de l(anne `t Aisdst` J 8stJce que l(9eure d(9iver a pris effet*
S. ROHAUT
Page 37/93
10 :yS;)
10.1 Prsentation
6y#E/ est un #%1DD 2 M #yst: e de %estion de 4ase de Donnes Delationnel N qui se dfinit luiJ I e co e tant M /a 4ase de donnes ;pen #ource la plus populaire au onde N. Dien que Wa. 8t c(est vrai U 8dit par la socit 6y#E/ )1L 6y#E/ est un produit ;pen #ource li4re d(utilisation sous licence %P/ pour les pro,ets li4res. $ependant une licence co erciale est ncessaire dans les autres casL nota ent si on sou9aite redistri4uer 6y#E/ avec un produit non li4re ou si on sou9aite un support tec9nique. /a version de production actuelle de 6y#E/ est la version 4 @4.0.17 ' l(criture de ce supportBL ais la grande a,orit des serveurs des 94ergeurs sont encore dans les derni:res versions de 6y#E/ 3.23 @3.23."!B. /a future version actuelle ent en dveloppe ent est la ".0.0 et n(est surtout pas ' utiliser en production. /es principales qualits de 6y#E/ sont sa si plicit et sa rapidit. #on principale dfaut est le anque de fonctionnalits dites avances @dans les versions prcdentesB 2 cl trang:resL procdures stoc?esL triggers et selects i 4riqus nota ent. 6ais cela ne doit pas occulter sa puissance avec l(a,out de fonctionnalits avances co e une synta3e #E/ tendue @replaceL li itL deleteBL les inde3 de rec9erc9e M fullte3t N per ettant de crer des oteurs de rec9erc9eL ... /a proc9aine version sta4le @".0B co 4lera les lacunes des prcdentes versions avec le support co plet de la synta3e #E/ )F#IJ...
S. ROHAUT
Page 38/93
10.2.2 :ys0l&&
6ysql$$ @6y#E/ $ontrol $enterB est le frontJend grap9ique officiel de 6y#E/L dvelopp par la I e socit. 1as sur e tool?it EtL il est disponi4le sous Tindo>sL Uni3 @linu3B et 4ient=t sur 6ac;#. Il per et l(ad inistration du serveurL la gestion des 4ases et ta4lesL l(e3cution de requItes #E/ interactives avec coloration synta3ique...
Une fois l(utilisateur crL et si plusieurs 4ases sont prsentesL on peut affiner les droits pour c9acune des 4ases. /a liste des utilisateurs et de leurs droits sur une 4ase est affic9 en 9aut. 8n c9oisissant M odifier N on peut affiner la slection nota ent en passant par M autres privil:ges N 2 droits sur des 4asesL ta4les ou I e colonnes.
Pour c9aque entier on peut a,outer le ot cl M UF#I%F8D N 2 non sign. )ttention au type 1I%IF5 qui a des li itations @voir docu entation 6y#E/B. 8ntre parent9:ses 2 les valeurs UF#I%F8D. Il est possi4le de fournir une prcision d(affic9age @no 4re de c9iffresB. Par e3e ple une taille de 2 pour un 5IFHIF5 quivaut ' une valeur de 0 ' ...
5IFHIF5 2 J12! ' 127 @0 ' 2""B #6)//IF5 2 J327&! ' 327&7 @0 ' &""3"B 68DIU6IF5 2 J!3!!&0! ' !3!!&07 @0 ' 1&77721"B IF5 ou IF58%8D 2 J21474!3&4! ' 21474!3&47 @0 ' 42.4.&72."B 1I%IF5 2 J.22337203&!"477"!0! ' .22337203&!"477"!07 @0 ' 1!44&74407370.""1&1"B
C/;)5 2 no 4re en virgule flottante D;U1/8L D;U1/8 PD8$I#I;FL D8)/ 2 no 4re en virgule flottante dou4leJprcision. D8$I6)/L D8$L FU68DI$ 2 spcialL les valeurs sont M unpac?ed N 2 c(est une c9a-ne te3te
S. ROHAUT
Page 4!/93
$H)D 2 une c9a-ne de caract:re dont la taille peut Itre de 1 ' 2"" caract:res. /a taille est dfinie ' la cration de la ta4le. Dans la ta4leL le c9a p prend effective ent le no 4re de caract:res indiquL I e si la taille relle est infrieure. 7)D$H)D 2 une c9a-ne de caract:re dont la taille a3i ale peut Itre de 1 ' 2"" caract:res ais dont la longueur peut Itre varia4le. 6y#E/ stoc?e en plus un octet contenant la longueur de la c9a-ne. $(est une opti isationL une c9a-ne de 100 caract:res va donc prendre 100R1 octets en place dans la ta4le. ;n peut ra,outer la dfinition 1IF)DH. Par dfaut les c9a ps $H)D et 7)D$H)D sont tris sans tenir co pte de la casse. /(attri4ut 1IF)DH per et de trier en tenant co pte de la casse selon la ac9ine. )vec ces c9a psL les espaces finau3 sont suppri s.
10.5.2.2 1ypes 1@B1
/es types 58G5 et 1/;1 per ettent de stoc?er des quantits varia4les de te3te selon leurs dfinitions. Ici M / N est la longueur du te3te 2
5IFH@1/;1<58G5B 2 /R1 octets avec /_2g! 1/;1<58G5 2 /R2 octets avec /_2g1& 68DIU6@1/;1<58G5B 2 /R3 octets avec /_2g24 /;F%@1/;1<58G5B 2 /R4 octets avec /_2g32 ani:re identique ais il faut respecter les rIgles suivantes 2
/ors de trisL un c9a p 1/;1 tient co pte de la casseL pas un c9a p 58G5. ;n ne peut pas faire de rec9erc9e CU//58G5 sur un c9a p de type 1/;1. Il faudra utiliser les c9a ps 58G5. /es c9a ps de type 58G5 et 1/;1 ne prennent pas de valeurs par dfaut. /es espaces finau3 ne sont pas suppri s.
Un c9a p de type 8FU6 ne peut contenir qu(une c9a-ne de te3te par plusieurs prdfinies ' la cration de la ta4le. 7oici un e3e ple 2
%CDFTD TFWGD test ! id int O4T O:GG auto1incrementB c1enum enum!2oui2B2non2#B ]C8RFC` aD` !id# #;
S. ROHAUT
Page 4 /93
ettre autre
Dans ce cas une c9a-ne vide est insre ' la place. #i le c9a p est dclar F;5 FU//L la valeur par dfaut devient la pre i:re de la liste d(nu ration.
10.5.2.4 1ype S@1
Un type set resse 4le un peu au type 8FU6 sauf que le c9a p peut avoir une ou plusieurs valeurs par i une liste prdfinie ' la cration de la ta4le. Dans le type 8FU6 une seule valeur est autorise dans le c9a p. )vec le type #85L plusieurs valeurs spares par des espaces sont autorises.
%CDFTD TFWGD test ! id int!--# O4T O:GG auto1incrementB c1set set!2oui2B2non2#B ]C8RFC` aD` !id# #; insert into test !c1set# &alues !2ouiBnon2#; insert into test !c1set# &alues !2nonBoui2#; insert into test !c1set# &alues !2oui#;
on effectue une rec9erc9e d(un l ent #85 soit avec /IV8L soit avec la fonction CIFDAIFA#85 2
select ( select ( rom test Shere c1set G8aD 2bouib2; rom test Shere E8O)18O13DT!2oui2Bc1set#>=;
6y#E/L dans les co paraisons nota entL essaie M d(interprter N le for at de date qu(on lui passe. $(est le cas pour les co paraisons entre des c9a ps de type date et des c9a ps te3te. Dans la plupart des cas le rsultat sera celui attendu ais attention tout de I e au for alis e. /es dates doivent Itre donnes de prfrence au for at anneJ oisJ,our. /(anne doit tou,ours appara-tre en pre ier. Dans le cas d(un anneJ,ourJ ois attention 2 6y#E/ ne peut pas deviner si 2004J02J0" est le " fvrier ou le 2 ai... #i une date est utilise dans un calcul nu riqueL elle est convertie en no 4re @ti esta pB. #i une valeur illgale est trans iseL c(est la valeur +ro @0B qui est retenue. /a valeur +ro dpend du type de c9a p. /a gestion de l(an 2000 se fait ainsi 2
Dans le cas d(annes ' 4 c9iffresL aucun souci. Il vaut Cours Programmation PHP
S. ROHAUT
Dans le cas d(une anne ' deu3 c9iffesL 00J&. sont converties en 2000J20&.L 70J.. sont converties en 1.70J1....
))))J66JOO HH2662## ou ))J66JOO HH2662##. /es sparateurs peuvent Itre n(i porte quoi 2 ))))<66<OO HH.66.## est vala4le ))))J66JOO ou ))J66JOOL I e re arque pour les sparateurs.
))))66OOHH66## ou ))66OOHH66## si la c9a-ne ou le no 4re ont une signification en tant que date ))))66OO ou ))66OOL I e re arque
/e type D)585I68 per et de stoc?er la date et l(9eure sous le for at ))))J66JOO HH2662##. #on +ro est donc 0000J00J00 00200200.
10.5.3.3 1ype D(1@
)vec ce type seule la date est stoc?e au for at ))))J66JOO. #on +ro est 0000J00J00.
10.5.3.4 1ype 1#2@S1(2P
/e type 5I68#5)6P per et de stoc?er i plicite ent et auto atique ent un ti esta p @9eure couranteB lors d(un enregistre ent de donnes avec IF#8D5 ou UPD)58. #i une ta4le dispose d(un c9a p 5I68#5)6PL lors de l(a,out ou de la ise ' ,our d(un celuiJci sera auto atique ent is ' ,our pour cette ligne d(enregistre ent. /a colonne n(a pas 4esoin d(Itre e3plicite ent spcifie. #i on la spcifieL alors on peut lui ettre n(i porte quelle valeur.
%CDFTD TFWGD test ! id int!--# O4T O:GG auto1incrementB c1ts timestamp!-A# O4T O:GGB c1t"t &archar!-=# O4T O:GG de ault 22B ]C8RFC` aD` !id# # insert into test !c1t"t# &alues!2toto2#; select c1ts rom test;
0==A=--0-A666N
;n re arque que le rsultat retourn par 6y#E/ sur la colonne 5I68#5)6P n(est pas une valeur ti esta p Uni3 @4ien que telle en interneB ais une valeur for ate. Par dfaut un 5I68#5)6P S. ROHAUT Cours Programmation PHP Page 43/93
retourne une valeur @nu riqueB sur 14 caract:res. ;n peut c9oisir cette taille ' la cration de la ta4le 2
5I68#5)6P ou 5I68#5)6P@14B 2 ))))66OOHH66## 5I68#5)6P@12B 2 ))66OOHH66## 5I68#5)6P@10B 2 ))66OOHH66 5I68#5)6P@!B 2 ))))66OO 5I68#5)6P@&B 2 ))66OO 5I68#5)6P@4B 2 ))66 5I68#5)6P@2B 2 )) ois et le ,our I e avec un ti esta p de 4 ou
)vec tous ces for atsL spcifie+ tou,ours l(anne le de 2 sinon la date sera invalide.
10.5.3.5 1ype 1#2@
/e type 5I68 peut Itre utilis pour stoc?er une infor ation 9oraire. #on for at est HH2662## ou HHH2662## et la valeur peut Itre ngative. /es valeurs a3i ales possi4les vont de J!3!2".2". ' !3!2".2".. 5I68 ne sert pas qu(' stoc?er une 9eure de la ,ourne ais un intervalle ou une dure ce qui e3plique la plage 9oraire. ;n y acc:de co e ceci 2 D HH2662##.fraction 2 D est le ,our. /a fraction n(est pas stoc?e. ;u encore 2 HH2662##L HH266L D HH2662##L D HH266L D HHL D ##L HH66##L .##L 66##L ...
10.5.3.$ 1ype D@(A
/e type H8)D stoc?e unique ent l(anneL sur une plage allant de 1.01 ' 21"". /(interprtation des valeurs ' deu3 c9iffres et sou ise ' l(interprtation de la gestion de l(an 2000.
%CDFTD TFWGD J8E O4T Dc83TM nom1table ! champ- T`]D JO4T O:GGZ O:GGM J)DEF:GT &aleur1de autM JF:T418O%CDRDOTM J]C8RFC` aD`MB ...B ]C8RFC` aD`!nom1champ#B aD` JnomM !col-B col0B ...#B 8O)Dc JnomM !col-B col0B ...#B :O8^:D J8O)DcM JnomM !col-B col0B ...#B E:GTDcT J8O)DcM JnomM !col-B col0B ...# # T`]D=type1table;
Fote+ que
S. ROHAUT
Page 44/93
V8H et IFD8G sont des synony es. Un PDI6)DH V8H est un inde3 UFIEU8 dont toutes les colonnes doivent Itre F;5 FU// Un PDI6)DH V8H peut contenir plusieurs colonnes. Dans ce casL PDI6)DH V8H ne doit pas appara-tre au niveau de la dfinition d(une colonne ais la synta3e PDI6)DH V8H@colsL...B doit Itre utilise Il ne peut y avoir qu(un seul inde3 PDI6)DH V8HL ais plusieurs inde3 UFIEU8.
#i une application veut o4tenir le PDI6)DH V8H d(une ta4le et qu(il n(e3iste pasL alors 6y#E/ retournera le pre ier inde3 UFIEU8 trouv. #i on ne donne pas de no s ' un inde3L celuiJci est gnr auto atique ent en prenant le no de la pre i:re colonne de l(inde3 suivi d(un suffi3e nu rique @colA1L colA2L ...B. 1ien que cela soit dconseillL on peut ta4lir un inde3 sur une colonne 58G5 ou 1/;1. 6ais dans ce cas il faut o4ligatoire ent spcifier une longueur d(inde3.
;n peut aussi utiliser les clauses M ;F D8/858 $)#$)D8 N et M ;F D8/858 #85 FU// N. Euelques r:gles sont ' respecter pour l(utilisation 2 S. ROHAUT Cours Programmation PHP Page 45/93
)vec un ;F D8/858 $)#$)D8L si une ligne de la ta4le parente est suppri eL les lignes correspondantes ' la cl trang:re sont auto atique ent suppri es dans la ta4le fille. Dans l(e3e pleL une suppression d(un enregistre ent de la ta4le M parent N suppri e tous les enregistre ents de la ta4le M c9ild N dont le M parentAid N est gal au M id N de l(enregistre ent de la ta4le M parent N suppri . )vec un ;F D8/858 #85 FU//L les enregistre ents fils ne sont pas suppri sL colonnes de la cl trang:re @ici parentAidB prennent la valeur FU//. Un inde3 doit e3ister pour la cl parente et la cl fille. ais les
Dans ses derni:res versions @3.23.23 et suprieuresB 6y#E/ per et l(inde3ation et la rec9erc9e sur un ou plusieurs c9a ps de type 58G5. ;n peut ainsi crer des oteurs de rec9erc9es tr:s rapide ent. Pour Wa il faut crer un inde3 M 2ULLT.5T N ou en 5e3te 8ntierL o^ c9aque ot du c9a p te3te est en fait inde3. /es inde3 CU//58G5 ne fonctionnent qu(avec des c9a ps de type 58G5 @pas 1/;1B ou 7)D$H)D et sur des ta4les de type 6yI#)6 unique ent. 7oici co ent crer un inde3 CU//58G5. #i la ta4le e3iste d,' 2
%CDFTD E:GGTDcT 8O)Dc t- on 1message !suTetBte"te#;
;n peut prciser une ou plusieurs colonnes dans ce genre d(inde3. 6ais ATT./T0-/ 2 lors de la rec9erc9e si on a cr un inde3 sur deu3 colonnesL on ne peut pas rec9erc9er sur une seule des deu3 colonnes en I e te ps... Dans ce cas il faudra crer plusieurs inde3 CU//58G5.
10.5.$.2 Ae 7er 7e
;n effectue une rec9erc9e avec les fonctions MAT1H*, et A4A0/ST*,. /a fonction 6)5$H per et de prciser sur quelles colonnes on effectue la rec9erc9eL et la fonction )%)IF#5 les ots rec9erc9s.
3DGD%T id1message n&idia2#; EC4R 1message WHDCD RFT%H!suTetBte"te# F_F8O3T!2linu"
$ette requIte va effectuer une rec9erc9e sur les ots (linu3( et (nvidia( dans les colonnes (su,et( et (te3te(. 8lle va retourner les id des essages correspondants avec les plus pertinents en pre ier @ceu3 qui correspondent le ieu3 ' la rec9erc9eB. $ela est dl au fait que 6)5$H est dans une clause TH8D8. /a pertinence est dter ine par 6y#E/ selon des crit:res @un peu opaques tout de I eB co e le no 4re de ots dans la ligneL le no 4re de ots uniques dans la ligneL la longueur de la ligne. $(est la fonction 6)5$H qui retourne la pertinence sous for e d(un flottant suprieur ou gale ' S. ROHAUT Cours Programmation PHP Page 46/93
+ro. /e +ro signifie une pertinence nulle @pas de correspondanceB. Plus la valeur est leve plus le rsultat est pertinent.
3DGD%T id1messageB RFT%H!suTetBte"te# F_F8O3T!2linu" n&idia2# EC4R 1message;
$ette requIte rcup:re en seconde colonne la valeur de la pertinence. $elleJci n(est pas classe car il n(y a pas de TH8D8 ou de ;DD8D 1H. 7oici une derni:re t9ode per ettant de rcuprer les c9a ps et la pertinence tris par ordre de pertinence.
3DGD%T id1messageBsuTet RFT%H !suTetBte"te# F_F8O3T !2linu" n&idia2# EC4R 1messages WHDCD RFT%H !suTetBte"te# F_F8O3T !2linu" n&idia2#;
/es versions 4.3 de 6y#E/ ont introduit la notion de rec9erc9e 4oolenne qui per et d(affiner ses rec9erc9es.
3DGD%T id1message EC4R 1message <n&idia <ati2 8O W44GDFO R4)D#; WHDCD RFT%H!suTetBte"te# F_F8O3T !2<linu"
R 2 le J 2 le
ot doit o4ligatoire ent Itre prsent dans c9aque enregistre ent retourn ot ne doit pas Itre prsent dans les enregistre ents retourns ot. Un Xtoto _titi valorise plus toto que titi dans la rec9erc9e ots ot est tout de I e pris en co pte avec une
X et _ 2 valorisation du
;n utilise la fonction mys l&connect*,. $ette fonction prend @au serveur @9ostna eB l(utilisateur et son ot de passe.
,b1host="s>l.t Kdata.net" ,b1user="toto"; ,b1pass="%reT-";
S. ROHAUT
Page 47/93
;n c9oisit une 4ase de donnes par dfaut avec la fonction mys l&select&db*,. 8lle prend au ini u un para :treL le no de la 4ase. /e second para :tre optionnel est une ressource retourne par ysqlAconnectL en cas de conne3ion sur plusieurs serveurs 6y#E/. Par dfautL la fonction prend la derni:re conne3ion ouverte @celle du dernier ysqlAconnect e3cutB.
,b1base="slyuni""; ,db=ms>l1select1db!,b1base#; i !!,db# die!"Drreur de conne"ion . la base ,b1base"#;
;n fer e une conne3ion ' 6y#E/ avec la fonction mys l&close*,. $ependant dans le cas de conne3ion non persistantes @voir ' ce pointB cette fonction n(est pas o4ligatoire car PHP fer e auto atique ent les conne3ions ' la fin d(un script.
mys>l1close!,cn"#;
;n e3cute une requIte #E/ avec la fonction mys l& uery*,. $ette fonction prend au oins un para :tre 2 une requIte #E/ sous for e de c9a-ne. /a fonction retourne C)/#8 en cas d(c9ec @colonne ou ta4le invalideL droits insuffisantsL pas de conne3ionL etcB. ATT./T0-/ 2 $e n(est pas parce que l(appel ' ysqlAquery@B n(a pas retourn d(erreur que la fonction retourne des lignes de rsultats dans le cas d(un #8/8$5 par e3e ple. 8nfinL la requIte #E/ ne doit pas finir par un pointJvirgule. /a requIte peut Itre de n(i porte quel type @selectionL ise ' ,ourL destructionL etcB. Dans le cas d(un #8/8$5L #H;TL 8GP/)IF ou D8#$DI18L ysqlAquery@B retourne une ressource qui sera ensuite utilise pour lire le rsultat.
,result=mys>l1>uery!"select id1messageB suTet rom 1message"#;
S. ROHAUT
Page 48/93
Dans le cas d(un D8/858L IF#8D5L D8P/)$8 ou UPD)58L on peut conna-tre le no 4re de lignes affectes @ odifiesB par la requIte ' l(aide de la fonction mys l&affected&ro6s*,.
,result=mys>l1>uery!"delete rom 1message Shere login=2toto2"#; i !,result# echo mys>l1a ected1roSs!#." Dnregistrements supprim*s";
Dans le cas d(un #8/8$5L le no 4re d(enregistre ents @lignesB retourn est o4tenu avec la fonction mys l&num&ro6s*,.
,result=mys>l1>uery!"select ( rom 1message Shere id1message > -="#; i !,result# echo mys>l1num1roSs!#.2 enregistrements retourn*s2#;
/a fonction la plus sy pat9ique pour rcuprer les enregistre ents apr:s l(e3cution d(une slection est mys l&fetch&array*,. 8lle prend au ini u un para :tre 2 une ressource rsultat @rsultat de ysqlAqueryB. 8lle retourne une ligne de rsultat sous for e d(un ta4leau associatifL d(un ta4leau inde3 ou des deu3. Par dfautL le ta4leau retourn est ' la fois associatif et inde3. Dans un ta4leau associatifL l(inde3 du ta4leau est le no du c9a p correspondant ' la colonne. Dans un ta4leau inde3L les colonnes sont nu rotes ' partir de +ro. Fote+ que ysqlAfetc9Aarray@B ne retourne qu(une seule ligne de rsultat. Pour passer ' la suivanteL il faut e3cuter la fonction ' nouveau. 8lle retournera C)/#8 quand il n(y aura plus de lignes ' lire.
,result=mys>l1>uery!"select suTetBte"te rom 1message Shere login=2toto2"#; ,tab=mys>l1 etch1array!,result#; // ]remi+re ligne du r*sultat echo ,tabJ2suTet2M.2B 2.,tabJ2te"te2M; // a iche les champs suTet et te"te echo ,tabJ=M.2B 2.,tabJ-M; // idem
#i plusieurs colonnes portent le I e no L la derni:re colonne sera prioritaire. Dans une requIte affic9ant des no s de colonnes identiquesL le ieu3 est de les reno er 2
3DGD%T t-.nom as col-B t01nom as col0 EC4R t-B t0 ...
6H#E/A)##;$ 2 le rsultat est unique ent un ta4leau associatif @inde3\no 6H#E/AFU6 2 le rsultat est unique ent un ta4leau inde3 nu rique ent. 6H#E/A1;5H @par dfautB 2 les deu3 ent rcuprer tous les rsultats 2
7oici co
,result=mys>l1>uery!"select suTetBte"te rom 1message Shere login=2toto2"#; Shile !,result @@ ,tab=mys>l1 etch1array!,result## $ echo ,tabJ2suTet2M.2B 2.,tabJ2te"te2M; // a iche les champs suTet et te"te '
S. ROHAUT
Page 49/93
Fote+ l(e3pression du >9ile. Pour y rentrerL il faut que le rsultat de la requIte @[resultB ne soit pas C)/#8 @donc que la requIte ait fonctionnB et qu(il reste des lignes ' lire. )utre ent dit si la requIte ne retourne rienL on ne rentre pas dans la 4oucle. Fote+ enfin qu(il e3iste deu3 autres fonctions possi4les 2
/(identifiant unique d(une ta4le est souvent un entier autoJincr ent. /(avantage est qu(il n(y a pas 4esoin de grer cet identifiantL c(est 6y#E/ qui le dter ine tout seul. 6ais dans certains casL il peut Itre ncessaire de rcuprer la valeur de ce c9a p autoJincr ent apr:s une insertion pourL par e3e pleL ettre ' ,our un autre enregistre ent @liste c9a-neL ,ointureL etcB. ;n utilise pour Wa la fonction mys l&insert&id*,.
,result=mys>l1>uery!"insert !2test2B2test2#"#; into 1message !suTetB te"te# &alues
,id=mys>l1insert1id!#; ,result=mys>l1>uery!"select suTetB te"te rom 1message Shere id1message=,id"#; ,tab=mys>l1 etch1array!,result#; echo ,tabJ2suTet2M.2B 2.,tabJ2te"te2M; // testB test
S. ROHAUT
Page 5!/93
11 )e systme de $ic'iers
11.1 1ravail sur les fi 7iers 11.1.1 Cuverture
/a fonction fopen*, per et d(ouvrir ou de crer un fic9ier selon divers odes. 8lle prend en pre ier pra :tre le no du fic9ier avec son c9e in. $e no de fic9ier peut Itre une UD/ @il faut pour cela que la directive allo6&url&fopen soit active dans le p9p.iniB. /e second para :tre est le ode d(ouverture 2
r 2lecture seuleL en d4ut de fic9ier r72 lecture<critureL en d4ut de fic9ier 6 2 criture seule L taille du fic9ier ' 0 @ancien contenu effacBL cr s(il n(e3iste pas 67 2 lecture<critureL taille du fic9ier ' 0L cr s(il n(e3iste pas a 2 criture seuleL en fin de fic9ierL cr s(il n(e3iste pas a7 2 lecture<critureL en fin de fic9ierL cr s(il n(e3iste pas.
;n peut sous Tindo>s ra,outer la lettre (4( pour le type 4inaireL inutile sous Uni3. 8nfinL fopen@B ad et un troisi: e para :tre 2 1. Dans ce cas le fic9ier ' ouvrir sera rec9erc9 dans le include&path @voir p9p.iniB. /a valeur retourne est une ressource de fic9ier @identifiant de fic9ierB ou la valeur C)/#8 en cas d(c9ec.
, ile= open!2ser&er.log2B2a<2B-#;
11.1.2 )ecture
11.1.2.1 fgets<>
/a fonction f"ets*, per et de lire une ligne d(un fic9ier en ode te3te. /a fonction s(arrIte lorsqu(elle arrive ' la fin du fic9ier ou ' un retour c9ariot. ;n peut prciser en second para :tre une longueur de te3te en octet qui est par dfaut 1024 et ce para :tre est o4ligatoire avant les versions 4.2. /e pre ier para :tre est l(identifiant du fic9ier. C)/#8 sera retourn en cas d(erreur. ATT./T0-/ 8 f"ets*, ne retourne pas 2ALS. % la fin du fichier.
,ligne= gets!, ile#;
11.1.2.2 fread<>I
/a fonction fread*, per et de lire un fic9ier en ode 4inaire. /e second para :tre est la longueur sou9aite. #ous Tindo>s il faut penser ' placer (4( dans fopen@B. /a lecture s(arrIte lorsque les n octets @longueurB ont t lusL la fin du fic9ier a t atteinte ou qu(une erreur est survenue. S. ROHAUT Cours Programmation PHP Page 5 /93
, ile= open!2monimage.gi 2B2rb2#; ,img= read!, ileB , ileside!2nomimage.gi 2##; close!, ile#;
11.1.2.3 fs anf<>
/a fonction fscanf*, lit des lignes d(un fic9ier en fonction d(un for atage particulier.
, ile= open!2users.t"t2B2r2#; Shile!,ligne= scan !, ileB"bsItbsItbsIn"## $ echo ,ligne; '
/a fonction f"etc*, lit un seul caract:re dans le fic9ier. $ontraire ent ' fgets@BL elle retourne C)/#8 ' la fin du fic9ier. /e pre ier para :tre est l(identifiant du fic9ier.
11.1.2.5 fgetss<>
/a fonction f"etss*, fonction est identique ' fgets@B ais la ligne retourne est d4arrasse de ses ventuelles 4alises PHP ou H56/. ;n peut prciser en troisi: e para :tre une liste de 4alises autorises.
11.1.2.$ fget sv<>
/a fonction fgetcsv@B est une fonction tr:s puissante car elle per et de lire un fic9ier de type $#7L c(est ' dire dont les c9a ps sont dli itsL pour rcuprer les c9a ps dans un ta4leau. /esond para :tre est la longueur a3i ale d(une ligne du fic9ierL le troisi: e para :tre le sparateurL qui est la virgule par dfaut. 7oici un e3e ple per ettant de lire un fic9ier $#7 et d(en affic9er le rsultat sous for e d(un ta4leau H56/ 2
, ilename = "boo5-.cs&"; ,id = open!, ilenameB "r"#; Shile !,data = getcs&!,idB ileside!, ilename### ,tableJM = ,data; close!,id#; echo "<table>In"; oreach!,table as ,roS# $ echo "<tr>"; oreach!,roS as ,data# echo "<td>,data</td>"; echo "</tr>In";
'
echo "</table>In";
/a fonction readfile*, prend co e para :tre un no de fic9ier et renvoie son contenu par la sortie standard. /a fonction read"9file*, effectue la I e c9ose ais le fic9ier est au for at co press g+ip @+li4B.
S. ROHAUT
Page 52/93
11.1.3 !criture
/es deu3 fonctions f6rite*, et fputs*, sont identiques 100P car fputs*, est un alias de f6rite*,. 8lles crivent une c9a-ne dans un fic9ier. ;n peut li iter la longueur de la c9a-ne en troisi: e para :tre ais par dfaut toute la c9a-ne est crite. /a valeur retourne est le no 4re d(octets critsL ou C)/#8 en cas d(erreur.
, ile= open!2mon ic.t"t2B2a#; ,ret= Srite!, ileB2:ne ligne dans mon close!, ile#; ichier2#;
8n cas de travail sur un fic9ier 4inaireL il ne faut pas ou4lier sous Tindo>s de ra,outer l(option (4(.
11.1.% 6,lacement
11.1.4.1 fsee;<>
/a fonction fsee:*, per et de se dplacer dans un fic9ier. /e second para :tre @offsetB est le no 4re d(octets de dplace ent. Il peut Itre ngatif. Par dfaut le dplace ent est calcul ' partir du d4ut du fic9ier ais un troisi: e para :tre peut odifier cet tat. /a valeur retourne est 0 @+roB en cas de russiteL J1 sinon. Un positionne ent apr:s la fin du fic9ier n(est pas une erreur.
#88VA#85 2 $alcul ' partir du d4ut du fic9ier. Position finale 2 D4utRoffset #88VA$UD 2 $alcul ' partir de l(e place ent actuel. Position finale 2 )ctuelleRoffset #88VA8FD 2 $alcul ' partir de la fin du fic9ier. Position finale 2 CinR;ffset.
ichier
11.1.4.2 ftell<>
11.1.4.3 re:ind<>
/a fonction re6ind*, per et de retourner au d4ut du fic9ier. 8lle retourne 5DU8 en cas de russiteL C)/#8 sinon.
S. ROHAUT
Page 53/93
11.1.* >ermeture
;n fer e un fic9ier avec la fonction fclose*,.8lle retourne 5DU8 en cas de russiteL C)/#8 sinon.
11.2.2 Se d,lacer
;n se dplace avec la fonction chdir*,. /(argu ent peut Itre a4solu ou relatif. 8n cas d(erreurL C)/#8 est retourn.
i !chdir!2./rep2## getcSd!#; else die!28mpossible de se d*placer2#;
e para :tre
;n peut retourner au d4ut du rpertoire avec la fonction re6inddir*, qui prend co un identifiant de rpertoire. /a proc9aine lecture sera la pre i:re du rpertoire.
e para :tre
prcdentes et une 4oucleL la fonction scandir*, propose la I e c9oseL en une ligne et en plaWant tous les no s de fic9iers du c9e in indiqu dans un ta4leau. /e pre ier para :tre est un c9e in de rpertoire. /e second est optionnel et dfinit l(ordre du tri qui est alp9a4tique par dfaut. Un M 1 N indique un tri alp9a4tique dcroissant.
, iles=scandir!2./rep2#; print1r!, iles#;
is&e;ecutable*, 2 5DU8 si le fic9ier est e3cuta4le. #ous Tindo>s il faut PHP ".3. is&readable*, 2 5DU8 sir le fic9ier est lisi4le is&6riteable*,L is&6ritable*, 2 5DU8 si le fic9ier est accessi4le en criture is&lin:*, 2 5DU8 si le fic9ier est un lien. I eL on peut o4tenir des dtails sur un fic9ier avec les fonctions file;;;*, 2 file&e;ists*, 2 5DU8 si le fic9ier e3iste fileatime*, 2 retourne sous for e de 5I68#5)6P la derni:re date d(acc:s. #ous Tindo>sL ce sera la derni:re date de odification. filectime*, 2 retourne la date de cration filemtime*, 2 retourne la date de odification rel du groupe avec la fonction rel de l(utilisateur avec la fonction
De
file"roup*, 2 retourne le %ID du fic9ier. ;n rcup:re le no posi;&"et"r"id*,. fileo6ner*, 2 retourne le UID du fic9ier. ;n rcup:re le no posi;&"etp6uid*,. fileinode*, 2 retourne l(inode du fic9ier
fileperms*, 2 retourne les per issions du fic9ier. )558F5I;F le rsultat est en 4ase 10. Il faudra convertir en 4ase ! avec la fonction base&convert*,. filesi9e*, 2 retourne la taille du fic9ier en octets.
S. ROHAUT
Page 55/93
filetype*, 2 retourne le type du fic9ier. )558F5I;F il s(agit des types de fic9iers sur disqueL pas de leur contenu @i ageL etcB 2 fifoL c9arL dirL 4loc?L lin?L fileL un?no>n.
#i un fic9ier est d,' ouvert on peut o4tenir des infor ations avec la fonction fstat*, qui prend co e para :tre un identifiant de fic9ier retourn par fopen@B et qui retourne un ta4leau inde3 nu rique ent ou associatif. /a fonction stat*, retourne la I e c9ose ais on lui prcise un c9e in ou no de fic9ier. /a fonction lstat*, est quasiJidentique sauf que dans le cadre du lienL ce sont les infor ations sur le lien luiJ I e @et pas le fic9ier pointB qui sont retournes. 0. volu e @ou encore devB 1. inode @ou encore inoB 2. droits d(acc:s au fic9ier @ ode de protection du inodeB. ) convertir en octal. 7oir aussi fileper s@B. @ou encore modeB 3. no 4re de liens @ou encore nlin:B 4. id de l(utilisateur propritaire @ou encore uidB ". id du groupe propritaire @ou encore "idB &. type du volu e de l(inode e @ou encore rdev B 7. taille en octets @ou encore si9eB !. date du dernier acc:s @ou encore atimeB .. date de la derni:re odification @ou encore mtimeB
10.date du dernier c9ange ent @ou encore ctimeB 11.taille de 4loc du syst: e pour les entres<sorties e @ou encore bl:si9eB 12.no 4re de 4locs allous @ou encore bloc:sB
I e no
d(un fic9ier
cho6n*,L ch"rp*, 2 c9angent le propritaire et le groupe d(un fic9ier. /e pre ier para :tre est le fic9ierL le second le groupe ou le propritaire @UIDL %IDL ou en toutes lettresB chmod*, 2 odifie les droits. /e pre ier para :tre est le no du fic9ierL le second les droits en octal. )558F5I;F sous Tindo>sL les rsultats peuvent surprendre...
S. ROHAUT
Page 56/93
copy*, 2 copie d(un fic9ier 2 source et destination lin:*, 2 cr un lien 9ard lin?2 ci4leL no du lien du lien ode @droits par dfautB )7)F5
m:dir*, 2 cr un rpertoireL le second para :tre est le application du asque. rename*, 2 reno
rmdir*, 2 suppri e un rpertoire. Il doit Itre vide. unlin:*, 2 suppri e un fic9ier. umas:*, 2 odifie le u as? par dfaut
Fotes 2 $ertains navigateurs se fic9ent totale ent du poid @tailleB des fic9iers envoys en ne ragissant pas ' la varia4le 6)GACI/8A#IQ8. Dans ce cas la vrification doit Itre faite du c=t du serveur. )u pire on peut li iter c=t serveur la taille a3i ale ' l(aide du para :tre upload&ma;&filesi9e dans le p9p.ini. ;n c9oisit son fic9ier via la 4oite de dialogue du gestionnaire de fic9iers quand on clique sur le 4outon Parcourir. Une fois le for ulaire validL les donnes du for ulaire et le fic9ier sont envoys ' la page PHP. $=t PHPL on rcup:re les infor ations sur le fic9ier upload via un ta4leau A&20L. dont les inde3 sont les suivants A&20L.BnomCBpropieteC le no tant le no du c9a p du for ulaire CI/8 et la proprit 2
[ACI/8#c(userfile(dc(na e(d 2 /e no
S. ROHAUT
[ACI/8#c(userfile(dc(type(d 2 /e type 6I68 du fic9ierL si le navigateur a fourni cette infor ation. Par e3e pleL cela pourra Itre `i age<gif` [ACI/8#c(userfile(dc(si+e(d 2 /a tailleL en octetsL du fic9ier tlc9arg. [ACI/8#c(userfile(dc(t pAna e(d 2 /e no serveur. te poraire du fic9ier qui sera c9arg sur la ac9ine
Par dfaut le fic9ier tlc9arg et en attente de dplace ent est plac dans le rpertoire te poraire du syst: e @varia4le syst: e 586P ou 56PDIDB ou dans le rpertoire prcis par le para :tre de configuration upload&tmp&dir du fic9ier p9p.ini. Il est conseill d(initialiser et d(utiliser ce para :tre. /e c9e in du fic9ier te poraire upload est donc 2
,tmp1 ile=ini1get!"upload1tmp1dir"#.2/2.,1E8GDJ2user ile2MJ2tmp1name2M;
Pour savoir si un fic9ier a t correcte ent upload par la t9ode P;#5L on peut utiliser la fonction is&uploaded&file*, qui prend co e para :tre le no du fic9ier upload.
i !is1uploaded1 ile!,1E8GDJ2user ile2MJ2name2M## $// ou tmp1name echo ,1E8GD3J2user ile2MJ2side2M; '
#ac9ant la position du fic9ier te poraire upload et s(il a t correcte ent uploadL on peut utiliser la fonction copy. 6ais le ieu3 est d(utiliser la fonction move&uploaded&file*, qui teste la russite de l(upload et qui dplace le fic9ier. /e pre ier para :tre est le no du fic9ier upload. $e peut Itre le no du c9a p CI/8L le no rel du fic9ier ou le no du fic9ier te poraire.
i !mo&e1uploaded1 ile!,1E8GD3J2a&atar2MJ2tmp1name2MB,13DC/DCJ2)4%:RDOT1C44T2M."/ forum/avatars/$login".$_FILES['avatar']['name'])) { ,a&atar=,login.,1E8GD3J2a&atar2MJ2name2M; chmod!,13DC/DCJ2)4%:RDOT1C44T2M."/ orum/a&atars/,a&atar"B=QAA#; '
S. ROHAUT
Page 58/93
/a fonction htmlspecialchars*, convertit certains caract:res spciau3 en entits H56/. $es caract:res sont 2
M ] N 2]a pK M ` N 2 ]quotK si 8F5AF;EU;58# est utilis M ( N 2 ]m03.K si 8F5AEU;58# est utilis M _ N 2 ]ltK M X N 2 ]gtK
/e second para :tre @8F5A333B dfinit le fonctionne ent par rapport au3 quotes. /a fonction htmlentities*, va plus loin en re plaWant 5;U# les caract:res qui ont des quivalents en H56/. Pour dcoder une telle c9a-neL il faut alors utiliser la fonction html&entity&decode*,. /a fonction nlDbr*, re place tous les retourJc9ariots d(une c9a-ne en retours ' la ligne H56/ 2 _4r <X. /a fonction urlencode*, for ate une c9a-ne pour son utilisation dans une UD/. /es espaces sont S. ROHAUT Cours Programmation PHP Page 59/93
re placs par des M R N et tous les caract:res nonJalp9anu riques @sauf M J NL M . N et M A NB sont re placs par leur quivalent 9e3adci al PGG. Une telle c9a-ne sera dcode par la fonction urldecode*,.
/a fonction inverse se no e implode*,./e pre ier para :tre est la M colle N 2 le ou les caract:res de sparation qui seront placs entre les divers l ents de la c9a-ne reconstitue. /e second para :tre est un ta4leau.
// suite de l2e"emple pr*c*dent ,neSchaine=implode!2B2B,tab#; echo ,chaine; // loginBpSdBuidBgid
/a fonction )oin*, est un alias de i plode@B. ;n peut aussi effectuer un dcoupage tous les n caract:res avec la fonction chun:&split*,. 8lle dcoupe le pre ier para :tre en orceau3 de longueur du second para :tre @par dfaut 7& caract:resB avec co e sparateur le troisi: e para :tre @bnbr par dfautB.
,chaine=2EE7DWQAN%A2; ,n1chaine=chun51split!,chaineB0B292#; echo n1chaine; // EE97D9WQ9AN9%A
/a fonction 6ord6rap*, effectue la csure d(une c9a-ne. /a c9a-ne rsultante sera le te3te dcoup en tenant co pte des ots. Par dfaut la longueur @second para :treB est de 7" caract:res. ;n peut prciser la c9a-ne de coupure de ligne en troisi: e para :treL et le dernier para :tre s(il est ' 1 force la coupure I e au ilieu d(un ot. Pour un affic9age en H56/L il faut encapsuler le rsultat dans un nl24r@B.
,chaine="WonTour les amis et bien&enus dans le mer&eilleu" monde du langage ]H] !"; echo nl0br!SordSrap!,chaineB0=##;
retourne
WonTour les amis et bien&enus dans le mer&eilleu" monde du langage ]H] !
/a fonction str&split*, dcoupe une c9a-ne de caract:re en ta4leau. Par dfaut la longueur est de 1 ais on peut la c9oisir en second para :tre. S. ROHAUT Cours Programmation PHP Page 6!/93
;n peut dcouper une partie de c9a-ne avec la fonction substr*,. /e pre ier para :tre est la c9a-neL le second le d4ut @depuis 0B et le dernier la longueur. /e d4ut de la c9a-ne peut Itre une valeur ngative et dans ce cas on co pte en partant de la fin de la c9a-ne.
,chaine=2abcde 2; echo substr!,chaineB=#; // abcde echo substr!,chaineB0B6#; // cde echo substr!,chaineBK-#; // echo substr!,chaineBK6B0#; // de
/es fonctions trim*,L rtrim*, et ltrim*, suppri ent les caract:res invisi4les ' droite @tri L rtri B et ' gauc9e @tri L ltri B de la c9a-ne.
/a fonction strpos*, rec9erc9e dans la c9a-ne du pre ier para :tre la c9a-ne en second para :tre et retourne sa position. ;n peut placer en troisi: e para :tre la position de dpart de la rec9erc9e.
S. ROHAUT
Page 6 /93
13 Sessions et cooEies
13.1 /es oo;ies 13.1.1 &ration
Un coo?ie s(envoie avec la fonction setcoo:ie*,. /es argu ents sont les suivants 2
Fo 7aleur date d(e3piration @un ti esta p uni3B c9e in @validit du coo?ie suivant le c9e in dans l(urlB do aine @pare dfautL le v=treB secure 2 flag de scurit 2 le coo?ie n(est accessi4le que via une conne3ion scurise. ettre.
#eul le pre ier argu ent est o4ligatoire. Pour ne pas spcifier une valeurL il suffit de ne rien )ttention ' quelques li itations 2
Un coo?ie tant envoy avec les entItes H55PL il ne peut pas Itre envoy si une sortie a d,' eu lieu @9t lL te3teL ...B Un coo?ie n(est pas disponi4le dans la page qui l(a cr. Il faut soit rec9arger la pageL soit pointer sur une autre. Un coo?ie ne peut Itre suppri qu(avec les le navigateur qui suppri e le coo?ie. I es para :tres qui ont servi ' sa cration. $(est
Dans l(e3e ple prcdentL au pre ier c9arge ent rien ne sera affic9 car le contenu du coo?ie n(est pas encore accessi4le. )u deu3i: e c9arge ent la valeur sera relle ent affic9eL ais attention au dcalage entre la ise ' ,our et l(acc:s.
i !!isset!,1%44a8DJ2testcoo5ie2M## $ setcoo5ie!"testcoo5ie"B2toto2Btime!#<6Q==#; header!"Gocation9 http9//".,13DC/DCJ2HTT]1H43T2M.,13DC/DCJ2CD^:D3T1:C82M#; '
Dans cet e3e pleL on regarde si le coo?ie e3isteL sinon on le cr et on rappelle la page.
13.1.2 <ccs
;n acc:de au coo?ie grkce ' la varia4le glo4ale [A$;;VI8 qui est un ta4leau. /(inde3 du ta4leau est le no du coo?ie.
S. ROHAUT
Page 62/93
Fote 2 on peut placer les ta4leau3 avec les coo?ies. Il suffit de no notation par croc9ets.
setcoo5ie!"testcoo5ieJ-M"B2toto2Btime!#<6Q==#; setcoo5ie!"testcoo5ieJ0M"B2titi2Btime!#<6Q==#; setcoo5ie!"testcoo5ieJ6M"B2tata2Btime!#<6Q==#; ... !page sui&ante#
'
oreach!,1%44a8D as ,tab# $ i !is1array!,tab## oreach!,tab as ,5ey => ,&alue# echo ",5ey => ,&alue";
13.1.3 Su,,ression
Pour suppri er un coo?ieL il suffit de donner une date antrieure ' la date actuelle ' celuiJci.
i !!isset!,1%44a8DJ2testcoo5ie2M## $ setcoo5ie!"testcoo5ie"B2toto2Btime!#<6Q==#; ' else $ setcoo5ie!"testcoo5ie"B22Btime!#K6Q==#; ' i !isset!,1%44a8DJ2testcoo5ie2M## echo "4a"; else echo "]as de coo5ie";
Dans l(e3e ple prcdentL les appels au script vont provoquer successive ent l(affic9age de M pas de coo?ie N et M ;V N.
Dans cet e3e pleL on passe en entIte une de ande d(aut9entification. 8n cas d(c9ec @4outon annulerB un essage d(annulation est affic9. #inon on peut rcuprer les valeurs via les varia4les 2
[A#8D78Dc(PHPA)U5HAU#8D(d 2 login
S. ROHAUT
Page 63/93
[A#8D78Dc(PHPA)U5HAPT(d 2
ot de passe
13.2.2 6connexion
/a dconne3ion n(est pas si vidente que Wa car une fois connectL les identifiants sont placs dans la session. /a t9ode la plus si ple consiste ' fer er le navigateur et ' le relancer.
13.3.2 ?tilisation
13.3.2.1 6uverture
#i dans PHP.IFI la valeur M session.autoAstart N est activeL les sessions sont d arres de ani:re auto atique lors de l(acc:s ' une page. #inon il faut utiliser e3plicite ent la fonction session&start*,. #on appel cr une session ou restaure une session prcde ent stoc?e sur le serveur. ATT./T0-/ 8 L$ouverture d$une session doit obli"atoirement apparaEtre avant toute sortie@afficha"e du script PHP ou de balises HTML( m#me une li"ne vide F ;n peut crer ou rcuprer une session no e en prcisant un session&name*, qui prend co e para :tre le no de la session qui doit Itre cre @pre ier appelB ou accde @appels suivantsB. /a session par dfaut se no e M PHPS.SS0< N et c(est celleJl' qui est c9arge si sessionAna e@B n(est pas appele. Il faut donc appeler sessionAna e@B )7)F5 sessionAstart@B pour accder ' une session no e. Une session peut aussi Itre indirecte ent cre ou ouverte avec l(utilisation de la fonction session&re"ister*,.
13.3.2.2 5aria4les de session
Il y a deu3 oyens de crer des varia4les de sessionL qui seront accessi4les depuis n(i porte quelle page visite ' partir du o ent ou sessionAstart@B a t appele. /e pre ier oyen ne fonctionne ne fonctionne pas si re"ister&"lobals est ' off dans PHP.IFI 2 Mthode G *dconseille, 8 S. ROHAUT Cours Programmation PHP Page 64/93
/a fonction session&re"ister*, prend co e para :tre un no de varia4le et la dfinit co varia4le de session. $ette varia4le peut ensuite Itre accde par son no .
,t"t=2WonTour les amis2; session1register!2t"t2#; // t"t de&ient une &ariable de session.
est
enregistre
dans
la
session
couranteL
on
utilise
Pour suppri er une varia4le de sessionL il faut utiliser session&unre"ister*,. Par contre il ne faut pas ou4lier d(utiliser unset*, pour suppri er la varia4le glo4aleL car la prcdente fonction ne la suppri e pasL elle e pIc9e seule ent sa sauvegarde ' la fin du script.
i !session1is1registered!2t"t2## $ session1unregister!2t"t2#; unset!,t"t#; '
Mthode D *La meilleure % utiliser, 8 ;n utilise tout si ple ent le ta4leau glo4al A&S.SS0-/. )insi 2
,13D3384OJ2t"t2M="WonTour les amis";
l(affic9e et
unset!,13D3384OJ2t"t2M#;
restaurer de nouvelles valeurs. ) c9aque c9arge ent de page @ouverture de sessionBL on reco ence le dco pte. ;n peut odifier le dlai d(e3piration de la session grkce ' la fonction session&cache&e;pire*, qui prend co e valeur la nouvelle dure en inutes. #ans para :tre elle retourne la valeur actuelle.
'
'
'
S. ROHAUT
Page 66/93
' unction sessao1destroy! ,aaey # $ ,>uery = ")DGDTD EC4R sessions WHDCD 3ession8) = 2,aaey2"; mys>l1>uery!,>uery#; return True; unction sessao1gc! ,aRa"Gi eTime # ,>uery = ")DGDTD EC4R sessions WHDCD :O8c1T8RD3TFR]!O4W!## K :O8c1T8RD3TFR] !Gast:pdated# > ,aRa"Gi eTime"; mys>l1>uery!,>uery#; return True;
' $
'
1% Ima#es
14.1 PrHrequis importants
1eci concerne les versions de PHP avant la H.D.I et .asyPHP G.J2 certaines fonctions co e gdAinfo@B ou encore i agecreatetruetype@B ne sont pas tou,ours disponi4les car PHP fait appel ' une 4i4liot9:que e3terne appele %D2. Pour les version 4.2.3 et auJdel' on trouve des patc9es ' l(adresse 9ttp2<<>>>.4outell.co <gd<. )vant ces versionsL la version %D lin?e avec PHP est la 1.!.4. 1eci concerne les utilisateurs de PHP H.D.I et 7 et .asyPHP G.K sur Lindo6s 2 la configuration par dfaut de 8asyPHP 1.7 n(inclut pas le support des i ages. Pour cela il faut odifier le fic9ier PHP.IFI en retirant le co entaire de 2
extension=php_gd2.dll
0M4&P/4 2 for at PF% 0M4&MP4 2 for at OP8% 0M4&402 2 for at %IC 0M4&LNMP 2 for at Tindo>s 1it ap 16P
!imagetypes!# @ 8R_1]O_# $ echo "Ge type ]O_ est support*";
Puis au d4ut du scriptL on envoie un 9eader spcifiant le type d(i age 2 S. ROHAUT Cours Programmation PHP Page 67/93
ou image/Tpeg
1%.2.2 &ration
14.2.2.1 Couvelle image dynamique
8t enfin on cr une i age avec la fonction ima"ecreate*, @4ase sur une ta4le de couleurs inde3eB ou ima"ecreatetruecolor*, @en truecolorB avec co e para :tres la largeur et la 9auteur. /a seconde est conseille par la docu entation PHP. /es fonctions retournent une ressource identifiant l(i age. Par dfaut l$ima"e est noire.
,img=Ucreateimage!-==B-==# or die!"/otre ]H] ne supporte pas les images"#;
PHP peut c9arger une i age e3istante au lieu de la crer de toutes pi:ces. Dans ce cas l(i age est c9arge depuis un fic9ier et on peut ensuite la retravailler co e on le sou9aite. ;n peut utiliser les fonctions 2
ima"ecreatefrom"if*, 2 c9arge une i age %IC ima"ecreatefrom)pe"*, 2 c9arge une i age OP8% ima"ecreatefrompn"*, 2 c9arge une i age PF% ima"ecreatefromstrin"*, 2 c9arge une i age depuis une c9a-ne de te3te @par e3e ple un c9a pB
1%.2.3 Publication
8nfinL on pu4lie l(i age avec les fonctions ima"e;;;*,. #i cette fonction est utilise sans para :treL l(i age cre est redirige vers la sortie standard. ;n peut toutefois prciser co e para :tre un no de fic9ier. Dans ce casL l(i age est sauve sur disque au for at spcifi.
ima"epn"*, 2 cr une i age au for at PF% ima"e"if*, 2 cr une i age au for at %IC ima"e)pe"*, 2 cr une i age au for at OP8% oire.
Une fois l(i age creL on peut la suppri er avec ima"edestroy*, ce qui la dc9arge de la 7oici donc le code d(une page PHP i age.p9p retournant une i age 2
header !"%ontentKtype9 image/png"#; ,img=Uimagecreatetruecolor !-==B 7=# or die !"8mpossible de cr*e un _)"#; /( 8%8 4O ]GF%D GD3 %4RRFO)D3 )D )D338O 4: RFO8]:GFT84O (/ imagepng !,img#; imagedestroy !,img#;
lu" d2image
S. ROHAUT
Page 68/93
>idt9 2 largeur 3 9eig9t 2 9auteur y type 2 1 \ %ICL 2 \ OP%L 3 \ PF%L " \ P#DL & \ 16PL 7 \ 5ICC @;rdre des octets IntelBL ! \ 5ICC @;rdre des octets 6otorolaBL . \ OP$L 10 \ OP2L 11 \ OPGL 12 \ O12L 13 \ #T$L 14 \ ICC attr2 c9aine >idt9<9eig9t pour H56/
/a fonction ima"ecolorat*, retourne la valeur e3acte @soit l(inde3 de la paletteL soit un entier D71B du point au3 coordonnes 3<y de l(i age.
S. ROHAUT
Page 69/93
,color=imagecolore"tact!,imgB7=B7=#;
/a fonction ima"ecolortransparent*, per et de dfinir la couleur de transparence d(une i age dont la palette est inde3e. Le premier paramOtre est la ressource de l$ima"e -NL04AT-03.M./T cre avec ima"ecreate*,L le second une valeur retourne par i agecolorallocate@B. /a fonction ima"ecolorstotal*, retourne le no 4re total de couleurs utilises pour l(i age donne.
1%.3.3 6essin
14.3.3.1 Aemplissage
/a fonction ima"efilltoborder*, per et un re plissage d(une +one dli ite par une couleur donne. Dans ce cas les deu3 derniers para :tres sont la couleur de la 4ordure et la couleur de re plissage.
14.3.3.2 Point
;n utilise ima"esetpi;el*, 2
,green=imagecolorallocate !,imgB=B077B=#; 8magesetpi"el!,imgB0B0B,green#;
14.3.3.3 /igne
;n utilise ima"eline*, 2
imageline!,imgB -=B-=B6=BA=B,blue#;
14.3.3.4 Ae tangle
;n utilise ima"eellipse*, ou ima"efilledellipse*,. )ttention les deu3 pre iers para :tres sont les coordonnes du centre de l(ellipseL les deu3 autres la largeur et la 9auteur de l(ellipse.
imageellipse !,imgB 7=B 7=B6=B 0=B ,red#;
;n peut aussi faire des arcs de cercles avec les fonctions ima"earc*, et ima"efilledarc*, 2 Ouste S. ROHAUT Cours Programmation PHP Page 7!/93
avant la couleur on prcise le d4ut et la fin de l(arc en degrs @de 0 ' 3&0B.
14.3.3.$ Polygones
;n utilise les fonctions ima"epoly"one*, et ima"efilledpoly"one*,. /es so dfinis dans un ta4leau 2 5a4c0d\30L 5a4c1d\y0L 5a4c1d\31L 5a4c2d\y1L ... ;n doit aussi prciser le no 4re de so ets.
;n utilise ima"estrin"*, 2
imagestring!,imgB -B 7B 7B ":ne simple cha;ne de te"te"B ,te"t1color#;
/e second para :tre est le nu ro de police par dfaut de la page actuelle ou du navigateur.
1 )a ,ro#rammation ob+et
15.1 Stru ture
Une classe est une collection de varia4les @attri4utsB et de fonctions @ t9odesB qui fonctionnent avec ces varia4les. /(ense 4le for e les e 4res ou les proprits de l(o4,et. Une classe est dfinie en utilisant le otJcl M class N 2
class ]anier $ // Dl*ments de notre panier &ar ,contenu; // FTout de ,>te articles de type ,code au panier unction aTout1article !,codeB ,>te# $ i !isset!,thisK>contenuJ,codeM## ,thisK>contenuJ,codeM <= ,>te; else ,thisK>contenuJ,codeM = ,>te; ' // 3uppression de ,num articles du type ,artnr du panier unction suppr1article !,codeB ,>te# $ i !,thisK>contenuJ,codeM > ,>te# $ ,thisK>contenuJ,codeM K= ,>te; return TC:D; ' else $ return EFG3D; ' '
'
,mon1caddie=neS ]anier;
#i le constructeur e3iste @voir plus loinB on peut 4ien entendu passer des valeurs ' la cration 2 S. ROHAUT Cours Programmation PHP Page 7 /93
,o-=neS 4bT!"riri"#;
15.3 (
Fs au8 mem4res
1 .3.1 P4P % et
;n utilise les caract:res M -> N. ;n acc:de au3 utilise pas le [ devant un no d(attri4ut. e 4res avec la synta3e suivante. Fote+ qu(on
)u sein d(un o4,etL on acc:de au3 attri4uts de la classe en la prcisant avec la varia4le M $this N. #i on ne le prcise pasL on utilise en fait la varia4le local+ ' la t9ode.
,thisK>contenuJ2re =-2M<=-;
1 .3.2 P4P
/e PHP " tend les possi4ilits d(acc:s au3 dyna iques. 83 2 e 4res @varia4les et fonctionsB via les varia4les
class ]anier $ // Dl*ments de notre panier public ,etat= alse; // alse 9 &ide ... ' unction bidon!# $ return 2etat2;
'
,mon1caddie=neS ]anier; ,pipo=2etat2; echo ,mon1caddieK>,pipo; // a , onction=2a iche1panier2; ,mon1caddieK>, onction!#; echo ,nom1caddieK>$bidon!#';
iche ,thisK>etat
15.4 /'oprateur KK
/(oprateur M :: N per et de faire rfrence au3 e 4res d(une classe de 4ase @voir 9ritageBL ou d(utiliser des t9odes alors que la classe n(a pas t instancie.
class F $ unction e"ample!# $ echo "\e suis la onction originale.<br>In"; ' ' // 8l n2y a pas d2obTets de classe F. // G2a ichage est 9 \e suis la onction originale. F99e"ample!#;
<ans le cas d$un appel % une mthode avec 88 d$une classe non instancie *pas d$ob)ets,( la mthode ne doit pas appeler d$attributs de la classe( puis u$ils n$e;istent pas. <e m#me pour la m#me raison il ne faut pas employer la variable Athis dans les mthodes appeles. S. ROHAUT Cours Programmation PHP Page 72/93
1 . .2 P4P .x
15.5.2.1 Prote tion des varia4les et fon tions
/e PHP " ra,oute la notion de protection des donnes qui anquait ' PHP 4. ;n appelle Wa les trois Q P P 2 M public NL M protected NL M private NL avec les otsJcls correspondants. 7oici un ta4leau rcapitulatif de leur effet2 AccOs Dans la classe elleJ I e Depuis une classe drive Depuis l(e3trieur Public Protected Private
/ote 8 Les mots+cls public( private et protected peuvent bien entendu #tre utiliss pour les mthodes *fonctions, au uel cas la protection s$tend de la m#me maniOre. /e co otJcl M var N est tou,ours utilisa4le en PHP " et dans ce cas les attri4uts sont considrs e pu4lics.
Il est possi4le d(initialiser les varia4les ' leur cration avec n(i porte quelle valeur.
class ]anier $ // Dl*ments de notre panierB pri&* pri&ate ,contenu=array!#; ... '
;n peut aussi dfinir des attri4uts et des t9odes statiques qui seront accessi4les en de9ors de la classeL l(o4,et n(tant pas forc ent dclar. ;n ra,oute le otJcl M static N apr:s la dfinition de la visi4ilit de l(attri4ut. Un M static N n(ayant pas de porte dfinie est considr co e pu4lic. Par e3e pleL voici un co pteur per ettant de savoir co 4ien de fois une classe a t instancie. Fote+ l(utilisation de M self N ' la place de M $this N. M $this N ne peut pas Itre utilis ici il fait rfrence ' un o4,et et un attri4ut statique fait rfrence ' la classe elleJ I e.
S. ROHAUT
Page 73/93
class F $ public static ,compteur==; unction F!# $ sel 99,compteur<<; // 4n incr*mente ' $ ' ' unction a iche!# !
,o-=neS F; ,o-K>a iche!#; // ,o0=neS F; ,o0K>a iche!#; // 0 ,o6= neS F; ,o6K>a iche!#; // 6 echo F99,compteur; // 6
;n peut crer des constantes dans une classe ' l(aide du otJcl M const N. /a dclaration d(une constante ne doit pas Itre prcde d(un indicateur de visi4ilit. Une constante est tou,ours pu4lique. ;n ne peut pas non plus assigner ' une constante une valeur elleJ I e dyna iqueL co e le retour d(une fonction. $o e pour les varia4les statiquesL on utilise M self N pour accder ' sa valeur.
class F $ const classname="F"; unction 11construct!# $ echo sel 99classname; ' ' ,o-=neS F; // F iche F
/-T. 8 Le Q polymorphisme P n$est pas une surchar"e. Une surchar"e consiste % dfinir plusieurs mthodes de m#me nom mais de prototypes diffrents. PHP R ne supporte pas cette forme de surchar"e. Le polymorphisme remplace une mthode par une autre dans une classe drive. Pour crer un 9ritage on utilise le otJcl M extends N.
S. ROHAUT
Page 74/93
class ]anier1nomme e"tends ]anier $ &ar ,proprietaire; unction nom1proprietaire !,nom# $ ,thisK>proprietaire = ,nom; ' '
;n cr une classe M PanierAno e N qui 9rite de M Panier N. 8lle poss:de donc les I es proprits que la classe M Panier N ' laquelle on ra,oute un nouvel attri4ut et une nouvelle t9ode.
,ncart = neS ]anier1nomme; ,ncartK>nom1proprietaire !"3lyce"#; print ,ncartK>proprietaire; ,ncartK>aTout1article!"re =6"B -#;
/e otJcl M self N reprsente la classe elleJ I e et peut donc Itre utilise pour prciser l(acc:s ' un e 4re prcisL co e un attri4ut statique.
S. ROHAUT
Page 75/93
$ette classe 9rite de PanierAno e. /e constructeur initialise le no du propritaire co e tant l(identifiant de session. /e constructeur peut prendre co e n(i porte quelle t9ode des para :tres optionnels.
class auto1panier e"tends ]anier1nomme $ unction auto1panier!,nom="anonyme"# $ ,thisK>proprietaire=,nom; ' ' ,panier=neS auto1panier; // le constructeur est appel* a&ec sa &aleur par d* aut ,panier0=neS auto1panier!session1id!##; // &aleur pass*e
1 .2.2 P4P
;utre le no de la classe elleJ I eL PHP " propose une t9ode gnrique appele M __construct N @avec deu3 underscores M _ N au d4utB en lieu et place de la pre i:re t9ode vue ciJdessus. )insi 2
unction 11construct!# $ ,thisK>proprietaire=session1id!#;
'
I e.
S. ROHAUT
Page 76/93
)ffic9era
\e suis la classe W
#i une classe n(a pas de constructeurL c(est le constructeur de la classe de 4ase qui est appel 2
class F $ unction F !# $ echo "\e suis la classe F<br />"; ' ' class W e"tends F $ &ar ,&ar; ' ,b=neS W; // \e suis la classe F
;n re arque que les constructeurs ne sont pas appels en cascade. )insi dans le cas la classe 1L le constructeur de la classe ) n(est pas appelL ce qui est logique car PHP ne peut pas savoir par dfaut co ent appeler le constructeur @quels para :tresB. ;n doit donc l(appeler e3plicite ent ' l(aide du otJcl M parent N2
class F $ unction F !# $ echo "\e suis la classe F<br />"; ' ' class W e"tends F $ &ar ,&ar; unction W!# $ echo "\e suis la classe W<br />"; parent99F!#; ' ' ,b=neS W; // F iche 9 Te suis la classe WB \e suis la classe F
1 .5.2 P4P
/e PHP " ragit de ani:re presque identique que PHP 4L sauf qu(il est possi4le d(appeler un constructeur en cascadeL tou,ours avec le otJcl M parent NL ais sans conna-tre le no du constructeur de la classe de 4aseL en utilisant M __construct N 2
class F $ unction F !# $ echo "\e suis la classe F<br />"; ' ' class W e"tends F $ &ar ,&ar; unction 11construct!#
S. ROHAUT
Page 77/93
$ '
echo "\e suis la classe W<br />"; parent9911construct!#; // Fppelle le constructeur de F 9 F!#
'
,b=neS W; // F
1 .10.2 P4P
/e destructeur est prsent en PHP ". Il se no e M __destruct N et sera auto atique ent appel lors de la destruction de l(o4,et. 5out co e le constructeurL il n(est pas appel en cascade et doit donc Itre appel e3plicite ent lors d(un 9ritage.
class F $ unction 11destruct!# $ echo "Fu re&oir la classe F<br />"; ' ' class W e"tends F $ unction 11destruct!# $ echo "Fu re&oir la classe W<br />"; parent9911destruct!#;
'
'
S. ROHAUT
Page 78/93
1 .11.2 P4P %
.n PHP H( les ob)ets sont affects par copieL un nouvel o4,et est cr reprenant toutes les proprits du pre ierL ais est totale ent indpendant. )insi voici le rsultat du code suivant 2
,obT-=neS F; ,obT0=,obT-; // a ,obT-K>a ,obT0K>a ectation par copie iche salut iche 3alut iche WonTour iche 3alut
iche!#; // a iche!#; // a
modi !,obT-#; // ]ar copie ! ,obT-K>a iche!#; // a iche WonTour ,obT0K>a iche!#; // a iche 3alut
De I e si on cr une fonction qui doit odifier un o4,etL co e il est pass par dfaut en copieL on ne odifie en fait que la copie locale de l(o4,et. Dans ce cas on le passe par rfrence.
$ unction modi !@,obTet#
,obTetK>a=2coucou2; ' ,obT0=@,obT-; // ]ar r* *rence modi !,obT-#; // ]ar r* *rence ,obT-K>a iche!#; // a iche coucou car on a modi i* par r* *rence ,obT0K>a iche!#; // a iche coucou
DoncL si on sou9aite crer un code o4,et en PHP 4 @un peuB co pati4le avec les o4,ets de PHP"L alors on doit effectuer des copies par rfrenceL et passer les o4,ets au3 fonctions par rfrence. /e code odifi ciJdessus arc9e dans les deu3 cas.
1 .11.3 P4P
.n PHP R( les ob)ets sont affects par rfrence par dfaut et de
,obT-=neS F; ,obT0=,obT-; // a ,obT-K>a ,obT0K>a ectation par r* *rence iche salut iche 3alut iche WonTour
iche!#; // a iche!#; // a
S. ROHAUT
Page 79/93
,obT0K>a
iche!#; // a
iche WonTour
modi !,obT-#; // ]ar r* *rence ,obT-K>a iche!#; // a iche coucou ,obT0K>a iche!#; // a iche coucou
$e qui si plifie nor ent la tkc9e des dveloppeurs. $ependantL on peut e3plicite ent de ander la copie d(un o4,et ' l(aide d(une t9ode spciale M __clone N et de l(instruction M clone N. /e clonage consiste ' recopier tous les attri4uts d(une classe dans une autre. /e clonage peut Itre i plicite @copie directe par un canis e interne de PHPB ou e3plicite @via la t9ode AAcloneB.
,obT6=clone ,obT-; // on copie implicitement ,obT- dans ,obT6 ,obT-K>a=2WonTour2; ,obT6K>a=2Fu re&oir2; ,obT-K>a iche!#; // F iche bonTour ,obT6K>a iche!#; // F iche Fu re&oir
$ette t9ode fonctionne 4ien tant qu(on n(utilise pas des infor ations co ple3es co e des ressources ou des descripteurs de fic9iers. Par e3e ple si dans [o4,1 on avait ouvert une conne3ion sur une 4ase de donnesL on a copi une ressource 1ase de donnesL ais elle serait inutilisa4leL car pas ouverte. Il faudrait la rouvrir avec M __clone N 2
class Wase $ pri&ate ,db; unction 11construct!# $ ,thisK>db=mys>l1connect!2localhost2#; ' unction 11clone!# $ ,thisK>db=mys>l1connect!2localhost2#; ' ' ,obT-=neS Wase; ,obT0=clone ,obT-; // copie 9 11clone rou&re la conne"ion pour la copie
/ote 8 la mthode Q __clone P est appele implicitement si le mot+cl Q clone P est utilis. -n ne peut pas appeler e;plicitement cette mthode.
elles proviennent de la I e classeL elles sont les I es attri4utsL les attri4uts sont de I e valeur. ent la co paraison avec M == N ou M === N.
S. ROHAUT
Page 8!/93
'
'
return 2TC:D2;
'
unction compare4bTects!@,o-B @,o0# $ echo 2o- == o0 9 2.bool0str!,o- == ,o0#."In"; echo 2o- != o0 9 2.bool0str!,o- != ,o0#."In"; echo 2o- === o0 9 2.bool0str!,o- === ,o0#."In"; echo 2o- !== o0 9 2.bool0str!,o- !== ,o0#."In";
class Elag $ &ar , lag; unction Elag!, lag=true# $ ,thisK> lag = , lag;
'
'
class 3SitchableElag e"tends Elag $ unction turn4n!# $ ,thisK> lag = true; unction turn4 !# $ ,thisK> lag = alse;
'
'
'
,o = neS Elag!#; ,p = neS Elag! alse#; ,> = neS Elag!#; ,r = neS 3SitchableElag!#; echo "%ompare des instances cr**es a&ec les m[mes param+tresIn"; compare4bTects!,oB ,>#; echo "In%ompare des instances cr**es a&ec di compare4bTects!,oB ,p#; *rents param+tresIn";
echo "In%ompare une instance d2un parent a&ec celle d2une sousKclasseIn"; compare4bTects!,oB ,r#;
%ompare une instance d2un parent a&ec celle d2une sousKclasse o- == o0 9 EFG3D o- != o0 9 TC:D o- === o0 9 EFG3D o- !== o0 9 TC:D
S. ROHAUT
Page 8 /93
1 .12.2 P4P
PHP " fait une diffrence entre la co paraison si ple M == N et co pl:te M === N. )vec M == NL PHP retournera vrai si les deu3 o4,ets ont les des instances de la I e classeL co e pour PHP 4. I es attri4uts et valeursL et s(ils sont I e o4,et de la I e
)vec M === NL PHP retournera vrai si les deu3 o4,ets font rfrence au classe.
,o-=neS F; ,o0=,o-; // r* *rence ,o6= neS F; i !,o-==,o0# echo "o-==o0<br />"; else echo "o-!==o0<br />"; i !,o-===,o0# echo "o-===o0<br />"; else echo "o-!===o0<br />"; i !,o-==,o6# echo "o-==o6<br />"; else echo "o-!==o6<br />"; i !,o-===,o6# echo "o-===o6<br />"; else echo "o-!===o6<br />";
7a affic9er
o-==o0 // o- et o0 sont identi>ues !m[me classeB m[mes attributs et props.# o-===o0 // o- et o0 sont des r* *rences du m[me obTet o-==o6 // o- et o6 sont identi>ues !m[me classeB m[mes attributs et props.# o-!===o6 // o- et o6 ne sont pas des r* *rences sur le m[me obTet#
S. ROHAUT
Page 82/93
1* =ouveauts en P4P
1$.1 /es o4,ets 1*.1.1 )a $onction FFautoload
/a fonction M __autoload N indique ' PHP co ent ragir quand on tente de crer un o4,et depuis une classe qui n(a pas t dfinie. $(est une facilit offerte qui ne se su4stitue pas forc ent au3 require et include. 8lle peut Itre utile par e3e ple pour viter d(inclure l(ense 4le des classes utilises dans un pro,et. ;n prfrera inclure la dfinition de la classe au o ent de la cration de son instance. /a fonction M __autoload N ne prend qu(un para :treL le no de la classe. ) vous de la progra er ensuite pour inclure le code ncessaire.
unction 11autoload!,class# $ re>uire1once!"/inc/$,classM'.php"#;
'
#i la classe drive ne redfinit pas une t9ode a4straite de la classe parente @de 4aseBL elle devra Itre dclare a4straite ' son tour et ne pourra Itre instancie. /a classe qui i pl ente la t9ode a4straite doit Itre dfinie avec la I e visi4ilit ou plus fai4le. #i la t9ode a4straite est dfinie en tant que protgeL la fonction l(i pl entant doit Itre dfinie en tant que protge ou pu4lique. /(instruction pour dfinir des classes et t9odes est M abstract N.
// %lasse abstraite 9 elle contient une m*thode abstraite abstract class Fbstract%lass $ // R*thode abstraite >ui de&ra [tre red* inie dans la classe d*ri&*e abstract protected unction get/alue!#; public unction prt!# $ print ,thisK>get/alue!#; '
'
class %oncrete%lass- e"tends Fbstract%lass $ // Ced* inition de la m*thode abstraite de la classe de base protected unction get/alue!# $ return "%oncrete%lass-"; ' '
S. ROHAUT
Page 83/93
class %oncrete%lass0 e"tends Fbstract%lass $ // Ced* inition de la m*thode abstraite de la classe de base protected unction get/alue!# $ return "%oncrete%lass0"; ' ' ,class- = neS %oncrete%lass-; ,class-K>prt!#; // a iche %oncrete%lass,class0 = neS %oncrete%lass0; ,class0K>prt!#; // a iche %oncrete%lass0
'
'
class W e"tends F $ unction 11construct!# $ parent991construct!#; ' unction a iche!# $ // DCCD:C ! 4O OD ]D:T ]F3 CD)DE8O8C ! print ,thisK>&al;
'
'
Dans la classe 1 nous avons tent de rcrire la nous retournera une erreur.
inter ace Template $ public unction a iche!#; public unction incremente!,cpt#; '
Attention 8 la dclaration des mthodes *notamment des paramOtres, doit #tre ri"oureusement identi ue dans la classe % celle de l$interface. ;n indique qu(une classe i pl ente une interface avec le
class F implements Template $ protected ,&al; unction 11construct!# $ ,thisK>&al=-; ' unction a iche!# $ print ,thisK>&al; unction incremente!,cpt# $ ,thisK>&al<=,cpt;
otJcl M implements N.
'
'
'
Une classe peut i pl enter plusieurs interfaces en I e te ps. Dans ce cas la liste des interfaces doit Itre prcise apr:s le otJcl M implements NL et c9aque interface spare par des virgules.
inter ace Template $ public unction a iche!#; public unction incremente!,cpt#; ' inter ace Template0 $ public unction decremente!,cpt#; ' class F implements TemplateB Template0 $ protected ,&al; unction 11construct!# $ ,thisK>&al=-; ' unction a iche!# $ print ,thisK>&al; unction incremente!,cpt# $ ,thisK>&al<=,cpt; unction decremente!,cpt# $ ,thisK>&alK=,cpt;
'
'
'
'
S. ROHAUT
Page 85/93
Pour un attri4utL on utilise les t9odes M __get N et M __set N. /a t9ode M __get N est appele i plicite ent lorsque vous tente+ d(accder ' la valeur d(une varia4le qui n(est pas dfinie dans votre classe. 8lle prend co e unique para :tre le no de l(attri4ut auquel vous tente+ d(accder. /a t9ode M __set N est appele lorsque vous tente+ d(affecter une valeur ' un attri4ut qui n(est pas dfiniL et prend deu3 para :tres 2 le no de la varia4le et la valeur affecte.
class F $ pri&ate ,tab=array!#; unction 11get!,&# $ i !!isset!,thisK>tabJ,&M## return else return ,thisK>tabJ,&M; unction 11set!,&B,c# $ ,thisK>tabJ,&M=,c; alse;
'
'
'
,o- = neS F!#; ,o-K>&ar=-; // Ge membre &ar n2e"iste pas et pourtant ... echo ,o-K>&ar; // Pa marche et Pa a iche - !
S. ROHAUT
Page 86/93
class F $ public ,&-="salut"; public ,&0="les"; public ,&6="amis !"; pri&ate ,&A="pri&*"; ' ,o- = neS F!#; oreach!,o- as ,cle => ,&aleur# $ echo ",cle = ,&aleur <br />In"; '
$e code affic9e
&- = salut &0 = les &6 = amis !
8t les attri4uts qui ne sont pas visi4les ne sont pas affic9s. Il e3iste des interfaces prdfinies per ettant de crer sa propre classe d(itration. /a classe M terator N i pl ente les cinq t9odes suivantes 2
;n peut donc crer une classe i pl entant cette interface pourL par e3e pleL naviguer dans le rsultat d(une requIte de 4ase de donnesL ou dans un ta4leau.
'
/a fonction attend un o4,et particulier de classe utilisateur. 5out fonctionnera ' erveille si votre code est 4lind. $ependant si on lui passe un entierL Wa ne arc9era pasL ais c(est seule ent lors du M return ,userK>in os!# N que PHP gnrera une erreur. /e M t!pe hinting N indique ' PHP ce qu(attend e3acte ent la fonction.
unction detail!utilisateur ,user# $ return ,userK>in os!#;
'
$ette fois PHP " retournera une erreur d:s l(appel ' la fonction si elle ne reWoit pas un o4,et de classe utilisateur.
S. ROHAUT
Page 87/93
)u sein du 4loc M tr! NL l(e3cution d(une instruction errone va dclenc9er l( ission d(un signal 2 une e3ception. $e signal interro pt l(e3cution du reste de tout le 4loc. 8n fonction du signalL PHP e3cutera le 4loc M catch N appropri. ;n re arque que dans le 4loc M catch NL PHP g:re les e3ceptions ' l(aide d(une classe spciale appele M "xception N. Une e3ception est en fait dfinie par un o4,et de cette classe ou d(une classe drive. ;n peut donc crer ses propres gestionnaires d(e3ceptions. $o e on peut crire plusieurs 4locs M catch N pour grer les e3ceptions suivant le type d(o4,et.
) l(aide de l(instruction M throw N nous avons provoqu l( ission d(une e3ception qui sera gre par la classe M 83ception N. Dans ce casL PHP va rec9erc9er le 4loc M catch N correspondant au type d(o4,et cr pour grer l(e3ceptionL ici Mcatch#"xception $e$ N.
essage d(erreur et le
S. ROHAUT
Page 88/93
get'ode#$ 2 $ode erreur de l(e3ception get(ine#$ 2 nu ro de la ligne du script ayant provoqu l(e3ception get)ile#$ 2 no du script PHP ayant provoqu l(e3ception e
get*race#$ et get*race+string#$ 2 gestion de la pile d(appelsL un peu co Oava. __to,tring#$ 2 c9a-ne for ate ' affic9er.
/es t9odes M get----#$ N sont finales. ;n ne peut donc pas les tendre. 6ais le constructeur et la t9ode M __to,tring N peuvent Itre tendus. ;n peut donc crer sa propre classe drive.
class RonD"ception e"tends D"ception $ public unction 11construct!,message="Drreur par d* aut"B ,code = =# $ parent9911construct!,messageB ,code#; ' ' ,a=-; try $ sSitch!,a# $ case -9 throS neS RonD"ception!"4uille !"B,a#; brea5; case 09 throS neS D"ception!"Fie !"B,a#; brea5; ' ' catch!RonD"ception ,e# $ echo ,eK>getRessage!#; ' catch !D"ception ,e# $ echo 2D"ception9 2.,eK>getRessage!#.2 ligne 2.,eK>getGine!#."In"; '
ne donnera pas du tout le rsultat esco pt. /(e3cution de M fopen N ne provoquera pas l( ission d(une e3ception ais une erreur PHP de type T)DFIF% 2
.arning9 open!toto# J unction. openM9 ailed to open stream9 Oo such ile or
S. ROHAUT
Page 89/93
PHP g:re plusieurs niveau d(erreurs 2 LA3/0/4L /-T01.L etc. Par e3e pleL un pro4l: e d(ouverture de fic9ier et une erreur de type T)DFIF%L une erreur de synta3e P)D#8L l(utilisation d(une varia4le non dclare un F;5I$8. ;n peut rgler et odifier les niveau3 d(erreurs dans le p9p.iniL ais aussi dyna ique ent via des fonctions. Par i ces fonctionsL deu3 peuvent nous intresser. M set_error_handler N per et de odifier le co porte ent par dfaut de PHP lorsqu(il rencontre une erreur dans votre script. )u lieu d(e3cuter son propre gestionnaireL il e3cutera le votre. )ttentionL ce gestionnaire ne peut pas grer certains types d(erreurs @synta3eL etcL voir 9ttp2<<>>>.p9p.net< anual<en<function.setJerrorJ 9andler.p9pBL ais dans le cas d(un si ple LA3/0/4 ou /-T01. il n(y a pas de pro4l: e. ;n lui passe en para :tre le no de sa propre fonction qui doit grer l(erreur. /es para :tres sont asse+ parlants. Dans notre fonctionL nous allons dclenc9er une e3ception ' la rception de n(i porte quelle erreur.
$ unction gest1erreur!,errnoB ,errstrB ,err ileB ,errline#
'
set1e"ception1handler!2e"ception1handler2#;
S. ROHAUT
Page 9!/93
/a session doit Itre ouverte sur c9aque page par la fonction M session&start*, N avant l(utilisation de l(o4,et /es classes doivent Itre dfinies avant l(ouverture de session par sessionAstart@B et l(appel ' l(o4,etL ce qui i plique soit de rpter cette dclaration dans c9aque pageL soit de la placer dans un fic9ier ' inclure avec M re uire*, N ou M re uire&once*, N en d4ut de script. /(o4,et doit Itre une varia4le de session stoc?e soit par la fonction M session&re"ister*, NL soit ' l(aide du ta4leau glo4al M A&S.SS0-/BC N.
'
class ]anier1nomme e"tends ]anier $ &ar ,proprietaire; unction nom1proprietaire !,nom# $ ,thisK>proprietaire = ,nom;
'
'
S. ROHAUT
Page 9 /93
?>
o4,et.p9p 2
<?php re>uire1once!"obTet.inc"#; session1start!#; ?> <html> <head> <title>]age -</title> </head> <body> <? ,13D3384OJ2obTet2M=neS ]anier1nomme; ,13D3384OJ2obTet2MK>nom1proprietaire!"seb"#; ,13D3384OJ2obTet2MK>aTout1article!"re =-"B6#; ,13D3384OJ2obTet2MK>suppr1article!"re =-"B-#; ,13D3384OJ2obTet2MK>aTout1article!"re =0"B6#; echo "$,13D3384OJ2obTet2MK>proprietaire'<br />"; ?> <a hre ="obTet0.php">]age 0</a> </body> </html>
o4,et2.p9p 2
<?php re>uire1once!"obTet.inc"#; session1start!#; ?> <html> <head> <title>]age 0</title> </head> <body> <? echo ,13D3384OJ2obTet2MK>proprietaire."<br />"; ,13D3384OJ2obTet2MK>liste1article!#; ?> </body> </html>
1%.2 (utres as
Dien n(e pIc9e de conserver un o4,et pour le rcuprer plus tardL I e apr:s avoir fer une session. Pour Wa on peut le stoc?er dans un fic9ier ou en 4ase de donnes. Pour rcuprer un for at correct de donnes pour stoc?ageL il faut utiliser les fonctions M seriali9e*, P et M unseriali9e*, P. /a pre i:re fonction retourne une c9a-ne de te3te reprsentant la varia4le @pas forc ent un o4,etB passe en para :tre. $e for at de donne peut ainsi Itre stoc? dans la ani:re qui vous convient. /e seconde fonction prend co e para :tre la c9a-ne de te3te issue de seriali+e et retourne la varia4le du type originelL dans notre cas un o4,et. classa.inc2
<?php class F $ &ar ,one = -; unction shoS1one!# $ echo ,thisK>one;
S. ROHAUT
Page 92/93
?>
'
'
page1.p9p2
<?php include!"classa.inc"#; ,a = neS F; ,s = serialide!,a#; // enregistred ,s oe la page0.php pourra le trou&er. , p = open!"store"B "S"#; puts!, pB ,s#; close!, p#; ?>
page2.p9p2
<?php // %eci est n*cessaire pour >ue unserialide!# onctionne correctement include!"classa.inc"#; ,s = implode!""B U ile!"store"##; unserialide!,s#; // maintenantB utilised la m*thode shoS1one de l2obTet ,a. ,aK>shoS1one!#; ?>
S. ROHAUT
Page 93/93