You are on page 1of 93

Cours PHP

Versions 4.x et 5.x Sbastien ROHAUT

Table des matires


1 Introduction....................................................................................................................................... 7 1.1 Dfinition................................................................................................................................... 7 1.2 Historique...................................................................................................................................7 1.3 Utilisation pratique.................................................................................................................... 7 1.4 Pages statiques vs pages dyna iques........................................................................................ ! 1." #cripts $%I................................................................................................................................ ! 1.& Pages dyna iques et PHP..........................................................................................................! 1.7 Pourquoi prfrer PHP ' d(autres langages co e )#P *........................................................ ! 1.! $e que vous deve+ d,' conna-tre .............................................................................................. 1.. /e ncessaire serveur................................................................................................................. . 1.10 /e ncessaire client.................................................................................................................. . 1.11 /e respect des standards............................................................................................................ 2 1ases 2Prsentation.......................................................................................................................... 11 2.0.1 #ynta3e de 4ase................................................................................................................ 11 2.1 Intgration ' H56/................................................................................................................. 11 2.2 #parateur d(instructions.......................................................................................................... 12 2.3 1loc d(instructions....................................................................................................................12 2.4 $o entaires.......................................................................................................................... 12 3 5ravailler avec des varia4les........................................................................................................... 13 3.1 Dclarer une varia4le............................................................................................................... 13 3.2 Porte des varia4les................................................................................................................. 13 3.3 7aria4les prdfinies............................................................................................................... 14 3.4 7aria4les dyna iques.............................................................................................................. 1" 3." 5ypes de varia4les....................................................................................................................1" 3.".1 4oolens........................................................................................................................... 1" 3.".2 8ntiers.............................................................................................................................. 1" 3.".3 7irgule flottante............................................................................................................... 1& 3.".4 $9a-nes de caract:res....................................................................................................... 1& 3."." /es ta4leau3..................................................................................................................... 17 3.".& /a varia4le o4,et...............................................................................................................1! 3.& /es constantes.......................................................................................................................... 1! 3.7 ;4tenir le type d(une varia4le.................................................................................................. 1. 3.! Dfinir et suppri er une varia4le............................................................................................ 1. 4 /es oprateurs..................................................................................................................................20 4.1 /a prcdence des oprateurs.................................................................................................. 20 4.2 ;prateurs arit9 tiques......................................................................................................... 20 4.3 ;prateurs d(assignation.......................................................................................................... 20 4.4 ;prateurs sur les 4its..............................................................................................................20 4." ;prateurs de co paraison......................................................................................................21 4.& ;prateur d(erreur.................................................................................................................... 21 4.7 ;prateur d(e3cution.............................................................................................................. 21 4.! ;prateurs d(incr entation<dcr entation...........................................................................21 4.. ;prateurs logiques................................................................................................................. 21 4.10 ;prateurs de c9a-nes............................................................................................................ 22 4.11 ;prateur de ta4leau3............................................................................................................ 22 " /a notion d(e3pression..................................................................................................................... 23 & /es structures de contr=le................................................................................................................ 2" &.1 if............................................................................................................................................... 2" &.2 >9ile.........................................................................................................................................2" S. ROHAUT Cours Programmation PHP Page 2/93

&.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

Cours Programmation PHP

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

1.3 Utilisation pratique


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/

1.4 Pages statiques vs pages dynamiques


Une page statique et une page crite directe ent en H56/. 8lle peut ventuelle ent incorporer du code Oavascript lui donnant un se 4lant de (dyna is e( ais unique ent du c=t du navigateur et des donnes locales. Pour des traite ents plus lourds ncessitant l(acc:s ' une 4ase de donnesL un for atage de ta4leau en fonction de rsultatsL une rec9erc9e pousseL du grap9is eL il faut passer par des pages dyna iques et par un langage qui sera e3cut du c=t du serveur 2 )#P sur les serveurs 6icrosoft<II#L PerlL PHP...

1.5 S ripts !"#


PHP peut Itre utilis co e langage $%I. Pour rappelL un script ou progra e $%I est un progra e co e un autre ais dont la sortie est ddie ' un navigateurL par e3e ple un progra e s9ellL $ ou Perl qui sort du H56/. PHP tant un langage script co e un autre on peut l(utiliser dans ce casL ais ce n(est pas forc ent le ieu3.

1.$ Pages dynamiques et PHP


PHP est un langage #erver #ide ou c=t serveur. /ors du c9arge ent d(une page PHPL c(est le serveur qui va lireL interprter et e3cuter le code. Puis il renvoie le rsultatL gnrale ent sous la for e de code H56/ au navigateur. )insi le navigateur et l(utilisateur ne voient ,a ais le vrita4le code PHP e3cut. De plus le rsultat tant une page >e4 classique en H56/L pas 4esoin d(installer sur le client des co posants spcifiques @,avaL ...B. Il n(y a donc pas de notion de vitesse d(e3cution du c=t du clientL ais celle du serveur est prpondrante.

1.% Pourquoi prfrer PHP & d'autres langages omme (SP )


)#P n(est pas enti:re ent un langage puisque )#P veut dire )ctive #erver Page. )#P dispose 4ien entendu de ses propres )PI ais qui peuvent Itre accessi4les via un autre langage. Il s(agit d(utiliser un langage @quelconqueB pour crer des pages dyna iques. Fative ent disponi4le avec II# sous Tindo>sL il ne l(est pas par dfaut avec les autres syst: es ou serveurs >e4 co e )pac9e. Il e3iste cependant des odules de co pati4ilit )#P pour )pac9e co e )pac9e22)#P qui reprend les )PI )#P en les tendant et en progra ation P8D/. #ous Tindo>sL le code )#P se fait gnrale ent en 71#cript ou en Oscript. $(est aussi possi4le sous Uni3</inu3 et )pac9eL ais il faut alors se tourner vers des solutions co erciales @#un ;ne )#PL Instant )#PL ...B. #ous S. ROHAUT Cours Programmation PHP Page 8/93

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

1.* !e que vous deve+ d,& onna-tre


7ous deve+ conna-tre H56/ ainsi qu(un langage de progra ation procdural @$ par e3e pleB. Une connaissance 4asique du #E/ peut Itre ncessaire ais sera a4orde.

1.. /e n essaire serveur


PHP ne sert pas seule ent ' faire des pages dyna iques. $(est un langage interprt qui au I e titre que PerlL Pyt9on ou 5$/ est capa4le de lancer des scripts intractifs ou non. ;n peut I e utiliser PHP pour crer des interfaces grap9iques @e3tension %5VB. /e ini u ncessaire et vital pour apprendre PHP est donc l(interprteur PHP luiJ I e sur un environne ent support @Uni3L Tindo>sL 6acL ...B. #i on parle de /)6PL on voit 4ien la rfrence. Un syst: e /inu3L un serveur Te4 )pac9eL un serveur de 4ases de donnes 6y#E/ et un interprteur PHP. /a version 4 de PHP per et de fonctionner avec II#L et 6y#E/ e3iste aussi pour Tindo>s. ;n peut donc utiliser une arc9itecture TI6P @Tindo>sL II#L 6y#E/L PHPB ou T)6P @Tindo>sL )pac9eL 6y#E/L PHPB. ),outer PHP ' II#L c(est laisser la porte ouverte ' tous les ventsL on prfrera donc la seconde solution. /es distri4utions /inu3 disposent d,' du ncessaire pour l(arc9itecture /)6P et le para trage est asse+ si ple. De plus le ode M userA od N de )pac9e per et ' c9aque utilisateur de crer son site >e4 dans un rpertoire spcifique de son rpertoire personnel. #ous Tindo>sL c(est d,' un peu plus co ple3e ' ettre en oeuvre anuelle ent. ;n e ploie donc des distri4utions toutes faitesL la eilleure se no ant 8asyPHP. /es versions 1.& et 1.7 sont les eilleures pour dvelopper. ;n peut ainsi dvelopper son site sous Tindo>s et le porter tel quel sur un serveur Uni3.

1.10 /e n essaire lient


Pour dvelopper il suffit d(un si ple diteur ais il vaut ieu3 prfrer un diteur plus volu supportant la coloration synta3ique et quelques fonctions volues. /(diteur H)P8dit 3 est parfait pour dvelopper en PHP. /(acc:s au3 4ases 6y#E/ peut se faire soit depuis un navigateur @p9p6y)d inB soit depuis une interface 6y#E/$$ ou encore D1Designer pour la conception. Pour les tests 2 un si ple navigateur respectant les standards du >e4.

1.11 /e respe t des standards


/e T3$ est l(organis e international faisant loi dans le onde des standards du >e4. Il a dfini une srie de nor es dont le H56/L le G6/L le GH56/L les $##L etc. Pourquoi respecter un standard * $(est la garantie d(un 4on fonctionne ent et du 4on affic9age de ani:re identique de vos pages sur S. ROHAUT Cours Programmation PHP Page 9/93

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

Cours Programmation PHP

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.

2.0.1 Syntaxe de base 2.1 #ntgration & H12/


Une page p9p porte l(e3tension M .php N. Une page PHP peut Itre enti:re ent progra e en PHP ou lange avec du code 9t l. PHP est un langage M 8 4edded H56/ NL c(est ' dire qu(il appara-t ' n(i porte quel endroit de la page H56/. Pour Wa on le place dans des 4alises particuli:res 2 <?php et ?>. ;n peut aussi utiliser les 4alises <script language="php"> et </script>. /a pre i:re for e est prfra4le pour plus de si plicit et une co pati4ilit GH56/. ;n crit donc une page H56/ dans laquelle on int:gre du code PHP.
<html> <head> <title>Titre</title> </head> <body> <?php echo "Hello World !"; ?> </body> </html>

/e code H56/ gnr sera le suivant


<html> <head> <title>Titre</title> </head> <body> Hello World ! </body> </html>

/(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

Cours Programmation PHP

Page

/93

2.2 Sparateur d'instru tions


$o e en $ une instruction se ter ine par un pointJvirgule M K N. Fote+ que la 4alise fer ante *X i plique la fin d(une instruction.
<?php echo "%eci est un test"; ?> <?php echo "%eci est un test" ?>

2.3 3lo d'instru tions


Un 4loc d(instructions se place entre accolades Y et Z. Un 4loc d(instructions peut contenir du code de n(i porte quelle longueur et est considr dans le reste du code co e une instruction unique. #i c(est une e3pression @qui a une valeurB on peut donc assigner le 4locL faire des calculsL ...

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

Cours Programmation PHP

Page 2/93

3 Travailler avec des variables


3.1 D larer une varia4le
Une varia4le co ence par un dollar M [ N suivi d(un no de varia4le. /es varia4les ne sont pas types au o ent de leur cration. )ttention PHP est sensi4le ' la casse 2 var et 7ar ne sont pas les I es varia4les U 7oici les r:gles ' respecter 2

Une varia4le peut co Une varia4le peut co

encer par une lettre encer par un soulign @underscoreB M A N

Une variable ne doit pas commencer par un chiffre.

// )*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.

3.2 Porte des varia4les


/a porte d(une varia4le dpend du conte3te. Une varia4le dclare dans un script et 9ors d(une fonction est glo4ale ais par dfaut sa porte est li ite au script courantL ainsi qu(au code ventuelle ent inclus @includeL requireB et n(est pas accessi4le dans les fonctions ou d(autres scripts. S. ROHAUT Cours Programmation PHP Page 3/93

,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.

PHP accepte les varia4les statiques. $o on sort d(une fonction.

e en $ une varia4le statique ne perd pas sa valeur quand

'

unction test1static!# $ static ,a==; echo ,a; // <- . cha>ue passage dans la ,a<<;

onction

3.3 5aria4les prdfinies


PHP dispose d(un grand no 4re de varia4les prdfinies. $es varia4les sont gnrale ent de type scalaires ou des ta4leau3. 8lles sont souvent de type superglo4alesL c(est ' dire accessi4le depuis n(i porte o^ sans notion de porte. 7oici quelques ta4leau3 prdfinis @voir au point 5a4leau3 pour co prendre leur utilisationB.

[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

Cours Programmation PHP

Page 4/93

3.4 5aria4les dynamiques


Une varia4le dyna ique utilise la valeur d(une varia4le co les varia4les dyna iques en ra,outant un M [ N devant le no
,a="&ar"; ,,a=-; // ,,a=- e>ui&aut en echo ,a; // a iche &ar echo ,,a; // a iche echo ,&ar; // a iche ait . ,&ar=-

e no d(une autre varia4le. ;n utilise de la pre i:re varia4le.

)ttention avec les ta4leau3 U Pour viter toute a 4iguatL il est prfra4le de placer la varia4le entre accolades.

3.5 1ypes de varia4les 3. .1 boolens


Un 4oolen peut prendre deu3 valeurs TC:D ou EFG3D. /es deu3 constantes TC:D et EFG3D peuvent Itre utilises sans aucune distinction de casse @pas de diffrences entre les a,uscules et les inusculesB.
,&ar=EFG3D; // EFG3DB EalseB alseB ... ,&ar0=True; // TC:DB TrueB trueB ...

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

Cours Programmation PHP

Page 6/93

3alut les amis %omment Pa &a ? E8O; echo ,toto;

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

i i loulou toto. ics

;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

Cours Programmation PHP

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;

;n peut aussi crer des ta4leau3

ultidi ensionnels ' l(aide des deu3

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!#.

odifier les l ents

,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

3.$ /es onstantes


/es constantes est un no qui prend une valeur ne pouvant pas Itre odifie une fois fi3e. Une constante n(est accessi4le qu(en lecture seule. 8lles sont sensi4les ' la casse et doivent par convention Itre crites en a,uscules. ;n dfinit une constante avec la fonction de ine!# et doit respecter certaines r:gles 2

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.

de ine!%4O3TFOTDB"&aleur"#; echo %4O3TFOTD; // a iche "&aleur"

S. ROHAUT

Cours Programmation PHP

Page 8/93

3.% 64tenir le type d'une varia4le


Pour o4tenir le type d(une varia4leL on utilise la fonction M "ettype N qui retourne une c9a-ne de te3te indiquant le type. Mais attention rien ne "arantit ue le rsultat soit le m#me d$une version PHP % une autre. /es types retourns sont `4oolean`L `integer`L `dou4le` @pour des raisons 9istoriquesL `dou4le` est retourne lorsqu(une valeur de type float est fournieL au lieu de la c9a-ne `float`BL `string`L `array`L `o4,ect`L `resource` @depuis PHP 4BL `FU//` @depuis PHP 4BL `un?no>n type` #i vous sou9aite+ relle ent tester le type d(une varia4leL il est prfra4le d(utiliser les fonctions de type M is&' N 2 is&array( is&bool( is&double( is&float( is&int( is&inte"er( is&lon"( is&null( is&numeric( is&ob)ect( is&real( is&resource( is&strin"( is&callable *est+ce une fonction,.

3.* Dfinir et supprimer une varia4le


#i vous sou9aite+ savoir si une varia4le est dfinieL c(est ' dire si elle est affecteL on utilise M isset N. 8nfin si vous sou9aite+ suppri er une varia4leL il faut utiliser M unset N.

S. ROHAUT

Cours Programmation PHP

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>

4.2 6prateurs arit7mtiques


/es oprateurs RL JL eL < et P. /e M P N est le odulo 2 le reste de la division.

4.3 6prateurs d'assignation


/e principal est le \ ais on a aussi co e en $ des oprateurs co 4ins R\L J\L e\L <\L P\L .\ ...

4.4 6prateurs sur les 4its


/es oprateurs sont le ] @)FDBL f @;DBL g @G;DBL h @F;5L h[aBL XX @[aXX[4 dcalage de [4 4its S. ROHAUT Cours Programmation PHP Page 2!/93

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.

4.5 6prateurs de omparaison


/es oprateurs sont \\ @[a\\[4L _X @diffrentBL _L XL _\L X\. I e valeurBL \\\ @[a\\\[4L I e valeur et I e typeBL U\ ou

Il y a aussi l(oprateur ternaire M *2 N e3pr1*e3pr22e3pr3 #i e3pr1 est vrai alors e3pr2 sinon e3pr3.

4.$ 6prateur d'erreur


;n dispose d(un oprateur spcial i qui appliqu ' une e3pression e pIc9e la sortie d(un essage d(erreur en cas de pro4l: e. ;n peut tou,ours rcuprer le essage d(erreur ventuel ' l(aide de la varia4le [p9pAerror sg ais unique ent si l(option M trac?Aerrors N est ' M ;n N dans le p9p.ini.
,retour=U,tabJ2toto2M; // ne retourne pas d2erreurs si l2inde" toto n2e"iste pas

4.% 6prateur d'e8 ution


;n peut e3cuter des co andes e3ternes au PHP co e en #9ell avec les oprateurs M guille ts inverses M j N @altgrR&B. )ttention l(option M safeA ode N doit Itre ' M ;n N dans le p9p.ini. ;n peut aussi utiliser la fonction M s9ellAe3ec N qui fait e3cuter une co ande par le s9ell.

4.* 6prateurs d'in rmentation9d rmentation


;n dispose co
,a<<; <<,a; ,aKK; KK,a; // // // //

e en $ des oprateurs RR et JJL ' utiliser avant ou apr:s le no


l2incr*mente de - puis retourne ,a d*cr*mente de - puis retourne ,a

de varia4le.

retourne ,a puis incr*mente ,a de retourne ,a puis d*cr*mente ,a de

)ttention U /es oprateurs ragissent au3 types de varia4les. /e PHP ragit co


,a=2V2; ,a<<; echo ,a; // retourne FF ,a<<; echo ,a; // retourne FW

e en P8D/. )insi 2

4.. 6prateurs logiques


/es oprateurs logiques sont 2
X X X X and Y ou X @@ Y !,a and ,bB ,a @@ ,b# &rai si ,a et ,b sont &rais or Y ou X ZZ Y !,a or ,bB ,a ZZ ,b# &rai si ,a ou ,b sont &rais "or Y !,a "or ,b# &rai si ,a ou ,b sont &rais mais pas les deu" en m[me temps ! Y !!,a# &rai si ,a est au".

)ttentionL and et or n(ont pas la

I e priorit @priorit plus fai4leB que ]] et ff U

S. ROHAUT

Cours Programmation PHP

Page 2 /93

4.10 6prateurs de 7a-nes


Il y a deu3 oprateurs de c9a-nes 2 le M . N qui concat:ne deu3 c9a-nes entre elles et le M .\ N d,' vu qui est l(oprateur d(assignation.
,a="WonTour"; ,b=,a." les amis"; // ,b contient WonTour les amis ,b.="! 3alut."; // ,b contient WonTour les amis! 3alut.

4.11 6prateur de ta4leau8


;n peut M additionner N deu3 ta4leau3 entre eu3 avec le M R N 2 le ta4leau de droite est a,out au ta4leau de gauc9e.

S. ROHAUT

Cours Programmation PHP

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

Cours Programmation PHP

Page 23/93

,a=TC:D; ,b=0;,c=6; echo ,a?,b9,c; // a

iche 0

S. ROHAUT

Cours Programmation PHP

Page 24/93

* )es structures de contr.le


$.1 if
i !e"pression# commande ou $ bloc de commandes ' else commande ou $ bloc de commandes '

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 ' ...

;n peut placer du H56/ co


<?php i !,a == 7# $ ?> F = 7 <?php ' ?>

e co

ande ou dans le 4loc de 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 ; ?>

$.2 :7ile *.2.1 /'ile classi0ue


$(est la 4oucle M tant que N si ple 2 tant que la condition n(est pas vraieL on continue la 4oucle. /(e3pression est place en d4ut de 4oucle 2 si l(e3pression est fausse avant de rentrer dans la 4oucleL la 4oucle n(est pas e3cute.
While!e"pression# commande ou $ bloc de commandes '

;n peut aussi utiliser la synta3e alternative 2


Shile!e"pression#9 commande ou $ bloc de commandes ' endShile

*.2.2 do ... /'ile


$(est la seconde possi4ilit. Dans ce cas la co S. ROHAUT ande ou le 4loc de co ande est e3cute au Page 25/93

Cours Programmation PHP

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<<# ;

;n peut e ployer une synta3e alternative avec le M 2 N et M endfor N.


or!e"pr-;e"pr0;e"pr6#9 commande ou $ bloc de commandes ' end or

$.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

Cours Programmation PHP

Page 26/93

' ,a = array ! "un" => -B "deu"" => 0B "trois" => 6B "di"Ksept" => -L #;

oreach !,arr as ,&alue# $ echo "/aleur9 ,&alue<br>In";

'

oreach!,a as ,5 => ,&# $ print "I,aJ,5M => ,&.In";

$.5 4rea; et ontinue


/(instruction M 4rea? N per et de sortir d(un forL >9ileL foreac9 ou s>itc9. ;n peut lui indiquer de co 4ien de structures on sou9aite sortir si elles sont e 4o-tes. /(instruction M continue N per et de passer ' l(itration suivante. )ttention PHP conside le s>itc9 co e une 4oucleL et dans ce casL rvalue le s>itc9. ;n peut indiquer ' continue co 4ien de structures e 4o-tes relancer.

$.$ 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 '

egale ="; egale -"; egale 0"; est in *rieur . = ou sup*rieur . 0 Y;

/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.

$.* require et in lude <=on e>


M require N et M include N incluent ' l(endroit actuel et e3cutent le fic9ier PHP. Ils sont identiques dans leur fonctionne ent ' une e3ception 2 le traite ent des erreurs. Un include produit un M >arning N @le code continue en principe ' s(e3cuterB tandis qu(un require produit une M erreur fatale N @l(e3cution s(arrIteB. $o e require et include sont des l ents du langage et pas des fonctions il y a pas 4esoin d(utiliser les parent9:ses. M requireAonce N et M includeAonce N resse 4lent ' leurs 9o ologues avec cependant une diffrence. Euoi qu(il arriveL le fic9ier est inclus une seule fois. #i un second M requireAonce N appara-t avec le I e fic9ierL l(instruction ne sera pas e3cute.

S. ROHAUT

Cours Programmation PHP

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";

'

/( RaitenantB nous pou&ons appeler i !,ma5e oo# oo!#;

oo!# car ,ma5e oo est maintenant &rai (/

'

unction bar!# $ echo "\2e"iste d+s le d*but du programme.In";

Pour le second cas 2


unction oo!# $ unction bar!# $ echo "\e n2e"iste pas tant >ue '

oo!# n2est pas appel*.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";

' ,msg="salut"; modi !,msg#; echo ,msg; // coucou

;n peut aussi dfinir des valeurs par dfaut valeurs par dfaut doivent Itre en dernier.

ais )558F5I;FL dans la liste des para :tres les

'

unction a iche!,nomB ,prenom="toto"# $ echo ",nom ,prenom";

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

'

%.3 5aleur de retour


;n retourne une valeur avec l(instruction M return N. ;n peut retourner tout type de valeursL ais pas plusieurs en I e te ps. $ependant rien n(e pIc9e dans ce cas de retourner un ta4leau. Une fonction peut aussi retourner une rfrence. Dans ce cas elle doit Itre dclare avec un M ] N devant son no .
unction carre !,num# $ return ,num ( ,num; // a iche 2-Q2

' echo carre !A#;

%.4 ?on tions internes


8n plus des fonctions dfinies par l(utilisateur PHP propose un grand no 4re de fonctions internes couvrant une ultitude de do aines. Pour accder ' ces fonctions il faut si ple ent les appeler par leur no et que le odule correspondant soit co pil avec PHP. Fous verrons dans les c9apitres suivants co ent en utiliser certaines.

S. ROHAUT

Cours Programmation PHP

Page 3!/93

2 3estion des $ormulaires en P4P


*.1 "@1 et P6S1
/e 4ut est de rcuprer le contenu des c9a ps d(un for ulaire H56/ dans notre code PHP pour pouvoir le traiter. /orsqu(un for ulaire est envoy ' un script PHPL toutes les varia4les seront disponi4les auto atique ent dans le script. /es for ulaires peuvent Itre de type %85 ou P;#5. Pour rappelL dans un for ulaire de type %85L les infor ations sont passes directe ent par l(UD/ en clairL ce qui peut poser des pro4l: es de li itations suivant le serveur @de 2"& ' !1.2 octets selon le casB. /a t9ode P;#5 n(a pas ce genre de li itationL car les infor ations sont trans ises par le conteneur de varia4les glo4ales @dans l(entIteB et sont de plus cac9es. PHP peut grer les deu3 t9odes de ani:re transparente.

*.2 A upration par ta4leau


$9aque c9a p de for ulaire en PHP est dfini par un no et une valeur. Dans un scriptL PHP va rcuprer ces no s et ces valeurs dans des ta4leau3 spciau3 dit superglo4au3 @accessi4les depuis partoutB. Pour la t9ode %85L le ta4leau est [A%85L pour la t9ode P;#5 le ta4leau est [AP;#5. #i vous ne sou9aite+ pas vous soucier de la t9odeL vous pouve+ utiliser le ta4leau [AD8EU8#5. 8n inde3 on aura le no du c9a p de for ulaire @ou de la varia4le passe en UD/B et en valeur la valeur du c9a p. Par e3e ple 2
< orm action=" oo.php" method="post"> Oame9 <input type="te"t" name="username"><br> Dmail9 <input type="te"t" name="email"><br> <input type="submit" name="submit" &alue="3ubmit me!"> </ orm>

Dans la page PHP foo.p9p on aura 2


<?php echo ,1]43TJ2username2M; echo ,1CD^:D3TJ2email2M; ?>

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

t9ode i plicite %85. Pour rcuprer M id N

[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; ?>

*.3 A upration dire te


#i cette valeur est ' off et que pour diverses raisons @scuritL pas le droitL etcB vous ne sou9aite+<pouve+ pas la odifierL il e3iste tout de I e une t9ode. /a fonction M import&re uest&variables N per et d(effectuer e3plicite ent la I e c9ose. $ette fonction prend un ou deu3 para :tresL le second tant optionnel. )pr:s e3cutionL on rcup:re les varia4les sans passer par un ta4leau. /e pre ier para :tre est le type de varia4les qu(on sou9aite rcuprer 2

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; ?>

*.4 Utiliser des ta4leau8


/es for ulaires per ettent d(utiliser des listes ' c9oi3 ultiples et PHP doit donc rcuprer l(ense 4le des c9oi3 de l(utilisateur. Pour Wa il faut utiliser les ta4leau3.
< orm action="<?php echo ,HTT]13DC/DC1/FC3J2]H]13DGE2M; ?>" method="post"> Oame9 <input type="te"t" name="personalJnameM"><br> Dmail9 <input type="te"t" name="personalJemailM"><br> Weer9 <br> <select multiple name="&inJM"> <option &alue="bordeau"">bordeau"</option> <option &alue="beauTolais">beauTolais</option> <option &alue="loire">loire</option> </select><br>

S. ROHAUT

Cours Programmation PHP

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

Cours Programmation PHP

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.

..2 A uprer la date et l'7eure 5.2.1 date78


/e plus si ple est d(utiliser la fonction M date N qui retourne l(9eure locale sous for e d(une c9a-ne de caract:res ' prciser en pre ier para :tre. 8n second para :tre on peut prciser un M timestamp N si on ne sou9aite pas l(9eure actuelle. Pour rcuprer la date du ,our 2
echo date!"d/m/`"#; // =Q/=-/0==A

7oici les caract:res utilisa4les @docu entation PHPB 2


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

Cours Programmation PHP

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

5.2.2 date locale str$time78


Pour for ater le rsultat en local @pour tenir co pte de la localisationB il faut utiliser la fonction M strftime N qui tient co pte de la langue. ;n aura donc un rsultat en franWais. /e pre ier para :tre est la c9a-ne de for atage. /e second est un ventuel ti esta p.

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

5.2.3 9etour ,ar tableau #etdate78


/a fonction M "etdate N per et aussi de rcuprer la date et l(9eure actuels @avec ventuelle ent un ti esta p en para :treB ais sous for e de ta4leau inde3 selon les valeurs suivantes 2

`seconds` J secondes ` inutes` J inutes

S. ROHAUT

Cours Programmation PHP

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";

5.2.% )-'eure localtime78


Pour l(9eure on peut utiliser les fonctions M localtime N qui peut aussi prendre un para :tre ti esta p et qui retourne un ta4leau inde3 selon les valeurs suivantes K

`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*

..3 A uprer n'importe quelle date


;n peut rcuprer n(i porte quelle date en ti esta p ou en c9a-ne. ;n peut pour cela utiliser la fonction M strtotime N. 8lle prend co e para :tre une c9a-ne de te3te en anglais qu(elle essaie de convertir en ti esta p. 7oici quelques e3e ples.
echo echo echo echo echo strtotime!"noS"#; // timestamp actuel strtotime!"K- day"#; // hier strtotime!"<- day"#; // demain strtotime!"-- september 0==-"#; // Ge -- septembre 0==strtotime!"<- year <0 See5s <6 days"#; // dans - an 0 semaines 6 Tours

S. ROHAUT

Cours Programmation PHP

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...

10.2 6utils 10.2.1 P',:y<dmin


#(il reste 4ien entendu possi4le d(utiliser 6y#E/ en ligne de co andeL un peu co e M sqlplus N de ;racleL on est 4ien plus ' l(aise avec un environne ent plus intuitif. )insiL l(outil p9p6y)d in est une interface >e4 ' 6y#E/ per ettant d(effectuer la plupart des tkc9es de aintenance et d(utilisation. $ette solution fonctionne depuis n(i porte quel navigateur et est indpendante de la ac9ine. ;n acc:de ' p9p6y)d in gnrale ent par l(UD/ 9ttp2<<serverAna e< ysql.

S. ROHAUT

Cours Programmation PHP

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...

10.3 !rer une 4ase


) partir de l(cran d(accueil de p9p6y)d inL on saisit le no de la 4ase dans M $rer une 4ase de donnes N. Il faut de prfrence c9oisir un no si ple et intuitif. Puis on clique sur M $rer N. )pr:s la cration une nouvelle page s(affic9e 2 c(est la page principale d(ad inistration de la 4ase. 8n 9aut seront tou,ours prsents apr:s l(e3cution d(une co ande les rsultats de celleJci. $et cran per et nota ent l(e3cution de co andes #E/L et le travail sur les ta4les.

10.4 Utilisateurs et droits


Dans le enu de gauc9eL on c9oisit le M J N @tiretB qui correspond ' la racine ou ad inistration du serveur 6y#E/ par luiJ I e. Dans la nouvelle pageL on c9oisit M Utilisateurs et privil:ges N. /a page suivante per et d(a,outer un utilisateur. Il faut faire attention ' une c9ose 2 le serveur. 8n effetL suivant la configuration initiale @sur /inu3 par e3e pleB les droits dpendent de la faWon dont a t accde la 4ase. )insi si local9ost et 127.0.0.1 sont identiquesL si la 4ase est appele depuis une autre IP ou un autre no L l(utilisateur n(aura pas tous les droits. 8n cas de douteL il suffit de c9oisir M 5out serveur N. Pour crer un ad inistrateurL le ieu3 est de donner tous les privil:ges. Pour un utilisateur M standard N @requItes de slectionL d(a,outL de ises ' ,our et de suppression d(enregistre entsB on c9oisira les privil:ges #electL InsertL Update et Delete. S. ROHAUT Cours Programmation PHP Page 39/93

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.

10.5 !rer et modifier des ta4les


;n retourne par le enu de gauc9e dans une 4ase e3istante. Dans l(cran d(ad inistration on saisit @4as de la pageB le no de la ta4le et le no 4re de c9a ps @colonnesB. Il sera possi4le apr:s coup d(en ra,outer ou d(en suppri er. Puis on c9oisit M $rer N. /(tape suivante consiste ' dfinir la ta4le. IntressonsJnous au3 diffrents types de c9a ps possi4les.

10. .1 Ty,es =umri0ues


10.5.1.1 1ypes entiers

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

10.5.1.2 1ypes rels <flottants>


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

10.5.1.3 1ypes 4oolens

1I5L 1;;/L 1;;/8)F @depuis 4.1B 2 Un 4itL quivaut ' 5IFHIF5@1B

10. .2 Ty,es caractres


$es types ritent un peu plus d(e3plications.

S. ROHAUT

Cours Programmation PHP

Page 4!/93

10.5.2.1 1ypes !H(A

$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

58G5 et 1/;1 s(utilisent de


/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.

10.5.2.3 1ype @CU2

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

Cours Programmation PHP

Page 4 /93

/e c9a p cAenu c9ose 2

ne pourra prendre que deu3 valeurs 2 oui ou non. #i on tente d(y

ettre autre

insert into te"t !c1enum# &alues!2toto2#;

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#>=;

10. .3 Ty,es date


)ttention avec les dates 2 la logique de 6y#E/ est de laisser au3 dveloppeurs le soin de contr=ler la validit de leurs dates. )insi 6y#E/ autorisera l(enregistre ent d(une date de type 2004J02J30 U /es seuls tests effectus sont la validit du ois @entre 0 et 12B et la validit du ,our @entre 0 et 31B. /e +ro @0B est autoris pour des raisons pratiques2 stoc?age de l(anneL ou de l(anne< ois seule ent par e3e ple. 7oici quelques autres infor ations 2

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

ieu3 5;UO;UD# utiliser des Page 42/93

S. ROHAUT

annes sur 4 c9iffres.

Dans le cas d(une anne ' deu3 c9iffesL 00J&. sont converties en 2000J20&.L 70J.. sont converties en 1.70J1....

10.5.3.1 ?ormats supports

))))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

10.5.3.2 1ype D(1@1#2@

/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-A60-0 update test set c1t"t=2truc2; 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.

10. .% &ration : Syntaxe S;)


;n utilise la co ande #E/ $D8)58.

%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

Cours Programmation PHP

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.

Par e3e ple 2


%CDFTD TFWGD 1message ! id1message int!-=# unsigned O4T O:GG auto1incrementB id1msg1initial int!--# unsigned O4T O:GG de ault 2=2B id1msg1prec int!-=# unsigned O4T O:GG de ault 2=2B id1 orum int!-=# O4T O:GG de ault 2=2B login &archar!0=# O4T O:GG de ault 22B date datetime O4T O:GG de ault 2====K==K== ==9==9==2B suTet &archar!0==# O4T O:GG de ault 22B te"te te"tB ]C8RFC` aD` !id1message#B aD` precedent !id1msg1prec#B aD` login !login#B aD` orum !id1 orum#B aD` initial !id1msg1initial#B E:GGTDcT aD` t- !suTetBte"te# # T`]D=Ry83FR;

10. . Ty,es de tables 7:yIS<: et Inno6B8


/e 5ype de ta4le est particulier ' 6y#E/. /e type par dfaut est M 6yI#)6 NL le gestionnaire de ta4les originel de 6y#E/L si ple et rapideL correspondant ' la a,orit des 4esoins. /e second type principal est M InnoD1 N et per et une gestion des transactions et verrouillage des donnes. /es M co it NL M roll4ac? NL restauration apr:s cras9L et surtout les contraintes d(intgrit avec cls trang:res sont possi4les.
%CDFTD TFWGD parent!id 8OT O4T O:GGB ]C8RFC` aD` !id## T`]D=8OO4)W; %CDFTD TFWGD child!id 8OTB parent1id 8OTB 8O)Dc par1ind !parent1id#B E4CD8_O aD` !parent1id# CDEDCDO%D3 parent!id# 4O )DGDTD 3DT O:GG # T`]D=8OO4)W;

;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

10. .* Index >?))T!@T


10.5.$.1 !ration

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#;

) la cration de la ta4leL on ra,oute une ligne de cration d(inde3 2


E:GGTDcT aD` t- !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#;

10.5.$.3 Ae 7er 7e 4oolenne

/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"

7oici la signification des caract:res suppl entaires


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

@ et B 2 grouper une srie de

h 2 ngation d(un ot. $ontraire ent au JL le pertinence ngative. e 2 tronquage d(un

ot 2 4one \X 4on,ourL 4onsoir ...

les guille ets M ` N 2 une c9a-ne rec9erc9e telle quelle.

10.$ 2ySE/ et PHP 10.*.1 &onnexion A une base de donnes


Deu3 tapes sont gnrale ent ncessaires pour plus de si plicit. /a seconde n(est pas o4ligatoire ais 4ien pratique dans le cas o^ on travaille sur une seule 4ase de donnes dans toute la page.
10.$.1.1 !onne8ion au serveur

;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-";

ini u B trois para :tres 2 le

S. ROHAUT

Cours Programmation PHP

Page 47/93

,cn"=mys>l1connect!,b1hostB ,b1userB ,b1pass#; i !!,cn"# die !"erreur de conne"ion . Ry3^G"#;

10.$.1.2 !7oi8 d'une 4ase

;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"#;

10.$.1.3 ?ermeture d'une onne8ion

;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"#;

10.$.1.4 Squen e omplFte pour une 4ase


,b1host="s>l.t Kdata.net" ,b1user="toto"; ,b1pass="%reT-"; ,b1base="slyuni""; mys>l1connect!,b1hostB ,b1userB ,b1pass# or die!"erreur de conne"ion . Ry3^G"#; mys>l1select1db!,b1base# or die!"erreur . la selection de ,b1base#; mys>l1close!#;

10.*.2 )es re0uBtes


10.$.2.1 @8 uter une requGte

;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

Cours Programmation PHP

Page 48/93

10.$.2.2 Com4re de lignes affe tes

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";

10.$.2.3 Com4re de lignes retournes

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#;

10.$.2.4 A uprer les rsultats

/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 ...

/e second para :tre de


ysqlAfetc9Aarray@B peut Itre 2 de colonneB

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

Cours Programmation PHP

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

mys l&fetch&ro6*, 2 quivaut ' mys l&fetch&assoc*, 2 quivaut '

ysqlAfetc9Aarray@[varL6H#E/AFU6B ysqlAfetc9Aarray@[varL 6H#E/A)##;$B

10.$.2.5 #nsertion ave autoHin rment

/(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

10.*.3 9cu,ration des erreurs


8n cas d(erreur lors d(une anipulation sur 6y#E/L on peut rcuprer le nu ro de l(erreur 6y#E/ par la fonction mys l&errno*,. De I e on peut rcuprer le essage d(erreur par la fonction mys l&error*,. ;n peut trouver la liste des codes d(erreurs ici 2 9ttp2<<>>>. ysql.co <doc<en<8rrorJreturns.9t l

S. ROHAUT

Cours Programmation PHP

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; '

11.1.2.4 fget <>

/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";

11.1.2.% Aenvoyer un fi 7ier par la sortie standard

/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

Cours Programmation PHP

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

,ret= see5!, ileB=B 3DDa1DO)#; // Ein du

11.1.4.2 ftell<>

/a fonction fsee:*, renvoie la position actuelle du pointeur dans le fic9ier.


,pos= tell!, ile#;

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.

11.1. >in de $ic'ier


/a fonction feof*, indique si on est ' la fin du fic9ier ou non. 8lle retourne 5DU8 si la fin de fic9ier a t atteinteL C)/#8 sinon.
, d = open !"/tmp/input ile.t"t"B "r"#; Shile !! eo !, d## $ ,bu er = gets!, dB A=NQ#; echo ,bu er; ' close !, d#;

S. ROHAUT

Cours Programmation PHP

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 1ravail sur les rpertoires 11.2.1 9,ertoire actuel


/a fonction "etc6d*, retourne le no du dossier de travail courantL c(est ' dire l' o^ on est. )ttention sous Tindo>s 2 cette fonction ne fait pas de distinctions entre les a,uscules et les inuscules.
,chemin=getcSd!#; echo , chemin ; 99 /sr&/SSS/site

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#;

11.2.3 CuvrirD listerD $ermer


;n ouvre un rpertoire en lecture avec la fonction opendir*, qui prend co e unique para :tre un no ou c9e in de rpertoire. 8n cas d(c9ecL la fonction retourne C)/#8 sinon un identifiant @9andlerB de rpertoire. ;n lit une entre avec la fonction readdir*, qui prend co e para :tre l(identifiant de rpertoire. Euand il n(y a plus rien ' lireL la fonction retourne C)/#8 sinon elle retourne le no de l(entre actuelle ent lue. )558F5I;FL les entres M . N et M .. N sont lues co e les autres. ;n fer e un rpertoire en cours de lecture avec la fonction closedir*, qui prend co l(identifiant de rpertoire.
,handle=opendir!2.2#; Shile !, ile = readdir!,handle## $ i !, ile != "." @@ , ile != ".."# $ echo ", ileIn"; ' ' closedir!,handle#;

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

11.2.% 9cu,rer toutes les entres


6I e s(il est possi4le de rcuprer l(ense 4le des entres d(un rpertoire avec les fonctions S. ROHAUT Cours Programmation PHP Page 54/93

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#;

11.3 1ravail sur le systFme de fi 7iers 11.3.1 In$ormations sur le $ic'ier


;n peut o4tenir diverses infor ations sur un fic9ier ' l(aide des co

andes de type is&;*, 2

is&dir*, 2 5DU8 si le no is&file*, 2 5DU8 si le no

de fic9ier est un rpertoire de fic9ier est un vrita4le fic9ier nor al

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

Cours Programmation PHP

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

11.3.2 <ctions sur les $ic'iers et r,ertoires


;n retrouve ici des fonctions qui portent souvent le Uni3 2

I e no

que leurs quivalents sous le s9ell

dirname*,L basemane*, 2 isolent le c9e in et le 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

Cours Programmation PHP

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

symlin:*, 2 cr un lien sy 4olique 2 ci4leL no

m:dir*, 2 cr un rpertoireL le second para :tre est le application du asque. rename*, 2 reno

e et<ou dplace un fic9ier 2 orgineL destination.

rmdir*, 2 suppri e un rpertoire. Il doit Itre vide. unlin:*, 2 suppri e un fic9ier. umas:*, 2 odifie le u as? par dfaut

11.4 Upload de fi 7iers


/(upload de fic9iers per et d(envoyer depuis un poste client un fic9ier sur le serveur. $ette opration ncessite un navigateur sac9ant prendre en c9arge une 4alise spciale et l(appel d(un script PHP. $=t Page H56/L il faut odifier la dfinition d(un for ulaireL placer le c9a p for ulaire de type 20L. et indiquer la taille a3i ale du fic9ier tlc9arg avec un no H0<<./ de 4o MA5&20L.&S0=.. $ette taille est prcise en octets. $e c9a p doit Itre plac )7)F5 l(apparition du c9a p de type CI/8. /e for ulaire doit Itre de type P;#5 *4ien que %85 soit possi4leL voir docu entation PHPB et le type d(encodage ./1T>P. ?@multipart@form+data? doit Itre prcis.
< orm DO%T`]D="multipart/ ormKdata" action="/page.php" method="post"> <8O]:T T`]D="hidden" name="RFc1E8GD138VD" &alue="67?A="> <8O]:T OFRD="a&atar" T`]D=" ile" 38VD=7=> <input type="submit" &alue="Dnregistrer"/> </ orm>

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

original du fic9ierL tel que sur la

ac9ine du client >e4. Page 57/93

S. ROHAUT

Cours Programmation PHP

[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

[ACI/8#c(userfile(dc(error(d 2 /e code d(erreur associ au tlc9arge ent de fic9ier @PHP 4.2B

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

Cours Programmation PHP

Page 58/93

12 Travail sur c'a(nes


12.1 ?on tions pour ode H12/ et 2ySE/ 12.1.1 3estion des caractres verrouills
/a fonction addslashes*, ra,oute des slas9es @4ac?slas9es bB devant tous les caract:res qui doivent Itre verrouills. $es caract:res sont le M ` NL le M ( NL le M b N et le caract:re nul @FU//B. )insi la c9a-ne rsultante peut Itre utilise pour Itre place en 4ase de donnes via des co andes #E/. /a fonction stripslashes*, effectue l(opration inverse 2 elle suppri e les antiJslas9 sauf dans le cas des dou4les antiJslas9 bbL elle n(en suppri e qu(un.
,chaine="G2oreille cass*e"; ,c-=addslashes!,chaine#; echo ,c-; // GI2oreille cass*e echo stripslashes!,c-#; // G2oreille cass*e

12.1.2 balises et caractres s,ciaux 4T:)


/a fonction strip&ta"s*, per et de filtrer une c9a-ne contenant des 4alises @tagsB H56/ en autorisant certains et interdisant d(autres. /e pre ier para :tre est la c9a-ne H56/. /e second est la liste des tags autoriss. ATT./T0-/ 2 la fonction ne odifie pas le contenu des 4alises autorisesL laissant ainsi les attri4uts $/)##L #5H/8 et appels Oava#cript.
,chaine="<u><i><b>WonTour les amis</b></i></u>"; echo strip1tags!,chaineB2<u><i><b>2#; // WonTour les amis echo strip1tags!,chaineB2<b>2#; // <b>WonTour les amis</b> en gras

/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*,.

12.2 ?on tions te8te gnrales 12.2.1 6cou,er une c'a(ne


/a fonction e;plode*, per et de dcouper une c9a-ne selon un sparateur. 8lle retourne un ta4leau contenant les divers l ents dcoups. /e pre ier para :tre est le sparateurL le second la c9a-ne. Un troisi: e para :tre per et de li iter le no 4re de valeurs retournes.
,chaine=2login9pSd9uid9gid2; ,tab=e"plode!292B,chaine#; oreach!,tab as ,&alue# echo ,&alue; // login pSd uid gid

/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.

12.2.2 9ec'erc'er et com,arer


/a fonction strcmp*, effectue une co paraison de deu3 c9a-nes. Detourne _0 si la c9aine1 est infrieure ' c9aine2L 0 si galeL X0 sinon. /a fonction strncmp*, ' le I e effet ais sur une longueur donneL en troisi: e para :tre. /es fonctions strcasecmp*, et strncasecmp*, sont des versions insensi4les ' la casse. /a fonction strstr*, rec9erc9e la pre i:re occurrence du second para :tre dans le pre ier et retourne la c9a-ne depuis cette position ,usqu(' la fin. /a fonction strchr*, est un alias de strstr@B. /a fonction stristr*, est la I e ais insensi4le ' la casse. /a fonction strrchr*, effectue quasi ent la depuis le dernier caract:re trouv. I e c9ose sauf qu(elle retourne la fin 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

Cours Programmation PHP

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

setcoo5ie!"testcoo5ie"Bsession1id!#Btime!#<6Q==#; i !isset!,1%44a8DJ2testcoo5ie2M## echo ,1%44a8DJ2testcoo5ie2M;

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

Cours Programmation PHP

Page 62/93

,&aleur=,1%44a8DJ2testcoo5ie2M; echo ,&aleur; // par rapport . l2e"emple pr*c*dent 9 toto

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#

er son coo?ie avec une

'

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.

13.2 #dentifi ation H11P 13.2.1 &onnexion


$ette possi4ilit n(est disponi4le que si PHP est utilis co e odule )pac9eL et pas en tant que script $%I. /(identification H55P per et via l(envoi d(un H8)D8D H55P de de ander une identification au client. Dans ce cas le navigateur va ouvrir une fenItre de conne3ion de andant une saisie de login et de ot de passe. PHP rcup:re 4ien entendu ces valeurs. 7oici l(e3e ple issu de la docu entation PHP
i !!isset!,13DC/DCJ2]H]1F:TH1:3DC2M## $ header!2WWWKFuthenticate9 Wasic realm="3lyuni""2#; header!2HTT]/-.= A=- :nauthorided2#; echo 2Te"te utilis* si le &isiteur utilise le bouton dI2annulation2; e"it; ' else $ echo "<p>WonTourB $,13DC/DCJ2]H]1F:TH1:3DC2M'.</p>"; echo "<p>/otre mot de passe est $,13DC/DCJ2]H]1F:TH1]W2M'.</p>"; '

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

Cours Programmation PHP

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 Sessions PHP 13.3.1 Princi,e


/es sessions per ettent de prserver des donnes lors de la visite d(un site. $9aque personne se voit attri4u un identifiant unique appel identifiant de sessionL ou #ID. $e #ID est soit stoc? dans un coo?ieL soit pass par UD/. ;n peut ainsi dfinir un no 4re infini de varia4les qui seront accessi4les durant toute la dure de la session. Fote+ que si vous fer e+ et relance+ votre navigateurL vous c9ange+ d(identifiantL et donc la prcdente session est perdueL I e si elle tait no e. ;n peut conna-tre son #ID grkce ' la constante de I e no L ou par la fonction session&id*,.

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.

Pour savoir si une varia4le session&is&re"istered*,.

est

enregistre

dans

la

session

couranteL

on

utilise

i !session1is1registered!2t"t2## echo ,t"t;

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";

cre la varia4le de session t3tL


echo ,13D3384OJ2t"t2M

l(affic9e et
unset!,13D3384OJ2t"t2M#;

l(efface. Pour effacer toutes les varia4les de sessionsL il suffit de faire


,13D3384O=array!#;

13.3.3 !x,iration de la session


/a dure de vie d(une session PHP dpend de trois para :tres de configuration du fic9ier PHP.IFI 2 session."c&ma;lifetime( session.coo:ie&lifetime et session.cache&e;pire. /e pre ier concerne la dure de vie des donnes sur le serveurL en no 4re de secondes. Il est par dfaut de 1440 secondesL soit 24 inutes. )u del'L les donnes sont suppri es et elles seront rec9arges via le coo?ie de session lors du proc9ain appel. /e second est la dure de vie du coo?ie de sessionL e3pri en secondes. Par dfaut la valeur est +ro @0B ce qui signifie 2 ,usqu(' ce que le navigateur soit teind. /e troisi: e est la dure de vie des donnes de sessionL en inutes. #a valeur par dfaut est de 1!0 inutesL soit trois 9eures. $e qui veut dire que dans une I e sessionL on peut rester trois 9eures sur la I e pageL les valeurs ne sont pas perdues. )u del'L il faut rouvrir une nouvelle session et S. ROHAUT Cours Programmation PHP Page 65/93

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.

13.3.% &'an#er l-accs ,ar d$aut


PHP sait tr:s 4ien se d4rouiller tout seul ais on peut re placer la prise en c9arge par dfaut des sessions par ses propres fonctionsL dans le 4ut de grer l(ouverture et la fer eture ou encore la sauvegarde des donnes de session dans un fic9ier ou une 4ase de donnes. Une autre utilisation peut Itre le traWage via PHP de toutes les ouvertures<fer etures des sessions. Pour Wa on utilise la fonction session&set&save&handler*,. #on tude dpasse le cadre du cours ais voici un e3e ple tir de la docu entation PHP.
i !!mys>l1table1e"ists!"sessions"B,)W## $ ,>uery = 2%CDFTD TFWGD sessions ! 3ession8) char!077# not nullB Gast:pdated datetime not nullB )ata/alue te"tB ]C8RFC` aD` ! 3ession8) #B 8O)Dc ! Gast:pdated # #2; mys>l1>uery!,>uery#; ' unction sessao1open!,a3a&a]athB ,a3essionOame#$ global ,aTime; sessao1gc! ,aTime #; return True; unction sessao1close!#$ return True; unction sessao1read! ,aaey # $ ,>uery = "3DGD%T )ata/alue EC4R sessions WHDCD 3ession8)=2,aaey2"; ,busca = mys>l1>uery!,>uery#; i !mys>l1num1roSs!,busca# == -# $ ,r = mys>l1 etch1array!,busca#; return ,rJ2)ata/alue2M; ' DG3D $ ,>uery = "8O3DCT 8OT4 sessions !3ession8)B Gast:pdatedB )ata/alue# /FG:D3 !2,aaey2B O4W!#B 22#"; mys>l1>uery!,>uery#; return ""; ' unction sessao1Srite! ,aaeyB ,a/al # $ ,a/al = addslashes! ,a/al #; ,>uery = ":])FTD sessions 3DT )ata/alue = 2,a/al2B Gast:pdated = O4W!# WHDCD 3ession8) = 2,aaey2"; mys>l1>uery!,>uery#; return True;

'

'

'

S. ROHAUT

Cours Programmation PHP

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;

' $

'

session1set1sa&e1handler!"sessao1open"B "sessao1close"B "sessao1read"B "sessao1Srite"B "sessao1destroy"B "sessao1gc"#;

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

14.2 !rer une image 1%.2.1 Ty,es ,ossibles


Il faut tout d(a4ord c9oisir le type de l(i age que vous sou9aite+ crer. Pour cela on peut tester quels types PHP peut gnrer avec la fonction ima"etypes*, et ses constantes associes 2

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

header !"%ontentKtype9 image/png"#; // ou image/gi

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"#;

14.2.2.2 A upration d'une image e8istante

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

Cours Programmation PHP

Page 68/93

1%.2.% &'ar#ement via une autre ,a#e


Pour appeler cette i age dyna ique depuis une page H56/ ou PHP il suffit de la placer dans une 4alise I6% 2
<img src="image.php">

14.3 1ravailler sur les #mages 1%.3.1 9cu,rer des in$ormations


/a fonction "etima"esi9e*, per et de rcuprer des infor ations sur une i age si on lui passe un no de fic9ier @pas de ressource i ageB. 8lle retourne un ta4leau inde3.
list!,SidthB,heightB,typeB,attr#=getimageside!"toto.gi "#;

>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/

#i on travaille sur une i age qu(on a cr nousJ I e 2


ima"es;*, 2 largeur 3 de l(i age ima"esy*, 2 9auteur de l(i age

1%.3.2 )es couleurs


Il n(est pas possi4le de voir toutes les fonctions cependant une c9ose est ' retenir 2 la notion de palette inde3e @createi age@BB et la notion de truetype. Dans le pre ier cas les couleurs sont inde3es via un nu ro. Dans le second casL la couleur est une co posante D71. /a fonction ima"ecolorallocate*, per et de dfinir une couleur qui sera utilise pour une i age. /e pre ier para :tre est le ressource de l(i ageL les trois autres les niveau3 de rougeL vert et 4leu de la couleur. ATT./T0-/ 8 Avec une ima"e cre avec createima"e*,( la palette est inde;e et le premier inde; est la couleur du fond. <onc 8 un premier appel % ima"ecolorallocate*, dans ce cas modifie la couleur du fond.
,Shite=imagecolorallocate!,imgB077B077B077#;

/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

Cours Programmation PHP

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

;n utilise la fonction ima"efill*, 2


,bac5ground=imagecolorallocate !,imgB077B077B077#; 8mageEill!,imgB=B=B,bac5ground#;

/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"erectan"le*, pour un rectangle si pleL ima"efilledrectan"le*, pour un rectangle re pli.


,blue=8mage%olorFllocate!,imgB=B=B077#; imagerectangle!,imgB -=B-=B6=BA=B,blue#; image illedrectangle!,imgB-0B-0B0LB6LB,green#;

14.3.3.5 !er leJ ellipse

;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.

ets du polygone sont

imagepolygon!,imgB array !=B =B-==B 0==B 6==B 0==#B6B ,blue#;

14.3.3.% 1e8te simple

;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; ' '

'

15.2 !ration d'un o4,et


;n utilise le otJcl M new P.

,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

,mon1caddieK>contenu=array!2re =-2 => 0B 2re =02 => -#;

)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

15.5 /es varia4lesJ prote tion 1 . .1 P4P %.x


;n dclare les attri4uts avec le otJcl M var P. /es attri4uts sont considrs co e tant tous pu4lics. PHP 4 ne poss:de aucun canis e de protection des varia4les. )insi un attri4ut est accessi4le depuis toute les classes drives et depuis l(e3trieur de la classe.
&ar ,ma&ariable;

Il est interdit d(initialiser une varia4le lors de sa dclaration.


&ar ,toto="salut !"; // Oe marche pas !

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!#; ... '

15.5.2.2 attri4uts et mt7odes statiques

;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

Cours Programmation PHP

Page 73/93

class F $ public static ,compteur==; unction F!# $ sel 99,compteur<<; // 4n incr*mente ' $ ' ' unction a iche!# !

echo sel 99,compteur."<br />"; // sel

,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

15.5.2.3 onstantes de lasse

;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

15.$ Hritage et polymorp7isme


/(9ritage per et de dfinir des classes gnriques rutilisa4les. ;n peut alors faire des e3tensions ' une classeL faire driver une classe d(une autre. /a classe drive 9rite de toutes les t9odes et varia4les de la classe de 4ase et peut redfinir ses propres fonctions et varia4les. Une classe ne peut 9riter que d(une seule autre classe. /(9ritage ultiple n(est pas supportL ni par PHP 4L ni par PHP ". Par contre rien n(e pIc9e de faire des 9ritages en cascade. /e M polymorphisme N per et de redfinir une d(autres para :tres ventuels. t9ode de I e no dans une classe driveL par

/-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

Cours Programmation PHP

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 -#;

Par le poly orp9is e on peut redfinir dans la classe drive les


class F $ unction a iche!# $ echo "%lasse F<br />"; ' ' class W e"tends F $ unction a iche!# $ echo "%lasse W<br />"; ' ' ,test=neS W; ,testK>a iche!#; // F iche %lasse W

t9odes de la classe 9rite.

15.% /es motsH ls parent et self


/e otJcl M parent N reprsente la classe de 4ase @celle prsente apr:s un M extends NB et per et de faire rfrence au3 varia4les et fonctions d(une classe de 4ase.
class F $ unction e"ample!# $ echo "\e suis F99e"ample!#B onctionnalit* de base.<br>In"; ' ' class W e"tends F $ unction e"ample!# $ echo "\e suis W99e"ample!#B onctionnalit* suppl*mentaire.<br>In"; parent99e"ample!#; ' ' ,b = neS W; // appelle W99e"ample!#B >uiB . sont tourB appelle F99e"ample!#. ,bK>e"ample!#;

/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

Cours Programmation PHP

Page 75/93

15.* !onstru teurs 1 .2.1 P4P % et


/e constructeur est la t9ode qui est auto atique ent appele lors de la cration d(un o4,et par M new N. Une t9ode devient un constructeur si elle porte le I e no que la classe dans laquelle elle est dfinie.
class auto1panier e"tends ]anier1nomme $ unction auto1panier!# $ ,thisK>proprietaire=session1id!#; ' '

$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!#;

'

revient e3acte ent au

I e.

15.. !onstru teurs et lasses drives 1 .5.1 P4P % et


#oit les classes ) et 1 suivantes 2
class F $ unction F !# $ echo "\e suis la classe F<br />"; ' ' class W e"tends F $ unction W !# $ echo "\e suis la classe W<br />"; ' '

S. ROHAUT

Cours Programmation PHP

Page 76/93

/a cration d(un nouvel o4,et de type 1 2


,b=neS W;

)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

Cours Programmation PHP

Page 77/93

$ '

echo "\e suis la classe W<br />"; parent9911construct!#; // Fppelle le constructeur de F 9 F!#

'

,b=neS W; // F

iche 9 Te suis la classe WB \e suis la classe F

15.10 Destru teur 1 .10.1 P4P %


Il n(y a pas de destructeur en PHP 4. ;n fera confiance dans ce cas ' la gestion de la oire @ra asseJ iettesB de PHPL ou appeler une t9ode particuli:re de la classe ' la fin du scriptL c9arge de faire le nageL ce qui peut Itre i portant par e3e ple lorsqu(on a allou une ressource pour une i age dyna ique. Pour dtruire un o4,etL il suffit de raffecter sa varia4leL ou de la dtruire avec M unset N. /(o4,et sera dtruit de toute faWon i plicite ent ' la fin de l(e3cution du script.

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!#;

'

'

,b=neS W; unset!,b#; // destruction de l2obTetB a iche Fu re&oir la classe W et F ...

15.11 (ffe tation d'o4,ets 1 .11.1 &ode commun


/e fonctionne ent des affectations des o4,ets en PHP 4 et PHP " n(est pas le I e. 8nL effet sur PHP 4L l(affectation se fait par copieL et par rfrence en PHP " ce qui peut induire de grandes diffrences de fonctionne ent lorsque du code o4,et en PHP 4 est utilis en PHP ". Fous allons voir un e3e ple ' l(aide d(une classe tr:s si ple.
class F $ &ar ,a; unction F!# $ ,thisK>a="3alut";

S. ROHAUT

Cours Programmation PHP

Page 78/93

' $ ' $ ' ' unction a iche!#

echo ",thisK>a<br />";

unction modi !,obTet# ,obTetK>a=2coucou2;

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

,obT-K>a="WonTour"; ,obT-K>a iche!#; // a ,obT0K>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

ani:re i plicite. )insi on a

iche!#; // a iche!#; // a

,obT-K>a="WonTour"; ,obT-K>a iche!#; // a

S. ROHAUT

Cours Programmation PHP

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.

15.12 !omparaison d'o4,ets 1 .12.1 P4P %


;n peut effectuer des co paraisons d(o4,ets en PHP4. Deu3 instances d(o4,ets sont gales si et seule ent si 2

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.

;n peut e ployer indiffre

unction bool0str!,bool# $ i !,bool === alse# $ return 2EFG3D2; ' else $

S. ROHAUT

Cours Programmation PHP

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#;

$et e3e ple va affic9er 2


%ompare des instances cr**es a&ec les m[mes param+tres o- == o0 9 TC:D o- != o0 9 EFG3D o- === o0 9 TC:D o- !== o0 9 EFG3D %ompare des instances cr**es a&ec di o- == o0 9 EFG3D o- != o0 9 TC:D o- === o0 9 EFG3D o- !== o0 9 TC:D *rents param+tres

%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

Cours Programmation PHP

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

Cours Programmation PHP

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"#;

'

1*.1.2 )es classes abstraites


/es classes a4straites sont une nouveaut de PHP ". Une classe a4straite est une classe sans i pl entation @qui ne peut Itre instancieBL reprsente par au oins une fonction a4straite @virtuelle pureL sans codeBL l(i pl entation tant effectue dans les classes drives. /es classes a4straites servent essentielle ent ' dfinir une classe de 4ase nor alise dont la structure pourra Itre reprise pour le dveloppe ent d(autres classes effectives. 5oute classe qui contient au oins une t9ode a4straite doit Itre dfinie co e a4straite.

#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

Cours Programmation PHP

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

1*.1.3 &lassesD mt'odes et variables $inales


PHP inclut un nouveau canis e de protection interdisant au3 classes drives de ri pl enter une t9ode ou une varia4leL ou ' une classe d(Itre elleJ I e drive. )vec le otJcl M final NL on indique que la classeL la t9ode ou la varia4le sont dfinitives et qu(elles ne pourront plus Itre i pl entes. 7oici un cas d(erreur 2
class F $ protected ,&al; unction 11construct!# $ ,thisK>&al=-; ' inal unction a iche!# $ print ,thisK>&al;

'

'

class W e"tends F $ unction 11construct!# $ parent991construct!#; ' unction a iche!# $ // DCCD:C ! 4O OD ]D:T ]F3 CD)DE8O8C ! print ,thisK>&al;

'

'

,o-=neS W; ,o-K>a iche!#;

Dans la classe 1 nous avons tent de rcrire la nous retournera une erreur.

t9ode affic9e dclare en M final NL et PHP

1*.1.% )es inter$aces ob+et


/es interfaces per ettent de crer du code qui spcifie quelles t9odes et attri4uts une classe peut i pl enter sans avoir ' dfinir co ent elles seront gres. 5outes les t9odes spcifies dans l(interface doivent Itre i pl entes dans la classe qui la dfinit. /(interface est donc un oyen de dfinir les prJrequis o4ligatoires ' la construction d(un od:le de classe en en donnant la liste des prototypes. ;n cr une interface avec le otJcl M interface N. Dans notre e3e pleL nous allons dfinir que toutes les classes qui i pl entent notre interface doivent o4ligatoire ent dfinir les fonctions affic9e et incr ente. S. ROHAUT Cours Programmation PHP Page 84/93

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.

'

'

'

,o-=neS F; ,o-K>incremente!0#; ,o-K>a iche!#;

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

Cours Programmation PHP

Page 85/93

1*.1. 3estion dynami0ue des mt'odes et attributs


;n ne peut tou,ours pas surc9arger directe ent ses t9odesL attri4uts et oprateurs en PHP " co e en $RR. $ependant de nouvelles fonctions per ettent d(intercepter des appels ' des t9odes ou attri4uts non prvus. /ote 8 1es mthodes peuvent uni uement #tre dclenches lors ue votre ob)et( hrit ou non( ne contient pas l$attribut ou la mthode ue vous tente9 d$accder. <ans le cas contraire( la mthode ou l$attribut sont utiliss. Pour une t9odeL on utilise la t9ode M __call N qui prend deu3 para :tres. /e pre ier est le no de la t9odeL le second est un ta4leau des para :tres passs ' la t9ode. I aginons que nous sou9aitons appeler la t9ode M test N de notre o4,etL ais que nous n(avions pas prvu ce cas. Il suffit de grer ce cas dans la t9ode M __call N 2
class F $ unction 11call!,mB ,a# $ // _+re les appels au" m*thodes non d* inies i !,m=="test"# $ echo " onction test appel*e a&ec les &aleurs ,a"; return ,a; ' ' ' ,o- = neS F!#; ,a = ,o-K>test!-B "0"B 6.AB true#; // test n2e"iste pas et pourtant... print1r!,a#; // Pa marche et Pa retourne les param+tres de test.

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 - !

1*.1.* )es itrations d-ob+ets


PHP " inde3e les attri4uts de ses o4,ets. Il est possi4le d(accder ' la liste des attri4uts @si la visi4ilit le per etB ' l(aide du si ple 4oucle itrative co e M foreach N.

S. ROHAUT

Cours Programmation PHP

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

current ne"t 5ey &alid reSind

;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.

1*.1.1 Ty,e 'intin#


PHP " per et de contr=ler le type de valeur pass en para :tre ' une fonction. Prenons le code suivant qui retourne les infos d(un utilisateur de classe M utilisateur N 2
unction detail!,user# $ return ,userK>in os!#;

'

/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

Cours Programmation PHP

Page 87/93

1$.2 /es e8 eptions 1*.2.1 try ... catc'


PHP " inclut enfin le support des e3ceptions avec le 4loc M tr! ... catch N. )insi on peut placer du code M ' risque N ou un code M e3ceptionnel N qui peut produire une erreur dans un 4loc M tr! NL et grer l(erreurL selon son typeL dans des 4locs M catch N. ;n put utiliser plusieurs 4locs M catch N suivant le type d(erreur gnr. )ttentionL quand c(est possi4le on grera les erreurs avec du code nor al.
try $ ... // %ode . ris>ue d2erreur ' catch !D"ception ,e# $ ... // %ode r*glant la situation e"ceptionnelle '

)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.

1*.2.2 6clenc'ement avec t'ro/


;n peut dclenc9er anuelle ent une e3ception ' l(aide de l(instruction M throw N. 7oici un code qui provoque tou,ours une e3ception 2
try $ ,erreur="Ressage d2erreur"; throS neS D"ception!,erreur#; echo 2\amais e"*cut*2; ' catch !D"ception ,e# $ echo 2D"ception9 2.,eK>getRessage!#.2 . la ligne 2.,eK>getGine!#."In"; '

) 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.

1*.2.3 classe !xce,tion et classes ,ersonnalises


/a classe M exception N est i pose par PHP co e classe de 4ase et parente de toute classe utilisa4le avec M catch N. /a classe de 4ase dispose des t9odes suivantes2

__construct#$erreur%$code$ 2 le constructeur avec le code get&essage#$ 2 retourne le essage d(erreur gnr

essage d(erreur et le

S. ROHAUT

Cours Programmation PHP

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"; '

#i [a vaut 1L M &on"xception N sera envoyL si [a vaut 2L ce sera M "xception N.

1*.2.% P4P : !rreur ou !xce,tion G


Il se peut que dans certains casL PHP dclenc9e naturelle ent une e3ception suivant l(e3cution d(une fonction. Dans ce casL ce sera indiqu dans la docu entation PHP @voir site PHPB en ligne. 6ais dans la plupart des casL c(est l(ancien syst: e de gestion des erreurs qui est utilis. )insi le code suivant
try $ ,a= open!2toto2B2r2#; ' catch!D"ception ,e# $ echo 2D"ception9 2.,eK>getRessage!#; '

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

Cours Programmation PHP

Page 89/93

directory in ':/apachefriends/xampp/htdocs/ob0et/panier.php on line 21

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#

throS neS D"ception!",errstr line ,errline"B,errno#; ' set1error1handler!"gest1erreur"#;

) l(e3cution de notre 4loc 2 tr!...catch NL nous aurons cette fois


D"ception9 open!toto# J unction. openM9 directory line 0ailed to open stream9 Oo such ile or

ce que nous voulions 2 nous avons 4ien dclenc9 une e3ception.

1*.2. !xce,tion ,ar d$aut


#i certaines instructions PHP gn:rent des e3ceptions et que ces instructions ne sont pas au sein d(un 4loc M tr!...catch NL PHP gnrera une e3ception par dfaut avec son propre gestionnaire d(e3ceptions. ;n peut odifier cet tat avec la fonction M set_exception_handler N.
unction e"ception1handler!,e"ception# $ echo "D"ception impr*&ue 9 " B ,e"ceptionK>getRessage!#B "In";

'

set1e"ception1handler!2e"ception1handler2#;

S. ROHAUT

Cours Programmation PHP

Page 9!/93

11 Sauve#arder ses ob+ets


1%.1 !as d'une session
/es infor ations indiques ici fonctionnent aussi 4ien en PHP 4 qu(en PHP ". Il faut distinguer le cas des sessions o^ il faut passer un o4,et d(une page ' l(autre et le cas d(une sauvegarde d(un o4,et sur disque. Dans le pre ier casL si les sessions sont utilises les o4,ets peuvent Itre passs directe ent d(une page ' une autre en respectant quelques r:gles 2

/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.

7oici un e3e ple 2 o4,et.inc 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; ' ' unction liste1article!# $ oreach!,thisK>contenu as ,re => ,>te# echo ",re =,>te <br />"; '

'

class ]anier1nomme e"tends ]anier $ &ar ,proprietaire; unction nom1proprietaire !,nom# $ ,thisK>proprietaire = ,nom;

'

'

S. ROHAUT

Cours Programmation PHP

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

Cours Programmation PHP

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

Cours Programmation PHP

Page 93/93

You might also like