You are on page 1of 246

PHPetMYSQLMySQLiPDO

Construisez votre application [2ime dition]

http://www.free-livres.com/
ChristopheVILLENEUVE

Rsum
Ce livre sur PHP est destin toute personne qui dsire se lancer dans le dveloppement web avec ce langage. Il dtaille pas pas le dveloppement dune application de gestion dun carnet dadresses sur Internet. La conception de cette application prend en compte diffrents formats de bases de donnes ( MySQL, MySQLi et PDO) et diffrentes versions de PHP. Dans un premier temps, lauteur choisit de dcrire les principales fonctions de PHP en prenant des exemples facilement comprhensibles. Il dcrit ensuite pas pas les diffrentes tapes du dveloppement en saidant des exemples de la premire partie (accs scuriss, gestion du carnet dadresses, gestion des mots de passe, gestion des administrateurs, affichage et exportation des donnes...). Un chapitre complmentaire dtaille des notions plus avances comme les contrles de scurit, le suivi de la navigation des visiteurs... Cette nouvelle dition de louvrage met laccent sur deux points : le premier concerne internet (scurit captcha, transmissions des donnes entre sites...), lautre point concerne la programmation objet, de sa dcouverte lutilisation des espaces de noms (namespace). Lapplication tudie est dcline en trois versions, avec une version supplmentaire en mode objet, entirement tlchargeables sur cette page. Les chapitres du livre : Avant-propos - Lenvironnement de dveloppement - La prparation du dveloppement - La saisie et laffichage - Les rsultats - Fonctionnalits supplmentaires - Programmation oriente objet - Annexe

L'auteur
Christophe Villeneuve se passionne pour l'informatique depuis de nombreuses annes. Autodidacte, son parcours professionnel a toujours volu dans le monde du dveloppement et du conseil. Son intrt pour PHP a fait de lui un membre actif de l'AFUP (Association Franaise des Utilisateurs de PHP) et avec ce livre, il met en exergue son exprience pour guider le lecteur de faon efficace dans la construction d'applications PHP.

Ce livre numrique a t conu et est diffus dans le respect des droits dauteur. Toutes les marques cites ont t dposes par leur diteur respectif. La loi du 11 Mars 1957 nautorisant aux termes des alinas 2 et 3 de larticle 41, dune part, que les copies ou reproductions strictement rserves lusage priv du copiste et non destines une utilisation collective, et, dautre part, que les analyses et les courtes citations dans un but dexemple et dillustration, toute reprsentation ou reproduction intgrale, ou partielle, faite sans le consentement de lauteur ou de ses ayants droit ou ayant cause, est illicite (alina 1er de larticle 40). Cette reprsentation ou reproduction, par quelque procd que ce soit, constituerait donc une contrefaon sanctionne par les articles 425 et suivants du Code Pnal. Copyright Editions ENI

ENI Editions - All rights reserved - Algeria Educ

- 1-

Avantpropos
Ce livre est destin toutes les personnes qui dsirent se lancer dans la programmation en environnement Web (Internet) ou qui dveloppent sur dautres langages volus que PHP et veulent dvelopper des applications dynamiquesetvolutivespourInternet.

1.Descriptiondelapplicationraliser
Tout au long des pages de ce livre, nous allons raliser une application qui gre un carnet dadresses. Le carnet dadressesseraaccessiblesurInternetpourunouplusieursutilisateursdisposantdesdroitssuffisants:lecarnet dadressesseradoncpartag.

Pour chaque contact du carnet dadresses, outre les informations classiques (nom, prnom, adresse, tlphone, photo...), le titulaire dun compte autoris pourra ajouter des informations supplmentaires comme les comptes de tchat,lessitesinternetprfrs...Chaqueinformationseralieunerubrique.Chaquetitulaireduncompteautoris pourrapersonnaliserlalistedesrubriques.

ENI Editions - All rights reserved - Algeria Educ

- 1-

Ilseraaussipossibledelocalisersurunecartelapositiondescontacts. Chaque titulaire dun compte pourra, avec cette application, transmettre les donnes enregistres vers dautres applications:lesexportationsproposescorrespondentauxformatsCSV,PDF,XML.

2.Diffrentsobjectifsderalisation
Pourralisercetteapplication,diffrentsobjectifsdoiventtreatteints :
G

Il faut concevoir une structure modulaire, permettant ainsi nimporte quel utilisateur de pouvoir crer un enregistrementdansunebasededonnes. Une fois la structure cre, elle doit permettre la recherche dinformations existantes, lajout dautres donnes,leurmodification,leureffacementpartirdunmasquedesaisieetleurrcupration.

- 2-

ENI Editions - All rights reserved - Algeria Educ

Enfin, lapplication doit pouvoir permettre de rcuprer les informations de la base de donnes pour les afficherlcran,lesimprimeroulesexporterpouruneautreutilisation.

3.Prparationetdroulementdudveloppement
ENI Editions - All rights reserved - Algeria Educ - 3-

Pourralisercetteapplication,lelivreestorganisainsi: Chapitre1:Environnementdedveloppement CechapitrevousdonneralesbasesduPHP(notammentcommenttabliruneconnexionavecunebasededonnes). IlprsenteralesoutilsncessaireslaralisationduprojetsurunserveurApache. Chapitre2:Prparationdudveloppement Avantdecommencerleprojet,nousprpareronsletravailendcouvrantuncertainnombredepossibilitsoffertes aveclelangagePHP.Nousauronslapossibilitdenressortiruneouplusieursnotionspouvantnouspermettrede menerbiennotreprojet. Chapitre3 :Saisieetaffichage Cette partie concerne la ralisation de lapplication proprement dite. Grce aux diffrentes prparations que nous avonspuraliser,nousallonspouvoirrutiliser :
G

lesaccsscurisspourdfinirlesdroitsdesutilisateurs, lagestionducarnetdadresses, lesparamtragesducarnetdadresses, lagestiondesmotsdepasse, lagestiondesadministrateurs.

Chapitre4 :Lesrsultats Sur les lments saisis dans notre application, nous devons pouvoir effectuer des recherches et des tris. Nous devonsaussipermettrelacommunicationavecdautresapplicationsautorisantainsidestraitementsdiffrents. Chapitre5 :Fonctionnalitssupplmentaires Une fois lapplicationralisenousajouteronsdesprotectionssupplmentairespouraiderleserveuretfaciliterles contrles.Nouslocaliseronslescontactssurdescartesetnousvisualiseronslanavigationdesvisiteurs. Laprogrammationorienteobjetestuneautremthodedeprogrammation.Nousverronslensembledesfonctions standardsetcommentlesmettreenplacedansnotrecaspratique.

4.Lesversionsutilises
Dans cet ouvrage, nous vous proposons la mme application, mais avec trois approches diffrentes pour vous permettredtudierdiffrentesbasesdedonnesaveclelangagePHPdanssesdiffrentesversions. Certainsformatsdebasededonnessontdesstandards,maisdautressontdeplusenplusconnusetcelivrevous permettrademieuxlesconnatreetdelesutiliser :
G

PHPetMySQLi VersionpourPHP5.xxetsuprieuretMySQL5etsuprieur.

PHPetMySQL VersionpourPHP4.3.x 5.xxetsuprieuretMySQL4 5etsuprieur.

PHPetPDO VersionpourPHP5.2.xetsuprieuretMySQL5etsuprieur.

PHPetPOO VersionpourPHP5.xxetsuprieuretMySQL4 5etsuprieur.

- 4-

ENI Editions - All rights reserved - Algeria Educ

5.Lenvironnementdedveloppement
Quelquesoitvotresystmedexploitation,ilestncessairedinstallerunenvironnementApache/PHP/phpMyAdmin. Parexemple :Wampserver,MampouXampp. Vousdevezcrerunebasededonnessouslenomde"ouvrage"etimporterlefichiersetrouvantdansledossier SQL.

ENI Editions - All rights reserved - Algeria Educ

- 5-

Tlchargerlesexemplesdulivre
Afin de pouvoir raliser lensemble des manipulations de cet ouvrage, vous devez tlcharger les fichiers dexemple fournissurlesitedesEditionsENI. Pour cela, accdez au site des Editions ENI : www.editionseni.fr et dans la zone Moteur de recherche, saisissez la rfrenceENIdulivreSO25PHP etvalidez.Cliquezsurletitredulivrepuissurleliendetlchargement. Ledossierquivousestfournicomprenddeuxsousdossiers(applicationetsource)organisscommececi :
G

application
G

appphpmysql appphpmysqli appphppdo apppoomysqli sql

ouvrage
G

sql Diffrentsdossiersdulivre

Le dossier application comprend les scripts pour initialiser la base de donnes SQL (que vous devez installer dans phpMyAdmin) et quatre dossiers contenant chacun une application avec une base de donnes diffrente. Ces trois applicationssontcompltementindpendanteslunedelautre. LedossierouvragecomprendlabasededonnesSQLettouslesdossiersquiseronttudisdanslelivre. Toutaulongdecetouvrage,desexemplessontralisspourexpliquercommentseservirdesfonctionsPHP.Nousne pouvonspasutiliserlensembledesfonctionsquiexistentcarellessonttropnombreuses,maisnouspouvonstudier lesprincipales. Lecodesourcesetrouvedanslefichiersource.rar. Chaquefonctionetexemplesetrouventregroupsdansundossierspar"source"avecexactementlenomduthme lesconcernant. Danschaqueapplicationdexemple(appphpxxx),nousdcouvronsladcompositionsuivante :
G

admin:cedossiercontientlefichierdeconnexionverslabasededonnes.Ilestmispartcarcestleplus important.Ilestncessairedeleprotgeraveclesfichiers.htaccesset.htpasswd. dl:cedossierestdestinstockerlesfichiersquiseronttlchargs. images : nous stockons dans ce dossier les images et photos qui sont utilises dans le carnet dadresses personneldechaquepersonnequipossdeuncompte. include:cedossiercontientlesfichiersquisontappelslorsdelanavigation.Ilssontcompossde : Config :contientlesconfigurationsengnrales Fct :fichiercomprenantlesfonctionsgnrales Fct_captcha.inc.php :fichiercomprenantlaralisationducaptcha Fct_debug :fichiercomprenantlesoutilsdedbuggages

ENI Editions - All rights reserved - Algeria Educ

- 1-

Fct_log :fichierpourleslogs Fct_upload :fichierpourlesenvoisdefichiers(upload) Fpdf :fichierpourcrerdesfichiersPDFavecledossierFONT GoogleMapAPI :laclasseGoogleMap


G

log:cedossiermmoriseleslogsdesdiffrentspassagesdesvisiteurs.

Lesautresfichierssetrouventlaracinedudossier.Ilssontutilisspournotreapplication.Chaquefichierpossde unedcoupespcifiqueaumenu : adminxxx :menuadministrateur carnetxxx :menuvotrecarnet compte :informationsurlecompte contact :pagedecontact deconnection :quitterlecompte download :fichierutilispourforcerlestlchargements exportxxx :menuexportation footer :pieddespagesinternet head :enttedespagesinternet identification :pagepoursaisirlescodesdaccspouraccderlapartieprive login :gestionetvrificationsdescodesdaccs passxxx :changerlemotdepasseourecevoirunautremotdepasse rubrique:menuRubrique Leslignesadminxxxetcarnetxxxsedcomposentdelafaonsuivante: Add :ajouter View :visualiser Viewedit :diterlalignequenousavonsvisualise Aprs linstallation dun des trois environnements, vous devez lancer votre navigateur et saisir lune des adresses suivantes :
G

http://localhost/votreDossier/application/appphpmysql http://localhost/votreDossier/application/appphpmysqli http://localhost/votreDossier/application/appphppdo http://localhost/votreDossier/application/apppoomysqli

Silapplication affiche des messages derreurs,vousdevezvousreporterlouvragepoureffectuerlesmodifications ncessaires. Concernantlesaccslapartieprive,nousvousrappelonslescodesdaccs : PourlapartieAdministrateur : Login :admin Password :Admin Pouruncompteutilisateur: Login :test Password :test Cescodesdaccspeuventtremodifiscommevouslesouhaitez.

- 2-

ENI Editions - All rights reserved - Algeria Educ

ENI Editions - All rights reserved - Algeria Educ

- 3-

Introduction
Avantdecommencerundveloppement,nousdevonsconnatrelesbasesdulangageintranet/internetpourraliser correctementunepageHTMLetparconsquentuneapplicationdynamiqueenPHP.

ENI Editions - All rights reserved - Algeria Educ

- 1-

Pagefixe/pagedynamique
Quel que soit le microordinateur que vous possdez, un systme dexploitation (OS) est prsent dessus pour vous permettre de raliser de nombreuses tches sous la forme de logiciels ou dapplications. Grce au microordinateur nouspouvonsaussiaccderluniversdInternetetnaviguersurleWebavecunnavigateur(browser). Lesnavigateurslesplusrpandusactuellementsont :MozillaFirefox,Safari,Konqueror,Opra,InternetExplorer. Cette plateforme Internet que nous utilisons rgulirement volue tous les jours avec de nombreux moyens et de nombreusestechniques,etparlebiaisdinformationset/oudactualits,desitepersonnelsoudesitesprofessionnels. Cette masse dinformations est gnre par toutes sortes de sites Internet, qui sont reprsents sous la forme de sitesvitrinesoudesitesdynamiques. LesitevitrineestunsitedontlespagessontfixesetsouventdveloppesenHTML. IlestpossiblederaliserunepagefixeauformatHTMLcommececi : html/html.php <html> <head> <title>1ere exemple</title> </head> <body> <?php echo "Bonjour, tout le monde"; ?> </body> </html> Pourobtenirlersultatsuivant :

Lesitedynamiquepermetdaffichercertainesinformationssurunepartieoulatotalitdunepagedenavigation. Nousallonseffectuerunpetitexempleenaffichantunmessage"Bonjourtoutlemonde"avecunepartiedynamique permettant :


G

deproposerunlienpouraccderlasuite derecommencerlamanipulation.

VoicilepremiercranlorsquenousarrivonssurlapageInternet:

Leslignesduprogrammesedcomposentcommececi: html/html2.php <html> <head> <title>2eme exemple</title>

ENI Editions - All rights reserved - Algeria Educ

- 1-

</head> <body> <?php echo "Bonjour, tout le monde<br>"; if { (isset($_GET[action]) && $_GET[action]=="suite")

echo "Bravo... "; echo "<a href=html2.php?action=recommence>recommencer</a>"; } if ( (isset($_GET[action]) && $_GET[action]=="recommence") || empty($_GET[action]) ) { echo "Etape 1... "; echo "<a href=html2.php?action=suite>Suite</a>"; } ?> </body> </html> LorsquenouscliquonssurlelienSuite,nousobtenonslcransuivant :

Lautrepossibilitdunsitedynamiqueestdafficherdesinformationsvenantdunebasededonnes.Cepoint seratudidanscechapitrePrsentationdunebase dedonnes(ouBDD).

- 2-

ENI Editions - All rights reserved - Algeria Educ

LelangagePHP
LelangagePHPestunlangagedescriptexcutctserveur,cestdirequelenavigateurInternetnaffichequele rsultatdelexcutionduscriptdanslapage. LebutdulangagePHPestdepermettrederaliserdespagesInternetsouslaformedepagesdynamiques. Ilpermetavanttoutde:
G

validerlesformulaires viterderpterleslignesdecontrle programmerenlignedecommande criredesapplicationsclientesgraphiques.

Parailleurs,avecPHPilestpossiblederaliserdesapplicationspluscomplexesquenousallonsseulementnumrer car de nombreux kits existent dj : forum, blog, livre dor, newsletter, compteur de visiteurs, chat, systme dactualits,jeuxdestratgiesetrflexions,etc. Le langage ne se limite pas la production de pages HTML. Il est possible de gnrer la vole des images graphiques,desfichiersPDF,desanimationsFlash... LelangagePHPpermetaussidecommuniqueravectouslesautreslangages(XML,Java,Ajax...).

1.Afficherunepage
PouraccderunepageInternet,nousutilisonsunnavigateur.LorsquenousaffichonsunsiteInternet,nousnous connectonsenfaitunserveurquiutiliseunlangage,parexemplelelangagePHP. Pour afficher la page dun site Internet, nous saisissons directement dans la barre de navigation du navigateur ladressedusiteInternet.Lorsquecelleciatsaisie,ellevanousenvoyerdirectementsurleserveurquihberge lesiteInternet.Parexemple:http://www.editionseni.fr Lorsque nous dveloppons un site Internet, il est ncessaire de disposer dun serveur sur notre ordinateur permettantainsidesimulerlaconnexion.Noussaisissonsalorsdansnotrebarredenavigationuneadressedece type :http://127.0.0.1/ouhttp://localhost/

2.Dtailsdelutilisation
LutilisationdulangagePHPcomportecertainesrglesrespecter.Lesbalises(outags)sontreprsentesainsi : <?php ... ?> Parexemplepourafficherlemessage :"Bonjour,toutlemonde",voicilapageInternetauformatHTML : debut/exemple.htm <html> <head> </head> <body> Bonjour, tout le monde </body> </html> Pourobtenirceci :

ENI Editions - All rights reserved - Algeria Educ

- 1-

AveclelangagePHP,voicilemmeexemplequeprcdemment : debut/exemple.php <html> <head> </head> <body> <?php echo "Bonjour, tout le monde"; ?> </body> </html> LafonctionprincipaleutiliseparPHPpourafficherunmessagecorrespondlafonctionEcho : Echo Afficheunechanedecaractres. Pourobtenirceci:

Biensr,ilexistedautresfonctionspourafficheruntextequenousneverronspasdanscelivre.Signalons parexemplePRINT,PRINT_R. Uneautrefonctionquiseratrsutilisedanslouvrage,ilsagitde : Die Aliasdelafonctionexit. Exit Terminelescriptcourantenaffichantunmessagesincessaire. la fin de chaque ligne en PHP, nous mettons le symbole "" (point virgule). Ce symbole est tir du langage de programmationC.Lorsquelafonctionestexcute,etavantdinterprterlafonctionsuivante,noussignalonslafin dexcutionpourlaligneencours. Sanscesymbolelafindechaqueligne,nousrencontrerionsquelquessoucisdefonctionnement.

3.Lesextensionsdesfichiers
LesfichiersquisontsauvegardssurlespacedisquepossdentlextensionPHPpourtretraitsparlhbergeur. Ilesttoujourspossibledutiliserlesextensions.php3,.php4,.php5maiscelaestdconseillcarcestuneinformation quipeuttreutilepourlespersonnesquiviendraientvisitervotresiteInternet. Si nous parlons extension des fichiers, il est possible deffectuer une distinction entre les fichiers principaux et les
- 2 ENI Editions - All rights reserved - Algeria Educ

sousfichiers. Les sousfichiers sont des fichiers comprenant des routines, des classes, des fonctions ou toutes sortes dinformationsimportantesetquipeuventtreutilissparplusieursfichiersprincipaux.Pourreprerfacilementtous lesfichiersetlesidentifier,nouspouvonsutiliserlextension.inc.php. Lajout.inccorrespondauprincipeinclude. Grce cette extension supplmentaire, nous pouvons reprer plus facilement les fichiers principaux et les fichiers quiserventdinclusions.

ENI Editions - All rights reserved - Algeria Educ

- 3-

Prsentationdunebasededonnes(ouBDD)
1.Introduction
La base de donnes (BDD) est un systme permettant denregistrer les donnes venant de diffrentes sources (formulaires,informationsdiverses...). Nousallonscommuniqueravecunebasededonnesenutilisantunlangagedynamique,lelangagePHP. Un des formats les plus rpandus et le plus connu est actuellement le format SQL et plus prcisment le format MySQL.Biensr,ilexistedautrestypesdebasesdedonnes :PostgreSQL,DB2,Oracle,MSAccess(ODBC). Depuislaversion4.1dePHP,estapparuleformatMySQLi.CestuneextensiondeMySQL.Ceformatestdeplusen plus utilis et fortement conseill car il risque de devenir un standard. Il existe des outils pour convertir le format MySQLversleformatMySQLi. AveclesversionsactuellesdePHP,unnouveauformatestapparu :ilsagitduformatPDOquipermetdutiliserune basededonnescommeunobjet.Ilseratudiunpeuplusloindanscetouvrage. Le principe de fonctionnement entre un langage de programmation, comme ici le langage PHP, et une base de donnesestlesuivant :
G

lelangagePHPeffectuelesactionsquenousluidemandons celuicivainterrogerlabasededonnespourmmoriserlesinformations labasededonneseffectueletravail quand la base de donnes a termin, elle retourne une information signalant que tout sest correctement droul.

Danscetouvrage,nousallonsutiliserlabasededonnesauformatSQLetplusprcismentMySQL. PourcommuniqueraveclabasededonnesnousutiliseronsphpMyAdmincommeciaprs :

Labasededonnesseprsentesousuneformestructure (nomdelabasededonnes,nomdestables,nomdes

ENI Editions - All rights reserved - Algeria Educ

- 1-

champspourchaquetable).Lesdonnesremplissentleschampsdestables. CestainsiquestutiliselabasededonnesMySQL,partirdephpMyAdmin.

2.Crerunebasededonnes
Quandvouschoisissezunhbergeurgratuitoupayant,celuicivousattribuedofficeunnomdebasededonnes, souventcestlenomducomptemaiscertainshbergeurspeuventvousenimposerundeleurchoix. Par contre sur votre ordinateur, cestdire en local, vous pouvez choisir le nom de la base de donnes. Ici, nous allonsutilisercommenomouvrage,commeciaprs:

Toutaulongdecelivre,nousallonstudierlesdiffrentesfonctionsetpointsimportantsdulangagePHP. Nouseffectueronslestestsaveclabasededonnesquiutiliselenomouvrage. Aprsavoircrlabasededonnes,nousavonsdeuxpossibilits :


G

ImporterlefichierSQLquidcritlastructuredelaoudestables. Creruneouplusieurstablesavecdesnomsdechamps.

3.ImporterunfichierSQL
PourimporterunfichierMySQLdjexistant,nousallonsutiliserlinterfacequinousestproposeparphpMyAdmin commeciaprs:

- 2-

ENI Editions - All rights reserved - Algeria Educ

Pourobtenirlersultatsuivant :

Voicilesourcedufichierouvrage.SQL quiatimportpourobtenirlastructuredecettebasededonnes: SQL/ouvrage.SQL CREATE

ENI Editions - All rights reserved - Algeria Educ

- 3-

TABLE exemple ( id int(5) NOT NULL auto_increment, nom varchar(20) NOT NULL, prenom varchar(20) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; LefichierSQLsecomposeduncertainnombredelignes :
G

id :numrodidentificationdeligne nom :champquicorrespondaunomdefamille prnom :champquicorrespondvotreprnom PRIMARY KEY :clefprimaire auto_increment:compteurautomatiquesurlacolonnecestdireid.

Noustudieronsultrieurementcommentremplirceschampsavecdesdonnes. lafindecetouvrage,nousallonstreamensutiliseruneautretablemaiscellecipossdedesdonnes.Voici commentseprsente lefichierSQL: CREATE TABLE actualite ( id tinyint(5) NOT NULL auto_increment, titre varchar(100) NOT NULL, lien varchar(255) NOT NULL, description text NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ; Cette table sera utilise pour lutilisation des Flux RSS, donnant la possibilit dmettre des bulletins dinformation versdautressitesInternet nousyinsreronsquelquesactualitsquisonttrsimportantes : INSERT INTO actualite (id, titre, lien, description) VALUES (1, Edition ENI, http://www.editions-eni.com/, Le site des Editions ENI), (2, Hello-Design, http://www.hello-design.fr, Auteur du livre que vous avez dans les mains), (3, Actualit PHP et MySQL franaise, http://www.nexen.net, Soyez inform des actualites francaises venant du PHP), (4, Portail de la communaut francophone, http://www.phpteam.net/, Site permettant de progresser en PHP sous la forme de Tutoriaux), (5, Le site incontournable, http://www.elroubio.net/, Venez decouvrir Le site du pere de elephant);

4.CrerunfichierSQL
PourcrerunfichierSQL,nouspouvonsutiliserlinterfacedephpMyAdmin :
G

Soitenmodeassist. SoitenutilisantlapartieSQL.

Nous allons reprendre le mme nom de base de donnes que nous avons utilis prcdemment, cestdire ouvrage.Puisquecelleciatcre,nousdevonsmaintenant crerunetableavecuncertainnombredelignesqui correspondentauxnomsdeschamps.

- 4-

ENI Editions - All rights reserved - Algeria Educ

Nousavonschoisiexemplecommenomdunetable quicontiendra3champs :id,nom,prnom.

Commenouslemontrelacapturecran,nousnousretrouvonsdansuneinterfacepermettantdecrernosnomsde champs :
G

Champ :nomduchampquinousserviraultrieurement. Type :permetdedfinirquelgenredetextes,dechiffresoudedatessontautorissdanscechamp. Taille :lenombredecaractresautoriss.

Ilexistedautresparamtrespourdfinirunchampparexemple:
G

Null ou non null : cela autorise les (non) valeurs Null dans la colonne, cestdire que cela permet denregistrerunelignesansquelavaleursoitrenseigne. Autoincrment.

ENI Editions - All rights reserved - Algeria Educ

- 5-

Verrouillerlaclefprimaire.

Ladfinitiondelaclefprimaireestassezimportante,nousdevonsypenserlorsdelacrationdelatable,maiselle peuttoujourstremodifieousupprimeplustard. Loptionautoincrementconsisteajouter+1ladernirevaleurdanslechamp.Cesttrsutile :


G

lorsquenousrencontronsdestablesassezcomplexes, pourviterdegnreruncompteurenlangagePHPcarcestlabasededonnesquivaeffectuerlopration.

Quandvousavezterminladfinitiondetousleschamps,vouspouvezvaliderlasaisiedeschampsencliquantsurle boutonSauvegarder. Ilesttoujourspossibledajouterunouplusieurschampsultrieurement.Pourcela,revenezsurlatableet insrezlesnouveauxchamps.

5.Insrerdesdonnes
Pourinsrerdesdonnes,choisissezlemenuInsrer:

Nousallonsjusteremplirlechampnometlechampprnom.Lechampid,quicorrespondaucompteurdelignesvase remplirtoutseul. Ilesttoutfaitpossibledajouterautantdelignesquenousdsirons. Lorsquenousinsronsdesdonnes,nouspouvonstredenouveauobligsdintervenirsurlesdonnesou sur la structure. Concernant les donnes, nous pouvons modifier ou supprimer une ligne. Pour la partie structure nous avons un peu plus de possibilits, par exemple ajouter de nouveaux champs, supprimer des champs,modifierdesnomsdechamps.

- 6-

ENI Editions - All rights reserved - Algeria Educ

6.ManipulationsSQL
AveclinterfacephpMyAdmin,nousavonslapossibilitdutiliserlesfonctionsSQLstandards :
G

INSERT :insertiondedonnes. UPDATE :misejourdedonnes. DELETE :suppressionsdedonnes.

Poursaisircesdiffrentesfonctions,nousutilisonsunepartiedelinterfacephpMyAdmin(menuSQL ):

Pourinsrerdesdonnes,nouspouvonssaisir : INSERT exemple (nom,prenom) VALUES (nom,prenom); Ici,nousinsronsunnometunprnom.Lalignerecevralenumro2quicorrespondlalignesuivante. Pourmettrejourlesdonnes,nouspouvonssaisir : UPDATE exemple SET nom=essai WHERE id=1; Icinousmettonsjourlechampnomdelaligne1. Pourvisualiserlesdonnes,nouspouvonssaisir : SELECT * FROM exemple ; Ici,nousdemandonsdafficherlatotalitducontenudelatableexemple. Poursupprimerlesdonnesduneligne,nouspouvonssaisir : DELETE * FROM exemple WHERE id=2; Icinoussupprimonslaligne2delatableexemple.

ENI Editions - All rights reserved - Algeria Educ

- 7-

Cenesontquequelquesinstructionsparmilesplusutilises.Ilexistedesinstructionsdefiltre,detri...Tout ceciseratudidanslelivre.

7.AccslabasededonnesavecPHP
Nous ne pouvons pas autoriser toutes les personnes qui possdent un compte sur notre site Internet utiliser linterfacephpMyAdminpourcomplterlabasededonnes. Cest pourquoi le langage PHP possde une srie de fonctions permettant deffectuer la communication entre linterfacedunavigateur,sonlangageetlabasededonnes. Unemthodologieexistepoureffectuerlarelation,danslordre :
G

mySQL_connect:Connexionauserveurdedonnes. mySQL_select_db:Slectiondelabasededonnes. mySQL_query:Excutiondunerequte. mySQL_xxx:Exploitationdesrsultats. mySQL_free_result:Librationdursultat. mySQL_close:Fermeturedelaconnexion.

- 8-

ENI Editions - All rights reserved - Algeria Educ

Leserveur
Une fois quil est dcid dutiliser un langage et une base de donnes, nous avons besoin dun outil pour faire fonctionnercesdeuxapplications.NousallonsutiliserleserveurApachequipermettradefairefonctionnernotresite Internetenlocal. Danslamesureolamajoritdessolutionsdhbergementgratuitesetpayantesutilisentceserveur,nousnavons pasnousinquitersurlacompatibilitentrenotreconfigurationetlhbergementretenu. Rappel : un site Internet dvelopp en PHP ne stocke aucune information chez le client (visiteur). Les informationsdexcutionsontmmorisessurleserveuretcestleserveurquivaeffectuerletravailpourles convertirauxnormesHTMLenvigueur.ParconsquentnotresiteInternettournerasurunserveurdistant. LespossibilitsdeparamtrageetdeconfigurationdunserveurApachesontunedesesfonctionnalitsphares.Elles permettentdinstalleretdhbergerplusieurssitesInternetsurunmmeserveur. Ilestpossibledeprotgerundossierpourviterdesefairevolerlescodesdaccs.Lesfichiersutilisssont.htaccess et .htpasswd. Ces fichiers seront tudis plus loin dans louvrage (cf. chapitre Fonctionnalits supplmentaires HTAccess). NouspouvonsaussicontrleretgrerlesfonctionsURLderedirectionsquiseronttudiesplusloindanslouvrage(cf. chapitreFonctionnalitssupplmentairesRedirectiondadresse). LeserveurApachepeutvrifiersilechemindelapageInternetexisteoupaslorsquelevisiteurveutsaisirdirectement lapagelamain. Comme vous laurez compris, le serveur Apache permet deffectuer la majorit du travail pour laisser la place au langageetlabasededonnes,delespacepourexcuterlesfonctionsprincipales.

ENI Editions - All rights reserved - Algeria Educ

- 1-

Lesoutils
1.Leslogiciels
Pour raliser notre application, nous avons besoin doutils (logiciels). Ils sont varis et nombreux : le plus rapide consisteutiliserunditeurdetexte(parexemplenotepadouleblocnotesdevotresystmedexploitation)maison peutciterquelquesoutilsdestinslaralisationdedveloppementsenPHP,parexemple :
G

EclipseavecsonmodulePHPEclipse ZendStudio PHPEdit.

IlexistedautreslogicielsmaisilsnesontpasdestinsexclusivementaulangagePHP. LorsdudveloppementdunsiteInternet,ilestncessairedepouvoirdbuguerlapplicationpourrepreretcorriger lesquelquesproblmesquipeuventexister. Lesoutilspouvanttreutilisssontparexemple :


G

AdvancedPHPDebugger(APD) Xdebug PHPdebuggerDBG.

2.Environnementprdfini
Pour utiliser le langage PHP, il est ncessaire davoir une station de travail qui comprendra la gestion du langage dynamique,unebasededonnes(MySQL)etunserveurproprementdit(Apache). Il est possible dinstaller sparment ces trois applications, mais lorsque nous commenons vouloir programmer aveclelangagePHP,ilpeutseposerquelquesproblmesdeparamtrageoudeconfiguration.Lasolutionconsiste installerunenvironnementdjprdfini. Pour installer et configurer tout ceci, sans normment de connaissances, il existe dj des environnements semi configursavecunexcutablequisoccuperadetoutinstaller.Nouspouvonsciter lesplusconnus:
G

WAMP (WindowsApacheMySQLPHP):disponiblesurlesiteInternethttp://www.wampserver.com. MAMP(MacApacheMySQLPHP):disponiblesurlesiteInternet http://www.mamp.info. XAMPP (linuX Apache MySQL PHP) http://www.apachefriends.org/en/xampp.html. : disponible sur le site Internet

Cesonttroisenvironnementsparmiceuxquipeuventexistersurlemarch.Biensr,ilenexistedautresqui fonctionnentaussitrsbien.

3.OrganisationdesfichiersPHP
Lorsque nous utilisons un langage dynamique comme le PHP, nous nous retrouvons trs rapidement avec de nombreuxfichiersinformatiquesetsouventcelapeutdevenirunpeulourdgrer.Cestpourquoi,ilestprfrable deprparerunestructurecommunepourlesdossiers:
G

Admin : contient les fichiers de paramtrage et de connexion la base de donnes. Il faudra scuriser ce

ENI Editions - All rights reserved - Algeria Educ

- 1-

dossieraveclesfichiers .htaccesset.htpasswd.
G

Include : contient les fichiers comprenant lextension .inc. Nous y retrouverons la gestion des fonctions, touteslestchesquisontamenestrerptes. Images:contienttouteslesimagesquiserontaffichessurnotresiteInternet. Media:contienttouteslesvidos. Forum:contientleforum.

Nouspouvonsbiensrcrerdautresdossiersousousdossiers.Lebutesttoujoursdepouvoirsyretrouver.

- 2-

ENI Editions - All rights reserved - Algeria Educ

Introduction
Dans ce chapitre, nous dfinirons un certain nombre dlments ou de concept qui seront ncessaires au dveloppementdenotreapplication.Quelquesexemplessimplesnouspermettronsdemettreenvidencelesbases indispensablessabonneralisationtantdupointdevuedulangagequedelabasededonnes,desastructureet delascurit.

ENI Editions - All rights reserved - Algeria Educ

- 1-

Lesfeuillesdestyle
AvantdecommencerlaralisationdunprojetoudunsiteInternet,ilestimportantdeprparerunemaquettesousla formedunsquelettequelonhabilleraavecdesfeuillesdestylepourobtenirleprojetfinal.Lesfeuillesdestylessont appelesCSS( CascadingStyleSheet)etpermettentdestructurerunepagecriteenHTML. Nous allons apprendre prparer une feuille de style pour donner un style personnalis notre application. Cette partieneconcernepasdirectementledveloppement,maisnousnedevonspasperdredevuequepourraliserun siteInternetsympathiquel il,ilestncessairedemettreunminimumdeprsentation (utilisationdecouleurssurle texte,personnalisationdeslienshypertextes...). AulieudinsrerunstyledecaractrepourchaquepageInternet,nousallonsdoncregrouperlatotalitdecesstyles dansunefeuilleCSS.Cesfeuillesdestylesnousservirontdfinirunecertainepolicedecaractre(outypo),unetaille etunecouleur.Ellespossdentdautrespossibilitscommelapersonnalisationdesborduresduntableau,ladfinition dunfonddcran... AvecPHP,ilestpossibledutilisercettemmefeuilledestylepourlensembledusiteInternet,endfinissantunen ttecommun.AinsilesiteInternetauralammeprsentationpourtoutessespages. Exercice Pournousexercer,affichonsuntexte"Bonjour,toutlemonde"avecunefeuilledestyleexterne.Lefichiercss.cssest composcommececi : css/css.php texte { font-family: Verdana, Arial, sans-serif; font-size: 20pt; color: #000000; font-weight:bold; } Nousdfinissonsunepolicedecaractresappeletexte,detaille20,decouleurnoireetengras. Ensuite,nousdevonsprparernotrefichierphp.Ilvasecomposercommececi :
G

Appeldufichiercss.css. Affichagedelabalisequenousavonschoisie. Affichagedumessage. Fermeturedelabalise.

Nousobtenonslecodesourcesuivant : css/index.php <?php echo "<link rel=stylesheet href=$fichier type=text/css>"; echo "<span class=texte>"; echo "Bonjour, tout le monde"; echo "</span>"; ?> Touslesmotsclsutilissiciserontexpliqusdanslouvrage. Envisualisantlersultat,nousobtenonsceci :

ENI Editions - All rights reserved - Algeria Educ

- 1-

Nous pouvons proposer lutilisateur un choix multiple pour la police de caractres et par consquent pour une prsentation. css/exemple2.php <?php if(isset($_GET[css]) && $_GET[css]==1) $fichier="css.css"; else $fichier="css2.css"; echo "<link rel=stylesheet href=$fichier type=text/css>"; echo "<span class=texte>"; echo "Bonjour, tout le monde"; echo "</span>"; echo "<br><br>"; echo "<a href=exemple2.php?css=1>Police de caractre 1</a> "; echo "<a href=exemple2.php?css=2>Police de caractre 2</a> "; ?> Ici,nousdonnonslapossibilitnotrevisiteurdechoisirlestyledecaractresquilsouhaite.

Aprssonchoix,lapageInternetserechargepoursemettreenrelationaveclabonnefeuilledestyle.

- 2-

ENI Editions - All rights reserved - Algeria Educ

Attentionpourchaquefeuilledestylebienutiliserlesmmesbalisessinonlesprsentationsrisquentdene pascorrespondrevoschoix.

ENI Editions - All rights reserved - Algeria Educ

- 3-

LesbasesdulangagePHP
Pourtousleslangagesinformatiquesnousdevonsconnatrecertainesbases.Cesbasessontutilisesrgulirement etlelangagePHPnchappepaslargle.Cestpourquoidanscettepartienousallonsvoirlesnotionsimportantes quisont :
G

lesvariables lesconditions lesboucles.

1.Lesvariables
Une variable correspond une valeur qui mmorise provisoirement une donne numrique (chiffre) ou du texte (donnealphabtique).Cetteinformationserautilepourexcuteruneoprationprcise. Lesvariablesquenousutilisonssontdestinesuneseulepagedenotresite,cestpourquoileurduredevieest trscourte. Lorsquun langage permet lutilisation dune variable, nous pouvons nous permettre dexcuter certaines manipulations. NousallonsmmoriserdanslavariablealemotEditionsetdanslavariableblemotENI. Nousaffichonschacunedesvariableslcranpuislesdeuxvariablessuruneseuleligne. variable/exemple1.php <?php $a="Editions"; $b="ENI"; echo "$a<br>"; echo "$b<br>"; echo "$a $b<br>"; ?> Nouspouvonsgnrerunenouvellevariableenenregistrantlesvariablesaetbdansuneautrevariablec. <?php $c=$a." ".$b; echo "$c<br>"; ?> Pourobtenirlersultatsuivant :

Nous venons de voir lutilisation de variables avec du texte, mais il est possible dutiliser les variables avec des chiffres. Leschiffrespermettentdeffectuerlesfonctionsdecalculdebase(addition,soustraction,multiplication,division)et descalculscomplexes. Illustronsavecladdition lunedespossibilitsquePHPpeutnousoffrir.Nousallonsraliseruneadditiondansune variablea :
ENI Editions - All rights reserved - Algeria Educ - 1-

variable/exemple2.php <?php $a = 1+1; echo "a : $a<br>"; ?> LelangagePHPnousoffrelapossibilitdeffectuerdesadditionsbasiques,cestdiredcomposerladditionvariable parvariable.Commececi : <?php $d = 5; $d = $d + $a; echo "d : $d<br>"; ?> Cependant nous pouvons effectuer ces additions sous une autre forme : au lieu de rpter deux fois la mme variable, nous pouvons demander au langage PHP deffectuerlajoutdeladeuximevariabledanslapremire.Ici, nousallonsajouteretprendreencomptecenouveaursultatdansunevariablecetnousajoutonslavaleurdea. <?php $c = 5; $c += $a; echo "c : $c<br>"; ?> Nousobtenonslersultatsuivant:

Cequivientdevoustremontrserautilisunpeuplusloindanslouvrage,entreautrespourlacration duneclefalatoire(cf.cechapitre,LesquelettedelapplicationLesfonctions).

2.Lesconditions
Ifelse Lesconditionsserventdanslelangageinformatiquedterminersilersultatobtenuestgaloupasuneautre valeur.CequinouspermetdobtenirpourrsultatunevaleurVraiouFaux. Lasyntaxeemployepourlesconditionsest : If condition Else sinon Danscettefonction,nouspouvonseffectuercertainstestsdecomparaison:

- 2-

ENI Editions - All rights reserved - Algeria Educ

==:Egal >:estsuprieur <:estinfrieur >=:estsuprieurougal <=:estinfrieurougal !=:estdiffrentde Nousallonsutilisercesconditionslorsdunpetitexemple : condition/exemple1.php <?php $a="Editions ENI"; if ($a == "Editions ENI") { echo "Vrai"; } else { echo "Faux"; } ?> NotreexemplenousretournelersultatVrai. Biensrnouspouvonseffectuerplusieurstestsdansunemmecondition,lasyntaxeutiliseestalors : AND correspond au terme ET OR correspond au terme OU && correspond au mot AND || correspond au mot OR

condition/exemple2.php <?php $a="Editions ENI"; $b="hello"; if ($a == "Editions ENI" && $b=="hello") { echo "Vrai"; } else { echo "Faux"; } ?> Nous obtenons un rsultat Vrai car nous regardons si la variable a possde bien la valeur Editions ENI et si la variablebpossdebienlavaleurhello. Nous venons de voir lutilisation des conditions simples, cestdire avec deux rsultats possibles. Il est possible deffectuer des tests en cascade cestdiredutiliser plusieurs conditions les unes en dessous des autres avec la fonctionelseif. Elseif : sinon si Pour illustrer cette fonction, nous allons, partir dun formulaire, dterminer si la valeur que nous avons saisie correspondlunedesquatretranchesquenousallonsdterminer. Cestranchesirontde25en25,cestdire :
G

025 :tranche1

ENI Editions - All rights reserved - Algeria Educ

- 3-

2650 :tranche2 5175 :tranche3 7599 :tranche4.

Nousprenonsunevariableetnousmettonsunevaleurauhasardpourvoirlersultat : condition/exemple3.php <?php $tranche=2; if ($tranche<=0) echo "Tranche 0<br>"; elseif ($tranche==1) echo "Tranche 1<br>"; elseif ($tranche==2) echo "Tranche 2<br>"; elseif ($tranche==3) echo "Tranche 3<br>"; elseif ($tranche==4) echo "Tranche 4<br>"; elseif ($tranche==5) echo "Tranche 5<br>"; elseif ($tranche==6) echo "Tranche 6<br>"; elseif ($tranche==7) echo "Tranche 7<br>"; elseif ($tranche==8) echo "Tranche 8<br>"; elseif ($tranche==9) echo "Tranche 9<br>"; else echo "Hors tranche<br>"; ?> LersultatmontrequilsagitdelaTranche2. Switch Dans lexemple prcdent nous voyons que les lignes se rptent. Nous pouvons effectuer ces tests par lintermdiaireduneautreinstruction: Switch Testelavariable. Case Valeurdelavariable. Break Sortdutest. condition/exemple4.php <?php $tranche=2; switch ($tranche) { case 0: echo "Tranche 0<br>"; break; case 1: echo "Tranche 1<br>"; break; case 2: echo "Tranche 2<br>"; break;
- 4 ENI Editions - All rights reserved - Algeria Educ

case 3: echo "Tranche case 4: echo "Tranche case 5: echo "Tranche case 6: echo "Tranche case 7: echo "Tranche case 8: echo "Tranche case 9: echo "Tranche default: echo "Hors tranche"; break; } ?>

3<br>"; 4<br>"; 5<br>"; 6<br>"; 7<br>"; 8<br>"; 9<br>";

break; break; break; break; break; break; break;

Nousobtenonslesmmesrsultatsmaisnousavonsunebienmeilleureclartdenotrecode.

3.Lesboucles
Lutilisationdesbouclesestprsentedanstousleslangagesdeprogrammations.Cettetechniqueesttrsutilepour rpteruneaction,pourraliseruncompteurouunsystmedaffichagedelignesdersultats. NousallonsaborderlesboucleslesplusrpanduesdanslelangagePHP. For Linstructionforpermetdeffectueruneboucleenspcifiantlenombrederptitions. F o r : boucle limite Linstruction nous permet de dterminer la position de dpart, suivie de la position de fin et pour terminer un pas dincrment. Nousallonsafficherdansuneboucleleschiffresde110avecunpasde1: boucle/exemple1.php <?php for ($i=0;$i<=10;$i++) { echo "$i<br>"; } ?> Pourobtenirlersultatsuivant :

while Cette instruction while permet deffectuer le mme travail que prcdemment, sauf quici, nous navons pas de
ENI Editions - All rights reserved - Algeria Educ - 5-

positiondefin. While Bouclesanslimite. Elle nous sera utile pour afficher un rsultat venant dune table, car nous ne pouvons pas connatre le nombre de lignesprovenantduchoixdenotrevisiteur cestpourquoicetteinstructionafficheralersultatligneparligne,tant quilrestedeslignesafficher. condition/exemple2.php <?php $i=0; while ($i<=10) { echo "$i<br>"; $i++; } ?> Dansnotreexemple,nousavonsinsruncompteurpourpermettredafficherlesystmedecompteur. Foreach Cetteinstructionpermetditrersurleslmentsduntableau.Ellepeutnoustreutilepoureffectuerunerecherche dansuntableaudynamique. Foreach Boucletableau. condition/exemple3.php <?php $arr = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); foreach ($arr as &$i) { echo "$i<br>"; } ?> Lutilisationdecetteboucleseratudieunpeuplusloindanslelivre(cf.danscechapitreLestableaux).

- 6-

ENI Editions - All rights reserved - Algeria Educ

Labasededonnes
Nousallonsaussiavoirbesoinpournotreapplicationdunebasededonnes.NousallonsrutiliserlemmefichierSQL ouvrage.sql que nous avons tudi dans le chapitre prcdent en effectuant les appels la base de donnes par MySQLietMySQL. Le format MySQLi correspond une extension de MySQL. Actuellement, nous pouvons dire que ce nouveau format risque de devenir le successeur de MySQL car il a t optimis pour rpondre aux diffrentes contraintesdechargeetderapiditliesInternet.

1.Connexion
Quelquesoitleformatquenousallonschoisir,nousallonsutiliserlammeinterfacephpMyAdmin,puisquecestla mmesocitquiproposeleformatMySQLetMySQLi. Lorsquenousimportonsnotrefichierouvrage.sql,nouspouvonsvoirlersultatdanslinterfacephpMyAdmin :

Lorsque notre fichier base de donnes est cr, nous devons par lintermdiaire du langage PHP prparer la connexion notre base de donnes se trouvant sur le serveur pour tre certains que la communication sera correctementralise. BaseDeDonnee/exemple-mysqli.php <?php $serveur="localhost"; $user="root"; $password=""; $bdd="ouvrage"; $connex = mysqli_connect($serveur, $user, $password, $bdd); if (mysqli_connect_errno()) { echo ("Echec de la connexion : ". mysqli_connect_error());

ENI Editions - All rights reserved - Algeria Educ

- 1-

die ("Code derreur : ".mysqli_connect_errno()); } ?> PoureffectuerlaconnexionenMySQLi,nousallonsutiliserlafonction : Mysqli_connect OuvrelaconnexionauserveurMySQLi. Nousinsronsunpetittestquiconsistereprersiuneerreurapparat,auquelcasnousaffichonsunmessage les fonctionsutilises : Mysqli_connect_error RetournelemessagederreurdeconnexionMySQLi. Mysqli_connect_errno RetournelecodeerreurdelaconnexionMySQLi. SivoustenezutiliserleformatMySQLclassiquepoureffectuerlammeconnexion,nousobtenonsceci : BaseDeDonnee/exemple-mysql.php <?php $serveur="localhost"; $user="root"; $password=""; $bdd="ouvrage"; $connex = mysql_connect($serveur, $user, $password, $bdd); if (mysql_ errno()) die ("Echec de la connexion : ". mysql_error()); mysql_select_db($bdd,$connex); ?> Danscetexemplenousutilisonslesfonctionssuivantes : Mysql_connect OuvrelaconnexionauserveurMySQL. Mysql_error Retournelenumroderreur. Mysql_select_db Slectionneunebasededonnes.

Cesdeuxexemplesmontrentlaconnexionauserveuretlabasededonnesouvrage.Noustudieronsun peuplusendtailtoutesceslignesunpeuplusloin(cf.danscechapitre Lesbasesdedonnes). Nous allons placer ce fichier dans le dossier admin. Cest un fichier trs sensible car il contient tous les codes ncessairespourseconnecterauserveuretlabasededonnes. Lorsque nous basculerons notre application sur Internet, nous devrons protger le dossier qui contient les paramtresdeconnexionparlintermdiairedesfichiers.htaccesset.htpasswd. .htaccess Contientlesdirectivesdeprotection. .htpasswd Contientlesidentifiantsetmotsdepassedespersonnesquipeuventaccdercedossier.

- 2-

ENI Editions - All rights reserved - Algeria Educ

Ces protections de dossiers seront tudies aussi dans une autre partie de louvrage (cf. chapitre Fonctionnalits supplmentairesHTAccess).Ilfautdjprendreconsciencedesintentionsmalhonntesdecertainsvisiteurs.

2.Structuredelabasededonnes
Pourrevenirnotreapplication,nousallonsimporternotrefichierSQLappelENI.SQLaveclinterfacephpMyAdmin commenouslavonstudidanslechapitreprcdent. Lesourcedufichierneserapasdtaillici.Ilestjustedisponibleaveclesautresfichiersentlchargement. Cependant,nousallonstudierlastructuredelabaseSQL,permettantainsidenousapprocherlepluspossiblede notre application. Ce fichier correspond lensemble des tables et des donnes qui seront utilises dans notre application"Carnetdadresses".

La table user reprsente tous les possesseurs de comptes. Elle enregistre les comptes des personnes qui sont autorisespossderuncarnetdadresse.Nousallonsytrouvercertainschampsimportants :
G

idclef :uneclefcryptenouspermetdenepasfaireapparatreenclairlenumrodeligneafindviter,silon modifie un caractre de ce champ, de tomber sur lenregistrement suivant ou prcdent pour lequel nous navonspaslesdroitsdaccs. niveau :ilnousserautilepourdterminerleniveaudaccsdupossesseurducompte. page :ilnouspermetlorsdelidentificationdupossesseurducomptedelenvoyersurunepagespcifique.

La table carnet est destine mmoriser les informations du possesseur du compte cette table enregistrera partir dun formulaire tous les contacts des personnes qui possdent un compte sur notre site Internet. Il pourra avoirdansuncarnetplusieursenregistrementspersonnels.Leschampsimportantsdelatablesont :
G

carnetclef :cechampserautilispourscuriserlesdonnesetpermetdoncdenepasvoirlenumrodela lignecomme1idclef(quenousavonsvuquelqueslignesaudessus). iduser : ce champ mmorise le numro de ligne du possesseur du compte et ne sera visible pour aucun visiteur.

La table rubrique reprsente la liste des diffrentes rubriques que tous les possesseurs de comptes pourront personnaliser. Cettelistecorresponddiffrentschoixpossiblespourclassercertainesinformations.Parailleurstantdonnque ceslistessontdestinesuneseulepersonne,cestdirelepossesseurducompte,ellesserontdiffrentespour touslespossesseursdecomptes. La table carnet_details sert mmoriser une ou plusieurs informations pour un des contacts du possesseur de compte.Elleestassocieaveclatablecarnet.

ENI Editions - All rights reserved - Algeria Educ

- 3-

Ainsi,letitulaireducomptepossdeuncarnetdanslequelilpeutmettretoussescontacts,etdepluspourchaque contact,ilauralapossibilitdinscrireuneouplusieursinformations. Voicilersultatunefoiscefichierimport :

LefichierSQLestdisponibleentlchargement.

- 4-

ENI Editions - All rights reserved - Algeria Educ

Lesquelettedelapplication
1.Lesincludes
PHP possde une fonctionnalit trs utilise : les includes. Cest une fonctionnalit trs simple, mais fort utile et surtouttrspuissante.Ellepermetdinsrerunepagedansuneautrepage. Nousallonsvoirquevousnepouvezpasignorercettefonction :parexempledansnotresiteInternet,nousavons unmenuetuneprsentationidentiquepourtouteslespages.Grcecettefonction,nousnavonspasbesoinde recopiercetteprsentationpourtouteslespagesInternet. Lautreavantageestenrapportaveclesmodificationsetvolutionsfuturesoupendantlapriodededveloppement dusiteInternet :nousnauronseffectuerquuneseulefoislescorrectionspourquellessappliquentsurlensemble dusiteInternet. Poureffectuerlappeldunfichierextrieur,nousdevonscrercefichierextrieur : Fichier page.php <html> <head></head> <body> Les Editions ENI </body> </html> Pouraffichercettepage,nousallonsfaireappeluneautrepage : Fichier index.php <?php include "page.php"; ?> Ilexistedautresfonctionsquipermettentgalementdappelerdesfichiersexternes :
G

includeetrequire :excutelefichierspcificommeunargument. include_onceet require_once:mmesfonctionsquecidessusaveclaparticularitdenesexcuterquune seulefois.Cesttrsutilepourviterlesmessagesderedfinitionsdefonction.

Nousutiliseronsdeprfrencelafonctionrequire_once.

2.Lespseudoframes
Lespseudoframes(appelsFRAMEdanslelangageHTML)sonttrssouventutilisesdanslelangagedynamique. Ellesdcoupentlcranenplusieursparties,permettantainsidegrersparmentlactualisationduneouplusieurs parties. Lautreparticularitdespseudoframesestquellespeuventtreindexesparlesmoteursderecherchesanssoucis deprsentation. Pourexcuterlespseudoframes,lameilleuresolutionconsiste,commenouslavonsvudanslespagesprcdentes, utiliserlesfonctionsincludeourequire. Pourillustrerlutilisationdespseudoframesetenguisedexempledebase,nousallonscrerunfichieravecunen tte(head.inc.php)etunpieddepage(footer.inc.php). Pour mmoire, lextension .inc.php concerne des fichiers includes qui ne seront pas pris en compte comme desfichiersprincipaux.

frame/head.inc.php

ENI Editions - All rights reserved - Algeria Educ

- 1-

<?php echo "Frame : Partie en haut de lecran"; ?> frame/footer.inc.php <?php echo "Frame : Partie en bas de lecran"; ?> frame/index.php <html> <body> <table border="1" width="500"> <tr> <td> <?php require(head.inc.php); ?> </td> </tr> <tr> <td> <?php $i=0; $fin=10; while($i != $fin) { echo "Ligne exemple numero : ".$i."<br>"; $i++; } ?> </td> </tr> <tr> <td> <?php require(footer.inc.php); ?> </td> </tr> </table> </body> </html> Voicilersultat:

Pour concevoir des pseudoframes il suffit de crer un tableau HTML classique et dans chaque partie du tableau dinclureunerelationaveclesfichiersPHP. LavantagedutilisercettetechniqueestquelelienURLseradiffrentpourchaquepage. Dansnotreapplication,nousallonsutiliserlatechniquedespseudoframespourpermettredafficheretdegrerle menudenotreapplication.Notremenusecomposeraduntitreetdesousmenus.
- 2 ENI Editions - All rights reserved - Algeria Educ

Lorsquenousaccdonsausite,aucunsousmenunestaffich,maissuivantlechoixduvisiteur,lesousmenusera affichoupas.Parailleurs,cesousmenudisparatraauchangementdemenu. Voicilcrandedbut :

Lecodedenotrefichierhead.inc.phpseprsentecommececi : frame2/head.inc.php <table border="1" cellspacing="2" cellpadding="2" width="100%"><tr> <td width=100 valign=top> <a href=index.php>Accueil</a><br> <a href=carnet.php>Votre Carnet</a><br> <?php if (isset ($menu) && $menu=="carnet") { ?> <a href=#>Ajout</a><br> <a href=#>Consult/Modif</a><br> <a href=#>Recherche</a><br> <?php } ?> </td><td valign=top> SinouschoisissonsdeslectionnerlemenuVotrecarnet,unenouvelleprsentationapparatcommececi :

ENI Editions - All rights reserved - Algeria Educ

- 3-

Toutdabord,vouspouveznoterquelurlachangetcorrespondnotrechoix.Lorsdelaffichage de la page, de nouvellesrubriquessontapparues.Voicilecodesourceexemple : frame2/carnet.php <?php $menu="carnet"; require_once ("head.inc.php"); echo "Fichier Rubrique"; require_once ("footer.inc.php"); ?> Surlapremireligneunevariablenousindiquequenoussommesdanslapagecarnet.Ensuitenousallonsafficher notre menu et en reprenant lexemple prcdent, head.inc.php, nous voyons que si le menu carnet est bien slectionnnotreapplicationvaafficherlesnouvellesrubriques. SinousreslectionnonslemenuAccueil,nousallonsvoirdisparatrelesousmenuquivenaitdapparatre. Lemenucompletestdisponibleentlchargement.

3.Lesfonctions
Lesfonctionspermettentauxprogrammeursderaliserunextraitdecodequipeutserpterdenombreusesfois. Nouspouvonsaussiutiliserunefonctionpourisolerunepartiedenotreapplicationassezcompliquequiseraainsi plusfacilefairevoluer.Onpeutaussilesappelerdessousprogrammes. Lesfonctionssonttrsutilisespour,parexemple,lagestionduncaddieoudunpanier(sitemarchand).Maiselles sontaussiutilisespourleformatagedechampoulecontrledechamps,dedates... Ilestpossiblepourunefonctiondefaireappeluneautrefonction(voirexemple2). Return Terminelafonctionetretourneunevaleur. ExempledunefonctionsimplequiafficheracommersultatlemessageBonjour: fonctions/exemple1.php <?php function retourne_message ($text) { return $text; } echo retourne_message ("Bonjour"); ?> Pourrevenirnotreapplication,nousallonsavoirbesoindunpetitgnrateurdeclautomatique. Ce gnrateur de cl sera utilis pour obtenir un minimum de scurit et garder une clef didentification qui sera utilisepourlesSESSIONS(voirplusloin).chaqueidentification,cetteclefserarecalculeautomatiquement. Ce gnrateur de clef sera dcompos en deux fonctions dans un exemple que nous utiliserons pour notre application. La premire fonction (ciaprs) permet de rcuprer le timestamp UNIX en microsecondes si plusieurs personnes effectuent laffichage de la mme page au mme moment, cette fonction permettra de retourner des valeurs diffrentesetilyauradoncmoinsderisquesdeconflitauniveaudelascurit. fonctions/exemple2.php <?php function make_mms() { list($usec, $sec) = explode( , microtime());

- 4-

ENI Editions - All rights reserved - Algeria Educ

return (float) $sec + ((float) $usec * 100000); } ?> explode:coupeunechaneensegments.Cettefonctionpermetdecouperunechaneensegments(en parties) sous la forme dun tableau de chane microtime : retourne le stimestamp Unix avec les microsecondesfloat:retourneunevaleurnumrique. Ladeuximefonction,quiesttrsutile,permetdercupreruneclefdidentificationdunelongueurde20caractres. Ellevanousservirdefonctionprincipale : <?php function recup_clef() { $idcle=""; $taille = 20; $lettres = "abcdefghijklmnopqrstuvwxyz0123456789"; srand(make_mms()); for ($i=0;$i<$taille;$i++) { $idcle.=substr($lettres,(rand()%(strlen($lettres))),1); } return $idcle; } ?> srand:permetdegnrerunnombrealatoireaveclersultatprovenantdelautrefonction(cidessus) microtimesubstr:retourneunsegmentdechane. Maintenant,ilnousresteafficherlesvaleurspourvrifierquenosdeuxfonctionstravaillentparfaitement. Afficherlesdeuxclefspourvrifier: <?php echo Clef numero 1 : ".recup_clef()."<br>"; echo Clef numero 2 : ".recup_clef()."<br>"; ?> Voicilersultat :

ENI Editions - All rights reserved - Algeria Educ

- 5-

Lesformulaires
1.GET,POST,REQUESTetFILES
GETetPOSTsontdesmthodesstandardsduHTML.EllesexistentdepuisdenombreusesannesenPHP.Ellessont utiliseslaidede$_GETet$_POST. La fonction FILE se prsente en PHP sous la forme $_FILES. Elle est utilise pour lenvoi de fichiers partir dun formulaireversleserveur,parexempleunephoto,undocument... La variable $_REQUEST correspond lincorporation des fonctions GET, POST, COOKIE. Cest une variable globale et nous vous dconseillons de lutiliser. Le paramtre $_FILES nest plus inclus dedans depuis la versiondePHP4.3. Lutilisationdecesvariablespermetderecevoirdesdonnesvenantdunformulaire,dunlien... Diffrence entre $_GET et $_POST : la premire affiche les informations en clair directement dans la barre URL de votrenavigateur.Ladeuximetransmetlesmmesinformationsmaisellesneserontpasaffichesdanslabarrede navigation: Voicicommentutilisercesvariables: <form name="saisie" method="POST" action="exemple1.php"> ... </form>

a.Envoidesdonnespartirdunformulaire
*$_POST Pour rcuprer les donnes venant de notre formulaire nous allons utiliser $_POST si nous avons envoy les donnesdenotreformulaireparlamthodePOST. Exemple :soitunformulairecomprenantdeuxchamps :nometprenom. Aprslasaisiedenotreformulaire,nousafficheronsaprsunbonjourlenometleprnomquenousvenonsde saisir. Voicilcrandesaisie :

Pourafficherceschamps,utilisonsleformulairesuivant : get-post/exemple1.php <html> <body> <form name="saisie" method="POST" action="exemple1.php"> Votre nom <input name="nom" type="text"><br /><br /> Votre prnom <input name="prenom" type="text"><br /><br /> <input name="Confirmer" type="submit" value="Confirmer">

ENI Editions - All rights reserved - Algeria Educ

- 1-

</form> </body> </html> Lorsdelavalidationdesdonnes,nousallonsafficherleschampsaveclesparamtresdevalidationdePHP. <?php if (sizeof($_POST) > 0) { echo Bonjour : ".$_POST[prenom]." ".$_POST[nom]."<br />"; } ?> Le source cidessus montre une particularit : sizeof. Cette fonction nous informe si notre formulaire possde au moinsdesdonnesquionttenvoys. sizeof :aliasdelafonctioncountquicomptelenombredlmentsenvoysparleformulaire. Lecontenude$_POSTesttestpourvoirsinotreformulaireabientenvoy. Cetexempleestdisponibleentlchargement.

*$_GET SinousutilisonslamthodeGET,nousallonsrcuprerlesvaleursdedonnessaisieslaidede$_GET : <form name="saisie" method="GET" action="exemple2.php"> ... </form> Nousallonsutiliserlemmeexemplequecidessusmaisaveccenouveaucode. get-post/exemple2.php <?php if (sizeof($_GET) > 0) { echo "Bonjour : ".$_GET[prenom]." ".$_GET[nom]."<br />"; } ?> <html> <body> <form name="saisie" method="GET" action="exemple2.php"> Votre nom <input name="nom" type="text"><br /><br /> Votre prnom <input name="prenom" type="text"><br /><br /> <input name="Confirmer" type="submit" value="Confirmer"> </form> </body> </html> Lersultatseraidentiquemaislesdonnessaisiespartirduformulaireserontaffichesdanslabarredadresse devotrenavigateursurcommelcranciaprs :

- 2 ENI Editions - All rights reserved - Algeria Educ

Lavariable$_GETpossdeuneautreparticularit.Ellepermetdercuprerlesdonnesvenantdunlien (URL). Pourafficherlatotalitdesdonnescontenuesdanslenvoi,ilestpossibledutiliserlesfonctionsprint_r($_GET)ou print_r($_POST). Print_r Affichelesinformationslisiblespourunevariable. Nomdefichier getpost/exemple3.php. <?php echo <pre>; print_r($_GET); echo </pre>; ?> Cetexemplepermetdaffichertoutlecontenudelavariable$_GET. Enlappliquantlexempleprcdent,nousobtenonslersultatsuivant :

b.Envoidesdonnespartirdunlienhypertexte
LamthodeGETestaussiutilisepourlenvoidedonnespartirdelienshypertextes(URL). Dansunpetitexemple,quinousserautilepournotreapplication,nousallonstudiersonprincipe : get-post/exemple4.php <?php $message="Bonjour"; echo "<a href=exemple4-resultat.php?message=$message> Cliquer ici</a>" ?> CettepagevaenvoyerlemotBonjourdansuneautrepageInternet. get-post/exemple4-resultat.php <?php if (isset($_GET[message])) { echo "Message : ".$_GET[message]." <br />";

ENI Editions - All rights reserved - Algeria Educ

- 3-

} else { echo "Pas de message <br />"; } ?> CetexemplevrifiesilavaleurentreatdtruiteaveclafonctionUNSEToupas. isset Dterminesiunevariableestaffecte.

c.Envoidesdonnespartirdunfichier
Nousallonsutiliserlavariable$_FILES(quinousserautilepourpournotreapplication),parexemplepourenvoyer unephoto. get-post/exemple5.php <?php if(!empty($_FILES)) { echo <pre>; print_r($_FILES); echo </pre>; } ?> Lescriptquisetrouvecidessuspermetdevrifiersinotreformulairecontientdesdonnes. empty :dterminesiunevariablecontientunevaleurnonnulle. Nousafficheronslersultatdesvaleurs.LetoutseraenvoypartirdunformulaireHTMLclassique,commececi : <form method="POST" action="exemple5.php" enctype="multipart/form-data"> Pice jointe : <input type="file" name="file" /><br /><br /> <input type="submit" value="Envoyer" /> </form> Voicilersultatsinousenvoyonsunfichier :

IlestimpratifdemettredanslaligneFORMlecodesuivant :enctype= multipart/formdata. Sivousne linsrezpasdansvotreformulairelefichiernepourrapastreenvoy.

- 4-

ENI Editions - All rights reserved - Algeria Educ

2.Lecontrledesformulaires
Le contrle des formulaires est un point important, cest une tape qui se positionne entre la saisie et la mmorisationdesdonnesdanslabasededonnes. Nous allons utiliser comme base et comme description thorique le formulaire de saisie du nom et du prnom que nousavonscrdanslapartieprcdente. Avantdevalidernotreformulaire,uncertainnombredepointssontimportantsvrifiercarcesontlesbasesdela scuritetdelavaliditdunformulaire. Nousallonsmettreenplaceunexemplepourchaquetest,pourtudiercommentsedroulerontlesdiffrentstests possibles,pourtermineraveclatotalitdestestsquiserontlisnotreapplication.

a.Votreformulairepossdetildesvaleurs ?
lavalidationdesdonnesduformulaire,ilfautvrifierqueceluicicontientbiendescaractresdansleschamps desaisieetqueleschampsdesaisienontpastdtruitsentretemps.Nousdisposonsdedeuxfonctions. EMPTY Dterminesiunevariablecontientunevaleurnulle. ISSET VrifiesilavaleurentreatdtruiteaveclafonctionUNSEToupas. Nousallonsrendreobligatoirelasaisieduchampprnom : formulaire/form1.php <?php if (sizeof($_POST) > 0) { if (empty($_POST[prenom]) && isset($_POST[prenom])) { $msg = "Champ obligatoire"; } else { echo "Bonjour : ".$_POST[prenom]." ".$_POST[nom]."<br />"; } } ?> Sileformulairenepossdepasdevaleurouquelavaleuratdtruitedanslechampprenom,nousallonsarrter ledroulementdelapplicationetsignalerquecechampestobligatoire. <html> <body> <form name="saisie" method="POST" action="form1.php"> Votre nom <input name="nom" type="text"><br /><br /> Votre prnom <input name="prenom" type="text"> (*) <?php if (isset($msg)) echo $msg; ?> <br /><br /> <input name="Confirmer" type="submit" value="Confirmer"> </form> </body> </html> Lorsdutestducontenuduchamp,nousmmoriseronslersultatdans$msgpourafficherunmessagecommeci aprs :

ENI Editions - All rights reserved - Algeria Educ

- 5-

b.Votreformulairecontientildescaractres ?
Avantdevaliderleformulairenousdevonsaussipenservrifierquenotreformulairenepossdepasdechane vide. Lavantagedeffectuercetestestdesavoirsilfautvraimentcontinuerexcuterlesdiffrentestapesdenotre traitement.Ainsi,nousvitonsdecrerunenregistrementvidedansnotrebasededonnes. formulaire/form2.php <?php if (sizeof($_POST) > 0) { if (strlen($_POST[prenom])<1) { $msg = "Le champ doit contenir au moins 1 caractre"; } else { echo "Bonjour : ".$_POST[prenom]." ".$_POST[nom]."<br />"; } } ?> <html> <body> <form name="saisie" method="POST" action="form2.php"> Votre nom <input name="nom" type="text"><br /><br /> Votre prnom <input name="prenom" type="text"> (*) <?php if (isset($msg)) echo $msg; ?> <br /><br /> <input name="Confirmer" type="submit" value="Confirmer"> </form> </body> </html> strlen

- 6-

ENI Editions - All rights reserved - Algeria Educ

Calculelatailledunechane.

c.Dtectiondescaractresspciaux
Nous allons garder notre formulaire de saisie avec le nom et le prnom et nous allons grer la dtection de caractresspciauxpermettantainsidemmorisercescaractresdansnotrebasededonnes. Cescaractresspciauxsontlesapostrophes( ),lesguillemets( ),lessymbolessuivants:<>&. htmlspecialchars ConvertitlescaractresspciauxenentitsHTML. Cescaractresspciauxsontutilissparlafonctionhtmlspecialchars()pourobtenirlesrsultatssuivants : & (etcommercial)devient &amp (guillemetsdoubles)devient &quot lorsqueENT_NOQUOTESnestpasutilis (singlequote)devient &#039 uniquementlorsqueENT_QUOTESestutilis < (infrieur)devient &lt > (suprieur)devient &gt . Pouraffichercorrectementlersultatdelasaisie,nousallonsutiliserlafonctionstripslashes. stripslashes Supprimelesantislashdunechane. Exemple : <?php $str = "Aujourd\hui il fait beau"; echo stripslashes($str); ?> Voyonsaveclexempleciaprscommentutilisercesdeuxfonctions : formulaire/form3.php <?php f (sizeof($_POST) > 0) { if (empty($_POST[prenom]) && isset($_POST[prenom])) { $msg = "Champ obligatoire"; if (strlen($_POST[prenom])<1) $msg="Votre champ doit comporter au moins 1 caractre"; } else {
ENI Editions - All rights reserved - Algeria Educ - 7-

$nom=htmlspecialchars($_POST[nom], ENT_QUOTES); $prenom=htmlspecialchars($_POST[prenom], ENT_QUOTES); echo "Bonjour : "; echo stripslashes($prenom); echo " "; echo stripslashes($nom); echo "<br />"; } } ?>

Sinousvoulonsgrerlesaccentsetlescaractresspciauxenmmetemps,ilestprfrabledutiliserla fonctionhtmlentities().Nousverronslutilisationdecettefonctionunpeuplusloin.

d.Dtectiondunechanedecaractres
Dans le formulaire nous devons aussi vrifier si une chane de caractres que nous recevrons est un entier numrique. Nouspouvonsutiliserlesdeuxfonctionssuivantes :intvaletis_numeric : intval Retournelavaleurnumriqueentirequivalentedunevariable. is_numeric Dterminesiunevariableestuntypenumrique. formulaire/form4.php <?php if (sizeof($_POST) > 0) { if ( is_numeric($_POST[codepostal]) && (intval(0 + $_POST[codepostal]) == $_POST[codepostal])) { echo Code postal : Saisie correcte <br>; } else { echo Code postal : Saisie incorrecte <br>; } } ?> NouseffectuonslasaisieavecunformulaireHTMLclassique : <html> <body> <form name="saisie" method="POST" action="form4.php"> Votre code postal <input name="codepostal" type="text"> <br />

- 8-

ENI Editions - All rights reserved - Algeria Educ

<input name="Confirmer" type="submit" value="Confirmer"> </form> </body> </html>

e.Vrificationduformat
Nousdevonsaussipenservrifierleformatdecertainschampssaisiscommeunemail,unlienhypertexte(URL), etc. htmlentities ConvertittouslescaractresligiblesenentitsHTML. Nousallonstudiercommentfairepourvrifieruneadresseemail.Lavrificationseffectueendeuxtemps. Nous allons convertir la chane de saisie au format de caractres HTML, ce qui nous permettra de traduire les caractresspciaux,leslettressouslaformedaccents,etc. Ensuitenousallonseffectueruntestsouslaformeduneexpressionrgulire(cf.unpeuplusloindanscechapitre (section Expression rgulire) cestdire en cherchant si certains caractres sont autoriss dans la chane de texte. Ici,pournotreexemple,nousallonsvrifierentreautressi@estbienprsent. formulaire/form5.php <?php if (sizeof($_POST) > 0) { $email=htmlentities($_POST[email]); if (!preg_match(^[[:alnum:]]([-_.]?[[:alnum:]])*@[[:alnum:]]([-_.]?[[:alnum:]])*. ([a-z]{2,4})$,$email)) { echo Votre email est incorrect !; } else { echo Votre email est correct !; } } ?> <html> <body> <form name="saisie" method="POST" action="form5.php"> Votre email <input name="email" type="text"> <br /> <input name="Confirmer" type="submit" value="Confirmer"> </form> </body> </html>

f.Particularitaveclesformulaires
Lorsque nous excutons les diffrentes tapes de tests et que notre formulaire nest pas valid 100 %, nous devonsrafficherlesvaleurssaisiesdansleformulairepourviterquenotrevisiteurressaisissetousleschamps aveclerisquedeffectuerdenouvelleserreurs. Reprenonsnotreexempleaveclenometleprnomavecobligationquelechampprnomsoitrempli. htmlentities CettefonctionestidentiquelafonctionhtmlspecialcharsmaistouslescaractressontconvertisenentitsHTML. formulaire/form6.php <?php if (sizeof($_POST) > 0) { $nom=htmlentities($_POST[nom], ENT_QUOTES,UTF-8);
ENI Editions - All rights reserved - Algeria Educ - 9-

$prenom=htmlentities($_POST[prenom], ENT_QUOTES,UTF-8); if (empty($_POST[prenom]) && isset($_POST[prenom])) { $msg = "Champ obligatoire"; if (strlen($_POST[prenom])<1) $msg="Votre champ doit comporter au moins 1 caractre"; } else { echo "Bonjour : "; echo stripslashes($prenom); echo " "; echo stripslashes($nom); echo "<br />"; } } ?> <html> <body> <form name="saisie" method="POST" action="form6.php"> Votre nom <input name="nom" type="text" value="<?php if (isset($nom)) echo addslashes($nom); ?>" /><br /><br /> Votre prnom <input name="prenom" type="text"> (*) <?php if (isset($msg)) echo $msg; ?> <br /><br /> <input name="Confirmer" type="submit" value="Confirmer"> </form> </body> </html> Nousattironsvotreattentionsurlasyntaxequiatutilise: <input name="nom" type="text" value="<?php echo addslashes($nom); ?>" /> Les guillemets pour lattribut VALUE signifient que si votre chane de caractres possde des espaces elle sera traiteentirement.Sanscelatoutelasaisieneseraitpaspriseencompte.

g.Leslistesdanslesformulaires
Dansunformulairedesaisie,ilestsouventncessairedevrifierlecontenudeslistesdroulantespourtrecertain quelapersonneabienslectionnunedesvaleursdelaliste. Nous allons maintenant voir comment contrler ce champ. Nous prendrons par exemple une liste droulante contenantMonsieur,Madame,Mademoiselle. Poureffectuerlecontrlelaideduntableau,nousallonsutiliserlobjet arrayquipermetlagestiondedonnes souslaformeduntableauprovisoire.Cetobjetseratudiplusendtaildanslechapitresuivant. Nous allons considrer que les donnes sont dans le tableau et que nous avons besoin deffectuer un test de vrification en effectuant une comparaison. Cette opration sera ralise avec la fonction in_array (et explique danslechapitresuivant). formulaire/form7.php <?php if (sizeof($_POST) > 0) { $genre=array (Monsieur,Madame,Mademoiselle); if (in_array ($_POST[genre],$genre)) { echo "Choix slectionn ".$_POST[genre]; } else { echo "Champ non trouv"; } }
- 10 ENI Editions - All rights reserved - Algeria Educ

?> <html> <body> <form name="saisie" method="POST" action="form7.php"> Faites votre choix <select name="genre"> <option selected> </option> <option value="Monsieur">Monsieur</option> <option value="Madame">Madame</option> <option value="Mademoiselle">Mademoiselle</option> </select> <input name="Confirmer" type="submit" value="Confirmer"> </form> </body> </html> Nous venons de dcouvrir de nombreuses techniques pour effectuer un contrle de formulaire. Dans notre application,touscespointsserontrutilisspourdmontrerlimportancedecestests. Cestestsdevalidationdeformulairetouchentaussilascuritdesdonnes.Ilestimportantdelirela partieconcernantlascuritsivousnevoulezpasavoirdemauvaisessurprisesaprslamiseenlignede votreapplication.

ENI Editions - All rights reserved - Algeria Educ

- 11 -

Lestableaux
1.Lestableauxengnral
Les tableaux dynamiques permettent, dans une mme variable, de stocker plusieurs informations qui seront mmorisesetpourronttrerutilisesultrieurement. Cette gestion dynamique est compltement diffrente des fonctions utilises dans une table MySQL. Ce tableau (objetArray)correspondunezonedestockagetemporaire,quiesttrsutilepourlutilisationetlavalidationdes formulaires. Ces tableaux sont souvent utiliss pour une gestion de caddie ou de panier mais aussi pour la mmorisation de messagesdalerteouderreurdanscertainesfonctions. Lesfonctionsdegestiondetableauprincipalessont : array Crationduntableau. in_array Retournesiunevaleurappartientuntableau. tableaux/tableau1.php <?php $tableau = array( 4, 1, 1, 1, 1, 8=>1, 4=>1, 19, 3=>13); print_r ($tableau); ?> Voicilersultat :

Un tableau Array commence par la ligne 0 et ajoute 1 pour les lignes qui possdent une valeur. Il est par ailleurs possibledindiquerlindicedansuntableaucomme :
G

lindice8quiauracommevaleur1 lindice4quiauracommevaleur1 lindice3quiauracommevaleur13.

Pourafficherlindicenumro4denotretableau : <?php $tableau = array( 4, 1, 1, 1, 1, 8=>1, 4=>1, 19, 3=>13); echo $tableau[4]; ?> Lersultatquiseraretournsera1,puisquedansnotretableaulaligne4possdelavaleur 1.

2.Lestableauxdansunefonction
ENI Editions - All rights reserved - Algeria Educ - 1-

Lestableauxoffrentdenombreusespossibilits.Nouspouvonsutiliseruntableaupourrcuprerplusieursvaleurs venantdunefonction. Nous avons vu en dbut de ce chapitre (section Les bases du langage PHP Les variables) que nous pouvions rcuprerunevaleur.Ici,nousallonsrcuprerplusieursvaleurs.Cettetechniqueserautilisepourlenvoi(upload) defichiers(cf.unpeuplusloindanscechapitre Lagestiondesfichiers). Voiciunexemple :

Pourobtenircersultatvoicilecodesource : tableaux/tableau2.php <?php function tableau($valeur) { if ($valeur=="1") return array(TRUE,"Retour Vrai"); else return array(FALSE,"Retour Faux"); } $rep=tableau(1); echo $rep[0]."-".$rep[1]."<br>"; $rep=tableau(2); echo $rep[0]."-".$rep[1]."<br>"; ?> Nousavonseffectudeuxappelslafonctiontableau.Lepremierenvoielavaleur1etledeuximelavaleur2. Lafonctionvatesterlavaleurquellereoitetvastockerdansuntableaudeuxinformations :
G

Unevaleurvraioufauxquipeutservirdecritre. Unevaleurtextequipeutservirdemessage.

3.Lestableauxdemessagesdansunformulaire
Nousallonsutiliserlestableauxpourgrerlesmessagesdansunformulaire. Gardons notre formulaire exemple comprenant un nom et un prnom et rendons obligatoires tous les champs de saisie. Nous allons mmoriser les messages dans un tableau pour les afficher au bon endroit si notre visiteur ne remplit aucundeschampsobligatoires.Lavantagedecettetechniqueestdemmorisertouslesmessagesdansuneseule variable. tableaux/tableau3.php <?php if (sizeof($_POST) > 0) { $erreurs = array(); $msg = array(); if (empty($_POST[nom]) && isset($_POST[nom]))

- 2-

ENI Editions - All rights reserved - Algeria Educ

{ $erreurs[nom] = true; $msg[nom] = "Le Champ NOM est obligatoire"; } if (empty($_POST[prenom]) && isset($_POST[prenom])) { $erreurs[prenom] = true; $msg[prenom] = "Le Champ PRENOM est obligatoire"; } if (empty($erreurs)) { $nom=htmlspecialchars($_POST[nom], ENT_QUOTES); $prenom=htmlspecialchars($_POST[prenom], ENT_QUOTES); echo echo echo echo echo "Bonjour : "; stripslashes($prenom); " "; stripslashes($nom); "<br />";

} } ?> <html> <body> <form name="saisie" method="POST" action="<?php echo $_SERVER[PHP_SELF]?>"> Votre nom <input name="nom" type="text" value="<?php if (isset($POST[nom])) echo stripslashes($_POST[nom]); ?>" /> (*) <?php if (isset($erreurs[nom])) echo $msg[nom]; ?><br /><br /> Votre prnom <input name="prenom" type="text" value="<?php if (isset($POST [prenom] echo stripslashes($_POST[prenom]); ?>" /> (*) <?php if (isset($erreurs[prenom])) echo $msg[prenom]; ?> <br /><br /> <input name="Confirmer" type="submit" value="Confirmer"> </form> </body> </html> Pour la cration dun tableau la vole nous devons dclarer un tableau vide pour permettre ainsi de stocker les informations les unes aprs les autres. Nous allons mmoriser dans notre tableau la variable nom et ensuite la variableprenom. Biensr,silundesdeuxchampsnestpasrempli,lapplicationnirapasplusloincarnotretableaunestpasNULL. Poureffectuercetest,nousutilisonslafonctionempty($erreurs)). Sitoutestcorrectementrempli,voicilersultat :

Sileschampsnesontpasremplis,voicilersultat :

ENI Editions - All rights reserved - Algeria Educ

- 3-

4.Rechercherdansuntableau
Quandlestableauxsontimportantsounepossdentpasdepointsderepres,nousdevonseffectuerunerecherche ligneparlignepourvrifiersilavaleurestprsenteoupas. Poureffectuercettecomparaisonentrelavaleurslectionneetlecontenudutableaunousallonsutiliserin_array. Reprenonslexempleconcernantlutilisationdunelistedroulantequenousavonscrdanslapartieprcdente. tableaux/tableau4.php <?php $NotreChoix="Mademoiselle"; $genre=array (Monsieur,Madame,Mademoiselle); if (in_array ($NotreChoix,$genre)) { echo "Notre choix est bien dans notre tableau"; } else { echo "Champ non trouv"; } ?> Lersultatcorrespond :

Notrechoixestbiendansnotretableau.

- 4-

ENI Editions - All rights reserved - Algeria Educ

Lesbasesdedonnes
Aprsavoirvalidetcontrlleformulaire,nousdevonsmaintenantenregistrerlesdonnesdansunetablepouren garderunetrace,maisaussiparlasuitepouvoirlesconsulteretlesmodifier. Troispossibilitssoffrentnous :
G

MySQLi : cest la base de donnes volue de mysql et qui deviendra logiquement un standard car elle correspondunevolutiondemysql,avecdenombreusesautrespossibilits. MySQL :cestlabasededonnesclassiquequiestactuellementtrsutilise. PDO :ilsagitduneinterfacepermettantuneconnexionauxdiffrentesbasesdedonnesdumarchpouvant exister(MySQL,SQLite,PostgreSQL,Oracle...).Ellevapermettredaccdernimportequellebasededonnes sansavoirseproccuperdesavoircommentellefonctionnerellement.

Noustudieronschacunedellespourlesadapternotreapplication. Dansunebasededonnes,nousallonstrouveruneouplusieurstablesdcomposesenunensembledechamps. Ces champs dterminent les champs de saisie du formulaire, par exemple : le nom, le prnom, ladresse, etc. Mais peuvent aussi mmoriser dautres informations comme ladresse de lordinateur (IP), le dernier passage de notre visiteur,etc.

1.MySQLi
MySQLi est une version volue de MySQL et pourrait court terme remplacer MySQL avec des volutions tant au niveauperformancesquenouvellesfonctionnalits(apparuesdepuisMySQL4.1). LabasededonneMySQLiestapparueavecPHP5,maisvaprendreplusdimportance avec larrivedePHP 6au niveaudesgains. Nousallonsgardernotreexempleaveclesmmeschampsdesaisies,cestdirelenometleprnom. Rappelons aussi quil est important deffectuer un contrle des donnes avant de les enregistrer dans la table (cf. danscechapitreLecontrledesformulaires).

a.Ajouterdesdonnesdansunetable
partirduformulairedesaisie,nousallonsremplirleschampsnometprnom.Aprsavoirappuysurlebouton Confirmer,nousallonsnousconnecterauserveur. mysqli/exemple1.php <?php $serveur = "localhost"; $user= "root"; $passwd = ""; $bdd = "ouvrage"; if (sizeof($_POST) > 0) { $connex = mysqli_connect($serveur, $user, $passwd, $bdd); if (mysqli_connect_errno()) die ("Echec de la connexion : ". mysqli_connect_error()); ?> NousallonsprparernotrerequteSQLpourensuitelexcuter.Sitoutsestcorrectementdroul,nousaffichons unmessagedefinpuisnousfermonslaconnexion. <?php $sql = " INSERT INTO exemple ( nom
ENI Editions - All rights reserved - Algeria Educ - 1-

, prenom ) VALUES ( ".htmlspecialchars($_POST[nom], ENT_QUOTES)." ,".htmlspecialchars($_POST[prenom], ENT_QUOTES)." )"; $result = mysqli_query($connex, $sql); if (!$result) die (Probleme : . mysqli_error($connex)); else echo "Ajout...oki"; mysqli_close($connex); } ?> mysqli_error Retourneunechanedcrivantladernireerreur. mysqli_query Excute une requte sur la base de donnes. Le rsultat qui est renvoy par la fonction permet de savoir si loprationsestcorrectementdroulecommececionpeutafficherlemessagecorrespondantaursultat. mysqli_close Fermelaconnexion. Leformulaireciaprscorrespondauformulaireclassique,ilsagitduformulaireHTMLquenousavonsdjutilis. <html> <body> <form name="saisie" method="POST" action="<?php echo $_SERVER[PHP_SELF]?>"> Votre nom <input name="nom" type="text" /> <br /><br /> Votre prnom <input name="prenom" type="text" /> <br /><br /> <input name="Confirmer" type="submit" value="Confirmer"> </form> </body> </html> Cette fonction permet de recopier le chemin de provenance, ce qui permet lors de la validation du formulaire de recharger la page (cette fonction est dtaille dans le chapitre Fonctionnalits supplmentaires Informations du serveur).

b.Visualiserlesdonnesdunetable
Aprs avoir ajout de nouvelles donnes, nous devons nous connecter au serveur de la base de donnes pour visualisertoutescesdonnes.Sicenestpaspossible,nouslesignalonscommececi : mysqli/exemple2.php <?php $serveur = "localhost"; $user= "root"; $passwd = ""; $bdd = "ouvrage"; $connex = mysqli_connect($serveur, $user, $passwd, $bdd); if (mysqli_connect_errno()) die ("chec de la connexion : ". mysqli_connect_error()); ?> Aprs avoir tabli la connexion nous allons excuter une requte SQL classique et afficher son rsultat sous la formeduntableau. < ?php $sql="SELECT * FROM exemple";

- 2-

ENI Editions - All rights reserved - Algeria Educ

$req=mysqli_query($connex,$sql); echo echo echo echo echo echo "<table border=1>"; "<tr>"; "<td>N</td>"; "<td>Nom</td>"; "<td>Prenom</td>"; "</tr>";

while ($row=mysqli_fetch_assoc($req)) { echo "<tr>"; echo "<td>".$row[id]."</td>"; echo "<td>".stripslashes($row[nom])."</td>"; echo "<td>".stripslashes($row[prenom])."</td>"; echo "</tr>"; } echo "</table>"; ?> Nouslibronslersultatetfermonslaconnexionavecleserveur : < ?php mysqli_free_result($req); mysqli_close($connex); ?> mysqli_fetch_assoc Rcupreunelignedersultatsouslaformeduntableauassociatif. mysqli_free_result Librelammoireassocieunrsultat.

c.Mettrejourdesdonnesdansunetable
Nousallonsmettrejourlaligne2,commececi : mysqli/exemple3.php <?php $serveur = "localhost"; $user= "root"; $passwd = ""; $bdd = "ouvrage"; $connex = mysqli_connect($serveur, $user, $passwd, $bdd); if (mysqli_connect_errno()) die ("Echec de la connexion : ". mysqli_connect_error()); $sql = "UPDATE exemple SET nom=Langage ,prenom=PHP WHERE id=2 "; $result = mysqli_query($connex, $sql); echo $result; if (!$result) die ("Probleme : " . mysqli_error($connex)); else echo "Mise a jour...oki"; mysqli_close($connex); ?>

ENI Editions - All rights reserved - Algeria Educ

- 3-

d.Supprimerdesdonnesdunetable
Nousallonssupprimerlalignenumro12 :aprsavoirtablilaconnexionavecnotreserveur,nousallonsprparer larequteenslectionnantlalignedsireetensuitelexcuter : mysqli/exemple4.php <?php $serveur = "localhost"; $user= "root"; $passwd = ""; $bdd = "ouvrage";

$connex = mysqli_connect($serveur, $user, $passwd, $bdd); if (mysqli_connect_errno()) die ("Echec de la connexion : ". mysqli_connect_error()); $sql = "DELETE FROM exemple WHERE id=12 "; $result = mysqli_query($connex, $sql); if (!$result) die ("Probleme : " . mysqli_error($connex)); else echo "Suppression...oki"; mysqli_close($connex); ?>

e.Rechercherdesdonnes
Lorsque nous utilisons des donnes mmorises dans une base de donnes, nous sommes souvent obligs deffectuerunerecherchepourlesretrouver. Poureffectuerunerecherchedansunerequte,nousutilisonslescritresstandardquinoussontproposs,laide deloprateurLIKE. mysqli/exemple5.php <?php $serveur = "localhost"; $user= "root"; $passwd = ""; $bdd = "ouvrage";

if (sizeof($_POST) > 0) { $connex = mysqli_connect($serveur, $user, $passwd, $bdd); if (mysqli_connect_errno()) die ("Echec de la connexion : ". mysqli_connect_error()); $sql="SELECT * FROM exemple WHERE (nom LIKE %".$_POST[motclef]."% OR prenom LIKE %".$_POST[motclef]."% ) "; $result = mysqli_query($connex, $sql); if (mysqli num rows($result) == 0) { echo "Nous navons pas trouv de rsultats"; } else { while( $row=mysqli_fetch_object($result) ) { echo $row[nom]." ".$row[prenom]."<br>"; } } mysqli_free_result($result); mysqli_close($connex);

- 4-

ENI Editions - All rights reserved - Algeria Educ

} ?> <html> <body>

<form name="fsearch" method="POST" action="<?php echo $_SERVER[PHP_SELF]?>"> Rechercher : <input type="text" name="motclef">&nbsp; <input type="submit" name="action" value="Recherche"> </form> </body> </html> mysqli_fetch_object Retournelalignecourantedunjeudersultatsousformedobjet. mysqli_free_result Librelammoireassocieunrsultat.

2.MySQL
La base de donnes MySQL correspond actuellement au format le plus utilis avec le langage PHP. Nous allons y consacrerquelquespagespourvousmontrercommentraliserlesfonctionsprincipales. Bien quici nous nallons pas effectuer de tests, rappelons encore quil est important deffectuer un contrle des donnesavantleurinsertiondanslatable(cf.danscechapitre,LesformulairesLecontrledesformulaires).

a.Ajouterdesdonnesdansunetable
Utilisonsdenouveaunotreexempledeformulaireavecnometprnom. Nous devons dans un premier temps nous connecter au serveur. Nous allons dclarer le nom du serveur, lidentifiantdeconnexion,sonmotdepasseetlenomdelabasededonneaveclafonctionmysql_pconnect. Sinousnepouvonspasnousconnecterauserveur,nousenverronsunmessagederreur. mysql/exemple.php <?php $serveur = "localhost"; $user= "root"; $passwd = ""; $bdd = "ouvrage"; $connex = mysql_pconnect($serveur, $user, $passwd); if (!$connex) die ("Impossible de se connecter : " . mysql_error()); ?> Aprsavoirtablilaconnexionentrenotrenavigateuretleserveur,nousallonsinsrerdesdonnesdanslatable EXEMPLE,quenousavonscreprcdemmentetimportedansphpMyAdmin. Nousallonsprparercettefonctionendeuxtemps,dabordenspcifiantlarequteSQLetensuiteenlexcutant. < ?php $sql = "INSERT INTO exemple (nom, prenom) VALUES (notre nom,notre prenom)"; $qid = mysql_query($sql); if(! $qid ) die (Requte invalide : . mysql_error()); else echo "Insertion... oki"; ?>

ENI Editions - All rights reserved - Algeria Educ

- 5-

Lorsquenousavonsexcutlarequte,nousdevonsfermerlaconnexioncommeciaprs : < ?php mysql_close($connex); ?> Nousaffichonsunpetitmessagepoursignalerquetoutsestcorrectementpass. < ?php echo "Insertion... oki"; ?> mysql_query EnvoieunerequteunserveurMySQL. mysql_close FermelaconnexionMySQL. Lorsqueleserveuraexcutlafonction,ilrenvoieuneinformation.Cetteinformationesttestepourafficherun messagedesuccsouchec. Maintenant nous allons voir comment insrer les donnes dans la table partir de notre formulaire de saisie habituel :

Aprsvalidationduformulaire,voicilesdiffrentestapespourinsrerlesdonnesdanslatable : mysql/exemple2.php <?php $serveur = "localhost"; $user= "root"; $passwd = ""; $bdd = "ouvrage"; if (sizeof($_POST) > 0) { $connex = mysql_pconnect($serveur, $user, $passwd); if (!$connex) echo ("Impossible de se connecter : " . mysql_error()); $sql = " INSERT INTO exemple ( nom , prenom ) VALUES ( ".htmlspecialchars($_POST[nom], ENT_QUOTES)." ,".htmlspecialchars($_POST[prenom], ENT_QUOTES)." )"; $qid = mysql_query($sql); if(! $qid ) die (Requte invalide : . mysql_error()); mysql_close($connex); echo "Insertion... oki"; }

- 6-

ENI Editions - All rights reserved - Algeria Educ

?> NotonsquelarequteSQLatlgrementmodifiesurtoutdanslapartieconcernantlesvaleurscarnousavons incorpor la gestion de certains caractres (avec la fonction htmlspecialchars) comme nous lavons vu prcdemment.

b.Visualiserlesdonnesdunetable
Aprsajoutdesdonnes,ilestsouventncessairedevrifierleurprsencedanslatable.Nousallonsprocder laffichageducontenudenotretable.Commeprcdemment,nousallonsnousconnecterauserveur. mysql/exemple3.php <?php $serveur = "localhost"; $user= "root"; $passwd = ""; $bdd = "ouvrage"; $connex = mysql_pconnect($serveur, $user, $passwd); if (!$connex) die ("Impossible de se connecter : " . mysql_error()); mysql_select_db($bdd,$connex); ?> Puis,nousslectionnonstousleschampsdenotretablepourenafficherlecontenucompletdansuntableauHTML classique. <?php $sql="select * from exemple "; $valeur=mysql_query($sql); if( ! $valeur ) echo "Problme dans la table exemple : " . mysql_error(); echo echo echo echo echo echo "<table border=1>"; "<tr>"; "<td>N</td>"; "<td>Nom</td>"; "<td>Prenom</td>"; "</tr>";

while( $list=mysql_fetch_object( $valeur) ) { echo "<tr>"; echo "<td>$list->id</td>"; echo "<td>".stripslashes($list->nom)."</td>"; echo "<td>".stripslashes($list->prenom)."</td>"; echo "</tr>"; } echo "</table>"; ?> Puis,nouslibronsetfermonslaconnexionentreleserveurhttpetceluidelabasededonnes. <?php mysql_free_result($valeur); mysql_close($connex); ?> Notezlutilisationdelafonctionstripslashes(),quipermetdegrerlescaractresspciaux. Voicilecontenudelatableaprsexcution :

ENI Editions - All rights reserved - Algeria Educ

- 7-

c.Mettrejourdesdonnesdansunetable
Aprsavoirinsretvisualislesdonnes,nousnedevonspasoublierquilnousfaudralesmodifieretdoncles mettrejour. Nousallonsmettrejourlalignenumro1,aveclesinformations :
G

Nom :Langage Prenom :PHP

mysql/exemple4.php <?php $serveur = "localhost"; $user= "root"; $passwd = ""; $bdd = "ouvrage"; $connex = mysql_pconnect($serveur, $user, $passwd); if (!$connex) echo ("Impossible de se connecter : " . mysql_error()); mysql_select_db($bdd,$connex); $sql = "UPDATE exemple SET nom=Langage ,prenom=PHP WHERE id=1 "; $qid = mysql_query($sql); if(! $qid ) die (Requte invalide :. mysql_error()); else echo "Mise jour... oki"; mysql_close($connex); ?> Voicilecontenudelatableaprslamisejourdenosdonnes :

- 8-

ENI Editions - All rights reserved - Algeria Educ

d.Supprimerdesdonnesdunetable
Restonssurnotreexemplepoursupprimerlaligneid=1. mysql/exemple5.php <?php $serveur = "localhost"; $user= "root"; $passwd = "; $bdd = "ouvrage"; $connex = mysql_pconnect($serveur, $user, $passwd); if (!$connex) echo ("Impossible de se connecter : " . mysql_error()); mysql_select_db($bdd,$connex); $sql = "DELETE FROM exemple WHERE id=1 "; $qid = mysql_query($sql); if(! $qid ) die (Requte invalide : . mysql_error()); else echo "Suppression... oki"; mysql_close($connex); ?> Voicilenouveaucontenudenotretable :

e.Rechercherdesdonnes
Pour effectuer une recherche de donnes dans une base de donnes, nous sommes obligs de passer par un formulaire. Lors de lenvoi des donnes partir de ce formulaire, nous allons excuter la recherche par lintermdiairedunerequte. SELECT champ1, champ2, champ3, champ4, ... FROM table

ENI Editions - All rights reserved - Algeria Educ

- 9-

WHERE (champ1 LIKE %".$_POST[motclef]."% AND champ2 LIKE %".$_POST [motclef]."% ) ORDER BY champ1 LIMIT 1,30 LIKE : loprateur LIKE permet de faire une recherche dans un ou plusieurs champs en vrifiant si le mot est prsent ou pas. Les symboles % encadrant le mot cl montrent que celuici peut tre situ nimporte o dans le champ. LIMIT : permet dobtenir laffichage dun certain nombre de lignes et sur plusieurs pages. Nous verrons cela en dtaildanslechapitreLasaisieetlaffichageGrerplusieurspages. mysql/exemple6.php <?php $serveur = "localhost"; $user= "root"; $passwd = ""; $bdd = "ouvrage"; if (sizeof($_POST) > 0) { $connex = mysql_pconnect($serveur, $user, $passwd); if (!$connex) echo ("Impossible de se connecter : " . mysql_error()); $sql="SELECT * FROM exemple WHERE (nom LIKE %".$_POST[motclef]."% OR prenom LIKE %".$_POST[motclef]."% ) "; $resultat = mysql_query($sql); if (!$resultat) echo (Requte invalide: . mysql_error()); if (mysql_num_rows($resultat) == 0) { echo "Nous navons pas trouv de rsultats"; } else { while($row = mysql_fetch_object($resultat) ) { echo $row->nom." ".$row->prenom."<br>"; } } mysql_close($connex); exit; } ?> <html> <body> <form name="fsearch" method="POST" action="<?php echo $_SERVER[PHP_SELF]?>"> Rechercher : <input type="text" name="motclef">&nbsp; <input type="submit" name="action" value="Recherche"> </form> </body> </html> Nousvenonsdaborderlesfonctionsclassiquesquenousutilisonsrgulirementetquisonttoujoursdactualit. Concernant notre application, la connexion MySQL sera dtaille un peu plus loin dans louvrage, mais nous resteronsdanslesmmesapprochesetlemmeconcept.

3.PDO
a.Introduction
LePDO(PHPDataObjects)permetdetraiterlabasededonnescommeunobjet.Cesnouvellesfonctionnalitssont apparuesavecPHP5etvisentpouvoirexploiterunebasededonnessanssoccuperdesonformat. LePDOpermet,aveclammetechnique,dutiliserlesbasesdedonnessuivantes :DB2,MySQL,MySQLi,SQLite, ODBC,Oracle,PostgreSQL,etc. Enrsum,pourtouteslesbasesdedonnespouvantexister,ilestpossibledelesinsreretdelesutiliserentant

- 10 -

ENI Editions - All rights reserved - Algeria Educ

quobjet,doncavecPDO. Aveccertainssystmesdexploitation(parexempleWindows),ilestncessairedeffectuerunepetitemanipulation supplmentaire.Nousdevonsdclarerlextensionquiserautilise :


G

diterlefichierphp.ini. Effectuerunerecherchedelachane WindowsExtensions . PouractiverlemodePDO,ilestncessairedenleverle devantlalignesuivante :extension=php_pdo.dll. Et aussi dactiver lextension de la base de donnes, par exemple pour une base de donnes MySQL : extension=php_pdo_mysql.dll SivousdsirezutiliseruneautrebasededonnesparexempleMySQLi :extension=php_pdo_mysqli.dll

Pensezredmarrervotreenvironnementdedveloppementpourquelesmodificationssoientprisesencompte.Si vousutilisezWampserverdanslenvironnementWindows,ilfautlerelancer. MaintenantqueleserveurpeututiliserlePDO,nouspouvonspoursuivre.

b.Connexion
NousdevonstablirlaconnexionentrenospagesInternetetleserveur. Ciaprs quelques exemples de dclaration du serveur qui peuvent tre utiliss avec des bases de donnes diffrentes : MySQL $connex=newPDO(mysql:host=localhostdbname=baseDeDonnees,login, MotDePasse) ODBC $connex=newPDO(odbc:baseDeDonnees,login,MotDePasse) ODBC(Access) $connex=newPDO(odbc:Driver={MicrosoftAccessDriver(*.mdb)} Dbq=C:\\baseDeDonnees.mdb Uid=login,login, MotDePasse) PDO Connexionunebasededonnes. Voiciunexempledutilisationdelaconnexion : pdo/connection.php <?php $serveur = "localhost"; $user= "root"; $passwd = "; $bdd = "ouvrage"; $port=3306; try

ENI Editions - All rights reserved - Algeria Educ

- 11 -

{ $cnx = new PDO(mysql:host=.$serveur.;port=.$port.;dbname= .$bdd, $user, $passwd); } catch (PDOException $e) { echo N : .$e->getCode().<br />; die (Erreur : .$e->getMessage().<br />); } ?> Nousavonsintgrsurcetexemplelagestionderreurssousformedexceptionsquenousverronsunpeuplusloin danscechapitresectionLedebuggageErreurenExceptionEtendue.

c.Visualiserlesdonnesdunetable
Ilexistediffrentestechniquespourexcuterunerequte,nousallonsprivilgierlatechniqueendeuxtemps :
G

prparationdelarequte, excutiondelarequte.

Cettetechniqueoffrequelquesavantages :
G

optimisationdesperformancessilarequteestappeleplusieursfois, protectioncontrelesinjectionsSQL.

Nousallonstreamensutilisercertainesfonctionspouraffichelesdonnes : setAttribute Dfinitunattributpourunerequte. prepare Prparelexcutiondunerequteetretourneunobjetquilareprsente. execute Excuteunerequteprpare. fetch RcuprelalignesuivantedunjeudersultatPDO. closeCursor Fermelecurseur,permettantlarequtedtredenouveauexcute. Pourutiliserunexemplesimple,nousdevonscommencerpareffectueruneconnexionavecleserveurdelabasede donnes : pdo/visualiser.php <?php $cnx = new PDO(mysql:host=localhost;port=3306;dbname=ouvrage, root, ); $cnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); ?> Ensuitenousallonsprparerlarequteetlexcuter :

- 12 -

ENI Editions - All rights reserved - Algeria Educ

<?php $sql="SELECT nom,prenom from exemple "; $qid=$cnx->prepare($sql); $qid->execute(); ?> Lorsquelarequteatexcute,nouspouvonsaffichersonrsultatsouslaformedunobjet : <?php while($row=$qid->fetch(PDO::FETCH_OBJ)) { echo $row->nom..$row->prenom.<br />; } ?> Nousfermonslersultatpuislaconnexion : <?php $qid->closeCursor(); $cnx = null; ?>

d.Ajouterdesdonnesdansunetable
Poureffectuerlajoutdenouvellesdonnesdansunetabledenotrebasededonnes,nousdevonsrespecterun certainordredexcution. NousallonsutiliseruneautrefonctionPHP : beginTransaction Dmarreunetransaction. commit Valideunetransaction. Cettefonction,nouspermetdelancerunetransactionentrelenavigateurduvisiteuretlesdonnesduserveur. Dansnotreexemple,nouseffectuonsuneconnexionavecunobjet : pdo/insert.php <?php $cnx = new PDO(mysql:host=localhost;port=3306;dbname=ouvrage, $user, $passwd); $cnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); ?> Avantdeprparernotrerequte,nousdevonstablirlaconnexionpourpermettrededmarrerlatransactionpour linsertiondesdonnes.EnsuitenousprparonsetexcutonslarequteSQL : <?php $cnx->beginTransaction(); $sql="INSERT INTO exemple (nom, prenom) VALUES (Villeneuve, Christophe)"; $qid=$cnx->prepare($sql); $qid->execute(); ?> Pourfinir,latransactionestvalide(commit)cequiappliquelesmodificationsdelabasededonnes : <?php $cnx->commit(); $cnx = null; ?>

ENI Editions - All rights reserved - Algeria Educ

- 13 -

e.Mettrejourdesdonnesdansunetable
Aprsavoirajoutdesinformationsdansunetable,nousdevonseffectuerdesmisesjourdesdonnes. Surnotreexemplehabituel,modifionslecontenuduchampnomdelaligne3. Poureffectuercettemanipulation,nousallonsdabordtablirlaconnexion : pdo/update.php <?php $cnx = new PDO(mysql:host=localhost;port=3306;dbname=ouvrage, $user, $passwd); $cnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Obligatoire pour la suite ?> Nousdmarronslatransactionpourprparerlarequtepuislexcuter : <?php $cnx->beginTransaction(); $sql="UPDATE exemple SET nom=ENI WHERE id=3"; $qid=$cnx->prepare($sql); $qid->execute(); ?> Lorsquelamisejourestralise,nousvalidonslatransactionetfermonslaconnexion : <?php $cnx->commit(); $cnx = null; ?>

f.Nombredelignesdansunetable
Lorsquenousmanipulonsdesinformationsprovenantdunetabledelabasededonnes,nousdevonscompterle nombredelignespourafficherlersultatoupas.Leprincipedecompteurpeuttreutilisenmmetempsquelon prpareunerequte,grceaumotclefCOUNT. Aprsavoirtablilaconnexionavecleserveur(vuprcdemment),nousprparonslarequteavecuncalcul : COUNT Comptelenombredelignes. Pourensuiteexcuterlarequtequenousavonsprpare : pdo/nombre.php <?php $sql="SELECT COUNT(*) from exemple "; $compte = $cnx->prepare($sql); $compte->execute(); ?> NouspouvonsutiliserlafonctionfetchColumnpourconnatrelavaleurrsultatdenotrerequte. fetchColumn Retourneunecolonnedepuislalignesuivantedunjeudersultats. pdo/nombre.php <?php $resultat = $compte->fetchColumn(); echo $resultat."<br>";
- 14 ENI Editions - All rights reserved - Algeria Educ

?> Nousdevonsfermerlecurseuretfermerlaconnexion: closeCursor Fermelecurseur,permettantlarequtedtredenouveauexcute. pdo/nombre.php <?php $compte->closeCursor(); $cnx = null; ?>

g.Afficherlesdonnesdunetablesiellessontprsentes
NousallonseffectueravecunemmerequteSQLdeuxtchesdiffrentes :
G

Dterminersidesdonnessontprsentes. Afficherlersultatsinoustrouvonsdesdonnes.

Nousdevonsnousconnectercommenouslavonsdjvudanslespagesprcdentes.Lorsquelaconnexionest tablie,nousconstruisonsnotrerequteSQLsouslaformecidessous : pdo/update.php <?php $sql="SELECT nom,prenom from exemple "; ?> Nous allons dans un premier temps dterminer si notre rsultat possde des donnes afficher avec une autre fonctionenprparantetexcutantnotrerequte. fetchAll Retourneuntableaucontenanttoutesleslignesdujeudenregistrements. <?php $qid=$cnx->prepare($sql); $qid->execute(); $nrow=$qid->fetchAll(); ?> Lavaleurquenousobtenonscorrespondaunombredelignespossiblesvenantdenotrerequte. Pour excuter la requte, nous rutilisons la requte SQL que nous avons prpare prcdemment et nous lexcutons. Pouraffichercenouveaursultat,nousallonsutiliseruneboucleletraitantligneparligne. fetch Rcupreunelignesuivantedunjeudersultats. <?php if ($nrow[0] !=) { $qid=$cnx->prepare($sql); $qid->execute(); while($row=$qid->fetch(PDO::FETCH_OBJ)) { echo $row->nom..$row->prenom.<br />; }

ENI Editions - All rights reserved - Algeria Educ

- 15 -

} else { echo "Aucune rubrique disponible"; } ?> Nouslibronslersultatetlaconnexion : <?php $qid->closeCursor(); $cnx = null; ?> Il existe dautres fonctions et possibilits avec les bases de donnes en PDO, mais nous voyons ici les fonctionslespluscourammentutilises.

- 16 -

ENI Editions - All rights reserved - Algeria Educ

Lessessions
1.Description
LessessionspermettentdemmoriserdesinformationssurplusieurspagesenPHP.Ilestdoncpossibledesuivrela navigationduninternautedanslespagesdusiteInternet. Chaque fois quun visiteur vient sur le site Internet et quil sidentifie, un identifiant de session lui est automatiquementattribu. Les sessions sont aussi utilises pour des espaces membres ou dadministration cela permet de vrifier si la personnequiveutaccderunespaceprivsetrouvecorrectementidentifie. Cependantlessessionssontaussiutilisespourlagestiondecaddiesoupanierspourlessitesmarchands. Pourutiliserlessessions,ilestncessairederecourircertainsparamtres.AudbutdechaquepagePHP,ilfaut appelerlafonction session_start().Ellepermetdecrerunesessionpournotrevisiteur.Silasessionexistedj, ellenechangerapas. session_start Initialiseunesession. Renseignerunesessionseffectuedelafaonsuivante : $_SESSION[votre variable]= votre texte ; Pourafficherlecontenudunevariabledunesession : <?php echo $_SESSION[votre variable] ; ?> Si lutilisateur ne ferme pas son compte, ou bien son navigateur, la session sera automatiquement dtruite par le serveurhbergeantlesiteInternet. Silutilisateurfermesoncomptequandilatermintouteslesmanipulationsdesonchoix,ondtruitetonlibrela mmoiredelasessioncommececi : <?php session_destroy() ; unset($_SESSION); ?> session_destroy Dtruitunesession. unset Dtruitunevariable.

2.Utilisationdebasedessessions
Nousallonsplacerdansunesessionuntexteetlavrifier.Nousallonsdclarerlasessiondedpart. session1/exemple1.php <?php session_start(); ?> Nousallonstestersinotresessionditeurcontientunevaleur :

ENI Editions - All rights reserved - Algeria Educ

- 1-

<?php if (isset ($_SESSION[editeur]) { echo Test 1 : Editeur est : ; echo $_SESSION[editeur]."<br>"; ?> Silasessionestvide,nousallonssignalerquelavariabletaitvide.Nousallonsensuiteremplirlasessionquenous avonsdclareetrefaireuntestpourvrifier : <?php } else { // si la session est vide echo Test 1 : Aucun editeur n\est trouv<br>; $_SESSION[editeur]="ENI"; if (isset ($_SESSION[editeur])) { echo Test 2 : Editeur est : ; echo $_SESSION[editeur]."<br>"; } else // sinon { echo Test 2 : Aucun editeur n\est trouv <br>; } } ?> Maintenant que nous avons termin nos manipulations, nous pouvons dtruire et librer la session. Nous allons afficherlasessionpourtrecertainquellesoitvide : <?php session_destroy(); unset($_SESSION); if (isset ($SESSION[editeur])) echo $_SESSION[editeur] ; ?> Nousobtenonslersultatsuivant :

3.Unespacemembre
Pour raliser un espace membre (que nous utiliserons pour notre application) nous devons tablir un espace scuris,permettantainsiladministrateurettoutepersonnepossdantuncomptedaccderlapartieprive. Ilnousfauttroisfichiers :
G

unfichierconnex.inc.phpaveclecodedeconnexionlabasededonnes, unfichierindex.phpcomprenantleformulairedesaisiedescodesdaccs, unfichierresultat.phpquimontreunaccsprivetparconsquentrservauxmembres.

Exceptionnellement,nousallonsnousconnecterauserveurdedonnes"ENI"aulieude"OUVRAGE"etnousallons utiliserlabasededonnesauformatMySQLi. Parconsquentnotrefichierdeconnexionvaseprsentercommececi :


- 2 ENI Editions - All rights reserved - Algeria Educ

session2/admin/connex.inc.php <?php $serveur $user $passwd $bdd

= = = =

"localhost"; "root"; ""; "eni";

$connex = mysqli_connect($serveur, $user, $passwd, $bdd); if (mysqli_connect_errno()) { echo ("Echec de la connexion : ". mysqli_connect_error()); die ("Code derreur : ".mysqli_connect_errno()); } ?> Nousallonsdclarerdanslefichierindex.php(cidessous)ledbutdesessionpoursignalerquenousallonsaccder unespacepermettantdefiltrerlesutilisateurs. session2/index.php <?php include "admin/connex.inc.php"; session_start(); ?> Ensuite, il faut grer la partie du POST, cestdire lenvoi des donnes, qui permet de contrler la saisie et dautoriseroupaslaccslapartiemembre : <?php if (sizeof($_POST) > 0) { if (isset($_POST[login])) { $login=addslashes($_POST[login]); $password=MD5 ($_POST[password]); $sql="SELECT * FROM user WHERE login=$login AND password=$password "; $req=mysql_query($sql); if(! $req ) echo (Requte invalide : . mysql_error()); if (mysql_num_rows($req)) { $row = mysql_fetch_object($req); $_SESSION[login] = $row->login; $_SESSION[password] = $row->password; $_SESSION[page] = $row->page; header("Location:resultat.php"); } else echo "Login ou mot de passe invalide"; } else { header("Location:index.php?erreur=login"); echo "erreur"; } } ?> Dansnotrefichier,plusieurstapessenchanent. Pour commencer nous contrlons la validit de la saisie de notre formulaire. Ensuite nous vrifions que les identifiants sont bien prsents dans la base de donnes. Si tout est correct, nous mmorisonscertainesinformationsdansnotresession. Nousallonsensuiteredirigerlenavigateurversuneautrepageaveclafonctionheader.

ENI Editions - All rights reserved - Algeria Educ

- 3-

header Permetdallersurunenouvellepagepourviterquelapagedeprovenancesoitdenouveaumodifie. Pourappelercecode,nousavonsbesoindunformulairedesaisiecommeceluici : <html><body> <center> <form name="saisie" method="POST" action="index.php"> <table cellpadding="5" cellspacing="5" border=0 > <tr> <td align=center> Login<br> <input type="text" name="login"> <br> <br> Mot de passe<br> <input type="password" name="password" size=20> <br> <div align="center"> <input type="submit" name="action" value="Confirmer"> </div> </td></tr> </table> </form> </center> </body></html> Aprslasaisie,lesdonnessontenvoyesparlamthodePOST.Sitoutestcorrect,nouspourronsaccderaufichier resultat.php,cestdirelespacemembreoulespacerservcorrespondantauxcodesdaccs. session2/resultat.php <?php session_start(); ?> Nous allons mettre en place un petit filtre de session. Celuici va permettre de dterminer si lidentification a t effectue. SilapersonneaccdedirectementcettepageInternet,plusieurscassontpossibles :
G

Lasessionestdpasse. Notrevisiteurnesestpasidentifi.

Lapplicationrenvoiedirectementauformulairedesaisiepourobligerlevisiteursidentifier. <?php if (!isset($_SESSION[login])) { header("Location:index.php"); exit; } ?> Sitoutsestcorrectementpass,nousaffichonsquelquesinformationspourvrifierquetoutestcorrect : <?php echo "Bienvenue dans votre espace membre : ".$_SESSION[login]."<br><br>"; echo "Votre login : ".$_SESSION[login]."<br>"; echo "Votre Mot de Passe : ".$_SESSION[password]."<br>"; echo "Direction vers la page : ".$_SESSION[page]."<br>"; ?> Nousdtruisonspuislibronslasession :

- 4-

ENI Editions - All rights reserved - Algeria Educ

<?php session_destroy(); unset($_SESSION); ?>

4.Limitationdutempsdessessions
Lorsquunepersonnesestconnectenotresite,surtoutdanslapartiescurise,ellepeutlaissersonnavigateur ouvertetnepaslutiliser.Cettepriodedenonactivitpeutprsenterunrisquedevulnrabilit. Toutefois,ilesttoutfaitpossibledevrifiercombiendetempscettepageestrestenonactiveenrcuprantla duredesessionfournieparleserveur. Cettefonctionretournepardfaut1440secondes,cestdire24minutes. Pourrcuprercetypedinformation,nousutilisons : session.gc_maxlifetime Retourneensecondeladuredeviedesdonnessurleserveur. get_cfg_var RetournelavaleurduneoptiondePHP. session3/index.php <?php session_start(); $_SESSION[dernier_passage] = time(); $_SESSION[duree] = get_cfg_var("session.gc_maxlifetime"); echo "<a href=resultat.php>Verifier la duree</a>" ?> Nousvenonsdeplacerladuredesessionetlheuredaffichagedelapagedanslavariabledesession. MaintenantnousdevonslincorporerdansnospagesInternetpourpermettredafficheroupaslapagedemande. session/resultat.php <?php session_start(); if (time()-$_SESSION[dernier_passage]>$_SESSION[duree]) { echo "Session expire"; exit(); } else { $_SESSION[dernier_passage] = time() ; echo "Session... toujours valide"; } ?> Dans notre exemple nous effectuons la diffrence entre lheure daffichage de la page et lheure de laffichage prcdentdenotresiteetnouslacomparonsavecladureenmmoire. Siletempsestdpassnousallonsproposerlutilisateurdesidentifierunenouvellefois. Silachangdepage,nousmmorisonslheuredudernierpassagepourpermettredeffectuerlemmetestsurune autrepage.

ENI Editions - All rights reserved - Algeria Educ

- 5-

Lesdates
Lesdatessontutilisespourobtenirdenombreusesinformations :
G

ellesvontnouspermettredetracerunvisiteurlorsdesesdiffrentspassages, ellessontaussiutilisesparexemplepourlesdatesdenaissance, ellesnouspermettentdegrerlesdiffrentsformatspouvantexister,cestdireleformatanglais,franais, etc.

1.Affichage
Pourconnatrelejourenutilisantunemthodeclassique,ilexistelafonctionDATE.Cettefonctionpermetdafficher unedatedansleformatdenotrechoix. Pourconnatreladatedaujourdhui,voiciunexemple : date/date1.php <?php echo "Nous sommes le : "; echo DATE("d-m-Y"); ?> Ilestpossibledinsrerquelquesparamtresdanslechampdate.Danslexemple :
G

lalettredaffichelejour, lalettremaffichelemois, lalettreYaffichelannesur4caractres.

Ilexistedautreslettrespossibles,parexemplepourafficherlejourdelasemaine,lenumrodelasemaine,lheure etlesminutes.Voicilessymbolesquiexistent :
G

s :secondes i :minutes H :heure002300 I :indiquesilheuredtestactive(1=oui,0=non) O :diffrencedheuresaveclheureGMT(Greenwich) d :jourdumois m :moisdelanne Y :annesur4chiffres y :anne,sur2chiffres L :indiquesilanneestbissextile(1=oui,0=non)

ENI Editions - All rights reserved - Algeria Educ

- 1-

l :jourdelasemaine(enanglais) F :moiscritenclair t :nombredejoursdanslemois w :numrodujourdelasemaine0(dimanche)6(samedi) W :numrodelasemainedanslanne z :numrodujourdelanne

Avectoutescespossibilits,nouspouvonsbtirunpetitexemple : date/date2.php <?php echo "Nous sommes le : ".DATE("d-m-Y")."<br>"; echo "Il est ".DATE("l H \h i")." et ".DATE ("s")." secondes<br>"; ?>

2.Formatdenregistrement
Concernantlenregistrementdesdatespartirdunformulaire,nouspouvonsutiliserlafonctionstrftime()delafaon suivante : date/date3.php <?php echo Nous sommes le : "; setlocale(LC_TIME, "fr"); echo strftime("%d-%m-%Y"); ?> Dansnotreapplication,nousallonsutilisercettefonctionpourafficherladateauformatfranais : function datefr($ladate) { setlocale (LC_TIME, "fr_FR"); $date = strftime("%d-%m-%Y",strtotime($ladate)); return $date; }

- 2-

ENI Editions - All rights reserved - Algeria Educ

Expressionrgulire
Uneexpressionrgulirepermetdevrifier,rechercher,reconnatreouremplacerunepartiedunechanedetexte. Ellepermetavanttoutdevalideretfiltrerlesdonnesquelesutilisateursenvoientparlesdiffrentsformulaires. Cettepartieesttrsimportantecartouslesprogrammessrieuxutilisentcettetechnique. Nousallonsutiliserunmaximumdexemplesquiserontutilespournotreapplicationpourenfaciliterlacomprhension. Avantdecommencer,nousdevonssavoirquilexistediffrentestechniquespourvrifierunechanedecaractre,soit par lintermdiaire dune expression rgulire, soit avec les autres fonctions PHP qui existent comme les fonctions STRxxx. Ces fonctions sont plus simples utiliser mais plus limites dans nos applications surtout pour contrler et valideruneadressedemessagerie(email). Le principe dutilisation de ces expressions est deffectuer des tests avec des dlimiteurs permettant ainsi de tester uneouplusieurspartiesdelachanedecaractresquiatenvoyeparunformulaire.Lesdlimiteurssontvaris maisnousutiliseronsdeprfrencelesymbole []ou#. Lesexpressionsrguliresquisontconnatresont :
G

preg_match, preg_replace.

1.preg_Match
Pour effectuer une recherche dans une chane de caractres en respectant exactement le texte, nous utiliserons preg_match qui est une fonction trs rapide en terme de temps de rponse par rapport aux autres fonctions qui ralisentlemmetravail. expression/exp1.php <?php $chaine = Un diteur de qualit Edition ENI; if (preg_match("Editions]", $chaine)) { echo "Vrai"; } else { echo "Faux"; } ?> NousobtenonslersultatVrai. Parcontre,silemotEditiontaitcritenminuscule(edition),nousaurionsobtenuFaux.Celaestdaufaitquele mot Edition possde un E majuscule. Pour viter ce genre de retour et par consquent ne pas se proccuper des majusculesouminuscules,ilfautmettrelalettreiaprslexpression. expression/exp1b.php <?php $chaine = Un diteur de qualit Editions ENI; if(preg_match("[editions]i", $chaine)) { echo "Vrai<br>"; } else { echo "Faux<br>"; } ?>

ENI Editions - All rights reserved - Algeria Educ

- 1-

LexcutiondenotreexemplenousmontrequeletestnousrpondVrai. Biensr,lesexpressionsrgulirespossdentunnormeintrt.Ellespermettentdeffectueravecunemmechane plusieurstestsensimultan. NousallonseffectuerunerecherchedansunephrasepourvoirsinoustrouvonslesmotsENIetHello. Avecunemthodeclassique,voicicequipeuttreralis : expression/exp2.php <?php $chaine = Un diteur de qualit Editions ENI; if (strpos($chaine,"ENI")!== FALSE && strpos($chaine,"Hello")!==FALSE) { echo "Vrai"; } else { echo "Faux"; } ?> Avecuneexpressionrgulire : < ?php if(preg_match("[ENI&Hello]", $chaine)) { echo "Vrai"; } else { echo "Faux"; } ?> LersultatpourcesdeuxexemplesestFaux,carlemotENIestbienprsentmaispaslemotHello. Maintenantnousallonsvoquerlesdiffrentespossibilitsdenotredlimiteur : &reprsenteloprateuret : parexemple :pregmatch("[Edition&ENI]","UnditeurdequalitEditionsENI") >RetourneVrai |reprsenteloprateurou : parexemple :pregmatch("[Edition|ENI]",UnditeurdequalitEditionsENI") >RetourneVrai ^dsigneledbutdunechane : parexemple :pregmatch("[^Edition]","UnditeurdequalitEditionsENI") >Retournefaux $dsignelafindunechane : parexemple :pregmatch("[Edition$]","UnditeurdequalitEditionsENI")>Retournefaux [az]vrifiesicestunechanedecaractres : parexemple :preg_match(#[az]#,"http://hellodesign.fr/")>Retournevrai preg_match(#[az]#,"0123456789")>Retournefaux [09]vrifiesicestunechanenumrique : parexemple :preg_match(#[09]#,"0123456789")>Retournevrai Voicilesourcedecetexemple :
- 2 ENI Editions - All rights reserved - Algeria Educ

expression/exp3.php <?php $chaine echo echo echo echo echo echo echo echo echo echo $chaine echo

= Un diteur de qualit Editions ENI; fct_preg_match("#Edition#",$chaine)."<br>"; fct_preg_match("#edition#",$chaine)."<br>"; fct_preg_match("#edition#i",$chaine)."<br>"; fct_preg_match("#Edition|ENI#",$chaine)."<br>"; fct_preg_match("#^Un#",$chaine)."<br>"; fct_preg_match("#Edition$#",$chaine)."<br>"; fct_preg_match("#[a-z]#",$chaine)."<br>"; fct_preg_match("#[0-9]#","01 23 45 67 89")."<br>"; fct_preg_match("#[a-z]#","01 23 45 67 89")."<br>"; fct_preg_match("#[a-z]#","http://hello-design.fr/")."<br>"; = 1 diteur de qualit Edition ENI; fct_preg_match("#([a-z]{2,4})#",$chaine)."<br>";

function fct_preg_match($critere,$chaine) { if (preg_match($critere, $chaine)) { echo $chaine."...Vrai<br>"; } else { echo $chaine."...Faux<br>"; } } ?> Pournotreapplication,nousallonsutilisercettefonctionpourvrifierlavaliditdesemails,cestdirepourvrifier silemailquiatsaisicorrespondbienunemailauformatstandardavecun@. Nousallonsutiliserlexemplecidessouspourcela. expression/exp4.php <?php $email="livre@hello-design.fr"; if (!preg_match(^[[:alnum:]]([-_.]?[[:alnum:]])*@[[:alnum:]]([-_.]?[[:alnum:]])*. ([a-z]{2,4})$,$email)) { echo "Mauvais format dEmail"; } else { echo "Format correct"; } ?>

Danscetteexpressionrgulire,denouveauxsymbolessontutiliss : [[alnum]] Acceptelescaractresalphabtiquesetnumriques.

ENI Editions - All rights reserved - Algeria Educ

- 3-

? Caractrejokerquipermetdacceptertoutesortedechane.

2.preg_replace
Leremplacementdecertainscaractresdansunechaneestunefonctionnalittrsutile.Ledescriptifdelafonction utiliseest : preg_replace Rechercheretremplacerparuneexpressionrelationnellestandard. NousallonsmettreletexteEditionENIengraspartirduneexpressionrgulire : expression/exp5.php <?php $texte="[b]Editions ENI[/b]"; $cherche=array(/\[/,/\]/); $remplace=array(<,>); echo preg_replace ($cherche,$remplace,$texte); ?> Cette fonction permet de convertir en une seule fois plusieurs caractres qui sont prsents dans une chane de caractres. Dans notre exemple, nous avons remplac les crochets par des signes suprieurs et infrieurs pour obtenir : <b>EditionsENI</b>

- 4-

ENI Editions - All rights reserved - Algeria Educ

Lagestiondesfichiers
1.Lecture/Ecriture
Actuellementilexistediffrentesmanirespourlireetcriredansunfichierinformatique.Nousallonsenvoirdeux :la premire correspond une utilisation standard que la majorit des dveloppeurs utilisent, la deuxime mthode consistesurtoutexploiterlespossibilitsdesversionsPHP4.3.x,PHP5etsuprieur.

a.Premiremthode
Nousallonscriredansunfichiertextelemessagesuivant BonjourdesEditionsENI . Lesfonctionsutilisessont : fopen Ouverturedunfichier. fputs critunfichierenbinaire(aliasdefwrite). fclose Fermeunfichier. fichiers/exemple1.php <?php $texte1="Bonjour des Editions ENI"; $fp = fopen("exemple.txt", "a"); fputs($fp,$texte1); fclose ($fp); ?> Nousallonsliremaintenantlecontenudufichierquenousvenonsdcrireaveclesfonctionssuivantes : fgets Renvoielalignecourantedufichier. feof Testelafindufichier. fichiers/exemple2.php <?php $fp = fopen("exemple.txt", "r"); while(!feof($fp)) { $variable= fgets($fp,4096); } echo $variable; fclose ($fp); ?> Voicilersultatobtenu :

ENI Editions - All rights reserved - Algeria Educ

- 1-

b.Deuximemthode
partir de la version 5 de PHP, la fonction file_put_contents permet dcrire en une seule fois le contenu dune variabledansunfichierdesonchoix.Cettefonctionrevientenrsumeffectuerunfopensuividunfwriteetdun fclose. file_put_contents crireunechanedansunfichier. fichiers/exemple3.php <?php $texte1="Bonjour des Editions ENI"; $fichier = file_put_contents(exemple2.txt,$texte1); ?> partirdesversions4.3dePHPetaussienPHP5,lafonction file_get_contentspermetdeffectuerenuneseule tapelarcuprationducontenudufichierdansuneseulevariable. file_get_contents Littoutunfichierdansunechane. fichiers/exemple4.php <?php $fichier = file_get_contents(exemple2.txt); echo $fichier; ?> Voicilersultatobtenu :

Nousallonsprivilgiercettedeuximemthodepourralisernotreapplication.

2.Transfertdefichiers
Dansuneapplicationinformatique,ilnestpasraredemettreenplaceunsystmedenvoidefichiersversleserveur, parexempleunephoto,unfichier,unedocumentation,etc. Pour notre application. Nous allons envoyer dans un dossier "images" une photo de la personne membre qui se
- 2 ENI Editions - All rights reserved - Algeria Educ

trouvedanslecarnetadressesurnotreserveur. Pourcommencer,ilfautquenousprparionsunformulairepourpermettrenosvisiteursdenvoyerunfichier. fichiers/upload.php <html> <body> <form enctype="multipart/form-data" action="upload_execution.php" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="500000" > Choisir un fichier : <input name="fichier" type="file" > <input type="submit" name="action" value="Envoi" > </form> </body> </html> Notreformulairepossdedeuxpetitsdtailsquisontimportants :
G

Unecasecachequicontientlataillemaximumdufichierenvoyer.Icinousallonslalimiter500 Ko. Dans FORM, nous avons spcifi lattribut enctype= "multipart/formdata" qui permettra deffectuer le transfert. Si vous ne linsrez pas, notre formulaire ne pourra pas effectuer lenvoi du fichier sur notre serveur.

Ilestpossibledinsrerplusieurschampsdeslectionpourenvoyerdesfichiers.LelangagePHPgrelenvoimultiple depuislaversionPHP3.0.10. NousallonsutilisercommefichierimagelELEPHANTsymboleduPHPquiseradisponibleentlchargement.Ilesttout faitpossibledetrouvercetteillustrationetlesymboleduPHP,disponiblessurlesitedelauteur(voirlafinde louvragepourconnatrelesiteInternet). Lorsdelaconfirmationdenotreformulaire,plusieurstapessontncessairespourletraitementdenotrefichier.


G

Nousdevonsvrifierqueleformulaireatcorrectementrempli. Sicestlecas,nousallonsvrifiersiledossierderception(upload)existebien. Sicenestpaslecas,ilfautlecreretenautoriserlaccsencriture.

Nousutiliseronslesfonctions : is_dir Indiquesiledossierexiste. mkdir Creundossier. chmod Changelemodedufichier. fichiers/upload_execution.php < ?php $destDir = "upload"; if (sizeof($_POST) > 0 && $_FILES[fichier] && $_FILES[fichier] != "none") { ?> Nousvrifionssidesdonnesonttenvoyesparunformulaireetquilexisteunnomdefichierdanslechampde saisie. Nousvrifionssiledossierderceptionexistebien,sinonnousdevonslecreretluiouvrirlesdroitsdcriture.

ENI Editions - All rights reserved - Algeria Educ

- 3-

<?php if (!is_dir($destDir)) { if (!@mkdir($destDir)) { die (Erreur lors de la cration du dossier $destDir"); } } @chmod($destDir,0777); ?> @ Permetdebloquerlaffichagedesmessagesderreurslorsquelafonctionestappele. Pourautoriserlaccsencritureetenlecturesurundossier,nousutiliseronslafonctionCHMOD( 777 ).Quand noussommessurunserveurlocal,cettefonctionnestpasutile.Parcontre,elledevientncessairequandilsagit dunserveurdeproduction.Cetteactionpeuttreralise"lamain"avecunlogicieldeFTP. Nousallonstestersilefichiertransfrerexisteetquilnedpassepaslataillepermiselorsquenouslenvoyons partirdenotreformulaire.Notreserveurtestedabord silefichierexiste : file_exists Vrifiesilefichierexiste. <?php if (!file_exists($_FILES[fichier][tmp_name])) { die ("Le fichier nest pas pass. Vrifier les critres"); } ?> Nousallonseffectuerensuiteunautretestsurlatailledufichierpourtresrsquenotrefichiernedpassepasla taillemaximum. filesize Renvoielatailledunfichier. <?php $taille_max=$_POST[MAX_FILE_SIZE]; $taille_fichier = filesize($_FILES[fichier][tmp_name]); if ($taille_max && ($taille_fichier > $taille_max)) { die ("La taille est trop importante"); } ?> Nousallonsgalementeffectueruntestsurlextensiondenotrefichierpourvrifierquilsagitbiendunfichierimage. Nousenprofitonspourimposercetteextensionenminuscule. Une petite remarque importante : il est prfrable davoirunnomdefichierenminusculecardenombreux hbergeurssetrouventsousdesenvironnementsetsystmesdexploitationfaisantladistinctionentreles majusculesetminuscules,parexemplelesenvironnementsLinuxouUnix. strrchr Trouveladernireoccurrenceduncaractredansunechane. <?php $ext = strrchr($_FILES[fichier][name], .); $ext = substr($ext, 1); $ext = strtolower($ext); if ($ext!="jpg" && $ext!="jpeg" && $ext!="png" && $ext!="gif" ) {

- 4-

ENI Editions - All rights reserved - Algeria Educ

die("Le fichier nest pas une image"); } ?> Maintenant,nousallonseffectuerunecorrectionsurlenomdufichier. Toujoursdanslexempledenotrechapitreactuel,nousutilisonslenomoriginaldelimagequicorrespondaunomde fichierquenotrevisiteurauraenvoypartirdunformulairedesaisie,cestdiresinousregardonsdansledossier derceptionduserveur,nousallonstrouverlemmefichier.Parcontre,celapeutposerquelquesproblmessuivant lasyntaxedecenom. Avec notre exemple, nous pouvons rencontrer des noms de fichiers possdant des caractres sous la forme daccents,desespaces,descaractresspciaux,majuscules. strtr Remplacedescaractresdansunechane Pourvaliderlenomdenotrefichier,nousallonseffectuertroisoprations :
G

Leremplacementdesaccentsaveclafonctionstrtr. Unevrificationdesautrescaractresaveclafonctionpreg_replace(cf.sectionExpressionrgulire). La conversion en minuscule du nom de fichier nest pas une obligation, mais sur certains serveurs ou environnements,ilestprfrabledelefairepourunmeilleurfonctionnement.

<?php $fichier_destination = strtr($_FILES[fichier][name], , AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy); $fichier_destination = preg_replace( /[^a-zA-Z0-9\.\$\%\\\-\@\{\}\~\!\#\(\)\&\_\^]/ ,,str_replace(array( ,%20),array(_,_),$fichier_destination)); $fichier_destination=strtolower($fichier_destination); ?> Cecifait,ilnenousresteplusqudplacerlefichierdanslebondossier : <?php if (move_uploaded_file($_FILES[fichier][tmp_name], $destDir.$fichier_destination)) { die ("Le fichier est correctement pass"); } else { echo "Probleme de transfert"; } ?> move_uploaded_file Dplaceunfichiertlcharg. Lorsquelefichierestcorrectementtransfr,nouspouvonsremettreleCHMODcommeavant:CHMOD( 755 ).

ENI Editions - All rights reserved - Algeria Educ

- 5-

Lascurit
La scurit dun site Internet devient un des aspects principaux et sera toujours une des priorits pour un bon programmeur. Lemanquedescuritpeuttresouventlideserreursdeprogrammation.Nousallonsvoirquelquestechniquesqui nousserontutileslorsdudveloppementdenotreapplication. Pourinformation,nousneverronspascommenteffectuerlesdiffrentstypesdattaquespouvantexister,mais justelencessairepourlesviter.

1.Lessessions
Pourscuriserunpeupluslutilisationdessessions,cestdirefixerunesessionpourdfinirunutilisateurlgitime, nousallonsattribueruneclefdinitialisationvariable. Utilisercetteclefpermet,lorsquelelangagePHPinitialiselessessions,devrifiersiunidentifiantattransmiset silestconnu.Sicenestpaslecas,unnouvelidentifiantseracr. securite/session.php <?php session_start(); if (!isset($_SESSION[initialisation])) { session_regenerate_id(); $_SESSION[initialisation]=time(); } echo $_SESSION[initialisation]; ?> NouspouvonsaussimmoriserladresseIPdelordinateurdenotrevisiteurpourscuriserunpeupluslessessions etlesprovenancesdenosvisiteurs.

2.Droitdaccscertainespages
Le droit daccs certaines pages permet certaines personnes reconnues daccder des pages dsignes. Souvent, ces pages sont destines aux administrateurs ou aux personnes qui sont responsables du site pour le contrler. Siunvisiteurveutaccderunepagepourlaquelleilnepossdeparlesdroitsaccs,ilfaudraitlerenvoyerversune autrepage.Cetteventualitexistesi,parexemple,cevisiteurpossdeuncomptesurlesiteetquilreoitdenotre partsouslaformedunlienlURLlaccsunepagequilnedevraitpasconnatre.Silevisiteurcliquesurcelienet quenousnemettonspasunfiltresurleniveaudaccs,ilpeutalorsutilisercespagesetprovoquerdesdommages. <?php if ($_SESSION[niveau]!="admin") header("Location:index.php"); ?> Ces quelques lignes sont insrer en haut de votre page Internet. Si le visiteur ne possde pas les droits ncessaires,ilseraautomatiquementrenvoylapageindexdusite.

3.Limitationdeladuredessessions
Commenouslavonsvuprcdemment,lorsquunvisiteurseconnectesurunepartiescurisedusite(soncompte par exemple) il peut laisser son navigateur ouvert sans lutiliser. Cette priode de nonactivit peut prsenter un risquedevulnrabilit. Toutefois,ilesttoutfaitpossibledemodifierladuredessessions.Ainsi,silevisiteurneraliseaucuneactionet quecedlaiestdpass,nouspouvonsleredirigerversleformulairedidentification.

ENI Editions - All rights reserved - Algeria Educ

- 1-

Nousallonsmmoriserdansnotresessionlheuredepassagedenotrevisiteuretladurequenousluiautorisons pourchangerdepage. session/dureesession.php <?php session_start(); $_SESSION[dernier_passage]=time(); $_SESSION[duree]=5 * 60; ?> Dans lexemple cidessus nous mmorisons la dure en seconde et nous lui accordons 5 minutes ce qui lui laisse 300 secondespourchangerdepage.Cettedurepeuttreplusimportanteourduite. Ilestensuitencessairepourchaquepagedeffectueruntestsupplmentairepourvrifiersilasessionesttoujours dactualitetnestpasexpire. session/dureesession_result.php <?php session_start(); if (time()-$_SESSION[dernier_passage]>$_SESSION[duree]) { echo "Session expire"; exit(); } else $_SESSION[dernier_passage] = time() ; ?> Dans notre exemple nous effectuons la diffrence entre lheure daffichage de la page et lheure de laffichage prcdentdenotresiteetnouslacomparonsavecladureenmmoire. Siletempsestdpassnousluiproposonsdesidentifierunenouvellefois. Sinotrevisiteurachangdepage,nousmmorisonslheuredudernierpassagepourpermettredeffectuerlemme testsuruneautrepage.

4.XSS
LafailleXSS(CrossSiteScripting)connuaussisouslenomCSS(CrossSiteScripting)exploitelesvulnrabilitsdune pageWebdynamique.LeXreprsenteCross,carcelapeutporterconfusionavecCSS( CascadingStyleSheets). Cela est d, entre autres, labsence de contrles lors de la validation dunformulaireoudun lien Internet. Pour scurisercettepartie,nousvousconseillonsdutiliserlesfonctionshtmlspecialcharsethtmlentities. Cesdeuxfonctionssontpresqueidentiques,maisnousutiliseronssurtoutlafonction htmlentitiesquioffreplusde possibilitsdecontrle. securite/xss.php <?php $titre="Un petit exemple <script>alert (Editions ENI)</script>"; echo $titre."<br>"; ?> Nousobtenonslaffichagedunmessagecommececi :

- 2-

ENI Editions - All rights reserved - Algeria Educ

Pourcontrecarrercegenredattaque,voicilasolution : securite/xss-v2.php <?php $titre="Un petit exemple <script>alert (Edition ENI)</script>"; echo htmlentities($titre)."<br>"; ?> Cequidonne :

5.InjectionSQL
Les injections sur Internet sont un aspect ne pas ngliger. Il est trs dommage de constater un matin quelques dysfonctionnementssurvotresiteoummequilacompltementchangdeprsentation. securite/injectionsql.php <?php $serveur = "localhost"; $user= "root"; $passwd = ""; $connex = mysql_pconnect($serveur, $user, $passwd); $champ="Aujourdhui, il fait beau"; echo mysql_real_escape_string($champ); ?> LesinjectionsSQLsontlieslaconnexionverslabasededonnes.Lafonctionmysql_real_escape_stringpermet dajouterunebarreobliquedevantlessimplesquotes. Pour notre application, nous allons nous en servir pour la connexion notre compte pour viter davoir des perturbationsdansnotregestiondesutilisateurs. <?php $login=mysql_real_escape_string(htmlentities($_POST[login], ENT_QUOTES)); ?>

6.Supprimeravecconfirmation

ENI Editions - All rights reserved - Algeria Educ

- 3-

Pourenrevenirtoujoursnotreapplicationexemple,ilserapossibledautoriserlasuppressiondesenregistrements de son compte. Il peut y avoir un risque, surtout si nous ne demandons pas une confirmation de la suppression. Plusieursactionspeuventtreentreprises :
G

Laconfirmationdelasuppressiondelaligne,pourtresrquelapersonnenesestpastrompe. Prvoirventuellementdedemander,partirdunformulaire,laconfirmationdelasuppressiondelaligneen retapantsonmotdepasse.

Nous ne mettrons pas dexemple, cet aspect est dvelopp dans le chapitre La saisie et laffichage Supprimeruncontact.

7.CSRF(CrossSiteRequestForgeries)
CettetechniqueestlopposdelatechniqueXSS(vueprcdemment)caraulieudexploiterlaconfiancedenotre visiteur,leCSRF(CrossSiteRequestForgeries)exploitelaconfiancedusiteWebensesutilisateurs. La mthode joue surtout sur le chemin dorigine de lurl. En rsum, la provenance des fichiers qui seront affichs danslabarredadressedunavigateur.Pourvitercegenredattaque :
G

Utiliserletableau$_POSTpluttquelesvariablescresgrceregister_globals. Nepassimplifierlesactionsimportantessurtoutpoursupprimerdesdonnes.Ilestprfrablededemander uneconfirmationsupplmentairepourtrecertainquilsagitdunepersonnephysique. Forcerlesutilisateurspasserparunformulairepourlavalidationdestapesimportantes.

8.PHP_SELF
La fonction PHP_SELF utilise sous la forme $_SERVER[PHP_SELF] dans beaucoup de nos formulaires, permet de reprendreladresseURL(chemincomplet)danslaquellenotreformulairedesaisievarecevoirlasaisiedesdiffrents champsdenosvisiteurs. Cependant elle prsente facilement un risque dinsrer des scripts malicieux pour prendre le contrle de votre systme.Pourscurisercettevariable,voicilasolutionquenousvousconseillons : securite/php_self.php <form action="<?php echo htmlentities($_SERVER[PHP_SELF]); ?>"> </form>

9.Crypterlemotdepasse
Quand nous regardons le contenu dune base de donnes, nous pouvons lire les donnes en clair. Toutefois, certaines donnes plus sensibles (notamment un mot de passe) peuvent tre protges et vous pouvez donc ajouterunescuritsupplmentairefacetouteslespersonnesquipeuventconsultersesdonnes. Lamthodeconsisteutiliserlafonctionmd5. Ellepermetdeconvertirunechanedecaractresenunechanedecaractreshexadcimauxdunelongueurde32. securite/motdepasse.php <?php $exemple="Editions ENI"; echo $exemple."<br />"; echo md5($exemple)."<br />";
- 4 ENI Editions - All rights reserved - Algeria Educ

?> Voicilersultatobtenu :

10.Listingdossier
Cetaspectcorrespondlapossibilitdeperdredesdonnesbasiques,cestdiredesdossiersetsousdossiersqui nesontpassituslaracinedudisquedur. Voyonscelaavecunpetitexemple : Prenonslecheminincludequicontienttouteslesroutinesimportantes :/notreSiteInternet/include Laseuletechniquedeprotectionquipeutexisterestdajouterunfichierindex.phpdansledossierconcernquiva renvoyerdirectementlaracinedusiteInternet. listing/index.php <?php header("Location: ../index.php"); ?> Il est ncessaire de linsrer dans tous les dossiers et sousdossiers de notre application comme dans le dossier image.Ainsi,lesdonnesouaccsquisontsensiblesnepourrontpastrercuprsparcettetechnique.

ENI Editions - All rights reserved - Algeria Educ

- 5-

Ledbuggage
1.Leserreursclassiques
Lorsque nous dveloppons un site Internet, nous pouvons rencontrer certains messages dalerte lorsque nous dsironsafficherunepageInternet. Cesmessagesderreurssignalentdespetitssoucisdansuneouplusieurslignesdelapage.Ceserreurspeuventse prsentersousdiffrentesformes. Lepointvirgule Lecaractrepointvirgule""estimpratiflafindechaquelignedeprogramme,poursignaleraulangagelafinde linstruction. Exemple : Echo bonjour Aulieude: Echo bonjour ; Lesguillemets Ilestfrquentdoublierdeterminerunlittralaveclesignedoublequoteousimplequote. Exemple : Echo bonjour ; Aulieude: Echo bonjour ; Lesvariables Ilsagitdansunemmeinstructiondeplacerdutexte,etlaffichagedelavaleurdunevariable. Exemple: Echo Bonjour . $variable Aulieude: Echo Bonjour .$variable. Lesaccolades Ilsagitdencadrerpardesaccoladesdiffrentesinstructions,etsilebloccomportetropdelignes,doublierlaccolade fermante.Cequiprovoqueundsquilibredansnotrepage. Exemple : ?php for ($i;$i<=10;$i++) { echo "$i<br />"; ?> Aulieude : <?php des ditions ENI des ditions ENI

ENI Editions - All rights reserved - Algeria Educ

- 1-

for ($i;$i<=10;$i++) { echo "$i<br />"; } ?>

2.ErreurenExceptionEtendue
Depuis la version 5 de PHP, une gestion dexception tendue est possible comme dans dautres langages de programmation. Cettefonctionnalitpermetdanalyserlesblocsdelignedeprogrammeetdenstoppertoutmomentlexcutionsi uneinstructionnecorrespondpasauxcritresdeslectionprvus. NousutiliseronsceprincipedexceptionaveclesbasesdedonnesPDO,maisilpeuttreappliqupartoutenPHP. Lesfonctionsdontnousavonsbesoinsont : try Envoielesdonnes. catch Attrapesiuneerreurapparat. getCode Retournelecodeerreur. getMessage Retournelemessageerreur. Dansunscript,voicicequenouspouvonscrire : Try { .... } catch (Exception $e) { echo N : .$e->getCode().<br />; die (Erreur : .$e->getMessage().<br />); } ?>

3.Lesvariables
Lorsdundveloppement,ilestsouventncessairedeconnatrelesvaleursquisetrouventdanslesvariableslorsde lenvoidedonnespartirdunformulaire.Nousallonsutiliserlafonctionprint_r : print_r Affichelesinformationslisiblesdunevariable. <pre> Rendlalecturepluslisible. <?php echo "<pre>"; print_r ($_SESSION); echo "<br>";
- 2 ENI Editions - All rights reserved - Algeria Educ

print_r ($_GET); echo "<br>"; print_r ($_POST); echo "</pre>"; ?> Cetexemplemontrelecontenudelasession,desGETetdesPOSTsurtouteslespagesdenotreapplication. Dans celleci, nous placerons ce code dans le fichier footer.inc.php inclus dans toutes les pages pour fermer les diffrentesbalisesquenousavonsouvertdanslentte(head.inc.php).

4.Lesrequtes
Dans une page Internet, il est souvent ncessaire deffectuer plusieurs appels vers la base de donnes, donc dexcuterplusieursfoismysql_query. Siuneerreurapparat,ilestsouventdifficilederetrouverlaligneoseposeleproblme.Heureusement,lelangage PHP nous permet dutiliser une fonction qui, si nous lactivons, permet de connatre exactement o se trouve le problme. assert_options() Fixeetlitdiffrentesoptionsdassertions. Nousallonsutiliserquatreoptionspourcettefonction : ASSERT_ACTIVE ActivelassistantASSERT. ASSERT_WARNING AfficheoudsactivelalertePHPpourchaquelignefausse. ASSERT_QUIET_EVAL Activeoudsactivelerapportderreur. ASSERT_CALLBACK Retournelesinformationsutilessiuneerreurapparat. debug/assert.php <?php assert_options(ASSERT_ACTIVE, 1); assert_options(ASSERT_WARNING, 0); assert_options(ASSERT_QUIET_EVAL, 1); function recup_assert($file, $line, $code) { echo "<hr />"; echo "Erreur : <br />"; echo "Fichier $file<br />"; echo "Line $line<br />"; echo "Code $code<br />"; echo "<hr />"; } assert_options (ASSERT_CALLBACK, recup_assert); assert (mysql_query("SELECT * FROM test")); ?> Nousobtenonslersultatsuivant :

ENI Editions - All rights reserved - Algeria Educ

- 3-

Quandnousauronsterminledveloppementdenotreapplication,pourmettrelesiteInternetenproductionnous devronsdsactiverlafonctioncequisetraduiraparlamodificationduneseuleinstructioncommececi : <?php assert_options(ASSERT_ACTIVE, 0); ?> LegrosavantageestquenousnauronspasbesoindditertouteslespagesdenotresiteInternetpourtrouverles lignesquiutilisentlafonctionASSERT. Danslapplication,nousallonsutilisercedbogueurpendantlapriodededveloppementaveclexemplequiat utilisprcdemment. Etdanstouteslesinstructionsquiexcutentunerequte,nousallonsinsrerlafonctiondetestquivaseprsenter commececi : <?php assert (mysqli_query($sql)); ?>

5.Lewarning
LewarningestuneoptionutilepourraliserunebonneprogrammationPHP. Cette option nest jamais active sur un serveur de production car il peut alors fournir des informations non souhaites linternaute. Cependant, cette option est importante lors dun dveloppement car elle permet de raliseruneprogrammationquirespectelesnormesenvigueur. Pourlactiver,nouseffectuonslesoprationssuivantes :
G

rechercherlemplacementdufichierphp.ini diterlefichier rechercherlaligneerror_reportingconcerne

- 4-

ENI Editions - All rights reserved - Algeria Educ

supprimerlepointvirguledudbutdeligne sauvegarderlefichier relancerleserveur.

NousactivonslemodeALLdufichierPHP.INIcommececi :

Activerlatotalitdesoptionspermetdavoirenmmetempslemodewarning,cequiactivelaffichagedesmessages dalertessansbloquerledroulementdelapplication. Reprenonsunexempledupremierchapitre,Lenvironnementdedveloppement :

Commelemontrelacapturecidessus,nousdsironsafficherquelquechose,cependantuneactionsembleindfinie. Cemessagepeutapparatresousdiffrentesformes :

ENI Editions - All rights reserved - Algeria Educ

- 5-

lutilisationdunenouvellevariable, larcuprationdedonnesprovenantdun$_GET[]ou$_POST[].

LasolutionconsisterajouteruntestsurlavaleurinterrogeenutilisantlafonctionISSET,pourobtenirlersultat suivant : <?php if (isset($_GET[action]) && $_GET[action]=="suite") ?>

- 6-

ENI Editions - All rights reserved - Algeria Educ

Image
Les images sont aussi des lments importants prendre en compte car nous pouvons les crer dans diffrents formats,avecdiffrentscontenuslavoleetlesafficherlademande.

1.Lesfonctionnalits
Une image possde un entte qui dfinit un format daffichage. Les formats disponibles en natifs sont : JPG/JPEG, GIF,PNG. DansuneprogrammationHTMLstandard,nousutilisonslabaliseHTML<img>quiseprsentedelafaonsuivante: <img src= image1.png > Lorsquenousdfinissonslecontenudenotreimage,nousutilisonstoujourslammebaliseHTML<img>,maiscette foiselleseprsentedelafaonsuivante: fichier/image1.html <html> <head></head> <body> <img src= image1.php> </body> </html> Labalise<img>contientunnomdefichier,cequisetraduitparlappeldunfichierexternequiseraaffichdansun formatimage. Pourconcevoircefichier,nousutilisonslesfonctionssuivantes : imagecreate :creunenouvelleimagepalette. imagecreatetruecolor:creunenouvelleimageencouleursvraies. imagePNG :envoieuneimagePNGversunnavigateurouunfichier. imagedestroy :dtruituneimage. Aprsavoircrunfichier image1.php quivanouspermettredecrernotreimage. Lacrationduneimagededrouledelafaonsuivante :
G

dclarationdelentte, dclarationdesdimensions, gnrationducontenu, affichageducontenuimage, librationdelimage.

images/image1.php <?php header(Content-type: image/png); $img = imagecreatetruecolor(320,200); imagepng($img); imagedestroy($img); ?> Nousobtenonslersultatsuivant :

ENI Editions - All rights reserved - Algeria Educ

- 1-

Ilestpossibledesauvegarderlimageaulieudelafficherlcran.Loprationseralisedelafaonsuivante : Image/image1.php <?php header(Content-type: image/png); $img = imagecreatetruecolor(320,200); imagepng($img,"image1.png"); imagedestroy($img); ?> LesautresformatscommeleformatJPG/JPEGouGIFutilisentleurspropresfonctions : imagejpeg:envoieuneimageJPEGversunnavigateurouunfichier. imagegif :envoieuneimageGIFversunnavigateurouunfichier. Elleseprsentedelafaonsuivante pourleformatJPG : <?php header(Content-type: image/jpg); $img = imagecreatetruecolor(320,200); imagejpeg($img); imagedestroy($img); ?> etpourleformatGIF : <?php header(Content-type: image/gif); $img = imagecreatetruecolor(320,200); imagegif($img); imagedestroy($img); ?> Le rsultat reste identique au format prcdemment prsent, cest pourquoi nous utiliserons le format PNG dans toutlouvrage.

- 2-

ENI Editions - All rights reserved - Algeria Educ

2.Lesobjetsgraphiques
Lesobjetsgraphiquespeuventseprsentersousdiffrentesformesgrcedesfonctionsspcifiquesquioffrentla possibilitdedessinerdeslignes,descarrs,descerclesavecousansremplissageintrieur,maisaussidafficherun champtexteouenpolicedecaractres. Suivant les dimensions des objets, ceuxci peuvent reprsenter des formes diffrentes un carr peut devenir un rectangleouuncerclepeutsetransformerenellipse. Lesfonctionnalitsdisponibles : imageline :dessineuneligne. imageellipse :dessineuneellipse. Imagerectangle :dessineunrectangle.

a.Ligne
Nousallonstracerunelignedecouleurrougedanslimageprcdente.Ladclaration,laffichageetlalibrationne changentpas.Lvolutionapporteconcernelutilisationdunepalettedecouleurs(voirlasectionLescouleurs)et delafonctionimagelinedontlasyntaxeestlasuivante : imageline(image , x1 , y1 , x2 , y2 , couleur ) quiseprsenteainsidansnotreexemple : image/image2.php <?php header(Content-type: image/png); $img = imagecreatetruecolor(320,200); $col=imagecolorallocate($img, 255,0,0); imageline($img,10,10,400,150, $col); imagepng($img); imagedestroy($img); ?> pourobtenirlersultatsuivant :

ENI Editions - All rights reserved - Algeria Educ

- 3-

b.Carr/rectangle
Lareprsentationduneformegomtriquecommeuncarrouunrectangleseffectuedelammefaon. Pourralisercetteopration,nousutilisonslafonctionsuivante : Imagerectangle ($img, x1 , y1 , x2 , y2 , couleur ) prsentedelafaonsuivante : Image/image3.php <?php header(Content-type: image/png); $img = imagecreatetruecolor(320,200); $col=imagecolorallocate($img, 255,0,0); imagerectangle($img,10,10,310,180, $col); imagepng($img); imagedestroy($img); ?> pourobtenirlersultatsuivant :

- 4-

ENI Editions - All rights reserved - Algeria Educ

c.Cercle/ellipse
Lareprsentationduneformegomtriquecommeuncercleouuneellipseseffectuedelammefaon. Pourralisercetteopration,nousallonsutiliserlafonctionsuivante : imageellipse (image , position X , position Y, largeur, hauteur , couleur ) prsentedelafaonsuivante : Image/image4.php <?php header(Content-type: image/png); $img = imagecreatetruecolor(320,200); $col=imagecolorallocate($img, 255,0,0); imageellipse($img, 150, 100, 50,50, $col); imagepng($img); imagedestroy($img); ?> pourobtenirlersultatsuivant :

ENI Editions - All rights reserved - Algeria Educ

- 5-

Suivantlalargeuretlahauteurdelaforme,nousobtenonsdesformesdiffrentes.

3.Lescouleurs
Lescouleurspermettentderendreundessinattrayantetpluslisible. Nousutilisonslafonction : Imagecolorallocate() :alloueunecouleurpouruneimage. Dontlasyntaxeestlasuivante : Imagecolorallocate ($image,Rouge, Vert, Bleu) Lesvaleursutilisespourcettefonctionsontdesvaleursdcimalesde1255pourlescouleursrouge,vert,bleu. Ces3couleurssontlescouleursprimairesnumriques.Grceces3 couleursdebase,nousobtenonsdesmillions decouleurs. Pourobtenirlescouleursprincipales,nousmettonsvotredispositionquelquesexemplesutiles : <?php $blanc = ImageColorAllocate ($image, 255, 255, 255); $noir = ImageColorAllocate ($image, 0, 0, 0); $bleu = ImageColorAllocate ($image, 0, 0, 255); $violet= ImageColorAllocate ($image,255,255, 0); $jaune= ImageColorAllocate ($image, 0, 255,255); $vert = ImageColorAllocate ($image, 0, 255, 0); $rouge= ImageColorAllocate ($image, 255, 0, 0); ?> Reprenons les diffrents objets dessins prcdemment pour les remplir dune couleur. Pour cela, utilisons les fonctionssuivantes : Imagefilledrectangle() :dessineunrectanglerempli. Imagefilledeellipse() :dessineuneellipseremplie. Nousallonscreruncerclebleuetuncarrvertdanslemmedessin,cequisetraduitcommececi :

- 6-

ENI Editions - All rights reserved - Algeria Educ

Image/image5.php <?php header(Content-type: image/png); $img = imagecreatetruecolor(320,200); $vert=imagecolorallocate($img, 0,255,0); $bleu=imagecolorallocate($img, 0,0,255); imagefilledrectangle($img,200,150,231,180, $vert); imagefilledellipse($img, 150, 100, 50,50, $bleu); imagepng($img); imagedestroy($img); ?> pourobtenirlersultatsuivant :

4.Letexte
Une image ne contient pas que des objets graphiques, elle peut aussi contenir un texte. Il existe deux mthodes pourafficheruntexte : Imagestring() :dessineunechanehorizontale. Imagettftext() :dessineuntexteavecunepoliceTrueType.

a.Chanehorizontale
Laffichagedunechanedetextedediffrentestaillesseprogrammedelafaonsuivante : Image/image6.php <?php header(Content-type: image/png);
ENI Editions - All rights reserved - Algeria Educ - 7-

$img = imagecreatetruecolor(320,200); $blanc=imagecolorallocate($img, 255,255,255); imagestring($img, 1, 10, 10, "PHP & MySQL - MySQLi - PDO", $blanc); imagestring($img, 2, 10, 50, "PHP & MySQL - MySQLi - PDO", $blanc); imagestring($img, 3, 10, 80, "PHP & MySQL - MySQLi - PDO", $blanc); imagestring($img, 4, 10, 125, "PHP & MySQL - MySQLi - PDO", $blanc); imagestring($img, 5, 10, 180, "PHP & MySQL - MySQLi - PDO", $blanc); imagepng($img); imagedestroy($img); ?> Pourobtenirlersultatsuivant :

Cettefonctionesttrsutilisepourajouterunpetittextesuruneimage.

b.PoliceTrueType
Lutilisation des polices de caractres TrueType est trs rpandue car le format est associ aux fichiers *.TTF disponiblesdanstouslessystmesdexploitation.LespolicesdecaractreslesplusrpanduessontArial,Times, Verbatim,etc.CependantilexistedesmilliersdepoliceslibresdedroitsdisponiblessurleWeb. Cettefonctionseprsentedelafaonsuivante : Imagettftext (image , taille,angle, x, Y,couleur, police TTF, texte) Affichonsuntextedansnotreimage : Image/image7.php <?php header(Content-type: image/png); $img = imagecreatetruecolor(320,200); $blanc=imagecolorallocate($img, 255,255,255); imagettftext($img, 22, 0, 10, 90, $blanc, "Swiss721 BT.TTF", "Les Editions ENI"); imagepng($img); imagedestroy($img); ?>

- 8-

ENI Editions - All rights reserved - Algeria Educ

Nousobtenonslersultatsuivant :

5.Fichierexterne
Lorsquenouscronsuneimage,nousavonslapossibilitdinclureuneautreimagelintrieurdecelleci. Pourralisercetteopration,ilexistelafonctionsuivante : Imagecreatefromjpeg(nom du fichier) NousutiliseronsuneimageJPEGpourobtenirlecodesuivant : Image/image8.php <?php header(Content-type: image/png); $img = imagecreatetruecolor(320,200); $img = imagecreatefromjpeg("elephant.jpg"); imagepng($img); imagedestroy($img); ?> Etobtenonslersultatsuivant :

ENI Editions - All rights reserved - Algeria Educ

- 9-

- 10 -

ENI Editions - All rights reserved - Algeria Educ

Introduction
Dans ce chapitre nous allons aborder plus prcisment le dveloppement de notre application. Les fonctions et concepts de base dtaills dans le chapitre prcdent seront exploits dans les pages suivantes pour aboutir la ralisationdenotreinterfaceavecsesdiffrentesfonctionnalits :
G

lesaccsscurisspourdfinirlesdroitsdesutilisateurs, lagestionducarnetdadresses, lesparamtragesducarnetdadresses, lagestiondesmotsdepasse, lagestiondesadministrateurs.

ENI Editions - All rights reserved - Algeria Educ

- 1-

Connexionuncompte
1.Lidentifiant
CommenouslavonsvudanslechapitreLaprparationdudveloppement,nouspouvonsaccdercertainesparties du site par lintermdiaire dune interface. Lidentifiant permet davoir un filtrage simple mais utile pour accder certainespagesdusiteinternet. Nousallonsrutiliserceprincipepourpermettreunutilisateurdaccderlapartieadministrationdusite(admin) toutengardantlapossibilitpourcemmeutilisateurdebnficiercommetouslesautresutilisateursdelagestion desonproprecarnetdadresses. Danslexemple,nousallonsaccdernotreespaceprivpartirdunformulaire,commeciaprs:

Nousproposonsdansceformulairedeuxchampsremplir :unchampLogin(identifiant)etunchampMotdepasse. Cesdeuxchampssontobligatoiresetpermettrontauvisiteurdaccdersoncompte(sileschampsonttremplis correctement). Si les valeurs ne sont pas bonnes, nous afficherons un message signalant le problme qui se prsentera comme ceci : Fichier identification.php <?php if(isset($_GET[erreur]) && ($_GET[erreur] == "login")) { echo "login ou mot de passe incorrect"; } if(isset($_GET[erreur]) && ($_GET[erreur] == "intru")) { echo "Echec didentification !!!"; } if(isset($_GET[erreur]) && ($_GET[erreur] == "session")) { echo "Session expire"; }

ENI Editions - All rights reserved - Algeria Educ

- 1-

?> Un peu plus loin dans ce chapitre, section Connexion un compte Lemail, le mot de passe, nous ajouteronsunlienpourlecasolevisiteurauraitoublisesidentifiantsafinquilpuisselesrcuprer(nous luiferonsparvenirceslmentssursonadressemailpourtresrsquilsagitdelabonnepersonnequidemande cesidentifiants).

2.Laconnexion
Avantdutilisernotreapplication,rappelonscertainspointsconcernantlecontrledeschamps : Login : lidentifiant saisi va tre gard en ltat, sans aucune conversion part la conversion des caractres au format HTML. Nous raliserons cette manipulation avec la fonction HTMLENTITIES() que nous avons tudie prcdemment. Motdepasse :lemotdepassevatreprotgparlafonctionmd5.Ainsinousallonsenvoyerunevaleurcryptece quipermettradassurerlaconfidentialitauprsdespersonnesquipossdentuncompte. La fonction md5 est une chane de caractres (string) qui utilise un algorithme et retourne un rsultat sur 32 caractreshexadcimaux. Envoiciunpetitexemple. motdepasse/md5.php <?php $exemple="Editions ENI2007"; echo md5($exemple)."<br />"; ?> md5 CalculeleMD5dunechane. Voicilersultatquenousobtenons :

Lorsque le visiteur va se connecter, nous devons effectuer un certain nombre de vrifications avant de pouvoir lui donneraccssoncompte. Nousallonsdabordvrifiersilpossdeuncompte,avectouslescontrlesdescaractresspciauxcommeciaprs. Nousallonsavoirbesoindufichierfct.inc.phpquicontientunefonctionquivanouspermettredegnreruneclefde reprage. login.inc.php <?php include "include/fct.inc.php"; ?> Noustestonssilechampnestpasvideetcontientbienunevaleuravantdecontinuer.Sicenestpaslecas,nous revenonslcranprcdentetnousaffichonsunmessagederreur. Nousutilisonslafonctionmysql_real_escape_string: mysql_real_escape_string
- 2 ENI Editions - All rights reserved - Algeria Educ

ProtgelescaractresspciauxdunechanepourlutiliserdansunerequteSQL. <?php if (isset($_POST[login]) && !empty($_POST[login]) ) { $login=htmlentities($_POST[login], ENT_QUOTES,UTF-8); $login=mysql_real_escape_string($login); $password=htmlentities($_POST[password], ENT_QUOTES,UTF-8); $password=md5($password); $password=mysql_real_escape_string($password); } else { header("Location: identification.php?erreur=login") ; } ?> Maintenant, nous allons vrifier si les caractres saisis sont bien prsents dans la base de donnes. Nous devons avant tout convertir le login pour tre sr quil est compos de caractres HTML pour viter toutes les attaques possibles. Nous allons aussi chiffrer le champ mot de passe car les mots de passe de la base de donnes sont crypts pour viterquelescomptessoientutilisspardespersonnesauxquellesilsnappartiennentpas. <?php $sql="SELECT * FROM user WHERE login=$login AND password=$password "; $req=mysql_query($sql); if(! $req ) echo (Requte invalide : . mysql_error()); if (mysql_num_rows($req)==0) header("Location:identification.php?erreur=login"); ?> Sinousnetrouvonspaslecompte,nousrevenonssurleformulairedauthentificationensignalantleproblme. Sinousavonstrouvlecomptedanslabasededonnes,nousmodifionslaclefderepragequinouspermetdtre certainsdidentifierlabonnepersonnelorsdesdiffrentesmanipulationsetnavigationsdanslesiteInternet.Nous enregistreronsenmmetempsladatedepassagequipeutnoustreutilepourplustard. <?php $idclef=recup_clef(); $date=DATE("Y-m-d"); $sql="UPDATE user SET idclef=$idclef,date_lastpass=$date WHERE login=$login AND password=$password "; $query = mysql_query($sql) OR die("Mise jour de la cl impossible : <br />". mysql_error()); ?> Laclefestdtermineparunappellafonctionrecup_clef()quenousavonsvuedanslapartieprcdente.Cette clefchangetoutletempspermettantainsidenepasavoirdedoublondansnotresiteInternet. Aprs avoir effectu les vrifications dusage, nous chargeons quelques informations que nous plaons dans une variableSESSION. <?php $sql="SELECT * FROM user WHERE login=$login AND password=$password AND idclef=$idclef "; $req=mysql_query($sql); if(! $req ) echo (Requte invalide : . mysql_error()); $row = mysql_fetch_object($req); if (mysql_num_rows($req)!=0) { session_start(); $_SESSION[login] = $row->login; $_SESSION[idclef] = $row->idclef; $_SESSION[niveau] = $row->niveau; $_SESSION[ip] = $_SERVER[REMOTE_ADDR]; $_SESSION[iduser] = $row->id; $destination=$row->page; header("Location:$destination");

ENI Editions - All rights reserved - Algeria Educ

- 3-

} else { header("Location:identification.php?erreur=intru"); } ?> Silapersonneestcorrectementidentifie,nousallonsluipermettredecontinuerenaccdantlapartiecompltedu menu. Nous en profitons pour enregistrer la clef, ladresse de lordinateur (IP de la machine), lidentifiant, et son niveau daccs. Ainsi, nous viterons de faire appel la base de donnes chaque changement de page. Pour plus de dtailsconcernantleschoixdeslmentsmmoriss :
G

Clef :laclefserachangechaqueconnexion. Adressedelamachine :noussommessrsquilsagitdummeordinateurconnectlorsdeschangements depagesetdenavigation. NiveaudAccs :nousavonsprvudeuxniveaux :unniveaupourlesutilisateurs (user)etunautrepourle ou les administrateurs (admin). Les possesseurs du niveau admin auront accs aux mmes menus que les utilisateursetpossderontunmenusupplmentairepourgrerlesaccsdescomptesutilisateurs.

Pouraccderaumenucompletduncompte,nousallonsaccderlapageparlintermdiairedelafonctionheader. CettefonctionpermetdespcifierunnouvelenttehttplorsdelenvoidesfichiersHTML. Grcecettefonction,nousvitonsquelapersonnepossdantuncomptevalideplusieursfoissonchoix.

3.Lemail,lemotdepasse
LaplupartdessitesInternetquipossdentdesidentifiantsetdesmotsdepassepouraccderuncomptepriv proposentderecevoircesidentifiantsparemailencasdeperte. EnPHP,lafontionmail()permetdenvoyerunemail.Elleprendenargumentundestinataire,unobjetetuncorpsde message. Exemple: mail/ex1.php <?php $destinataire = "email@votresite.com"; $objet = "1er exemple" ; $message = "Un petit message pour notre 1er exemple \n" ; $message .= "avec fonction mail() \n"; if ( mail($destinataire, $objet, $message) ) echo "Envoi du mail russi."; else echo "Echec de lenvoi du mail."; ?> Biensrlafonctionnalitdebaseestassezlimite.Nousallonslafairevoluerenluiajoutantunemaildexpditeur pourpermettredespcifierunerponseetnousobtenonsceci : mail/ex2.php <?php $emailexp="mail@votreemail.com"; $emaildest="email@destinataire.com"; $mailmessage = "Un petit message pour notre 2eme exemple \n" ; $mailmessage .= "avec fonction mail() \n"; $titre="test email simple"; if (mail ("$emaildest","$titre","$mailmessage","From: $emailexp")) echo "Envoi du mail russi."; else

- 4-

ENI Editions - All rights reserved - Algeria Educ

echo "Echec de lenvoi du mail."; ?> Nousavonsralislenvoidunemailauformattexte.Biensr,nouspouvonsincorporerdanslecorpsdelemailun messageauformatHTMLcommececi: mail/ex3.php <?php $emailexp="mail@votreemail.com"; $emaildest="email@destinataire.com"; $mailmessage = "<html><body>"; $mailmessage .= "Les <h1>Editions ENI</h1>" ; $mailmessage .= "vous remercie davoir utilis ce 3eme exemple <br>" ; $mailmessage .= "avec la fonction <b>mail()</b> au format HTML <br>"; $mailmessage .= "</body></html>"; $titre="test email au format HTML"; if (mail ("$emaildest","$titre","$mailmessage","From: $emailexp")) echo "Envoi du mail russi."; else echo "Echec de lenvoi du mail."; ?> Par contre, si vous voluez dans un environnement Windows et que vous utilisez cette fonction sur votre serveur localhost,ilestncessairedeffectuerunepetitemanipulationdanslefichierphp.ini. IlfautactiverleslignesSMTPetsendmail_form.Pourcela,ilfautjusteenleverle audbutdelaligne.Depuisla version1.7deWampserver,toutseffectueraautomatiquement. Concernant notre application, pour envoyer un email avec les codes daccs du visiteur, nous allons tout dabord passerparlintermdiairedunformulairedesaisiecommececi :

Aprs la saisie de lemail par le visiteur, nous devons effectuer quelques tests pour pouvoir envoyer les codes daccsverscetteadresse. Nousallonstoutdabordvrifiersilechampemailestbienremplietnestpasvidepourcontinuerlaprparationde lenvoi : pass_oublie.php <?php require ("head.inc.php"); if (isset($_POST[action])||!empty($_POST[action])) $action = $_POST[action]; ?> Nous allons ensuite vrifier que cest bien le bouton Confirmer de notre formulaire qui a t utilis. Grce cela, nousallonsconvertirlasaisieencaractresHTML,cequivanouspermettrederecherchersilemailestprsentdans labasededonnes. Aveccettetapeintermdiairenousvitonslesrisquesdeblocagesetdeprisesdecontrlesmalveillantes. <?php switch($action) {

ENI Editions - All rights reserved - Algeria Educ

- 5-

case "Confirmer": $emaildest=htmlentities($_POST[email"]); $sql="select * from user where email=$emaildest "; $valeur=mysql_query($sql); if( ! $valeur ) die ("Probleme de requete : " . mysql_error()); if (!mysql_num_rows($valeur)) { require_once "head.inc.php"; echo "Cet Email nexiste pas dans nos comptes, Merci de recommencer<br>"; echo "<a href= ".$_SERVER[PHP_SELF]." class=links> Cliquer ici</a>"; include "footer.inc.php"; exit; } ... { ?> Aprsavoirvrifilaprsencedelemaildanslabasededonnes,nousallonsrgnrerlemotdepasse.Eneffet, le mot de passe actuel tant crypt avec la fonction MD5 personne ne peut en connatre la valeur, le seul moyen consisterecrerlemotdepasse.Nousallonsdoncfaireappelunefonctionquivagnrerunmotdepasse.Dans le choix des caractres nous allons viter ceux qui peuvent porter confusion (entre les chiffres et les lettres par exemple). Nousallonsattribuerunmotdepassecomprenant8caractres,maisilesttoujourspossibledespcifierunechane decaractrespluslongue.Nousallonsutiliserleprincipedunerecherchedechanedecaractresparrapportun nombrealatoire. <?php function creation_password() { $alphabet = "abcdefghjkmnpqrstuvwxyz"; $alphabet .= "ABCDEFGHJKMNPQRSTUVWXYZ"; $alphabet .= "23456789"; $nbcara = 8; $i = 0; $pass = ""; srand((double)microtime()*1000000); while ($i<$nbcara) { $valcara = rand(0, strlen($alphabet)); $pass .= substr("$alphabet",$valcara,1); $i++; } return $pass; } ?> Lorsquelenouveaumotdepasseestcr,nousallonslenregistrerenleprotgeantdenouveau : <?php $row=mysql_fetch_object( $valeur); $login=$row->login; $mot_de_passe=creation_password(); $sql = "UPDATE user SET password=".MD5($mot_de_passe)." WHERE email=$emaildest "; $qid = mysql_query($sql); if (!$qid) die(Requte invalide : . mysql_error()); ?> Laderniretapevatrelaconfectionetlenvoidemail : <?php $emailexp="votresite@hello-design.fr"; $titre="Votre mot de passe";

- 6-

ENI Editions - All rights reserved - Algeria Educ

$mailmessage="Bonjour,\n Vous avez demand vos codes daccs pour le site .. : \n\n\n"; $mailmessage.=" Identifiant : ".$login."\n"; $mailmessage.=" Mot de passe : $mot_de_passe\n\n"; $mailmessage.="Pour information, il vous a t attribue un nouveau mot de passe, le prcdent est perdu\n"; if (mail ("$emaildest","$titre","$mailmessage","From: $emailexp")) { echo "<br>Un email vous a t envoy<br>"; echo "<a href=identification.php class=links>Suite</a>"; exit; } else { echo "Echec de lenvoi du mail <br>"; echo "<a href= ".$_SERVER[PHP_SELF]." class=links>Cliquer ici</a>"; exit; } } break; default: break; } ?> Lemail est envoy automatiquement et le visiteur reoit les nouveaux codes daccs dans sa messagerie. Il peut maintenantseconnectersoncompte.

4.Lasession
Lessessionsmmorisentcertainslmentsdidentificationlorsdelasaisiedescodesdidentification.Unefoisdansla partieprivedusite,nousallonseffectuerlavrificationetlecontrledecesvaleursdesessionspourtrecertainde retrouverlabonnepersonnepageaprspage. CestestsdoiventtreeffectuspourchaquepageInternetdusite.Pourcela,nousallonsutiliserunfichiercommun config.inc.php.Cefichiervasedcomposerenplusieursparties. Nouscronsunesession : <?php session_start(); ?> Nousvrifionssilasessionpossdantlhorairedudernierpassagenapastdtruite.Sicestlecas,nousrecrons unnumrodesession,etrenregistronslheuredepassage,laduredesessionetladressedelordinateur.Sice nestpaslecas,nousmmorisonslanouvelleheuredesonpassage. <?php if (!isset($_SESSION[dernier_passage]) ) { session_regenerate_id(); $_SESSION[dernier_passage]=time(); $_SESSION[duree]=$duree_session; $_SESSION[ip] = $_SERVER[REMOTE_ADDR]; } else { $_SESSION[dernier_passage]=time(); } ?> Ensuitenousvrifionssilaclefdereprageducompteexistetoujours.Sicenestpaslecas,nousnesommesplus capablesdesavoirquiestconnect nousredirigeonsdonclevisiteurverslapageindexdusite. if (!isset($_SESSION[idclef]) { header("Location:index.php"); } )

ENI Editions - All rights reserved - Algeria Educ

- 7-

NousdevonseffectuerunnouveautestconcernantladuredeprsencesurlapageInternet.Nouseffectuonsun test sur la dure de non utilisation du navigateur. Si le visiteur na gnr aucune activit sur le site pendant la priodedfinie,nousallonslerenvoyerverslapagedesaisiedesparamtresdidentification.Siunchangementde pageateffectupendantladureprvue,nousallonsenregistrerlheuredaffichagedecettenouvellepage. if (time()-$_SESSION[dernier_passage]>$_SESSION[duree]) { header("Location:identification.php?erreur=session"); } else { $_SESSION[dernier_passage] = time() ; } ?> Nousavonseffectulesprincipauxtestssurlutilisationdessessionspournotreapplication.Maisilsnesarrtentpas l,nousallonsaussieffectueruntestdeladressemachine.

5.Ladressemachine
Nous effectuerons une petite validation supplmentaire avant dautoriserlaffichagedelapagedemande.Ilsagit dereprerladresseIPdelamachine,cequivanouspermettredesuivrelanavigationduvisiteur. Nous mmoriserons ladresse de la machine dans une variable de session, ainsi lorsque le visiteur va changer de page,nouspourronsvrifierquilsagittoujourslammepersonne. <?php if($_SERVER[REMOTE_ADDR] != $_SESSION[ip]) { header("Location:identification.php?erreur=session"); } ?> Sinousremarquonsqueladresseachang,nousrenvoyonslevisiteursurlapagedidentificationpourquilretape sescodesdaccs.

- 8-

ENI Editions - All rights reserved - Algeria Educ

Menu
1.Affichage
Afficherlemenuestncessairepourpermettrelanavigationsurlesiteinternet.Parcontrenousdevonstrecertains dautorisercettenavigationseulementsilevisiteursestbienidentifi. Letestdevrificationvaseffectuerdelafaonsuivante : <?php if (!isset($_SESSION[dernier_passage]) || empty($_SESSION[idclef]) || (time()-$_SESSION[dernier_passage]>$_SESSION[duree]) ) { ?> <a href=identification.php class=links>Identification</a><br> <?php } else { ?> <a href=compte.php class=links>Votre compte</a><br> Notre test de contrle consiste vrifier que le dernier passage existe, que nous possdons dj une clef identification et que la session a t ouverte dans le temps qui lui a t imparti. Si lune des valeurs nest pas correcte, le visiteur sera oblig de sidentifier. Si tout sest correctement droul, nous pouvons afficher le menu gnralavectoutessesoptions.

2.Contenu
Nousallonsproposerauvisiteurleschoixsuivants:
G

crationderubriques, saisiedepersonnesdanssoncarnetdadresses, et,suivantsonniveaudaccs,administrationdescomptesdesvisiteurs.

Pour rendre lapplication plus intressante, nous allons proposer dautres choix au visiteur qui peuvent tre considrscommedessousmenus.LessousmenusserontgrspardespagesInternetquiserontaffiches. Avantdafficherlesoptionsdumenuauxquelleslevisiteuradroit,ilfautvrifierquelaclefdidentification(gnre commenouslavonsvuauparavant)esttoujoursbienprsente. <?php if (empty ($_SESSION[idclef])) { ?> <a href=identification.php>Identification</a><br> <?php } else { ?> <a href=compte.php>Votre compte</a><br> Lexemple montre que si la clef est absente de la session, nous proposons une nouvelle identification. Si elle est prsente,nousaffichonsquelquesinformationsensouhaitantlabienvenueauvisiteur. Pourafficherlebonmenuenfonctiondelanavigationduvisiteur,nousallonsmettreenplaceplusieursfiltres.Dans chaquepagenousallonsspcifierlemenuconcern. Parexemple,pourallerdanslemenucarnet,nousallonsplacercerepredansunevariable. <?php $menu="carnet"; ?> Comme ceci quand nous affichons le menu et quil dtecte que nous sommes dans la partie carnet, lapplication affichelecarnetetlessousmenuslisceluici. <a href=rubrique.php>Les rubriques</a><br> <?php if ($menu=="carnet") { ?> <a href=rubrique-add.php>Ajout</a><br> <a href=rubrique-view.php>Consult/Modif</a><br> <?php } ?> LetitreRubriquesseratoujoursaffich.Parcontrelesousmenuneseraaffichquesilevisiteurslectionnecette partie,grceaucritreinsraudbutdechaquepageInternet.
ENI Editions - All rights reserved - Algeria Educ - 1-

Concernantlesaccsauxpartiesuniquementdestinesauxpersonnesdotesduniveauadministrateur,nousallons compareravecleniveaudelasessionpourlesafficheroupas. <?php if ($_SESSION[niveau]=="admin") { ?> <a href=admin.php>Administration</a><br> <?php if ($menu=="admin") { ?> <a href=admin-add.php>Ajout</a><br> <a href=admin-view.php>Consult/Modif</a><br> <?php } ?> Concernantlagestiondessousmenusvoicilersultatquenousobtenonssinousavonsslectionnlecarnet :

3.Description
Lemenuprsentedenombreuseslignes,cequicorrespondunsommaire.Chaquelmentdumenuproposedes pagesdiffrentes. *Accueil CettepagecorrespondlapremirepagequenousvoyonslorsquenousarrivonssurlesiteInternet. *Identification/Votrecompte Cetlmentproposedeuxchoix :
G

Silevisiteurnestpasidentifi,ilauralapossibilitdesaisirsesidentifiants. Silevisiteurestidentifi,nousaffichonslesinformationsquenousavonsennotrepossession :
G

sonlogin lemotdepassemasqu(personnepartluineleconnais).Ilpourramodifiersonmotdepassesille souhaite sonemail


ENI Editions - All rights reserved - Algeria Educ

- 2-

ladatedecrationdesoncompte

*Rubriques Lutilisateuralapossibilitdechoisirdesrubriquesdeclassementpoursesadressesetaussidelespersonnaliser. *Votrecarnet Le carnet correspond un carnet dadresses classique mais informatis. Pour chaque contact enregistr dans le carnet,ilserapossibledinscriredesinformationssupplmentairesleconcernant. Parexemple:sonnom,prnom,adresse,email,tlphone,etc. *Administration Cemenuestrservauxpersonnesquipossdentleniveauadmin.Ilpermetdegrerlescomptesdesutilisateurs. *Exportation Lexportationproposediffrentschoixpourextrairelesdonnesdestinationdautreslogicielsouapplications. *Dconnexion La dconnexion correspond la fin des manipulations dans le carnet dadresses. Elle ferme la session et renvoie directementlaccueil.Lutilisateurredevientunvisiteuranonyme. *Contact CettepagepermetdobtenirquelquesinformationssurlaoulespersonnesquiontralislesiteInternet.

ENI Editions - All rights reserved - Algeria Educ

- 3-

Lagestiondesrubriques
Nousallonsdanscettesectionpermettrechaquetitulaireduncomptedepouvoirpersonnalisersesrubriques,pour les utiliser par la suite et les incorporer automatiquement pour un usage personnel sans que les autres utilisateurs puissentlesconnatre. CettesectionseraconstruiteetdtailleavecunebasededonnesMySQL. Pourinformation,cettesectionestgalementdisponibleaveclesformatsMySQLietPDO,entlchargement surlesitedelditeur.

Quelques explications sont ncessaires propos de cet cran : comme la plupart des applications bureautiques disponiblessurlemarch,lapartieconfigurationducompteproposelatotalitdelagestionsurunseulcran. Nous allons utiliser cette approche en donnant la possibilit dajouter, de modifier, dditer ou de supprimer une rubrique,enutilisant$_POSTpourenvoyerlesdonnes.

1.Ajouterunerubrique
Lesrubriquesquivonttreajoutesdansuncomptevontpermettreparexempledeclassercertainesinformations parthme. La partie Ajouter se trouve sur la moiti droite de lcran. Nous avons une zone de texte qui va permettre lutilisateurdesaisirsesrubriquesfavoritesetdelesajouter. Aprsconfirmationdelasaisie,nousdevonseffectuercertainstestspourenvrifierlavalidit: rubrique.php <?php if ( empty($frm[nom]) ) { echo "Le champ est vide"; } elseif ($_SESSION[ip] != $_SERVER[REMOTE_ADDR] || $_POST[idclef] != $_SESSION[idclef])
ENI Editions - All rights reserved - Algeria Educ - 1-

{ echo "Tentative de pntration"; } else { $sql = "INSERT INTO rubrique (iduser, nom) VALUES ( ".$_SESSION[iduser]." ,".htmlentities($frm[nom], ENT_QUOTES)." )"; $qid = mysql_query($sql); if (!$qid) die(Requte invalide : . mysql_error()); } ?> Pourincorporercettenouvellerubriquedanslabasededonnes,noustestonsdjsilechampestbienrempli.Sans cetest,nousrisquonsdenousretrouveravecunchampvidedanslatablerubriquecequipeuttretrsgnant. Nouseffectuonsensuiteunpetittestsupplmentairequinestpasvraimentobligatoirepuisquilestdjprsent louverturedelapageavecletestdessessions.MaistantdonnquilsagitdesRubriquesduncarnetdadresses,il vaut mieux effectuer un test supplmentaire pour tre tranquille. Nous allons vrifier que cest toujours le mme ordinateurquieffectuelamanipulationetquelaclefdesessionesttoujoursidentique. Aprscestests,nouspouvonsinsrerlecontenudelasaisiedanslatablerubrique. Latablerubriquepossdedeuxchamps :
G

Lechampiduser :permetdemmoriserlidentifiantdelutilisateur.Cettevaleurvientdelasession. Le champ nom : nous allons convertir le contenu en caractres HTML (avec la conversion des caractres spciaux)pourtrecertainquenousnauronspasdeproblmeslorsdelaffichagedeslistesdanslesautres cransdelapplication.

2.Visualiserlesrubriques
Quellequesoitlamanipulationquenousallonseffectuerdanscettesection,nousdevonspouvoirconsulterlaliste denosrubriques.Cettelisteestpersonnelleetneserapasconsultableparlesautrestitulairesduncomptesurle site. Pourconstruirecettelistenousallonsfaireappellexcutiondunerequtecommecelleci : rubrique.php <?php $sql="SELECT rubrique.id as idselect,rubrique.iduser,rubrique.nom,user.id FROM rubrique, user WHERE rubrique.iduser=user.id AND rubrique.iduser=".$_SESSION[iduser]." AND user.idclef=".$_SESSION[idclef]." "; $qid=mysql_query($sql); if (!$qid) die(Requte invalide : . mysql_error()); ?> Dansunsoucidescurit,nouseffectuonsuneconnexionlatablerubriqueaveclatabledesutilisateurspourtre certainsquilnyapaseudepertesoudemodificationsdelutilisateur. Nous allons aussi dtecter si nous avons bien des donnes avec la fonction mysql_num_rows qui nous permet de savoirsinousavonsaumoinsuneinformationafficher. < ?php if (mysql_num_rows($qid)!=0) { ?> Sicestlecas,nousconstruisonsuntableauHTMLclassiquesansbordurepourrendrelesalignementsverticauxplus facile.Nousaffichonstroiscolonnes :
G

unecolonneRubrique,

- 2-

ENI Editions - All rights reserved - Algeria Educ

unecolonnedition, unecolonnesuppression.

La colonne Rubrique contient le rsultat de la requte. Les deux autres colonnes vont tre utiles pour modifier et supprimerchacunedeslignesdelalistequiseraaffiche,ellesvonttretudiesdanslespagesquisuivent. echo "<td><b>Rubrique(s) Disponible(s)</b><br>"; echo "<table>"; while( $row=mysql_fetch_object( $qid) ) { echo "<tr>"; echo "<td>".stripslashes($row->nom)."</td>"; echo "<td><ahref=".$_SERVER[PHP_SELF]."?id=$row->idselect class=links>Edit</a></td>"; echo "<td>"; echo "<a "; echo "onClick=\"Javascript:return confirm(tes-vous sr de vouloir enlever cette ligne ?);\" "; echo "href=".$_SERVER[PHP_SELF]."?id=".$row->idselect."&choix=trash"; echo " class=links>Supp</a>"; echo "</td>"; echo "</tr>"; } echo "</table>"; echo "</td>"; } else { echo "Aucune rubrique disponible"; } ?>

3.diterunerubrique
LelienEditvanousoffrirplusieurspossibilits :
G

corrigerlenomdelarubrique, changerlenomdelarubrique.

Pour pouvoir effectuer ces manipulations, nous devons procder en plusieurs tapes : une pour la partie visible et unepourletraitementetlamisejourdelabasededonnes. Voicilaprsentationdelcran :

ENI Editions - All rights reserved - Algeria Educ

- 3-

Pourmodifieruneligne,nouscronsunliendynamiqueetnousslectionnonslalignedsiregrcecelienquise prsenteracommececi : < ?php echo "<a href=".$_SERVER[PHP_SELF]."?id=$row->idselect class=links>Edit</a>"; ?> Linstructionsedcomposeainsi : $_SERVER[PHP_SELF] Recopielenomdelapagepourleliendynamique. id Mmoriselenumrodelaligneaffiche,cestdirelenumrodelaligne. Lorsquelutilisateuractivelelien,lapageInternetserechargeavecdenouveauxparamtres,permettantainside modifiersaprsentation. Nousgardonslamoitigauchedelcran(laffichagedelalistedesrubriques)sansmodifications.Cequivachanger concernelamoitidroitecarnousnoustrouvonssurunepagedemisejour. Avant dafficher la valeur dans le formulaire, nous devons vrifier que le paramtre id possde bien une valeur et quellenestpasvide. <?php $id=verif_GetPost($_GET[id]); ?> Cetteinstructionappelleunefonctionpourvrifiercertainscritres.Dansunsoucidefficacit,nousavonschoiside crerunefonction,ainsinouspourronsyfaireappelpourtesteretcontrlerlaprovenancedecertainesvaleurs.La fonctionseprsentecommececi : <?php function verif_GetPost($clef=) { if ( empty($clef) && isset($clef) ) return false;

- 4-

ENI Editions - All rights reserved - Algeria Educ

elseif (strlen($clef)<1) return false; $clef=htmlentities($clef, ENT_QUOTES,UTF-8); return $clef; } ?> Lafonctionvarcuprerlavaleurduchampquenousenvoyons parGETouparPOST.Noustestonssilechampnest pasvideounuletvrifionssinousavonsaumoinsuncaractre.Nousenprofitonspourleconvertirauformatde caractresHTMLetnousrenvoyonslersultatpourpermettredecontinuerlebondroulementdelapplication. Aprs cette petite vrification, nous pouvons excuter la mme requte que pour afficher la liste des rubriques disponiblesmaisnousinsronsuncritreenplus,lavaleurduparamtre id quenousvenonsdetester,pourpouvoir afficherlalignechoisieparlevisiteur. Bien sr, nous avons converti cette valeur en caractre html pour tre certain de ne pas avoir subi une attaque malveillanteetsurtoutnonsouhaite. <?php $id=htmlentities($id); $sql="SELECT rubrique.id as idselect,rubrique.iduser,rubrique.nom,user.id FROM rubrique, user WHERE rubrique.iduser=user.id AND rubrique.iduser=".$_SESSION[iduser]." AND user.idclef=".$_SESSION[idclef]." AND rubrique.id=$id ORDER BY rubrique.nom "; $req=mysql_query($sql); if (!$req) die(Requte invalide : . mysql_error()); $row=mysql_fetch_object( $req); ?> <input name="id" type="hidden" value=<?php echo $id;?> ><br> <input type="text" name="nom" value="<?php echo stripslashes($row->nom); ?>"><br> <input type="submit" name="action" value="Mise A Jour"> Maintenantquenousavonsaffichlavaleurdelarubriqueslectionne,lutilisateurpourraeffectuerlescorrections dsires.Nousenprofitonspourenregistrerlavaleuriddansunchampcachquinousserautilepourlamisejour delatable. Pour sauvegarder les modifications, lutilisateur clique sur le bouton Mise A jour ce qui dclenche un processus intermdiaireavantlamisejourdelatable. <?php $frm = $_POST; if ( empty($frm[nom]) ) { echo "Le champ est vide"; } elseif ($_SESSION[ip] != $_SERVER[REMOTE_ADDR ] || $_POST[idclef] != $_SESSION[idclef]) { echo "Tentative de pntration"; } else { $sql="UPDATE rubrique SET nom = ".htmlentities($frm[nom ], ENT_QUOTES)." where id=".htmlentities($frm[id ])." AND iduser=".$_SESSION[iduser]." "; $qid = mysql_query($sql); if (!$qid) die(Requte invalide : . mysql_error()); } ?> Nousvrifionsquelechampnapasteffacetquecesttoujourslammepersonnequieffectuelamodification aveclemmecomptedaccs. Nousappliquonslorsdelamisejourdelatable,laconversiondescaractresencaractresHTML. tantdonnquetoutescesoprationssonteffectuessurlammepageInternet,nousnavonspasbesoindtre redirigverslapagepourvisualiserlecontenudelalistedesrubriques.Celaseffectueautomatiquement.

ENI Editions - All rights reserved - Algeria Educ

- 5-

4.Supprimerunerubrique
Poursupprimerunerubrique,nousutilisonslemmeprincipequepourlelien Edit:partirdelalistedesrubriques quenousaffichonsnouspouvonsslectionnerunedeslignesetcliquersurunlienquivapermettredelasupprimer. Poursupprimercetteligne,nouscronsunliendynamiqueintitulSuppsurlequellutilisateurcliquera : < ?php echo "<a onClick=\"Javascript:return confirm(tes-vous sr de vouloir enlever cette ligne ?);\" href=".$_SERVER[PHP_SELF]."?id=".$row->idselect."&choix= trash class=links>Supp</a>"; ?> Linstructionsedcomposecommececi: $_SERVER[PHP_SELF] Recopielenomdelapagepourleliendynamique. id Mmoriselenumrodelaligneaffiche. choix Uncritreaveclavaleurtrashquicorrespondlacorbeille(suppression). Avant de lancer la suppression de la ligne choisie, nous allons en demander la confirmation en utilisant JavaScript. Lavantagedecetteapprocheestdepouvoirannulerlechoix. Silevisiteurconfirmelasuppression,nousvrifionsquelarubriqueslectionnenestpasutilisedanssoncarnet dadresses.Danscecaseneffet,ceseraitdommagedelasupprimer. <?php $sql="SELECT carnet_details.idcarnet, carnet_details.idcarnet,carnet.iduser, carnet.id FROM carnet_details ,carnet WHERE carnet_details.idcarnet=carnet.id AND carnet.iduser=".$_SESSION[iduser]." AND carnet_details.idrubrique=$id "; $qid=mysql_query($sql); if (mysql_num_rows($qid)) echo "Impossible effacer la ligne"; ?> Danscetterequte,nousfaisonsunejointureentredeuxtablespuisquelunecontientlenumroduvisiteur(iduser), pourviterdesupprimerquelquechosequineluiappartientpas. Si la rubrique (insrer :) supprimer nest pas utilise, nous allons passer par une autre tape intermdiaire qui consistedemanderauvisiteurderetapersonmotdepassepourtrecertainquilsagitdubonutilisateur.Cette tapenestpasobligatoirepournotreapplicationmaisellefortementconseillepouruneapplicationquisetrouve surInternetavecbeaucoupdepersonnesquipeuventseconnecter. Nousaffichonsuncrandesaisie :

- 6-

ENI Editions - All rights reserved - Algeria Educ

Nouspouvonseffectuerunedernirevrificationpourtresrsquelemotdepasseestcorrect.Nousrecherchonsla prsencedumotdepasseaveclaclefdesessionetlaclefinsredanslechampcachduformulaire. <?php $sql="SELECT * FROM user WHERE password = ".MD5($frm[pass])." AND idclef=".$_SESSION[idclef]." AND idclef=".$frm[idclef]." "; $qid=mysql_query($sql); if (!mysql_num_rows($qid)) die ("Erreur dans votre mot de passe"); ?> Commenousavonstoutvrifietquelestestsonttoustconcluants,nouspouvonseffacerlarubriquequiat slectionne. <?php $sql="DELETE FROM rubrique WHERE rubrique.id = ".$frm[id]." AND rubrique.iduser = ".$_SESSION[iduser]." ; $qid = mysql_query($sql); if (!$qid) die(Requte invalide : . mysql_error()); } ?> Nousaffichonsdenouveaulalistedesrubriquesquirestentdanslabasededonnes,permettantainsidecontinuer lesmanipulations.

ENI Editions - All rights reserved - Algeria Educ

- 7-

Lagestionducarnetdadresses
1.Prsentation
Nousallonsdanscettepartievoircommentremplirunefiche(ouuncontact)danslecarnetdadresses.Nousdevons procderendiffrentestapes:
G

effectuerlescontrlesncessaires, rendreobligatoirescertainschamps, excuterunerequtevolueenMySQLi.

Aprsavoirremplilaficheprincipale,nousallonsmettreenplacedenouvellesfonctionnalitscommeunblocnoteo nous pourons insrer diffrentes informations concernant la personne, par exemple : site Internet, blog, tchat, e mail... Pour information, cette partie est galement disponible pour les formats MySQL et PDO en tlchargement surlesitedelditeur. NousallonsinscrirelechampNomenmajusculesetlechampPrnomavecjustelapremirelettreenmajusculeetle resteenminuscules.

2.Ajouteruncontact
Pourcommencer,nousralisonsunformulairedesaisie,commeciaprs :

ENI Editions - All rights reserved - Algeria Educ

- 1-

Leformulairesecomposededeuxparties :
G

unepartieconcernantlescoordonnes, unepartieinformationssupplmentaires.

Concernantlapremirepartie,nousytrouvonsdiffrenteszonessaisir :
G

Genre :Madame,Monsieur,Mademoiselle Nom :lenomducontact Prnom :leprnomducontact Adresse :sonadresseaveclecodepostaletlaville Email :sonemail Tlphone :sontlphone Photo :lapossibilitdemettreunephoto.

Nousallonsrendreobligatoireslasaisieduprnometdelemail,cestdirequesicesdeuxchampsnesontpas

- 2-

ENI Editions - All rights reserved - Algeria Educ

remplis lors de la validation du formulaire, nous allons rafficher les informations dj inscrites dans les zones correctesensignalantlobligationderemplirceschamps. Concernantladeuximepartie,nousnavonsquedeuxzones :
G

larubrique observations.

Lalistedesrubriquesseraremplieautomatiquementpartirdesinformationsquenousavonsenregistreslaide dumenuRubriques. LazoneObservationspermettradesaisiruneinformationouuncommentairesurlarubrique.

a.Premirepartiedelasaisie
CettepartieduformulairecorrespondunformulaireHTMLclassique.Ilestimportantdesignalerquelquespoints: nous allons faire voluer la balise <select></select> (format HTML) qui correspond une liste droulante, en recherchantautomatiquementlabonnelignequiseraaffiche,cestdiremarqueSELECTED. LabaliseHTMLsedcomposecommececi : <select> <option></option> </select> Lutilisation de cette balise avec le langage PHP est trs simple, et nous allons utiliser une petite fonction pour viterdetapertoutesleslignes : <?php echo "<select name=\"genre\">"; echo ligne_selected(" ","-1",$frm[genre]); echo ligne_selected("Monsieur","Monsieur",$frm[genre]); echo ligne_selected("Madame","Madame",$frm[genre]); echo ligne_selected("Mademoiselle","Mademoiselle",$frm[genre]); echo "</select>"; ?> Lorsdelaffichageduneligne,nousenvoyonstroisparamtreslafonction :
G

Valeur=valeurquenousallonsretourner($value) Nom=Lemotafficher,iciilsagitdugenre($nom) Valeurextrieure=dterminesiloptionestSELECTED($entree).

Grcecela,nousallonspouvoirconstruireleslignesoptionsdontnousavonsbesoin : function ligne_selected($nom,$value,$entree) { $resultat="<option value=".$value." ; if ($value==$entree) $resultat .= " SELECTED "; $resultat .= ">".$nom."</option>"; return $resultat; } Lavantagedecettetechniqueestdallger le nombre de lignes mais aussi de permettre la programmation semi automatique,doncdobtenirungaindetempsetmoinsderisquesderreurs. Lautre particularit du formulaire correspond aux champs obligatoires. La gestion des champs obligatoires va stablir de la faon suivante : nous allons tester les lignes signales par une toile car ce sont des champs obligatoires. Si un problme apparat, nous stockerons dans un tableau le ou les messages derreur pour les afficherenuneseulefois. Pour mmoire : cette technique a t tudie dans le chapitre La prparation du dveloppement Le contrledesformulaires.

ENI Editions - All rights reserved - Algeria Educ

- 3-

b.Deuximepartiedelasaisie
Cettepartieduformulairenecomportepasdechampsobligatoires,carcesinformationspeuventtreajoutesplus tard en ditant la fiche. La zone Rubrique se prsente sous la forme dune liste droulante. Cette liste est une numration de donnes, mais ici cest lutilisateur du compte qui va la remplir sans que nous lui imposions des choix. Cette liste est alimente partir des rubriques saisies dans la section Rubriques de lapplication qui a t tudiedanscechapitre,sectionLagestiondesrubriques. Pourconstruirelalistedroulante,nousallonsutiliserlersultatdunerequte,maisaulieudelafficherauformat HTML,nousallonsafficherlersultatdynamiquementpartirdursultatdelarequtequenousvenonsdexcuter. <?php echo "<select name=\"idrubrique\">"; echo ligne_selected(" ","-1",""); $sql="SELECT id,iduser,nom FROM rubrique WHERE iduser=".$_SESSION[iduser]." ORDER BY nom"; $rubrique=mysqli_query($connex,$sql); if (!$rubrique) die(Requte invalide : . mysqli_error($connex)); if (mysqli_num_rows($rubrique)!=0) { while( $list=mysqli_fetch_object( $rubrique) ) { echo ligne_selected($list->nom,$list->id,); } } echo "</select>"; ?> Pourafficherlechoixdelalignequiatretenu,nousallonsappelerlafonction ligne_selecteddontnousavons parl prcdemment pour permettre dafficher la bonne ligne. Mais ici, elle sera toujours vide car il sagit dune nouvellesaisie. LazoneObservationsestunchampdesplusclassiques,doncaucunemanipulationneseraeffectueactuellement dessus.

c.Contrleduformulaire
Lecontrleduformulaireconsisteeffectuerquelquestestsparlintermdiairedunefonction.Silestestspassent touscorrectement,nousenregistreronsdanslabasededonneslesdonnesquionttsaisies. Dans notre fonction, nous allons tre amens nous connecter la base de donnes. Une fonction tant un programme spar du reste de lapplication, pour effectuer le test nous devons signaler que nous avons besoin dutiliserlaconnexionavecleserveurlaidedecettefonction : Global Permetdutiliserdesvariablesgnralesprovenantdusiteproprementdit. <?php function valide_form(&$frm, &$erreurs) { Global $connex; ?> Leserreursserontstockesdansuntableau :nousdevonseffectuerplusieurstestsetpourretournerenuneseule foislensembledesmessages,nouslesmmoriseronsdansuntableauquenousallonsdclarer. <?php $erreurs = array(); $msg = array(); ?> NousvrifionssilechampPrnomestvideoupas.Siceluiciestvide,nousmmorisonslemessagederreuretla prsenceduneerreurcequinouspermettraunpeuplusloindecontrlersileformulairepossdedeserreursou pas.

- 4-

ENI Editions - All rights reserved - Algeria Educ

<?php if (empty($frm[prenom]) ) { $erreurs[prenom] = true; $msg[prenom] = "Il manque le prnom"; } ?> Maintenant,noustestonslechampEmailunpeudiffremmentduchampPrnom.Nousallonsconvertirsoncontenu encaractresHTMLetauformatUTF8 : <?php $email=htmlentities($_POST[email], ENT_QUOTES,UTF-8); ?> Noustestonssilechampnestpasvide : <?php if (empty($email)) { $erreurs[email] = true; $msg[email] = "Absence demail"; } ?> Nous effectuons maintenant un test utilisant les expressions rgulires pour vrifier si lemail qui a t saisi correspondauformatstandarddesemails. <?php elseif (!preg_match(^[[:alnum:]]([-_.]?[[:alnum:]])*@[[:alnum:]]([-_.]? [[:alnum:]])*.([a-z]{2,4})$,$email)) { $erreurs[email] = true; $msg[email] = " Mauvais format dEmail"; } ?> Nousvrifionsmaintenantsilemailnexistepasdjdanslecarnetdadressesdelutilisateur. <?php elseif ((mysqli_num_rows(mysqli_query($connex,"SELECT 1 FROM carnet WHERE email= ".$frm[email]." AND iduser=".$_SESSION[iduser ]."")) > 0)) { $erreurs[email] = true; $msg[email] = "Lemail existe dj"; } ?> Aprs avoir effectu lensemble des tests, nous renvoyons le tableau, poursuivant ainsi le droulement de notre application. <?php return $msg; } Siunproblmeouuneerreurapparatlorsdechacundestests,nousmmorisonsosesitueleproblmepourle signalerdansleformulaire. Si tous les tests se sont correctement drouls, nous allons enregistrer les donnes saisies dans la base de donnesMySQLi.Cependant,nousallonseffectuercetteinsertionenplusieurstapes :
G

insertiondelaficheproprementdit insertiondeslementsdinformationconcernantlapersonne ajoutdelaphotoeneffectuantunemisejourdelafiche.

ENI Editions - All rights reserved - Algeria Educ

- 5-

Linsertiondelafichevaseffectuerdelafaonsuivante : <?php $sql = " INSERT INTO carnet ( iduser , nom , prenom , adresse1 , adresse2 , codepostal , ville , tel , portable , email ) VALUES ( ".$_SESSION[iduser]." ,".strtoupper(htmlentities($frm[nom]))." ,". ucfirst( strtolower(htmlentities($frm[prenom])))." ,".htmlentities($frm[adresse1])." ,".htmlentities($frm[adresse2])." ,".$frm[codepostal]." ,".htmlentities($frm[ville])." ,".htmlentities($frm[tel])." ,".htmlentities($frm[portable])." ,".$frm[email]." )"; $qid = mysqli_query($connex,$sql); if(! $qid ) die (Requte invalide : . mysqli_error($connex)); ?> Rappelonsquelenomdefamilledoittreinscritenmajusculeetquepourleprnomcestjustelapremirelettreet leresteenminuscule.Poursimplifierlamodificationduprnom,nousmettonsleprnomcompletenminusculeet ensuitenousutilisonssurlepremiercaractrelafonctiondemiseenmajuscule. Lesfonctionsutilisessont : strtoupper Renvoieunechanedecaractreenmajuscule. strtolower Renvoieunechanedecaractreenminuscule. ucfirst Metlepremiercaractreenmajuscule. Quandnousinsronslenregistrement,lenumrodelaligneestautomatiquementcrcarnousavonsdfinilors delacrationdelatableuncompteurautomatique(autoincrment). Pourrcuprercenumro,nousutilisonslafonctionmysqli_insert_iddelaconnexion. <?php $id_carnet = mysqli_insert_id($connex); ?> mysqli_insert_id Retournelidentifiantautomatiquementgnrparladernirerequte. Pourpouvoirensuiteenregistrerladeuximepartieduformulaire,cestdireunerubriqueetuneobservation : <?php $sql = " INSERT INTO carnet_details ( idcarnet , idrubrique

- 6-

ENI Editions - All rights reserved - Algeria Educ

, observation ) VALUES ( ".$id_carnet." ,"".$frm[idrubrique]." ,"".htmlentities($frm[observation])." )"; $qid = mysqli_query($connex,$sql); if(! $qid ) die (Requte invalide : . mysqli_error($connex)); ?> Ici, nous enregistrons quelques informations : le numro de la ligne du carnet (idcarnet), ensuite la rubrique (idrubrique)etpourfinirlesobservations. Ilestprfrabledenregistrerlaclquelavaleurduchampcarsinouseffectuonsunemodificationdelavaleurdu champ(ex :correctionorthographe)nousavonsjustelecontenudutexteamodifiecarlacl,ellenebougepas. Ilnenousresteplusquinsrerlaphotodanslenregistrement.

d.Manipulationsdufichierphoto
Unefoisinsrestouteslesdonnes,occuponsnousdelaphoto.Lavantagedeprocderdanscetordreestquesi lutilisateurnapasremplilechampphoto,lapplicationcontinuerasondroulement. Pourlajoutdelaphoto,nousallonsreprendrelamthodetudiedanslasectionconcernantletransfertdefichier (cf. chapitre La prparation du dveloppement Transfert de fichiers). Mais, pour plus de facilit, nous allons renommerlefichierenutilisantleprnomdelaficheducarnetquenousvenonsderempliraulieudegarderlenom originaldufichier. Nouschangeonscenompourobtenirquelquechosedeplusrationnel,sinon,lorsquevousregarderezledossiero setrouvetouteslesphotos,vousrisquezdytrouvertoutessortesdenomsetdechiffresetdavoirdumalvousy retrouver. Renommer les fichiers avec les prnoms des contacts permet dobtenir une structure plus facile contrler. Nousallonscrerunfichierddilagestiondesfichiers : fct_upload.inc.php.Ainsi,ilserabeaucoupplusfacilede retrouverlesfonctions. <?php function rename_fichier($newName,$fichier) { ?> Nousrcupronslenomdudossierdedestinationdesphotosquiatdfiniaudbutdenotreapplication : include/config.inc.php <?php Global $destDir; ?> Nousutilisonslenomdudossierdesauvegardedesfichiersquiserontutiliss : <?php $ext = strrchr($fichier, .); $newName = strtolower($newName); ?> Nousmettonspartlextensiondufichieretmmorisonslenomdufichierquiseraleprnomdelapersonneau formatchanedecaractresenminuscule. Testonsmaintenantsilefichierexistedj : <?php if ( !file_exists($destDir.$newName) ) { $i=0; ?> Avant deffectuer lopration de transfert, nous devons vrifier si le prnom que nous dsirons utiliser se trouve djdansledossier.LenomdufichierpeutdjexistersiunautreutilisateurdevotresiteInternet,possdedans sescontactslemmeprnom.Pourviterdcraserlefichierexistant,nousajoutonsaunomunevaleurnumrique

ENI Editions - All rights reserved - Algeria Educ

- 7-

incrmentejusqucequenousnetrouvionsplusdenomdefichierexistant. <?php while ( file_exists($destDir.$newName.$ext) ) { $i++; if (file_exists($destDir.$newName.$ext)) { $decoupe = explode(_,$newName); $newName = $decoupe[0]."_".$i; } else break; } } ?> Lorsque nous avons une combinaison prnom avec son numro qui nexiste pas, nous renommons le fichier avec cellecietnousrenvoyonsnotreapplicationlenouveaunomdufichierquenousavonsinsrdansnotreespace. rename Renommeunfichier. <?php rename ($destDir.$fichier,$destDir.$newName.$ext); return $newName.$ext; } ?> Cechangementdenomeffectu,nouslenregistronssurlafiche. Pourexcutertoutecetteprocdure,voicilaroutinedontnousavonsbesoin : <?php if (isset($_FILES[fichier])||!empty($_FILES[fichier])) $fichier = $_FILES[fichier]; if ( $fichier && $fichier != "none") { $rep=upload($destDir,$fichier); if ($rep[0]== TRUE) { $fichier=rename_fichier($frm[prenom],$rep[1]); $sql = "UPDATE carnet SET photo=".$fichier." WHERE id=".$id_site." "; $qid = mysqli_query($connex,$sql); if (!$qid) die(Requte invalide : . mysqli_error($connex)); } } ?> Lorsquenousavonstermintouteslesmanipulations,nousaffichonsunmessagedesuccs.

3.Afficherlescontacts
Lorsquelutilisateurauraenregistruncertainnombredecontactsdanslecarnetdadresses,illuiserancessairede pouvoirvisualiserlecontenucompletducarnet.

a.Visualiser
Poureffectuerlaconsultationducarnet,nousallonsraliserplusieurstapes :
G

prparerlarequte excuterlarequte

- 8-

ENI Editions - All rights reserved - Algeria Educ

afficherlersultat librerlersultat fermerlaconnexionaveclabasededonnes

carnet-view.php <?php $sql="select carnet.*,carnet.id as idtmp,user.id,user.idclef FROM carnet,user WHERE user.id=carnet.iduser AND carnet.iduser=".$_SESSION[iduser]." AND user.idclef=".$_SESSION[idclef]." "; $qid = mysqli_query($connex, $sql); if (!$qid) die ("Probleme : " . mysqli_error($connex)); ?> Pourslectionnerlecarnetdadressesenfonctiondelutilisateur,nousmettonsenplaceunfiltreaveclescritres que nous avons mmoriss dans la session, cestdire le numro de clef variable et le numro de ligne du possesseurducompte. NouseffectuonslaffichagedesinformationsprincipalessouslaformeduntableauHTML.Lesinformationsquisont affiches sont considres comme principales, permettant ainsi dobtenir plus rapidement les informations dont nouspouvonsavoirbesoin. <?php echo "<table border=1 width=100%>"; echo "<tr>"; echo "<td>Nom</td>"; echo "<td>Prenom</td>"; echo "<td>Email</td>"; echo "<td>Tel</td>"; echo "<td>Portable</td>"; echo "<td>Edit</td>"; echo "</tr>"; while( $row=mysqli_fetch_object( $qid) ) { echo "<tr>"; echo "<td>".$row->nom."</td>"; echo "<td>".$row->prenom."</td>"; echo "<td>".$row->email."</td>"; echo "<td>".$row->tel."</td>"; echo "<td>".$row->portable."</td>"; echo "<td><a href=carnet-view-edit.php?id=$row->idtmp class=links>Cliquez ici</a></td>"; echo "</tr>"; } echo "</table>"; ?> Nouslibronslersultatetfermonslaconnexion. <?php mysqli_free_result($row); mysqli_close($connex); ?> Biensrpourchaqueligneaffiche,nousallonspouvoirditer,consulteretmodifierlecontenudelafiche correspondanteducarnetdadresses.Nousleverronsunpeuplusloindanslouvrage.

ENI Editions - All rights reserved - Algeria Educ

- 9-

b.Filtrer
Quandnousparlonsduncarnetdadresses,nouspensonsaupetitcalepinquetoutlemondeaeuaumoinsune fois dans ses mains. Ce petit calepin possde un systme de classement alphabtique, permettant ainsi de retrouverplusfacilementlenomouprnomdelapersonnerecherche. Nous allons donc proposer un filtre alphabtique pour permettre de slectionner une lettre et dafficher tous les nomsquicommencentparcettelettre. Pourralisercettefonctionnalit,nousallonsinsrerunepetitebouclepourafficherleslettresdelalphabetetainsi viterdevoir26lignescorrespondantaux26lettresdelalphabet.Nousutiliseronsunpetittableaupourgagnerdu temps,etsurtoutconomisersurleslignesdeprogrammation,commececi : carnet-view.php < ?php $lettre=array(A,B,C,D,E,F,G,H,I,J,K, L,M,N,O,P,Q,R,S,T,U,V, W,X,Y,Z,Tous); for ($i=0;$i<26;$i++) { echo "<a href=".htmlentities($_SERVER[PHP_SELF])."?filtre= ".$lettre[$i]." class=links>".$lettre[$i]."</a>"; echo "-"; } ?> Lorsdelaslectiondunedeslettresproposes,nousrechargeonslapageencours,cequinouspermetdafficher lersultatcorrespondantlalettreconcernecommececi :

- 10 -

ENI Editions - All rights reserved - Algeria Educ

NousaffichonslemotTouslafindelalistealphabtique,carlevisiteurdoitpouvoirrevenirlaffichagetotaldela listesanspasserparlemenu. <?php if (isset ($GET[filtre])) $filtre=verif_GetPost($_GET[filtre]); if (!empty($filtre) && $filtre!="Tous") { $filtre= "AND ( nom LIKE " . $filtre . "% ) } else $filtre= " "; ?>

";

Sur slection dune des lettres et avant daccder la prparation de la requte, nous devons effectuer une vrificationdesdonnesprovenantdulienInternet. NouseffectuonsuntestpourvrifiersilemotTousnestpasprsentouquelechamppossdebienunevaleur. Sicescritresonttrenseigns,nousallonsajouterdanslarequteunerestrictionslectionnanttouslesnoms quicommencentparlalettrequiatchoisie. Si ce nest pas le cas, nous laissons un caractre vide, permettant ainsi la requte SQL de sexcuter normalementsansrestrictionsupplmentaire. <?php $sql="select carnet.*,user.id,user.idclef FROM carnet,user WHERE user.id=carnet.iduser AND carnet.iduser=".$_SESSION[iduser]." AND user.idclef=".$_SESSION[idclef]." $filtre "; ?> Lerestedelaffichagenechangepasdoncnousnenparleronspasdenouveau.

c.Trier

ENI Editions - All rights reserved - Algeria Educ

- 11 -

Lorsdelaffichageduneliste,ilestsouventncessairedepouvoireffectuerunpetittripourunevisualisationplus rapideoupourobteniruneautreprsentation. Pourraliserletri,nousallonsutiliserunefonctionstandardduSQL,ilsagitde : ORDERBY TrierlechampXdansunordrecroissant. DESC Sinsreaprslechamppoureffectueruntridcroissant,parexempleORDERBY...DESC. Dansnotreapplication,nousallonsautoriserletrisurlenomouleprnom : <?php if (isset ($_GET[tri])) $tri=verif_GetPost($_GET[tri]); if (isset ($tri) && $tri=="nom") $order="ORDER BY nom "; else $order=""; if (isset ($tri) && $tri=="prenom") $order="ORDER BY prenom "; if (isset ($_GET[ordre])) $ordre=verif_GetPost($_GET[ordre]); if ($tri && $ordre!="DESC") $ordre = "DESC"; else $ordre = ""; ?> Lorsquelutilisateurcliquepoureffectueruntri,lapageenregistrelacolonnequiatslectionneetseraffiche automatiquement trie. Si le visiteur slectionne de nouveau la mme colonne, le tri seffectuera dans le sens contrairecarnousmmorisonslesensdutri. PourcettemanipulationlelienHTMLsoccupedetout,ilsecomposeainsi : < ?php echo "<a href=".htmlentities($_SERVER[PHP_SELF])."?tri= nom&ordre=$ordre class=links>Tri</a>"; ?> Celienindiquequellecolonneatslectionne,etavecuneautrevaleurlordreactuel.

d.Grerplusieurspages
Lorsque le carnet est bien rempli, nous pouvons obtenir un rsultat trs volumineux pour certaines lettres de lalphabet. Parconsquent,ilesttoujoursintressantdepouvoirlimiterlaffichagedunombredelignessuruncran. Nousallonsgrerdesnumrosdepagespourdisposerdenumrosenbasdutableaupournaviguerentreelles plusfacilement. Pouroptimisercettepartie,nousutilisonscertainsnomsdevariables: $nb_pages Nombredelignesparpages. $start Positiondedpart. <?php $nb_pages=5; if (isset ($_GET[start])) $start=verif_GetPost($_GET[start]); else $start=0; if(isset($start) && !$start) $start=0; else $start = $start; ?> Ici,lenombredelignesparpageretenuest5,maisilesttoutfaitpossibledemodifiercettevaleurpourpermettre

- 12 -

ENI Editions - All rights reserved - Algeria Educ

laffichagede10,20ou50lignesparpage. Nous rcuprons le numro de la page permettant de se positionner dans ce mini navigateur. Bien sr, nous utilisonstouslesfiltresdecontrleetdescuritdontnousavonsmaintenantlhabitude. Lorsque nous avons dtermin la valeur des variables, nous insrons ces valeurs dans la requte pour lui permettredafficherlesbonneslignes. Poureffectuerlaffichagedeceslignes,nousutilisonslafonctionstandardSQL LIMIT.Cetteclauseseconstruitde lafaonsuivante :onindiquelenumrodelalignesuividunombredelignesretenir. Dans notre application, nous avons retenu 5 lignes par page, donc si nous dsirons afficher la page 4, nous effectuonslecalculcommececi : Numerodepage*5=$start Cequenousobtenons :4*5=20. Lavaleurde$startest20. Etlavariable$limitvaut5. <?php $sql="select carnet.*,user.id,user.idclef FROM carnet,user WHERE user.id=carnet.iduser AND carnet.iduser=".$_SESSION[iduser]." AND user.idclef=".$_SESSION[idclef]." $filtre $order LIMIT $start,$nb_pages "; $qid = mysqli_query($connex, $sql); if (!$qid) die (Probleme : " . mysql_error($connex)); ?> Lersultatquenousobtenonsiradeslignes2025. Sousletableau,nousaffichonssurunelignelesnumrosdespagesquicorrespondent. Deplus,nousenprofitonspourafficherchaqueextrmitlemot dbutetlemot fin, nous permettant ainsi de naviguersurlesextrmitsplusfacilement. Pourcommencer,nousdevonsafficherlemot dbutsinousnesommespasaudbutducompteur,cestdiresila variable$startpossdeunevaleurnumrique. < ?php if($start) { echo "<a href=".$_SERVER[PHP_SELF]."?start=".($start-$nb_pages)." class=links>"; echo "Dbut "; echo "</a>"; echo "&nbsp;"; } ?> Pourdterminerlenombredepagesafficher,nousallonsreprendrelarequteutilisepourafficherletableau. NousallonsluidemanderdecompterlenombredelignestotalesaveclafonctionSQLstandard :COUNT. <?php $sql="select COUNT(*) FROM carnet,user WHERE user.id=carnet.iduser AND carnet.iduser=".$_SESSION[iduser]." AND user.idclef=".$_SESSION[idclef]." $filtre $order "; $qid = mysqli_query($connex, $sql); if (!$qid) die (Probleme : " . mysqli_error($connex)); $row=mysqli_fetch_row($qid); ?>

ENI Editions - All rights reserved - Algeria Educ

- 13 -

Nous rcuprons la valeur qui nous est communique et, dans un premier temps, vrifions si le chiffre que nous avons obtenu est suprieur au nombre de lignes que nous devons afficher par page. Si cest le cas, nous commenonsafficherlesnumrosdepagespossibles. Nousallonscomparerchaquenumroettestersilenumrodelapagequiestaffichecorrespondaunumrode page du compteur. Si cest le cas, nous affichons le numro de la page dans un style dcriture diffrent pour montreronoussommessitusdanslensembleducatalogue. <?php if($row[0]>$nb_pages) { $start++; for($index=0;($index*$nb_pages)<$row[0];$index++) { $npage=$index+1; if ($start!=$npage) { echo "<b>"; echo "<a href=".$_SERVER[PHP_SELF]."?start=".$index*$nb_pages." class=links>$npage</a>"; echo "</b>"; echo "&nbsp;"; } else { echo $npage; echo "&nbsp;"; } } } ?> Ilnenousresteplusquafficherlemotfinquicorrespondladernirepageducarnetdadressesquenousavons slectionn.Sinousnoustrouvonssurladernirepage,nousnelaffichonspas. <?php if($row[0]>($start+$npage)) { echo "<a href=".$_SERVER[PHP_SELF]."?start=".($start+$npage)." class=links>"; echo " Fin"; echo "</a>"; } ?> Chaquenumrocorrespondunlien.Sicelienestchoisi,nousrechargeonslapageaveclesnouveauxcritresde slection.

4.diteruncontact
Dans notre application lutilisateur pourra afficher le contenu du carnet dadresses, comme nous venons de le voir dans les pages prcdentes. Il pourra choisir une des entres proposes, pour en consulter le dtail et aussi effectuerlesmodificationssicelaestncessaire. Nousvoyonscidessouslcrancomplet :

- 14 -

ENI Editions - All rights reserved - Algeria Educ

Lafichecomportedeuxparties :
G

unepartiesurlagauchecontenantlesinformationssurlecontact unepartiedroiteaveclesinformationsutilesquiconcernentcecontact.

Pour afficher et grer la partie de droite qui doit contenir les rubriques qui ont t remplies partir du menu Rubrique,nousallonstraiterlersultatsouslaformeduntableau. <?php $sql="SELECT carnet_details.idcarnet,carnet_details.id as idtmp,carnet_details. idrubrique,carnet_details.observation,carnet.id,carnet.carnetclef FROM carnet,carnet_details WHERE carnet.id=carnet_details.idcarnet AND carnet.carnetclef=$carnetclef "; assert (mysqli_query($connex, $sql)); $qid = mysqli_query($connex, $sql); if (!$qid) die ("Probleme : " . mysqli_error($connex)); ?> Nousdterminonslenombredelignesrenvoyespourraliseruneboucledaffichage. <?php $nligne= mysqli_num_rows($qid); $nligne=0; while ($row=mysqli_fetch_array( $qid)) { echo "<tr>"; echo "<td valign=top>"; ?> Pour chaque ligne, nous allons afficher sous la forme dune liste droulante les rubriques personnelles que nous avonsdtermines.

ENI Editions - All rights reserved - Algeria Educ

- 15 -

<?php echo "<select name=\"idrubrique[]\">"; echo ligne_selected(" ","-1",$frm[idrubrique][$i]); $sql="SELECT id,iduser,nom FROM rubrique WHERE iduser=".$_SESSION[iduser]." ORDER BY nom"; assert (mysqli_query($connex, $sql)); $rubrique=mysqli_query($connex, $sql); if (!$rubrique) die(Requte invalide : . mysqli_error($connex)); if (mysqli_num_rows($rubrique)!=0) { while( $row2=mysqli_fetch_array( $rubrique) ) { echo ligne_selected($row2[nom],$row2[id],$row[idrubrique]); } } echo "</select>"; echo "</td>"; ?> Nousaffichonspourlammelignelesobservationsetcommentairesimportants.Pourrespecterlaprsentationdela saisieduvisiteurdanscechamp,nousutilisonslafonctionnl2br: nl2br InsreunretourchariotlaligneHTMLchaquenouvelleligne. <?php echo "<td>"; echo "<textarea name=\"observation[]\" cols=\"30\" rows=\"3\">".stripslashes (nl2br($row[observation]))."</textarea>"; ?> Nousmmorisonslidentifiant(idtmp)dechaquelignepourpermettredeffectuerlamisejourduformulaire. <?php echo "<input name=\"iddetails[]\" type=\"hidden\" value=".$row[idtmp].">"; echo "</td>"; echo "</tr>"; $nligne++; } ?> Nouslibronslersultat. <?php mysqli_free_result($qid); ?> Nous avons deux possibilits pour insrer une nouvelle ligne (nouveau couple rubrique/observation= pour la fiche contactencours:
G

UnboutonAjouter:plusrapideraliser.Leprincipeconsisteafficherunautreformulairesioncliquesur cebouton. Unelignevide:consisteafficherobligatoirementunenouvelleligne,quiseraitutilisabledesuite.

Nousallonsprivilgierledeuximechoix. Lorsquelutilisateurauraeffectulesmodificationsdsires,ilslectionneraleboutonMiseAjour. Cettemisejourvatreraliseenplusieurstapes :


G

Lamisejourdelafiche. Lamisejourdesdtails.

- 16 -

ENI Editions - All rights reserved - Algeria Educ

a.Misejourdelafiche
Avant deffectuer la mise jour de la fiche, nous allons effectuer les vrifications classiques de scurit et si les champsobligatoiresonttcorrectementrenseigns. Rappelonsqueceschampsobligatoiressontleprnometlemail. Lesdiffrentstestsncessaireseffectus,nouspouvonsprocderlamisejourcommececi : carnet-vieux-edit.php <?php function update_fiche(&$frm) { global $connex;

$sql = "UPDATE carnet SET genre=".$frm[genre]." ,nom=".strtoupper(htmlentities($frm[nom]))." ,prenom=".ucfirst( strtolower(htmlentities($frm[prenom])))." ,adresse1=".htmlentities($frm[adresse1])." ,adresse2=".htmlentities($frm[adresse2])." ,codepostal=".$frm[codepostal]." ,ville=".htmlentities($frm[ville])." ,tel=".htmlentities($frm[tel])." ,portable=".htmlentities($frm[portable])." ,email=".htmlentities($frm[email])." WHERE carnetclef=".$frm[carnetclef]." "; $qid = mysqli_query($connex, $sql); if (!$qid) die (Probleme : " . mysqli_error($connex)); } ?> Lafonctiondemisejour(update_fiche)sedcomposeenplusieurstapes :
G

la prparation de la requte avec tous les critres de prsentation, cestdire le nom de famille en majuscules,leprnomtoutenminusculessauflapremirelettre lexcutiondelarequte.

b.Misejourdesdtails
Les dtails de la fiche (partie de droite) vont tre traits diffremment car nous avons grer un tableau. Nous devonsmmoriserlenumrodelaligne(id)pourlenregistrerdanslatabledtail(carnet_details).Pourinformation, nousnepouvonspasmmoriserlaclefcarelleestvariable,maispluttlenumrodelaligne. <?php function fiche_details(&$frm) { global $connex; $sql="select id FROM carnet WHERE carnetclef=".$frm[carnetclef]." "; assert (mysqli_query($connex, $sql)); $qid = mysqli_query($connex, $sql); if (!$qid) die ("Probleme : " . mysqli_error($connex)); $row=mysqli_fetch_object( $qid); ?> Poureffectuerlamisejourducarnetdetails,nousallons,partirdunombredelignes,effectuerlamodification ncessaire provenant du formulaire sauf la dernire qui sera gre un peu diffremment. Ainsi, les lignes qui possdentdesinformationsserontconsidrescommemodifiables. <?php $nligne=$frm[nligne]-1;

ENI Editions - All rights reserved - Algeria Educ

- 17 -

for ($i=0;$i<=$nligne;$i++) { $sql = "UPDATE carnet_details SET idcarnet=".$row->id." ,idrubrique=".$frm[idrubrique][$i]." ,observation=".htmlentities($frm[observation][$i])." WHERE id=".$frm[iddetails][$i]." "; assert (mysqli_query($connex, $sql)); $qid = mysqli_query($connex, $sql); if (!$qid) die ("Probleme : " . mysqli_error($connex)); } ?> Nous avons effectu la totalit de la mise jour, nous pouvons dsormais nous occuper de la dernire ligne qui taitvidelorsquenoussommesarrivssurcetcran. Nous effectuons un test pour vrifier si cette ligne possde des valeurs. Si la ligne est toujours vide, nous continuonsnotrechemin. Parcontre,silalignepossdedesvaleurs,nousdevonsinsrercesdonnesdanslabasededonnes. <?php if ($frm[Newidrubrique]!=-1) { $sql = " INSERT INTO carnet_details ( idcarnet , idrubrique , observation ) VALUES ( ".$row->id." ,".$frm[Newidrubrique]." ,".htmlentities($frm[NewObservation])." )"; $qid = mysqli_query($connex, $sql); if(! $qid ) die (Requte invalide : . mysqli_error ($connex)); } } ?>

c.Misejourdelaphoto
Nousavonsdeuxpossibilits :
G

insrerunenouvellephotoindisponiblelorsdelacrationdelafiche afficherlaphotoquenousavonsdanslabasededonnes.

Sinousdevonsinsrerunephoto,nousallonsprocderquelquesoprationspourlajouterauxautresphotos. Nous allons faire appel diffrentes fonctions pour effectuer le transfert du fichier retenu de lordinateur vers le serveur. Lorsque cette tape est ralise, nous renommons le fichier correctement en utilisant le prnom du contact et enregistronslesinformationsdanslabasededonnes. carnet-view-edit.php <?php require_once ("include/fct_upload.inc.php"); if (isset($_FILES[fichier])||!empty($_FILES[fichier])) $fichier =

- 18 -

ENI Editions - All rights reserved - Algeria Educ

$_FILES[fichier]; if ( $fichier && $fichier != "none") { $rep=upload($destDir,$fichier); if ($rep[0]== TRUE) { $fichier=rename_fichier($frm[prenom],$rep[1]); $sql = "UPDATE carnet SET photo=".$fichier." WHERE carnetclef=".$frm[carnetclef]." "; assert (mysqli_query($connex, $sql)); $qid = mysqli_query($connex, $sql); if (!$qid) die ("Probleme : " . mysqli_error($connex)); } } ?> Concernantlagestiondutransfertdelaphoto,nousvousconseillonsdevousrendrelapartieabordantcethme puisquilsagitdesmmesfonctions(cf.chapitreLaprparationdudveloppementTransfertdefichiers).

5.Supprimeruncontact
Lutilisateuraurabesoindesupprimeruneficheavecsesdiffrentsliens. Poureffectuercetteopration,ildevraaccderlafichedesonchoixetcliquersurleboutonSupprimer. Pour tre certains quil ne sagit pas dune erreur, nous demanderons la confirmation du choix par lintermdiaire dunefonctionJavaScript. <input type="submit" name="action" value="Supprimer" onClick="Javascript:return confirm(tes-vous sr de vouloir enlever cette ligne ?);"> Aprsconfirmationduchoix,nousallonseffectuerlopration. Signalons quil est galement possible de demander la confirmation de la suppression de la fiche par lintermdiairedunformulairedesaisiedumotdepassecommenouslavonsvudanslechapitreprcdent. Poureffacerleslignescorrespondantlaficheslectionne,nousdevonseffectuerlesoprationssuivantes : Nousslectionnonslenumrodelafichequenousobtenonsparlintermdiairedelaclefducarnet. <?php $sql="select id FROM carnet WHERE carnetclef=".$frm[carnetclef]." "; assert (mysqli_query($connex,$sql)); $qid = mysqli_query($connex,$sql); if (!$qid) die ("Probleme : " . mysql_error()); $row=mysqli_fetch_object( $qid); ?> Lorsque nous avons rcupr le numro de la fiche choisie, nous allons supprimer les lignes correspondant aux diffrentesrubriquesdelafiche,cestdirelapartiedroitedecelleci. <?php $sql="DELETE FROM carnet_details WHERE idcarnet=".$row->id." "; assert (mysqli_query($connex,$sql)); $qid = mysqli_query($connex,$sql); if (!$qid) die(Requte invalide : . mysql_error()); ?> Ensuite,noussupprimonslaficheproprementditeaveclenumrodeclefducarnet. <?php $sql="DELETE FROM carnet WHERE carnetclef=".$frm[carnetclef]." "; assert (mysqli_query($connex,$sql)); $qid = mysqli_query($connex,$sql); if (!$qid) die(Requte invalide : . mysql_error()); ?>

ENI Editions - All rights reserved - Algeria Educ

- 19 -

Nousaffichonsunmessagedesuccsconcernantcetteopration. <?php require_once "head.inc.php"; echo "<h1><center>"; echo "Fiche supprime"; echo "</center></h1>"; require_once footer.inc.php; exit; ?> Nousavonseffectulasuppressiondetoutelafiche. Nousprocdonsdanscetordre,carsilaficheproprementditeestsupprimeavantlesdtails,nousnaurionspas tcapablesderetrouverlenumrodelafichecorrespondantauxdtailssupprimer. Cest pour cela quil est toujours prfrable de supprimer les enregistrements dtails et de terminer par la fiche principale.

- 20 -

ENI Editions - All rights reserved - Algeria Educ

Lagestiondeladministration
Noustraitonstoujoursdelasaisie,maisconsacreauxdroitsdesutilisateurs.Ilsagitdelapartieadministrationdu site, qui va nous permettre de crer de nouveaux comptes et de leur attribuer des droits. Ces droits conditionnent laccscettepartie. Une petite parenthse : imaginez que les utilisateurs qui vont avoir un compte, possdent un carnet dadresses. Pour grer ces comptes il faut une personne qui soit responsable, donc un administrateur. Ladministrateurpeutcrerdesnouveauxcomptes,lesmodifieroulesbloquer.Leblocageduncomptepermetde bloquerlaccsduncomptesanssupprimerlesinformationsducarnet,cestdireencasdabusdelutilisationde lapplication. Unepersonnequinestpasconsidrecommeadministrateurneverrapascemenuetnepourrapasyaccder. Biensr,nousauronslapossibilitdecrerplusieursadministrateurspourgrernotreapplication. CettepartiedelapplicationestraliseavecleformatPDO.ElleestaussidisponibleaveclesformatsMySQLetMySQLi entlchargementsurlesitedelditeur. PourcommuniqueraveclabasededonnesenPDO,nousdevonsactiverlesextensionssuivantes :
G

extension=php_pdo.dll extension=php_pdo_mysql.dll

Pouractivercesextensions,vousdevezvousreporterlasectionPDOduchapitreLaprparationdudveloppement, quiexpliquecommentactivercesextensions.

1.Ajouteruncompte
Pourajouteruncompte,nousallonstablirunformulaireauformatHTML. Mais avant dafficher ce formulaire, il faut sassurer que la personne qui sest connecte possde bien le niveau administrateur. Admin.php <?php if ($_SESSION[niveau]!="admin") header("Location:index.php"); ?> Silevisiteuressayedeseconnectersurcettepageetquilnepossdepasleniveaurequis,ilseraautomatiquement redirigverslapageindexdusiteInternet. Si le visiteur possde bien le niveau ncessaire pour accder la partie administrateur, nous pouvons afficher le formulairecidessous :

ENI Editions - All rights reserved - Algeria Educ

- 1-

Dansceformulaire,nousallonsimposerlasaisieobligatoiredetoutesleszones. Nousallonsaussipardfautattribuerauxnouveauxcomptesquiserontenregistrsunniveauutilisateur. Lorsdelavalidationduformulaire,nousvrifieronsquetousleschampsonttcorrectementremplis. Pour effectuer le contrle du formulaire, nous allons passer par une fonction et nous garderons la technique de mmorisationdeserreursdansuntableauvudanslespagesprcentes(carnet,rubrique). <?php function valide_form(&$frm, &$erreurs) { GLOBAL $cnx; $erreurs = array(); $msg = array(); ?> NousvrifionssilechampLoginpossdebienunevaleur,sinonnousmmorisonslerreuretsonmessagedalerte. <?php if (empty($frm[nlogin]) ) { $erreurs[nlogin] = true; $msg[nlogin] = "Absence de Login"; } ?> Nouscontrlonsdanslabasededonnessicelogin(identifiant)nestpasdjutilisdanslatable. Pourralisercecontrle,nouseffectuonsuncertainnombredoprations.Toutdabord,nousprparonslarequte SQLenprenantcommecritrelidentifiantquiatsaisipartirduformulaire. Ensuitenouslexcutonsetnousrcupronslavaleurdelacolonnepoursavoirsicetidentifiantestprsentdansla table.Siaucunelignenexiste,nouscontinuonsledroulementdesdiffrentstests.Silaligneexiste,noussignalons leproblme. <?php $sql="SELECT 1 FROM user WHERE login = ".$frm[nlogin].""; $qid = $cnx->prepare($sql);

- 2-

ENI Editions - All rights reserved - Algeria Educ

$qid->execute(); $nbre = $qid->fetchColumn(); if ($nbre>0) { $erreurs[nlogin] = true; $msg[nlogin] = " Cet identifiant existe dj"; } ?> Pourvaliderlemotdepasse,nousdevonseffectuerdautrestestsdecontrle. Toutdabordnousallonsvrifiersilepremierchampdesaisiedumotdepassepossdeunevaleur. <?php if (empty($frm[npassword])) { $erreurs[npassword] = true; $msg[npassword] = "Absence de mot de passe"; } ?> Nousvrifionsensuitesilesecondchampdesaisiedumotdepassepossdebienunevaleur. <?php if (empty($frm[npassword2])) { $erreurs[npassword2] = true; $msg[npassword2] = "Absence de mot de passe"; } ?> SilesdeuxchampsMotdepasseet Confirmermotdepassepossdentbienunevaleur,nouslescomparonsetsila saisieestdiffrente,noussignalonsleproblme. <?php if ($frm[npassword]<>$frm[npassword2]) { $erreurs[npassword2] = true; $msg[npassword2] = " mots de passe diffrents"; } ?> Nous effectuons aussi un test sur la validit et lventuelle prsence de lemail dans la liste de comptes. Pour effectuercetest,nousprparonslechampemailauformatentitsHTML <?php $email=htmlentities($_POST[email], ENT_QUOTES,UTF-8); ?> Nousvrifionssilechampnestpasvide. <?php if (empty($email)) { $erreurs[email] = true; $msg[email] = "Absence demail"; } ?> Silechamppossdebienunevaleur,nouscontrlonssilemailcorrespondauformatstandardavecuneexpression rgulirecommenouslavonstudidanslechapitreLaprparationdudveloppement,sectionpreg_Replace. <?php elseif (!preg_match(^[[:alnum:]]([-_.]?[[:alnum:]])*@[[:alnum:]]([-_.]? [[:alnum:]])*.([a-z]{2,4})$,$email)) { $erreurs[email] = true; $msg[email] = " Mauvais format demail"; }

ENI Editions - All rights reserved - Algeria Educ

- 3-

?> Ensuite,nousdevonsvrifiersilemailquiatenregistrnexistepasdanslabasededonnes.Poureffectuerce contrle,nousallonsprparerunerequteSQLpourensuitelexcuter. Lersultatquenousobtenonspermetdevrifiersilemailexisteoupas,encontrlantsinousobtenonsunevaleur suprieure0. <?php $sql="SELECT 1 FROM user WHERE email = ".$frm[email].""; $qid = $cnx->prepare($sql); $qid->execute(); if ($qid->fetchColumn()>0) { $erreurs[email] = true; $msg[email] = "Lemail existe dj"; } ?> Nous testons la liste droulante Niveau pour vrifier que la valeur slectionne correspond lune des valeurs possibles,stockesdansuntableau. <?php $niveau=array (user,admin); if (!in_array ($frm[niveau],$niveau)) { $erreurs[niveau] = true; $msg[niveau] = " Problme avec la liste droulante"; } return $msg; } ?> Ayant contrl toutes les zones de saisie, nous pouvons passer ltape suivante, cestdire insrer lenregistrementdanslabasededonnes. Pourinsrerlesdonnesquiviennentdtresaisies,contrlesetvalides,nousallonsprparerlarequteSQL. <?php function insere_compte(&$frm) { global $cnx; $creat_compte=date("Y-m-j"); $sql = " INSERT INTO user ( niveau , idclef , login , password , email , date_creation , page ) VALUES ( $frm[niveau] ,".recup_clef()." ,".htmlentities($frm[nlogin])." ,".md5($frm[npassword])." ,".htmlentities($frm[email])." ,$creat_compte ,compte.php )"; ?> Lors de la prparation de la requte, nous rcuprons certaines informations que nous avons dj utilises dans notreapplication. idclef :ilsagitdelutilisationdelaclefautomatique,grcelafonction recup_clefnousobtenonsuneclefunique autorisantainsilepossesseurducomptenaviguersanssoucis. page : nous mmorisons le nom de la page compte.php par dfaut, ce qui nous permet si nous possdons de nombreuxcomptesetdenombreusesapplications,deredirigernotrepersonnesurlessitesoulespagesdiffrentes.

- 4-

ENI Editions - All rights reserved - Algeria Educ

Parexemple,nouspourrionsfaireensortequelevisiteur,silpossdeunniveauutilisateuretlorsquilseconnecte son compte, soit automatiquement dirig sur la page carnet.php de lapplication et quun possesseur du niveau administrateursoitdirigluidirectementverslapageadmin.php. Nous effectuons ensuite la connexion de la transaction en PDO en effectuant la prparation et la validation de la requteSQLquionttprvuesprcdemment. Ensuitenousexcuteronscettefonction. <?php $cnx->beginTransaction(); $qid=$cnx->prepare($sql); $qid->execute(); ?> Pourfinir,nouslibronsetfermonslaconnexionaveclabasededonnes. <?php $cnx->commit(); $cnx = null; } ?> Lorsquenousavonsinsrlenregistrement,nouspouvonssignalerlesuccsdelopration.

2.Afficherlescomptes
Avant de commencer afficher le contenu de la page, nous devons vrifier si le visiteur possde les droits ncessairesaveclefiltredeniveauquenousavonsvudanslechapitreprcdent.Silevisiteurpossdeleniveau administrateur,ilpourraaccdercettepage. Pour afficher les comptes prsents dans la base de donnes, nous ralisons une routine nous permettant de visualiserlecontenudelatablepourconnatrelesutilisateursinscritsdenotresiteInternet. Lescolonnesquenousaffichonssont :
G

lidentifiant

ENI Editions - All rights reserved - Algeria Educ

- 5-

leniveaudaccsactuel lemail ladatedecration la date du dernier passage. Nous nen avons pas parl la cration du compte car cest un champ qui se remplit automatiquement lorsque le visiteur se connecte sur son compte. Ainsi, nous pouvons connatre les personnesquiutilisentleurcompte.

Pour chaque ligne, nous avons la possibilit daccder au dtail du compte comme ceci nous pouvons modifier certainesinformationsgrceunlienCliqueziciquenousaborderonsdanslechapitresuivant.

Pourralisercettepage,nousallonstablirunerequteSQLenprparantaupralablelaconnexionverslabasede donnes. <?php $sql="select * from user"; $qid=$cnx->prepare($sql); $qid->execute(); ?> Pourensuiteexcuterlarequteetafficherlersultatenutilisantuneboucle. <?php echo "<table border=1 width=100%>"; echo "<tr>"; echo "<td>Login</td>"; echo "<td>Niveau</td>"; echo "<td>Email</td>"; echo "<td>Date creation</td>"; echo "<td>dernier passage</td>"; echo "<td>Edition</td>"; echo "</tr>"; while( $row=$qid->fetch(PDO::FETCH_OBJ) )

- 6-

ENI Editions - All rights reserved - Algeria Educ

{ echo "<tr valign=top>"; echo "<td>$row->login</td>"; echo "<td>$row->niveau</td>"; echo "<td>$row->email</td>"; echo "<td>".datefr($row->date_creation)."</td>"; echo "<td>".datefr($row->date_lastpass)."</td>"; echo "<td><a href=admin-view-edit.php?clef=$row->idclef class=links>Cliquez ici</a></td>"; echo "</tr>"; } ?> Nousfermonslecurseuretlaconnexion. <?php $qid->closeCursor(); $cnx = null; echo "</table>"; ?>

3.diteruncompte
Poureffectuerlditiondelalignesouhaite,nousdevonsnousreporterlapartieprcdentenousallonsafficher lalistedesmembresetsinousslectionnonsunedeslignescommececi : <?php echo "<td><a href=admin-view-edit.php?clef=$row->idclef class=links>Cliquez ici</a></td>"; ?> Nousutilisonslaclefquenousavonsgnrepourscuriserlenumroid. Lactivationduliendditionamnelutilisateursurunnouveauformulaire.

Lorsquelutilisateurcliquesurlebouton MiseAJour,nousallonsvrifierquelesdonnessonttoujourscorrectes.
ENI Editions - All rights reserved - Algeria Educ - 7-

Poureffectuerlestestsdevalidation,nousutiliseronslesmmestestsqueceuxtudisdanslechapitreprcdent, cestdire:
G

email :pourlechampEmail,nousvrifionsquelechampnestpasvideetquilsetrouveaubonformat. Niveau utilisateur : nous effectuons un test de validation de la liste pour tre certain quilny a pas eu de changement.

Lorsque la vrification du contenu des champs sest droule avec succs, nous passons la mise jour des donnes.NousallonsprparerlarequteSQLettabliruneconnexionavecleserveurdebasededonnes,cequi permettradexcuterlamisejour.Silavrificationducontenudeschampsnesepassepascorrectement,unou plusieursmessagesapparaissentsignalantleserreurs(parexemple,lechampestobligatoire). <?php function update_compte(&$frm) { Global $cnx; $sql = "UPDATE user SET niveau=".$frm[niveau]." ,email=".htmlentities($frm[email])." WHERE idclef=".$frm[clef]." "; $cnx->beginTransaction(); $qid=$cnx->prepare($sql); $qid->execute(); ?> Nousfermonslecurseuretlaconnexion. <?php $cnx->commit(); $cnx = null; } ?>

- 8-

ENI Editions - All rights reserved - Algeria Educ

Leslogs
Leslogssontutilisspourgarderunetracedelanavigationdenosvisiteurs,lespossesseursdescomptes.Ilsnous serventaussiconnatrelesprovenancesdestentativesdepntration(attaques).

1.Enregistrement
Pourmmoriserlanavigationduvisiteur,surchaquepagequiseraaffichenousallonsinsrerunepetitefonction quinouspermettradenregistrercertainesinformations. Nousallonstoutdabordvrifiersiledossiercontenantleslogsexiste.Sicenestpaslecas,nouscronscedossier etnousluiouvronslesdroitsencritureetlecture. Admin-log.php <?php if (!is_dir($destLog)) { if (!@mkdir($destLog)) { return array(false,Erreur lors de la cration du dossier $destDir); } } @chmod($destLog,0777); ?> Lenomdufichierseracompospartirdeladatedujour.Selonlesparamtresdouverture spcifis, si le fichier existedj,ilserasimplementrouvertpouryajouterlesnouvellesinformations,sinon,ilseracr.Cemcanisme permetdenavoirquunfichierlog(trace)parjour.Lesdonnesquenousenregistronsdanslefichierseront :
G

adresseIP dateetheuredaffichagedelapage nomdelapage lenavigateur laprovenance.

<?php $nom_fichier=DATE("Y-m-d"); $fp = fopen($destLog."".$nom_fichier.".txt", "a"); export($_SERVER["REMOTE_ADDR"],$separateurLog); export(DATE("Y-m-d H:i:s"),$separateurLog); export($_SERVER[REQUEST_URI],$separateurLog); export($_SERVER[HTTP_USER_AGENT],$separateurLog); export($_SERVER[HTTP_REFERER]); fclose($fp); ?> Nouseffectuonsunappelunefonctionintitule exportquinouspermetdesimplifierlenvoidesdonnesdansle fichier.Cettefonctionseprsentecommececi : <?php function export($champ,$separateur=) { global $fp; fputs($fp,$champ); if ($separateur!=) fputs($fp,$separateur); else

ENI Editions - All rights reserved - Algeria Educ

- 1-

fputs ($fp,"\n"); } ?> Lafonctionpossdedeuxarguments.Lepremierestobligatoire,parcontreledeuximepeuttrevideouinexistant. Nousutilisonslecaractrevidelorsdudernierappel,pourpasserlalignesuivante.

2.Visualisation
Leslogssontaccessiblespourlesutilisateursquipossdentunniveauadministrateur. Nousallonsafficherlesfichiersquisetrouventdansledossierlog. Pourafficherleslogs,nouscliquonssurlalignedumenu"Leslogs"gauchedelcranetnousobtenonsuncran commecidessous :

Les fichiers qui saffichent correspondent aux diffrents passages de lensemble des utilisateurs avec la date au formatanglais(Annemoisjour). Pourafficherlecontenudundossierquisetrouvesurleserveur,nousallonsutiliserlesfonctionssuivantes : opendir Ouvreledossieretrcuprelepointeurdessus. readdir Lituneentredudossier. closedir Fermelepointeursurledossier. Pouraffichercesfichiersdansnotreapplication : <?php echo "Les Logs : <br>";

- 2-

ENI Editions - All rights reserved - Algeria Educ

echo "<center>"; $fp = opendir ( $destLog ); while ( $fichier = readdir($fp) ) { if ( $fichier!=. && $fichier!=.. && $fichier!=index.php ) { echo "<a href=$destLog$fichier class=links>".$fichier."<br>"; } } closedir($fp) ; echo "</center>"; ?> Nous naffichons que les fichiers qui nous intressent cest pourquoi nous ne faisons pas apparatre le fichier index.php,nilesraccourcisquipermettentdechangerdedossiers. Surslectiondundesfichiers,nousobtenonslesinformationsquionttmmoriseslorsdesdiffrentspassages desvisiteurs. Voiciunexempledursultatquenousobtenons :

NousyvoyonsladresseIPdelamachine,lheuredepassageetlechemindenavigation.

ENI Editions - All rights reserved - Algeria Educ

- 3-

Motsdepasse
Lorsque nous sollicitons la gnration automatique dunmotdepasse,notreapplicationvaencrerunavectoutes sortesdecaractres. Il est toujours possible dapprendre ce nouveau mot de passe, mais si nous possdons de nombreux sites Internet avecdesmotsdepasseaussicomplexes,ildevientdifficiledesesouvenirdetous. Lasolutionprsenteconsisteencequelepossesseurducomptepuissemodifiersonmotdepasseetcrerceluide sonchoix.Ilseraleseulconnatresonnouveaumotdepasse,puisquedanslabasededonnesceluiciestprotg aveclafonctionMD5quenousavonsdjtudie. Pourcela,lutilisateuraccderaunformulaireparlintermdiairedumenucompte :

Dans ce formulaire, tous les champs sont obligatoires. Mais lorsque le visiteur clique sur Confirmer, nous devons effectueruncertainnombredoprationsetdevrificationsavantdeffectuerlamodification. Cette partie est traite avec la base de donnes au format MySQLi mais elle est aussi disponible avec les formatsMySQLetPDOentlchargementsurlesitedelditeur. Nousallonsprotgerlescaractresspciauxdanslestroischampspourpermettreleurutilisationdansunerequte SQL: <?php $oldpassword=mysqli_real_escape_string($connex,$_POST[oldpassword]); $newpassword=mysqli_real_escape_string($connex,$_POST[newpassword]); $newpassword2=mysqli_real_escape_string($connex,$_POST[newpassword2]); ?> Concernantlammorisationdesmots,nousallonsutiliseruneautreapprochequecellequenousavonsdjvuedans leschapitresprcdents.tantdonnquilsagitdeffectuerlamisejourdunseulchamp,nouspouvonsraliserun contrleglobal. Nousallonsprparerlesmessagesaucasounouplusieurschampsneseraientpasrenseignsetnousenprofitons pourcomparerlesdeuxchampsdesaisiedunouveaumotdepasse. <?php $msg="";

ENI Editions - All rights reserved - Algeria Educ

- 1-

if de if de if de if de ?>

(empty($oldpassword)) $msg .= "Vous navez pas entr votre ancien mot passe.<br>"; (empty($newpassword)) $msg .= "Vous navez pas entr de nouveau mot passe.<br>"; (empty($newpassword2)) $msg .= "Vous navez pas confirm le nouveau mot passe.<br>"; ($newpassword!=$newpassword2) $msg .= "Vos nouveaux mot passe sont diffrents.<br>";

Silacomparaisondeschampsestcorrecteetqueleformulairenepossdeaucunchampvide,nouspouvonspasser ltapesuivante. Cette tape consiste rcuprer le mot de passe actuellement stock dans la base de donnes, et que nous ne connaissons pas. Pour obtenir ce mot de passe, nous devons prparer une requte avec comme critre la clef de sessionquenouspossdonsenmmoire. <?php if ($msg == "") { $sql="select * from user where idclef=".$_SESSION[idclef]." "; assert (mysqli_query($connex, $sql)); $qid = mysqli_query($connex, $sql); if (!$qid) die ("Probleme : " . mysqli_error($connex)); $row=mysqli_fetch_object( $qid); $memoPass=$row->password; ?> Nous devons obligatoirement contrler si la personne a saisi le mme mot de passe que celui que nous possdons danslabasededonnes.Poureffectuercetest,noustraitonslemotsaisidanslechampAncienmotdepasseavecla fonction MD5 et effectuons une comparaison avec la valeur extraite de la base de donnes. Sil est diffrent, nous stopponslescontrlesetsignalonsosesitueleproblmeparlintermdiairedunmessage. <?php if ($memoPass != md5($oldpassword)) { $msg="Votre ancien mot de passe nest pas valide.<br>"; } ?> Si ce test sest correctement droul, nous pouvons protger le nouveau mot de passe et mettre jour la base de donnes. <?php else { $newpassword=md5($newpassword); $newpassword=mysqli_real_escape_string($connex,$newpassword); $sql="update user set password=$newpassword where idclef=".$_SESSION[idclef]. ""; assert (mysqli_query($connex, $sql)); $qid=mysqli_query($connex, $sql); if (!$qid) die ("Probleme : " . mysqli_error($connex)); ?> La dernire tape sest bien passe, donc nous affichons un message de succs, nous librons et fermons la connexion. <?php else { require_once "head.inc.php"; echo "Votre nouveau mot de passe a t pris en compte."; include("footer.inc.php"); mysqli_free_result($qid); mysqli_close($connex); exit; }

- 2-

ENI Editions - All rights reserved - Algeria Educ

} ?> Comme nous pouvons le constater dans le code source, chaque tape peut gnrer un ou plusieurs messages dalertes. Ces messages vont safficher en haut de lcran. Cependant, il est tout fait possible de les afficher lendroit qui vousconvientlemieux. <html> <body> <p> <?php echo $msg; ?> </p> </body> </html>

ENI Editions - All rights reserved - Algeria Educ

- 3-

Captcha
Nousallonsajouterdansnotreformulairedidentificationunfiltresupplmentaire,appelcaptcha.

1.Conception
Lecaptchareprsenteuneimageavecuncode,quenousallonsgnrerdynamiquement.Cecodepermetdevrifier sinotrevisiteurestbienuninternauteetnonunrobot,pourviterderecevoirdesmessagesnonsouhaits. Cecaptchapeuttreplacdansnimportequelcrandesaisiepuisquilestgnrlavole. Nousallonsmettreenpratiquelutilisationdesfonctionstudiesdanslechapitreprcdent. Cechapitreestcommunlensembledesdiffrentesapplicationsdelouvragecarilnyaaucuneimplicationtouchant lesbasesdedonnes.Lesdiffrentesoprationssonteffectuesductdunavigateur.

a.Dclarationdelimage
Dans un premier temps, il est ncessaire de dclarer la session, mme si la fonction a dj t utilise lors de louverturedunepageInternet.Nousralisonscetteoprationpourtrecertaindenepasperdrelesdonnes. Ensuite,nousdevonsdclarerlesvariablesquenousauronsbesoindafficher. Fichier include/fct_captcha.inc.php <?php session_start(); //----------------------------------$largCaptcha=130;// largeur captcha $hautCaptcha=65;// hauteur captcha $longChaineCaptcha=6; // nombre de caractres pour le captcha $fontTTF="Swiss721 BT.TTF"; // police de caractres pour le captcha //----------------------------------?> Leslignesdeprogrammationcidessusmontrentquenousdevonsprparercertainesdonnescommelalargeuret lahauteurducaptcha. Par ailleurs, il est important de dfinir le nombre de caractres qui seront affichs (ici nous afficherons six caractres)etunepolicedecaractres. Ensuite, nous devons aussi gnrer une chane de caractres. Il existe diffrentes mthodes permettant de gnrer une chane de caractres. La mthode choisie est celle de lhorloge, en utilisant les microsecondes pour viterdavoirdeuxtextesidentiques. <?php function chaine_captcha($longueur) { $md5 = md5(microtime() * mktime()); $chaine = substr($md5,0,$longueur); return $chaine; } $_SESSION[textCaptcha]=chaine_captcha($longChaineCaptcha); ?> NousenprofitonspourprotgercettechaneenutilisantlafonctionMD5quenousdcoupons,carpourrappel,la fonctionMD5gnreunelongueurde32caractresalorsquedansnotreexemple,nousutilisonssixcaractres. Lersultatobtenuserastockdansunesession,ainsinouspossdonslavaleurquiseraaffichedansnotreimage etnousutiliseronscettevaleurlorsquenouseffectueronsletestdecomparaisonparrapportlasaisie. Nousvousconseillonsdelirelapartiedtailleunpeuplusloin.

b.Paramtresdelimage

ENI Editions - All rights reserved - Algeria Educ

- 1-

Maintenant,nouscommenonsgnrernotrecaptcha.Nousdclaronslesdimensionsdelimageaveclesvaleurs dfiniesunpeuplushaut. <?php header(Content-type: image/png); $img = imagecreatetruecolor($largCaptcha,$hautCaptcha); ?> Nousplaonsunfonddecouleurblancenutilisantunrectangleblanc. <?php $fondCol = imagecolorallocate($img, 255,255,255); imagefilledrectangle($img,0,0,$largCaptcha,$hautCaptcha,$fondCol); ?> Lacouleurblanchepourlefondpermetderesterdanslacouleurdufonddelapplication. Enplusdelacouleurdefond,nouscronsuneffetdelignescomprenantdeuxtypesdelignesalatoires,gnres parlintermdiaireduneboucle.Ceslignessepositionnentdanslimageparrapportladimensiondecelleci. Nousutilisonslafonctionsuivante : Rand() Gnreunevaleuralatoire. <?php $position=0; for($ligne=-30;$ligne<$largCaptcha+30;$ligne+=10) { $color = imagecolorallocate($img, rand(80,250), rand(18,250), rand(100,250)); if ($position==0) { imageline($img,$ligne,rand(1,10),$largCaptcharand(20,60), $hautCaptcha, $color); imageline($img,$largCaptcha-$ligne,5,rand($hautCaptcha-10, $hautCaptcha+10),$largCaptcha, $color); $position=1; } else { imageline($img,$ligne,5,rand(10,30),$hautCaptcha, $color); imageline($img,$largCaptcha-$ligne,rand(5,20),$hautCaptcharand ($hautCaptcha-10,$hautCaptcha+10),$largCaptcha, $color); $position=0; } } ?> Commenouslevoyonschaquelignepossdeunecouleurdiffrente.chaquepassage,nousslectionnonslunou lautretypedelignes.

c.Letexte
Letexteseracomposdesixcaractresetproviendradelafonctionutilisedanslespagesprcdentes. Cependant si nous affichons le texte sans appliquer deffets dessus, les robots pourront reconnatre le texte et notrefiltredeviendradpass. Uneffetseraappliqusurchaquecaractrealatoirementcommececi : <?php $x=rand(4,35); for($c=0;$c<$longChaineCaptcha;$c++) { $angle=mt_rand(10, 50); $size=mt_rand(14, 36); $text=$_SESSION[textCaptcha][$c];

- 2-

ENI Editions - All rights reserved - Algeria Educ

$y=30+rand(1,40); $color=imagecolorallocate($img, rand(10,99),rand(10,99),rand(10,99)); imagettftext($img, $size, $angle, $x+18*$c, $y, $color, $fontTTF, $text); } ?> Dans le code source cidessus, nous ralisons une boucle permettant de dcouper caractre par caractre. Nous dfinissonsunetaillevariabledutexteavecunangle. Nousimposonsunepositiondedpartpourtrecertaindecommencerdanslimageetunepositionenhauteur(en Y)alatoirementpourgnerunpeupluslesrobots. Nousaffichonslimagequenouslibronsensuite : <?php imagepng($img); imagedestroy($img); ?> Lorsquenouseffectuonsuntestdaffichage,nousobtenonslersultatsuivant :

Maintenantquenotreroutinefonctionne,nouspouvonsinsrercecaptchadansnotreformulaire.

2.Leformulaire
Ajoutonslecaptchadansnotreformulairedesaisiedelafaonsuivante : Fichier carnet-add.php <img src="include/fct_captcha.inc.php"> <input type=text name=textCaptcha size=10> * <?php if (isset($erreurs[textCaptcha])) echo $message_erreur[textCaptcha] ?>

ENI Editions - All rights reserved - Algeria Educ

- 3-

Dansnotrefomulairedesaisie,nousajoutonsunelignesupplmentaire.Cetteligneaffiche :
G

notreimage,enfaisantappelaufichierexternequenouscronslavole, unezonedesaisiepourquelinternautepuissesaisirlecode. Unepetiteconditionapparatsouslaformedunetoile,quiinformelinternautequecechampestobligatoire.

Lorsdelavalidationdenotreformulaire,ileffectueuntestsurnotrecaptcha,quisedcomposecommececi : <?php if ($_SESSION[textCaptcha] != $frm[textCaptcha]) { $erreurs[textCaptcha] = true; $msg[textCaptcha] = "Erreur de saisie"; } ?> Nousrcupronsletextemmorisdansnotresessioncarcettevaleuratstockelorsdelaconceptiondenotre captcha.Nouseffectuonsunecomparaisonaveclavaleursaisie. Siuneerreurdesaisieapparat,unmessageestaffich,etdoncleformulaireneserapasenregistr. Siloprationsestcorrectementdroule,lapplicationcontinuelaprocduredetest.

- 4-

ENI Editions - All rights reserved - Algeria Educ

Recherche
1.Techniquederecherche
Dans nimporte quelle application Internet, il existe une fonctionnalit laquelle nous ne pouvons pas chapper, il sagit de la recherche. Cette fonction permet deffectuer une recherche base sur une partie dun mot ou un mot completdansunchampdelatable. Poureffectuercetterecherche,nousproposonsunformulairedesaisie :

LexempleseraralisenMySQLpourfaciliterladcouvertedecettefonction. LorsquelutilisateurconfirmelasaisieparleboutonRechercher,nousallonspourcommencerrechargerleformulaire desaisie.Ainsi,levisiteurpourraeffectuerunenouvellerecherchesicelleencoursneluiconvientpas. Nousallonstestersileformulairecontientbienunevaleur,sinonnousnironspasplusloin : recherche/recherche.php <?php if (!empty($_POST[action])) $action=$_POST[action]; if (!empty($_POST[mots])) $mots=$_POST[mots]; else $mots=""; if ($mots=="") exit; ?> Poureffectuerlarecherchedansunetable,nousutilisonsloprateurstandardLIKEaveclesymbole%permettantla rechercheaudbut,aumilieuetlafinduchamp. Lavantage est que si lutilisateur ne saisit que quelques caractres, nous pourrons lui fournir un rsultat plus complet,commelemotenentier. <?php $sql="SELECT nom, prenom FROM exemple WHERE nom LIKE %" . $mots . "%""; $qid = mysql_query($sql); if (!$qid) die (Probleme : " . mysql_error());

ENI Editions - All rights reserved - Algeria Educ

- 1-

?> Silachanerecherchenestpasprsentedanslechamp,noussignalonsquenousnavonspastrouvdersultat. <?php if (mysql_num_rows($qid) == 0) { echo "Nous navons pas trouv de rsultats"; } else { ?> Sinonnouspouvonsafficherlersultatlaideduneboucle,carilpeutyavoirplusieurscorrespondances. <?php while($recherche=mysql_fetch_object( $qid) ) { echo "$recherche->nom "; echo "$recherche->prenom"; echo "<br>"; } } ?> Dans notre application, pour largir les possibilits de recherche, nous allons autoriser la recherche sur plusieurs champs. NousallonstudiercettefonctionavecunebasededonnesMySQLi.Cettepartieestaussidisponibleavec lesformatsMySQLetPDOentlchargementsurlesitedelditeur. Nousallonsraliserunformulaire,composcommeciaprs :

Lutilisateurpourraeffectuerunerecherchesurplusieurschampspartirdunemmezonedesaisie.Ici,nousallons permettredeffectuerunerecherchesurleschampsNom,Prnom,etEmail. Aveclaparticularitdepouvoireffectuerlarecherchedanstoutlechamp,cestdirequelemotrecherchpeutse situeraudbut,aumilieuoulafinduchamp. Parexemple,sinousdsironseffectuerunerechercheavecdeuxlettrescomme EN,nouspouvonsobtenirdansle rsultatlesmotsEditionsENIcarilspeuventsetrouverdansaumoinsundestroischampsquenousavonsretenus poureffectuerlarecherche. Dans lapplication, nous allons effectuer la recherche dans le carnet dadresses du titulaire dun compte. Pour cela nousdevonsvaliderlasaisie,cequivanouspermettrederechargerlapagepoureffectuerlarecherchedesdonnes danslabasededonnes. Nousallonscommencerparvrifierlecontenuduchamputilisdansleformulaire.Siaucunmotnexiste,nousnirons

- 2-

ENI Editions - All rights reserved - Algeria Educ

pasplusloin. carnet-search.php <?php $action=verif_GetPost($_POST[action]); $mots=verif_GetPost($_POST[mots]); if ($mots=="") exit; ?> NousconvertissonslescaractresauformatHTMLafindeprparerlarequte. <?php $mots=htmlentities($_POST[mots], ENT_QUOTES,UTF-8); ?> Pourprparerlarequte,nousdevonsprendreencompteplusieurscritresimportants :
G

larecherchedansplusieurschampsenmmetemps retenirlecarnetquicorrespondlabonnepersonne.

Pourcela,nousallonsregrouperlepremiercritreentreparenthses.Ainsi,nouspouvonseffectuerlarecherchesur plusieurschamps. Lautrecritre,cestdireleiduser(identificationducompte),serainsrendehorsdesparenthses. Nousenprofitonspoureffectueruntrialphabtiquepouramliorerlaffichagedursultat. <?php $sql="SELECT carnetclef,nom,prenom,e-mail,tel,portable FROM carnet WHERE ( nom LIKE %" . $mots . "% OR prenom LIKE %" . $mots . "% OR e-mail LIKE %" . $mots . "% ) AND iduser=".$_SESSION[iduser]." ORDER BY nom,prenom "; $qid = mysqli_query($connex, $sql); if (!$qid) die ("Probleme : " . mysqli_error($connex)); ?> Sinousobtenonsdesrsultats,nousallonsafficherlesinformationslesplusdemandesetquinousintressent :le nom, le prnom, le tlphone, lemail. Bien sr, nous donnons la possibilit daccder la fiche complte de cette personnepourconsultertouteslesinformationslaconcernant. <?php if (mysqli_num_rows($qid) == 0) { echo "Nous navons pas trouv de rsultats"; } else { ?> <table border=1 witdh=100%> <tr> <td>Nom</td> <td>Prenom</td> <td>Email</td> <td>Tel</td> <td>Portable</td> <td>Edition</td> </tr> <?php while($recherche=mysqli_fetch_object( $qid) ) { echo "<tr>; echo "<td>$recherche->nom";

ENI Editions - All rights reserved - Algeria Educ

- 3-

echo "<td>$recherche->prenom</td>"; echo "<td>$recherche->e-mail</td>"; echo "<td>$recherche->tel</td>"; echo "<td>$recherche->portable</td>"; echo "<td><a href=carnet-view-edit.php?carnetclef=$recherche->carnetclef class=links>Cliquez ici</a></td>"; echo "</tr>"; } ?> Nouslibronslersultatetfermonslaconnexion. <?php mysqli_free_result($qid); mysqli_close($connex); ?> </table> <?php } ?>

2.Multipages
Lersultatpeutcontenirbeaucoupdelignes.Pourfaciliterlalecturedursultat,ilpeuttrencessairedeproposer sonaffichagesurplusieurspages. Nous pouvons rutiliser ce que nous avons tudi dans le chapitre prcdent car il sagit du mme principe de gestion.

- 4-

ENI Editions - All rights reserved - Algeria Educ

ExportationCSV
1.Cration
Le format CSV correspond un fichier texte structur. Cette structure permet de dfinir une interprtation en colonnesquiestutiliseparcertainslogicielscommelestableurs. Lesymbolepardfautquiestutilispourlasparationdescolonnesestlepointvirgule"".Ilesttoutfaitpossible dedfinirunautrecaractredesonchoixmaisavecunrisquedincompatibilit. NousallonsexporterlatotalitdelalisteducarnetdadressespourlenregistrersurledisquedurauformatCSV. Pourprparerlexportation,nousdevonsvrifiersiledossierdesauvegardeexistebien.Sicenestpaslecas,nous allonslecreretluidonnerlesdroitsencriture. Cedossierderceptionsappellera"dl"quicorrespondaumotdownload(tlchargement)etserareprsentparla variable$destDL. < ?php if (!is_dir($destDL)) { if (!@mkdir($destDL)) { return array(false,Erreur lors de la cration du dossier $destDir); } } @chmod($destDL,0777); ?> Nous vrifions si le fichier a dj t cr ou sil est encore prsent dans le dossier. Si le fichier existe, nous le supprimonsaveclafonctionsuivante : unlink Effaceunfichier. < ?php if(file_exists($destDL."".$_SESSION[login].".csv")) { unlink($destDL."".$_session[login].".csv"); } ?> Nousprparonslarequtepourrcuprerlesinformationsquisontmmorisesdanslabasededonnesetnous lexcutons. < ?php $sql="select carnet.*,carnet.id as idlinks,user.id,user.idclef FROM carnet,user WHERE user.id=carnet.iduser AND carnet.iduser=".$_SESSION[iduser]." AND user.idclef=".$_SESSION[idclef]." "; assert (mysqli_query($connex, $sql)); $qid=mysqli_query($connex, $sql); if (!$qid) echo (Requte invalide : . mysqli_error($connex)); ?> Passonsmaintenantlacrationdufichier.Nousouvronslefichierquinousservirapourlasauvegardepartirdu nomdelutilisateurducompte. Chaqueinformationquenousallonscrireestspareparlesymbolededlimitation,cestdirelesigne"". Cesparateursetrouvedanslefichierinclude/config.inc.php. Nousallonsinscrirecertainschamps : Nom

ENI Editions - All rights reserved - Algeria Educ

- 1-

Prnom Adresse CodePostal Ville Email Tlphone Numroduportable Lapremirelignequenouscrivonscorrespondauxenttesdecolonnesncessairespourrespecterceformat. < ?php $fp = fopen($destDL."".$_session[login].".csv", "a"); export("Nom",$separateur); export("Prenom",$separateur); export("Adresse",$separateur); export("Code Postal",$separateur); export("Ville",$separateur); export("e-mail",$separateur); export("Tel",$separateur); export("Portable"); $i=1; while ($list=mysqli_fetch_object( $qid)) { export($list->nom,$separateur); export($list->prenom,$separateur); export($list->adresse,$separateur); export($list->codepostal,$separateur); export($list->ville,$separateur); export($list->e-mail,$separateur); export($list->tel,$separateur); export($list->portable); } ?> Lorsquenousavonsterminlcrituredufichier,nouslefermons. < ?php fclose($fp); ?>

2.Tlchargement
Nousallonsrcuprerlefichierquenousvenonsdecrersouslaformedunfichiertlcharger. Pourralisercettemanipulation,nousallonsutiliserunlienclassiqueHTML.Ilpointesurunfichierpossdantlerajout dextensionINCquenousavonsvuaudbutdelouvrage. <a href="download.inc.php class=links>Cliquer ici</a> Poureffectuerletlchargement,nousnallons envoyer aucun paramtre, juste proposer la sauvegarde du fichier. Pourcrercefichier,nousallonsutiliserlesvaleursquenouspossdonsdanslasession. <?php session_start(); $file=$_SESSION[login].".csv"; ?> Avantdepermettreletlchargementdufichierquiserapropos,nousallonseffectuerquelquespetitesvrifications
- 2 ENI Editions - All rights reserved - Algeria Educ

portantsurlenomdufichier.Siunproblmeapparat,nousrenvoyonslevisiteurlapageindexdusitepourquil sidentifienouveau. <?php if (!isset($_SESSION[dernier_passage]) { session_regenerate_id(); } if (!isset($_SESSION[login]) ) { header("Location:index.php"); } ?> Nousutilisonsleslignesdeprogrammesuivantespourproposerletlchargement : <?php header(Content-type: application/csv); header(Content-Disposition: attachment; filename=.basename($file)); header(Accept-Ranges: bytes); header(Content-Length: .filesize($file) ); readfile($file); ?> Lorsquelutilisateurauratlchargsonfichier,nouspouvonslesupprimercarilestinutiledelegardercheznous. <?php unlink($file); ?>

ENI Editions - All rights reserved - Algeria Educ

- 3-

ExportationPDF
1.Prsentation
LeformatPDFexistedepuisdenombreusesannesetestdevenuunedespossibilitsdexportationstandardsdans lelangagePHP.LeformatPDFpeuttregnrlavole,cestdireenralisantundocumentscurisgrcela classeFPDF.LeFavantlemotPDFcorrespondFREE,doncvousteslibredutiliseretdemodifierledocumentsi vouslesouhaitez. LesiteInternetofficielFPDFproposebeaucoupdefonctionspermettantderaliserundocumentPDF. Avantdecommencer,ilfauttlchargerlabibliothqueFPDFdisponiblesurlesitesuivant :http://www.fpdf.org. Suiteautlchargement,nousdevonsdcompresserlefichierZIP.Nousgarderonsunfichier fpdf.phpetundossier fontquisontncessairespourlacrationcorrectedundocumentPDF.

2.Principesdebase
Commenonsparunexemplesimple:nousallonsinscriredansunfichierPDF,lemessage EditionsENI,centrsur uneligneetavecunepolicedecaractres(appeleaussitypo)enArialavecunetaillede16. Pourraliserceciilexistedesfonctionsprdfinies.Cesfonctionssontaccessiblessouslaformeduneaideenligne etdoncdirectementsurlesiteInternetdelauteurdelabibliothqueFPDF. Lesfonctionsquenousavonsutilisessont : define Dfinituneconstante. FPDF PermetdedfinirladimensiondunefeuillePDF,pardfautilsagitduformatA4. AddPage Ajouteunenouvellepage. Ln Saut de ligne. Cela correspond la hauteur dun retour chariot (retour la ligne) car au lieu deffectuer plusieurs retourslaligne,nouspouvonseffectuercetteoprationenuneseulefoisenspcifiantunevaleurcorrespondant unehauteur. SetFont Fixelapolicedecaractres. Cell Afficheunecellulesouslaformedunrectangleetdunedimensionprcise. Output Envoieledocumentlcranouenregistreledocumentsurledisquedur. Nousdevonsobligatoirementinclurelefichierfpdf.phpetdfinirlerpertoiredespolicesdecaractres. pdf/exemple.php <?php define(FPDF_FONTPATH,font/); require(fpdf.php);

ENI Editions - All rights reserved - Algeria Educ

- 1-

?> NouscronsledocumentauformatPDFeninstanciantlaclasseFPDF : <?php $pdf=new FPDF(); ?> Nouscronsunepagevide : <?php $pdf->AddPage(); ?> Nouslaissonsunespacevideentrelehautdelafeuilleetletexte,pourafficherletexteEDITIONSENI. Nousallonsfaireunretourchariot,puisdfinirunstyledepolicedecaractrecestdireici,unepoliceTimesengras detaille16etensuite,afficherletitrequiseracentrsurtoutelalargeurdelafeuille. <?php $pdf->Ln(30); $pdf->SetFont(Times,B,16); $pdf->Cell(0,5,EDITIONS ENI,0,1,C); ?> Nousaffichonslersultatlcran : <?php $pdf->Output(); ?> Ilestpossibledeforcerlasauvegardedudocumentsousformedefichiersurledisquedurenmodifiantladernire lignecommececi : <?php $pdf->Output("c:\exemple.pdf"); ?> AinsilefichierserasauvegardsurledisquedurCdelutilisateur(=possesseurducompte). Nousobtenonslersultatsuivant :

- 2-

ENI Editions - All rights reserved - Algeria Educ

3.Notreapplication
Dans notre application, partir du carnet dadresses nous allons choisir un contact et au lieu dafficher sa fiche lcran,nousallonslditerauformatPDFetainsiobtenirundocumentavecuneprsentationpersonnalise. Lexportation dans ce format va tre ralise avec la base de donnes MySQL. Bien sr, cette partie est disponibleaveclesconnexionsMySQLietPDOentlchargementsurlesitedelditeur. Nousallonsafficherlecontenuducarnetdadresses,aveccertainescolonnesimportantes :
G

Nom Prenom Email Tlphone Portable Photo Etc.

Lorsquelutilisateurchoisitunedesentresproposes,nousallonsgnrerlefichierPDF. Voicilersultatobtenir :

ENI Editions - All rights reserved - Algeria Educ

- 3-

Pourcela,nousallonseffectuercertainesdclarations.Danslexemplecidessous,nousutilisonsenpluslesfonctions suivantes : AliasNbPages Dfinitunaliaspourlenombredepagestotal. Rect Traceunrectanglelendroitdsir. Multicell Afficheuntextesurplusieurslignesavecretoursdechariot. Image Afficheuneimage. SetY FixelapositioncouranteenY(enhauteur). AvantdafficherlapagePDF,nousdevonspenserinsrerunentte et un pied de page. Ces deux lments ne sontpasobligatoires,maiscesinformationssontainsirptessurtouteslespagessiledocumentPDFencomporte plusieurs. Danslentte,nousallonssauterunelignepournepascrireendehorsdelafeuille,commececi : <?php function Header() {

- 4-

ENI Editions - All rights reserved - Algeria Educ

$this->Ln(1); } ?> Pourlebasdepage,nousallonsinsrerlenumrodelapagesiledocumentenpossdeplusieurs,commececi : <?php function Footer() { $this->SetY(-15); $this->SetFont(Times,I,8); $this->Cell(0,10,Page .$this->PageNo()./{nb},0,0,C); } ?> Nousnouspositionnonsenbasdelapageetremontonsdunehauteur(15)pourdterminerlemplacementdubas depage.Nouspouvonsalorsafficherlenumrodelapagecentrparrapportlalargeurtotaledudocument. PourraliserlavoleledocumentenPDFnousdevonsdclarerunnouveaufichierPDFquiseraauformatA4.Nous luisignalonslapossibilitdavoirplusieurspagesetdemandonsquilprpareunepagevierge. <?php $pdf=new PDF(); $pdf->AliasNbPages(); $pdf->AddPage(); ?> Ensuite,nousallonsnousconnecterlabasededonnesMySQLetcompterlenombredelignesrcupres.tant donnquenousavonsslectionnuneentreetquenousavonsenvoylaclefducarnetquicorrespondcelleci, larequtedoitnousretourneruneligne. <?php $sql="SELECT * FROM carnet WHERE carnetclef=$carnetclef "; $qid=mysql_query($sql); if( ! $qid ) die("Probleme : " . mysql_error()); $nligne= mysql_num_rows($qid); $row=mysql_fetch_object( $qid); ?> Nousaffichonsletitredelafeuille,iciseseraFiche,centrsurlalargeurdelapage : <?php $pdf->SetFont(Times,B,30); $pdf->Cell(0,5,FICHE,0,1,C); ?> Nouspouvonsafficherlescoordonnesdelapersonne,encadresparunrectangle : <?php $pdf->Ln(10); $pdf->SetFont(Times,B,12); $pdf->Cell(0,5,Nom : .$row->nom); $pdf->Ln(5); $pdf->Cell(0,5,Prenom : .$row->prenom); $pdf->Ln(5); $pdf->Cell(0,5,Adresse : .$row->adresse1); $pdf->Ln(5); $pdf->Cell(20); $pdf->Cell(0,5,$row->adresse2); $pdf->Ln(5); $pdf->Cell(20); $pdf->Cell(0,5,$row->codepostal." ".$row->ville); $pdf->Ln(5); $pdf->Rect(10,22,100,35); ?> Nousaffichonsdansunautrecadrelenumrodetlphone,lenumrodeportableetlemail : <?php $pdf->Ln(10);
ENI Editions - All rights reserved - Algeria Educ - 5-

$pdf->MultiCell(100,5, "Tel :".$row->tel."\n\rPortable : ".$row->portable."\n\rEmail : ".$row->e-mail."\n\r",1,1); ?> Silafichepossdeunephoto,nousenprofitonspourlafficherdansledocument. <?php if ($row->photo) { $pdf->Image($destDir.$row->photo,120,20); } Nous allons maintenant afficher les informations que nous possdons sur les rubriques. Nous prparons la mme requte que celle qui nous permet deffectuer les modifications dans une fiche du carnet dadresses. Nous allons utiliserunefonctionappeletableauquenoustudieronsensuite. <?php $sqlDetails="SELECT carnet_details.*,rubrique.id,rubrique.nom FROM carnet_details, rubrique WHERE carnet_details.idrubrique=rubrique.id AND idcarnet=".$row->id." "; $qidDetails=mysql_query($sqlDetails); if (!$qidDetails) die("Probleme : " . mysql_error()); $pdf->Ln(20); $pdf->Cell(20); $pdf->tableau("Rubrique","Observations"); while ($rowDetails=mysql_fetch_object($qidDetails)) { $pdf->tableau($rowDetails->nom,stripslashes($rowDetails->observation)); } $pdf->Ln(5); ?> Nouslibronslesconnexionsetaffichonslersultatlcran : <?php mysql_free_result($qidDetails); mysql_free_result($qid); mysql_close(); $pdf->Output(); ?> La fonction tableau correspond une certaine prsentation prdfinie. En effet, au lieu de rpter plusieurs reprises les instructions avec diffrentes positions, il est prfrable dutiliser une fonction pour optimiser le traitement. <?php function tableau($col,$col2) { $this->Cell(1,5,$col); $this->Cell(50); $this->Cell(0,5,$col2); $this->Ln(10); } ?> LorsquenousconstruisonslesquelettepourcrerlefichierPDF,ilestprfrable(mmesicenestpasobligatoire) dinsrer les fonctions dans la classe de FPDF. Cest pourquoi, nous utilisons $this qui fait appel la classe proprementdit. Pourlutiliser,nousluienvoyonsdeuxvaleurs :
G

unevaleursepositionneaudbutdelacolonne, lautrevaleursepositionneavecundcalagede50pixels.

- 6-

ENI Editions - All rights reserved - Algeria Educ

Ensuitenouseffectuonsunretourlalignepourpermettredafficherlesautresinformations. Lorsquenousaffichonslersultatlcran,levisiteurpeuteffectuerlasauvegardedirectementsursondisquedur puisquilsetrouvedevantundocumentPDFclassiquemaisquiatralislavolegrceauPHP.

ENI Editions - All rights reserved - Algeria Educ

- 7-

ExportationXML
1.Structure
LeformatXML(eXtendedMarkupLanguage)estunlangageutilisantdesbalises.IlestdiffrentduformatHTMLcaril sagitdunlangagestructurant.Nouspouvonslireceformatenmodetexteavecunditeurdetexteclassique. IlestpossibledecrerunfichierXMLgrceauPHP,ainsinouspouvonsproposerdiffrentesfonctionnalits :
G

treluparunautrelangage, crerunfluxRSS(RealSimpleSyndication), correspondreavecdautresapplications.

LastructuredunfichierXMLeststricte,ilestjustencessairederespecterlesnomsdesbalisescommececi : <racine> <rubrique> <Ligne>Message</ligne> </rubrique> </racine> Il est important de noter que les balises ne peuvent pas contenir de caractres spciaux (,:..\/). Ne sont autorissquedescaractresalphanumriques(lettresetchiffres)avecmajusculeet/ouminuscule. Concernant la dclaration des balises, nous allons commencer par <racine> et terminer par </racine> comme sur lexemplecidessus. RalisonsunpetitexempledefichierXMLavecuntitreetunmessageEditionsENI. xml/exemple.xml <?xml version="1.0" ?> <racine> <page title="exemple TITRE"> <menu>"Menu test"</menu> </page> <ligne> <soustitre>Editions</soustitre> <soustitre>ENI</soustitre> </ligne> </racine> Voicilersultatquenousobtenons :

ENI Editions - All rights reserved - Algeria Educ

- 1-

Maintenant,automatisonslacrationdufichierXMLsanspasserparunditeurdetexte.Pourgnrerlefichier,nous stockonslesinformationsdansunevariablepourraliserdeuxfonctions :
G

afficherlersultatlcran, crerlefichierenuneseulefois.

xml/exemple1.php <?php $_xml $_xml $_xml $_xml $_xml $_xml $_xml $_xml $_xml $_xml

="<?xml version=\"1.0\" encoding=\" UTF-8\" ?>\r\n"; .="<racine>\r\n"; .="<page title=\"exemple TITRE\">\r\n"; .="<menu>\"Menu test\"</menu>\r\n"; .="</page>\r\n"; .="<ligne>\r\n"; .="<titre>Editions</titre>\r\n"; .="<soustitre>ENI</soustitre>\r\n"; .="</ligne>\r\n"; .="</racine>\r\n";

Pourafficherlefichierlcran,nousprocdonscommecidessous : header("Content-type: text/xml"); echo $_xml; PourgnrerlefichierXML,nouslcrivonsaveclesfonctionsstandardsduPHP. $file = fopen("exemple1.xml", "w"); fwrite($file, $_xml); fclose($file); ?>

2.Basededonnes
- 2 ENI Editions - All rights reserved - Algeria Educ

a.Gnralits
Pournotreapplication,cequiestintressantestdegnrerunfichierXMLpartirdunebasededonnes.Nous allons nous connecter la base de donnes pour afficher le nom et le prnom, qui seront extraits de la table exemple.RalisonsunexempleavecuneconnexionMySQLi : xml/exemple2.php <?php $serveur = "localhost"; $user = "root"; $passwd = ""; $bdd = "ouvrage"; $connex = mysqli_connect($serveur, $user, $passwd, $bdd); if (mysqli_connect_errno()) die ("Echec de la connexion : ". mysqli_connect_error()); ?> Pour crer le fichier XML, nous allons effectuer par lintermdiaire dune boucle la prparation du contenu pour ensuitelenregistrerdansunfichieraveclanouvellefonctionfile_put_contentsdisponibleenPHP5. Pourrappel,leformatdefichierXMLestunformatstructur,cestpourquoiilestsouventncessairedinsrerune bouclepourafficherlecontenu,carcecontenucorrespondlaffichagedelignesrsultats. <?php $sql="select nom,prenom from exemple "; $valeur=mysqli_query($connex,$sql); if( ! $valeur ) echo "Probleme dans la table exemple : " . mysql_error(); if (mysqli_num_rows($valeur)>0) { $_xml ="<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\r\n"; $_xml .="<personne>\r\n"; while ($row = mysqli_fetch_object($valeur)) { $_xml .="\t\t<ligne>"; $_xml .="\t\t<nom>$row->nom</nom>\r\n"; $_xml .="\t\t<prenom>$row->prenom</prenom>\r\n"; $_xml .="</ligne>\r\n"; } $_xml .="</personne>"; file_put_contents($nom_fichier,$_xml); echo "<a href=\exemple2.xml\">Voir le fichier Resultat.</a>"; } else { echo "Auncun enregistrement"; } ?> Nousfermonslaconnexionquandnousavonstermin : <?php mysqli_close($connex); ?> La construction du fichier termine, nous proposons dafficher le rsultat. Ce rsultat peut ensuite tre raffich ailleurspouraccderauxinformationssansavoirbesoindallersurlesiteInternet. Par ailleurs, lexemple nous montre quune boucle est possible avec comme balise <ligne></ligne>. Ainsi, nous pouvonspermettreunautresiteInternetouuneautreapplicationderutiliserlersultatdesdonnes.

b.Miseenpratique
Dans notre application, nous allons exporter au format XML les donnes du carnet dadresses pour permettre lutilisationdesdonnesavecunautrelogiciel.

ENI Editions - All rights reserved - Algeria Educ

- 3-

Lesdiffrentespossibilitsquenousrencontronsconcernententreautreslutilisationdemailings,publipostagesou bienpoureffectuerdautrestraitementsdivers. Pour information, cette partie est aussi disponible avec les formats MySQL et PDO disponibles en tlchargementsurlesitedelditeur. Pourcommencerlexportation,nousvrifionssiledossierDLexiste,sicenestpaslecasnouslecronsetouvrons lesdroitsencrituredessus : Export-XML.PHP <?php if (!is_dir($destDL)) { if (!@mkdir($destDL)) { return array(false,Erreur lors de la cration du dossier $destDir); } } @chmod($destDL,0777); ?> Aprs,nousvrifionssilefichierXMLexistedjoupas.Silexiste,nouslesupprimons : <?php $nom_fichier=$destDL."".$_SESSION[login].".xml"; if(file_exists($nom_fichier)) { unlink($nom_fichier); } ?> NousallonsprparerlarequteSQLpourslectionnerlesadressesquiappartiennentauboncarnetdadresseset auboncompte : <?php $sql="select carnet.*,carnet.id as idlinks,user.id,user.idclef FROM carnet,user WHERE user.id=carnet.iduser AND carnet.iduser=".$_SESSION [iduser]." AND user.idclef=".$_SESSION[idclef]." "; assert (mysqli_query($connex, $sql)); $qid = mysqli_query($connex,$sql); if (!$qid) die(Requte invalide : . mysqli_error($connex)); ?> Sinoustrouvonsdesinformations,nousallonspouvoirconstruirelefichier.Pourconstruirelefichieradresse,nous allonsinscrire leschampssuivants :Nom,Prnom,Adresse,CodePostal,Ville. Pour lexplication sur la composition du fichier XML proprement dit, nous vous conseillons de vous reporter aux pagesprcdentes. <?php if (mysqli_num_rows($qid)>0) { $_xml ="<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\r\n"; $_xml .="<carnet_adresse>\r\n"; while ($row = mysqli_fetch_object($qid)) { $_xml .="<personne>\r\n"; $_xml .="\t\t<nom>$row->nom</nom>\r\n"; $_xml .="\t\t<prenom>$row->prenom</prenom>\r\n"; $_xml .="\t\t<adresse1>$row->adresse1</adresse1>\r\n"; $_xml .="\t\t<adresse2>$row->adresse2</adresse2>\r\n"; $_xml .="\t\t<codepostal>$row->codepostal</codepostal>\r\n"; $_xml .="\t\t<ville>$row->ville</ville>\r\n"; $_xml .="</personne>\r\n";

- 4-

ENI Editions - All rights reserved - Algeria Educ

} $_xml .="</carnet_adresse>"; ?> Lorsque le contenu est dfini, nous lcrivons dans un fichier informatique, qui sera enregistr directement sur lespacedisquedudossierquenousavonschoisi. <?php file_put_contents($nom_fichier,$_xml); echo "Fichier cre<br>"; echo "<a href=".$destDL.$_SESSION[login].".xml>Visualier le fichier XML.</a>"; } else { echo "Aucun enregistrement possible"; } ?> Nousdonnonslapossibilitdevisualisercefichierpourcontrlerlesdonnes.Ensuitenousfermonslaconnexion : <?php mysqli_close($connex); ?>

3.Lejeudecaractres
Le jeu de caractres est un point qui ne peut pas tre contourn car tout dabord votre fichier XML est un format structur. Par contre, il est possible dutiliser un encodage pour permettre une autre application de respecter exactementvotreformat. Cetencodagenestpasobligatoire,maisfortementconseillcarsinousutilisonsdesaccents,ilsrisquentdenepas treinterprtscorrectement.CestpourquoilorsquenousdclaronsunfichierXML,ilestncessairedespcifierle typedencodage. Pourlalanguefranaise,lencodagestandardcorrespondauformatISO88591,cequidonnececidanslefichier : <?xml version="1.0" encoding="ISO-8859-1" ?> Parcontre,cettedclarationpourratrerutiliseprincipalementpourdesapplicationsfranaises.Eneffet,certains caractresdelalanguefranaisepeuventtremalinterprts. Heureusement,ilexisteuntypedencodageunicode,quipermetdutiliserunetableuniverselle :leformatUTF8. <?xml version="1.0" encoding="UTF-8" ?> Pour dcoder les caractres UTF8,cestdirepourlalanguefranaiseconvertiruncaractreUTF8verslanorme ISO88591,nouspouvonsutiliserlafonctionutf8_decode. utf8_decode ConvertitunechaneUTF8enISO88591. LeformatUTF_8esttudiplusendtaildanslechapitreFonctionnalitssupplmentairesUTF8.

4.SimpleXML
Depuisdenombreusesannes,nouspouvonsliredesfichiersXML.partirdelaversionPHP5,unenouvellefonction estapparuesimpleXML,permettantdelireplusfacilementlesfichiersRSS. simpleXML ConvertitunfichierXMLenobjet. Lorsque nous lisons un fichier et quil se transforme en objet, il peut tre manipul comme nous le dsirons. Nous allonsprendrelefichierexemple1.xmlquiatgnrpourenaffichersoncontenu.

ENI Editions - All rights reserved - Algeria Educ

- 5-

xml/exemple3.php <?php $nom_fichier="exemple1.xml"; ?> Nousdevonsvrifiersilefichierestbienprsentpourpouvoirlechargeretleconvertirenobjet. <?php if (file_exists($nom_fichier)) { $_xml = simplexml_load_file($nom_fichier); ?> Lorsquelobjetestcr,nouspouvonslepasserenrevupourenextraireleschamps. Nous lisons le fichier pour linsrer dans une variable objet $_xml. Pour extraire les donnes de ce fichier, nous effectuonsunerecherchedeslignescomprenantlabalise<ligne>quenousconvertissonsenvariablespourpouvoir lafficher. Ensuite, nous utilisons le changement de codage des caractres, que nous avons vu dans les pages prcdentes, pourafficherleschampsquinousintressent. <?php foreach($_xml->ligne as $ligne) { echo Titre :<b> ,utf8_decode($ligne->titre).</b><br> ; echo Soustitre :<b> ,utf8_decode($ligne->soustitre).</b> ; } } else { die(Echec lors de l\ouverture du fichier $nom_fichier.); } ?>

5.FluxRSS
a.Prsentation
UnfluxRSS,appelaussifilRSS,correspondunformatdesyndicationdecontenusurInternet,structurenXML etquiregroupeunensembledactualits,denouvelles(news)venantdesourcesdiffrentes. UnfluxRSSpermetdefidliserleslecteursdunsiteInternet,entantaucourantdesnouvellessansavoirbesoin devenirrgulirementsurlesite. PourlireoucrireunfluxRSS,ilsuffitderespecterlastructurequenousavonsvueprcdemmentetderemplirle fichier :
G

unepartieentte, unepartiecontenue.

Lenttevaseprsentersouslaformesuivante :
- 6 ENI Editions - All rights reserved - Algeria Educ

<title>Hello-design</title> <link>www.hello-design.fr</link> <description>site Hello design</description> <langage>fr-fr</langage> Lecontenu,cestdirelapartiequisuit,seradfiniparlesbalises<item></item>aveccommeinformation : <item> <title>Titre</title> <link>Liens</link> <description>Description</description> </item>

b.RSSmanuel
NousallonsgnrerunfichierRSSpourmontrercommentpasserdelathorielapratique.Nousallonsraliser lexempleavecPHP5etMySQL. Tout dabord, nous tablissons la connexion avec le serveur de donnes et lui demandons de slectionner 5 actualits : rss/ex1_creat.php <?php $connex = mysql_pconnect("localhost", "root", ""); if (!$connex) die ("Impossible de se connecter : " . mysql_error()); mysql_select_db("ouvrage",$connex); $sql = "select titre,lien, description from actualite limit 5"; $qid = mysql_query($sql); ?> Nousmmorisonslecontenudansuntableau : <?php while ($row = mysql_fetch_array($qid)) { $return[] = $row; } $now = date("D, d M Y H:i:s T"); ?> NousralisonsmaintenantlefichierXMLenleprparantdansunevariableavecsonentteetles5lignesdont nousavonsbesoin, insresgrceuneboucle : <?php $_xml = "<?xml version=\"1.0\"?> <rss version=\"2.0\"> <channel> <title>Exemple Flux RSS</title> <link>http://www.hello-design.fr</link> <description>Le Flux RSS su site Hello pour exemple</description> <language>fr-fr</language> <pubDate>$now</pubDate> <lastBuildDate>$now</lastBuildDate> "; foreach ($return as $line) { $_xml .= "\t\t<item>"; $_xml .= "\t\t<title>.htmlentities($line[titre])."</title>\r\n"; $_xml .= "\t\t<link>.htmlentities($line[lien]). "</link>\r\n"; $_xml .= "\t\t<description>.htmlentities(strip_tags($line[description])). "</description>\r\n";

ENI Editions - All rights reserved - Algeria Educ

- 7-

$_xml .= "\t\t</item>"; } $_xml .= "\t\t</channel>"; $_xml .= "\t\t</rss>"; ?> Ilnousrestecrirelefichieretsignalerlafindelopration : <?php file_put_contents ("ouvrage.rss",$_xml); echo "Creation termin"; ?> Aprs avoir ralis le fichier RSS, nous devons permettre la lecture de son contenu pour nos visiteurs. Pour cela, nouschargeonslefichierRSSdansunobjetpourlefaireliresouslaformeduntableau. rss/ex2_view.php <?php $nom_fichier="ouvrage.rss"; $_xml = simplexml_load_file($nom_fichier); ?> Nouspouvonsensuitepersonnaliserlaprsentationetafficherjustecequenousdsironsvoir.Ici,nousaffichons un lien permettant de naviguer sur la page du site Internet o se trouve larticle complet, et en dessous la description. <?php foreach($_xml->channel->item as $item) { echo "* "; echo "<a href=\"".$item->link."\" target=\"_blank\">"; echo $item->title; echo "</a><br />"; echo "&nbsp;&nbsp;".$item->description; echo "<br />"; } ?> Nousobtenonsceci :

- 8-

ENI Editions - All rights reserved - Algeria Educ

c.RSSvolu
LefluxRSSpeutcontenirdiffrentesinformationssupplmentairesouuneprsentation,commedesicnesBien sr,ilesttoutfaitpossibledegnrerlefichierlamain.Cependant,ilexistedepuisdenombreusesannesdes bibliothquescompltementintgresdanslePHP.NousallonsvousmontrercommentutilisermagpieRSS. Ilenexistedautres,maiscelleciestlaplusconnuecarcestunedesplusanciennes. La classe magpieRSS fonctionne avec toutes les versions de PHP et permet de crer et de lire les fichiers RSS facilement. Vouspouveztlchargerlesfichierssurleliensuivant :http://magpierss.sourceforge.net/ Maislaclasseseradjinstallepourlexemplequivasuivre,sivousnesouhaitezpaseffectuercettemanipulation (danslesfichiersmisdispositionentlchargement). NousallonsinclurelaclasseMAGPIERSS : rss/ex3_rss.php <?php require_once("magpierss/rss_fetch.inc"); ?> Nousprparonslaprsentationquenousvoulonsaffichersouslaformedunefonction. Cettefonctionsedcomposecommececi :
G

NouslisonslefluxXML. Sinousavonspulirelefichier,nousvrifionsquilabientinsrdansuntableau. Nousrcupronsleslmentslesplusrcentsennouslimitantaux5derniers. NousprparonslesdiffrentsaffichagesauformatHTML.

ENI Editions - All rights reserved - Algeria Educ

- 9-

<?php function FluxRSS($url_feed, $nb_items_affiches=5) { $rss = fetch_rss($url_feed); if (is_array($rss->items)) { $items = array_slice($rss->items, 0, $nb_items_affiches); $html = "<ul>\n"; foreach ($items as $item) { $html .= "<li>"; $html .= "<a href=\"".$item[link]."\">"; $html .= $item[title]."</a></li>\n"; } $html .= "</ul>\n<br><br>"; } return $html; } ?> Pour afficher les diffrents flux qui nous intressent, nous ajoutons directement le lien de la page internet, par exemplelesderniresactualitsdephp.netetdelafup.orgcommececi : <?php echo "PHP<br>"; echo FluxRSS("http://www.php.net/news.rss"); echo "<br>AFUP : <br>"; echo FluxRSS(http://www.afup.org/pages/site/rss.php"); ?> Pourlersultatsuivant :

CetexempledutilisationdefluxRSSpeuttreinsrdansnotreapplicationpourpermettreauxvisiteursdenotre siteInternetdtreaucourantdesactualits.

- 10 -

ENI Editions - All rights reserved - Algeria Educ

ExtensionJson
1.Introduction
LextensionJSON(JavaScript Object Notation)existedepuislaversion5.2dePHP.Ilsagitdun format dchangede donnes entre le navigateur et le serveur. Cette extension prend de plus en plus dimportance avec les diffrents modesdecommunicationentrelessites,entrelesformatscommelesfichiersflash(SWF),maisestaussiutilisepar denombreuxmoteursderecherchecommeYahoo,Google. Cetteextensionatralisedanslebutdeffectuerdeschangesdedonnesentoutesimplicit.Laconceptionde ceformatestfacilecrireetlirepourlensembledesutilisateurs,commepourlesordinateurs.Ilsebasesurdeux structures :
G

unelistedecouplesnom/valeurcommeleproposedautresformats(XMLparexemple), unelistedevaleursordonnes.

2.Structure
LastructuredunfichierJSONeststricte,ilestncessairederespecterlasyntaxe : { nom : valeur } Commelemontrelastructurecidessus,lecontenudunelignereprsenteuneligne membre ,cestpourquoinous pouvonsmettreplusieursligneslasuite,aveclafindechaqueligneunevirgule,commececi : { nom : valeur , nom : valeur , nom : valeur } Ceformatpeutcontenirdesvaleursentableaux,permettantdenvoyerdesinformationsstructures. { nom : valeur , data : [ { nom : action }, { nom : action } ] } RalisonsunpetitexempledeformatJSONaveclelangagePHP,enutilisantlesfonctionssuivantes : Json_encode() :retournelaprsentationJSONdunevaleur. Json_decode() :dcodeunechaneJSON. Json/exemple1.php <?php

valeur , : valeur

valeur , : valeur

ENI Editions - All rights reserved - Algeria Educ

- 1-

$arr = array ( a=>Les editions ENI, b=>Christophe Villeneuve, c=>2007-2009); echo json_encode($arr); ?> Voicilersultatquenousobtenons :

Pour dcoder le rsultat obtenu, nous prenons le rsultat de lexercice prcdent et nous utilisons lautre fonction proposeparPHP :json_decode : Json/exemple2.php <?php $json = {"a":"Les editions ENI","b":"Christophe Villeneuve","c":"2007-2009"}; echo "<pre>"; var_dump(json_decode($json, true)); echo "</pre>"; ?> Nousajoutonslafonctionjson_decodeunevaleuroptionnelle true ,signifiantquenoussouhaitonsobtenirun rsultatsouslaformeduntableauassociatif. Voicilersultatquenousobtenons :

- 2-

ENI Editions - All rights reserved - Algeria Educ

3.Basededonnes
a.Gnralits
Pourillustrerlutilisationdeceformatdansnotreapplication,nousallonsnousconnecterunebasededonnes pour afficher le nom et le prnom qui seront extraits de la table exemple . Ralisons cet exemple avec une connexionMySQLi : Json/exemple3.php <?php $serveur = "localhost"; $user= "root"; $passwd = ""; $bdd = "ouvrage"; $connex = mysqli_connect($serveur, $user, $passwd, $bdd); if (mysqli_connect_errno()) die ("Echec de la connexion : ". mysqli_connect_error()); ?> PourcrerleformatJSON,nousallons,parlintermdiaireduneboucle,prparerlecontenuquenousmmorisons dansuntableau.Ensuite,nousencodonsnotretableauenJSON : <?php $sql="select nom,prenom from exemple "; $result = mysqli_query($connex, $sql); $tableau = array(); while($obj = mysqli_fetch_object($result)) { $tableau[] = $obj; } $json= {"personne":.json_encode($tableau).};
ENI Editions - All rights reserved - Algeria Educ - 3-

print_r ($json); ?> Nousfermonslaconnexionquandnousavonstermin : <?php mysqli_close($connex); ?> Voicilersultatquenousobtenons :

Cetexempleatinspirdelexemple2dudossierXML(fichierxml/exemple2.php),vouspourrezainsicomparerles deuxfaonsdobtenirlemmersultat.

b.Miseenpratique
Dansnotreapplication,nousallonsexporterauformatJSONlesdonnesducarnetdadresses. Ici,nousallonsdemanderauserveurdedonneslescoordonnesdenotrecarnetdadressesquiserontenvoyes auformatJSON.Nouslesrcupreronspourafficherlersultatducontenu. Biensr,nousavonsplusieurspossibilitsdexportationcommeuneexportationpartirdunfichier. Pour information, cette partie est aussi disponible avec les formats MySQL et PDO disponibles en tlchargementsurlesitedelditeur. Pour commencer, nous allons prparer la requte SQL pour slectionner les adresses qui appartiennent au bon carnetdadressesetauboncompte : Fichier : export-json.php <?php $sql="select carnet.*,carnet.id as idlinks,user.id,user.idclef FROM carnet,user WHERE user.id=carnet.iduser AND carnet.iduser=".$_SESSION[iduser]."

- 4-

ENI Editions - All rights reserved - Algeria Educ

AND user.idclef=".$_SESSION[idclef]." "; $qid = mysqli_query($connex,$sql); if (!$qid) ?> Sinoustrouvonsdesinformations,nouspouvonsconstruirelesdonnespourlesproposerauformatJSON. Pourlexplication sur la composition du JSON proprement dit, nous vous conseillons de vous reporter aux pagesprcdentes. die(Requte invalide : . mysqli_error($connex));

<?php if (mysqli_num_rows($qid)>0) { $_json = array(); while($obj = mysqli_fetch_object($qid)) { $_json[ ] = $obj; } $json= json_encode($_json); ?> Nous possdons maintenant une variable avec toutes les informations envoyes par le serveur au format JSON. Avantdelestraiter,nousfermonslaconnexionavecleserveur. <?php mysqli_close($connex); ?> Cette variable stocke les informations que nous venons dextraire. Pour voir le principe dutilisation, nous allons privilgierledcodageenJSONpourafficherlersultatdansuntableauHTML. Pourcommencer,nousdcodonslavariableenluispcifiantquenousavonsbesoinduntableauassociatif : <?php $resultat=json_decode($json, true); ?> Ensuite,nousprocdonslaffichagedenotretableauHTMLavecuneboucleFOREACH. PourlutilisationdelafonctionFOREACH,nousvousconseillonsdevousreporterauxpagesconcernesde cetouvrage(cf.chapitreLaprparationdudveloppementLesbasesdulangagePHP).

<table border="1" width="100%"> <tr> <td>Nom</td> <td>Prenom</td> <td>Adresse1</td> <td>Adresse2</td> <td>Code Postal</td> <td>Ville</td> </tr> <?php foreach ($resultat as $cle=>$row) { echo "<tr>"; echo "<td>".$row[nom]."</td>"; echo "<td>".$row[prenom]."</td>"; echo "<td>".$row[adresse1]."</td>"; echo "<td>".$row[adresse2]."</td>"; echo "<td>".$row[codepostal]."</td>"; echo "<td>".$row[ville]."</td>"; echo "</tr>"; }
ENI Editions - All rights reserved - Algeria Educ - 5-

?> </table> Pourobtenirlersultatsuivant :

- 6-

ENI Editions - All rights reserved - Algeria Educ

HTAccess
LafonctionHTAccessestunfiltreutilisparlesserveursApache.Ellepermet :
G

laprotectiondedossiers laredirectiondadresseInternet lagestiondeserreursdepages(ErrorDocument)

1.Protectiondedossiers
Laprotectiondundossierconsisterserverlaccsunrpertoireuniquementcertainespersonnesmuniesdun identifiant(login)etdunmotdepasse(password).Laprotectiondundossierseffectueviadeuxfichiers :
G

.htaccess .htpasswd

Le fichier .htaccess contient ladresse du fichier .htpasswd avec la possibilit dinsrer quelques options si vous le dsirez. Le fichier .htpasswd contient les identifiants des personnes qui peuvent accder au rpertoire protg. Nous y trouveronsleloginetlemotdepassedechaquepersonne. Voicicequedoiventcontenirlesdeuxfichiersenquestion : protection/.htaccess AuthName "Accs protg" AuthType Basic Require valid-user AuthUserFile /opt3/local/apache/htdocs/votresite/.htpasswd Danslexemplecidessus,deuxlignespeuventtrepersonnalises :
G

AuthName :ilsagitdumessagedalertedemandantauvisiteurderemplirlescasesduformulaire. AuthUserFile :ilfautmettrelechemincompletdufichier.htpasswd

Denombreuxhbergeursproposentlacrationautomatiquedecesfichierspartirduneinterface.Vousdevrezvous rendresurvotrecomptepourvisualiserlesoptionsetleparamtrage. Sivotrehbergeurneproposepascegenredoption,ilesttoutfaitpossibledetrouverlechemincompletavecune petitefonctionPHP. realpath Retournelechemincanoniqueabsolu. protection/chemin.php <?php echo realpath(chemin.php); ?>

ENI Editions - All rights reserved - Algeria Educ

- 1-

Nousdevonsnotertoutlecheminsauflenomdufichiercommenousleprsentelexempleprcdent.Nousdevons ensuitepensersupprimercefichierdurpertoirecarilnestpasutiledelelaisserdansledossier. Concernantlautrefichier voicicommentilestcompos : protection/.htpasswd login : Xfv46GgHz test : nKd4g94qz Pourchaqueligne,ilestdterminlidentifiantetsonmotdepasse.Cemotdepassepeuttrecrypt(commeau dessus). Lefichier.htpasswddoittoujourssetrouveraccompagndufichier.htaccess.

2.Redirectiondadresse
a.Prsentation
LerfrencementdunsiteInternetnestjamaisvidentpourtrebienpositionndanslesmoteursderecherche. Laredirection(appeleaussirewriting),permetdoptimiserlapositiondevotresiteInternetdanslesmoteursde recherche.Cettetechniquenevapasvousassurerlapremireposition,maisungainauniveaupositionnement. LeprincipedurewritingestdercrireuneadresseInternet(URL)complexeenuneadressedynamiqueplusclair.

- 2-

ENI Editions - All rights reserved - Algeria Educ

Lors de la navigation dans le site Internet, nous http://nomdusite.com/exemple.php?id=1&code=3&ligne=4&valide=1

pouvons

trouver

ce

genre

lURL :

Ce type de lien peut tre trs long cest pourquoi il est intressant de raliser, grce la redirection, la prsentationdelURLcommececi :http://nomdusite.com/exemple1341.html

b.ConfigurationduserveurApache
LorsquenousconsidronsPHPetlarcrituredURL,leserveurleplusutilissetrouvetreApache,cestpourquoi ilestncessairedtudiercommentleconfigurer. Habituellement,laconfigurationdunserveurApachenestpasncessairecarlensembledeshbergeursproposent cettetechniquepardfaut. Surunserveurlocalhost,ousivouspossdezunserveurddi,ilestncessairedeffectuercetteconfiguration. Pour activer ce mode sur un serveur Apache, nous devons diter le fichier httpd.conf et activer les deux lignes suivantes :
G

LoadModulerewrite_modulemodules/mod_rewrite.so AddModulemod_rewrite.c

Puis,redmarrerleserveur. Ensuite,nousdevonscrerunfichier.htaccess : rewriting/.htaccess Options +FollowSymlinks RewriteEngine on RewriteRule ^exemple\.html$ /exemple.php [L] Nousdevonsmettrecefichier.htaccesslaracinedenotreespace,commececinoussaisissonsladressesuivante http://votresite.com/exemple.html. LeserveurApachevatraduirecelienenhttp://votresite.com/exemple.php Bien sr, il est possible lorsque nous accdons une page Internet, de voir des informations comprenant des valeursaprsle"?".Nousallonsenvoyercommeinformationceci: Id=1 Code=3 Ligne=4 Valide=1 PourobtenircommelienURLceci : <html> <body> <a href=details-1-3-4-1.html>Cliquer ici</a> </body> </html> Lorsquelevisiteurauraslectionnlelien,nousrechargeronslapageaveccescritres. Leserveur,parlintermdiairedufichier.htaccess,vainterprtercelienenletraduisantcommececi : details.php?id=1&code=3&ligne=4&valide=1 Pourconvertircelien,nousinsronsdanslefichier.htaccesslalignesuivante : rewriting/.htaccess Options +FollowSymlinks RewriteEngine on

ENI Editions - All rights reserved - Algeria Educ

- 3-

RewriteRule ^details-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /details.php?id=$1&code=$2&ligne=$3&valide=$4 [L] Cettelignederedirectioncomprendcertainscritresconnatre :


G

^ :dtermineledbutdelurlrcrire. () :sertencadrerunevaleur. [09]+ :lavariablepossdeunouplusieurschiffres. [L] :arrtdelalignederedirection.

En rsum, les dlimitateurs de valeurs sont dfinis par le symbole "". Dans la premire partie, nous envoyons quatrevaleursentrantes.Cestpourquoinousdevonsobtenirquatrevaleurssortantesreprsentespar$1,$2,$3 et$4. Dautressymbolespeuventtreutiliss :
G

[az] :dterminelescaractresalphabtiques(lettres), (.*) :autorisetoustypesdevaleurs(chiffresetlettres).

c.Utilisation
Nouspouvonsutilisercettetechniquedansnotreapplicationpourviterdedonnertropdinformationdanslabarre denavigation. Nousallonsprendreunexemple,commelapartie"VotreCarnet"etlesousmenu"Consult/Modif". echo "<td><a href=carnet-view-edit-".$row->carnetclef." class=links> Cliquez ici</a></td>"; Lorsquenousslectionnonsunedeslignes,leserveurApachevaretraduireleliengrceaufichier.htaccess : Options +FollowSymlinks RewriteEngine on RewriteRule ^.*carnet-view-edit-(.*)\.html$ /carnet-view-edit.php?carnetclef=$1 [L] Commececi,leserveurtraduiralabonnepageetsedirigeraverslabonnefiche.

3.Gestiondeserreursdepage(ErrorDocument)
Ilsagitlencoredutiliserlefichier.htaccesspourgrerlesdiffrenteserreurssusceptiblesdtrerenvoyesparle serveurApache.Lerreurlaplusfrquenteestlerreur404quisignalequelapagenexistepas. LadirectiveappeleErrorDocumentpossdeuncertainnombredecodes,permettantdedfinirletypedeproblme. Lesprincipauxproblmesquenouspouvonsrencontrersont :
G

Erreur401 :levisiteurnapassaisilesbonscodesdidentification. Erreur403 :leserveurnapasledroitderpondrelarequte. Erreur404 :leserveurnapastrouvlapageInternetdemande. Erreur500 :erreurinterneduserveur.

Ilexistedautrestypesderreursquinesontpastraitsdanscelivre. Pourcommuniqueravecleserveuretdoncutiliserceserreurs,nousdevonsplacerlaracinedenotresiteInternetle fichier.htaccesspourquilvrifielesdemandesdesutilisateurs.

- 4-

ENI Editions - All rights reserved - Algeria Educ

htaccess/.htaccess RewriteEngine on # les erreurs ErrorDocument ErrorDocument ErrorDocument ErrorDocument

401 403 404 500

/error.php?err=401 /error.php?err=403 /error.php?err=404 /error.php?err=500

Lorsqueleserveurrepreuneerreurquenousavonsdtermine,ilvaexcuterautomatiquementlapagequenous avonsdfinie.Ici,ilsagitdelapageerreur.php. Nousenprofitonspourenvoyerlenumrodelerreur,cequinouspermetdafficherlebonmessage. NousrcupronslavaleurquinousestenvoyeparlintermdiairedelURLetnousmmorisonsnotresiteInternet : htaccess/error.php <?php if (isset($_POST[err])||!empty($_POST[err])) $url="http://www.notre_site.com"; ?>

$err = $_POST[err];

Nous allons rcuprer lerreur pour dfinir le bon message. La technique utilise cidessous a t tudie dans le chapitreLaprparationdudveloppementLesconditions. <?php switch($err) { case "401"; $msg = "Authetification ncessaire<br>"; $msg .= "Votre IP : ".$_SERVER[REMOTE_ADDR]."<br>"; break; case "403": $msg = "La page ".$_SERVER[REQUEST_URI]." est en accs interdit<br>"; $msg .= "Votre IP : ".$_SERVER[REMOTE_ADDR]."<br>"; $msg .= "<ADDRESS>Apache/1.3.33 Server at ".$_SERVER[HTTP_HOST]." Port 80</ADDRESS>"; break; case "404"; $msg = "Erreur<br>"; $msg .= "La page ".$_SERVER[REQUEST_URI]." demande nexiste pas<br>"; $msg .= "Votre IP : ".$_SERVER[REMOTE_ADDR]."<br>"; break; case "500"; $msg = "Erreur interne du serveur<br>"; $msg .= "Votre IP : ".$_SERVER[REMOTE_ADDR]."<br>"; break; } ?> NousaffichonslemessagederreurdansunepageHTMLclassiqueavecunlieupermettantderetournersurlesite directement. <html> <head></head> <body> <?php echo $msg."<br>"; ?> <br> Retour sur le site : <a href="<?php echo $url; ?>"><?php echo $url; ?></a> </body></html>

ENI Editions - All rights reserved - Algeria Educ

- 5-

ExtensionFilter
LextensionFilterexistedepuislaversion5.2dePHP.lavenir,cettefonctionprendradeplusenplusdeplacedans lesfutursdveloppements. Cetteextensionpermetdevalideretdefiltrerlesdonnesprovenantdesourcesnonscurisescommeparexemple lasaisiedanslesformulairesouunlienInternet. Pourscuriserlavaleurdechampdesaisie,etviterdefairesoimmelesfonctionsdetestetdecontrlepartirdes fonctions dj existantes de PHP comme les expressions rgulires (cf. chapitre La prparation du dveloppement Expressionrgulire),nousallonspouvoireffectuerlammechosemaisavecquelquesnouvellesfonctions. Cette extension permet de simplifier la validation des formulaires pour les dveloppeurs PHP en proposant une interfacestandardavecdenombreusesfonctions.numronslesprincipales : Filter_validate_int:Valeurdunentier Filter_validate_flot:Nombreflottant Filter_validate_regexp:Expressionrgulire Filter_validate_url:URL Filter_validate_email:Email Filter_validate_string:String Nousallonsentudierquelquesunes,parexemple:Filter_input,Filter_var.

1.Filter_input
Cettefonctionvanouspermettredevaliderlesdonnesprovenantdelasaisiedunformulaire : filter_input ( type, nom du champ [, nom du filtre [,options]] )
G

type :dtermineletypedercuprationdesdonnes(GET,POST,Cookie,Server...) nomduchamp :lenomduchamp nomdufiltre :siunfiltrespcifiquedoittreobligatoirementexcut.

Ilexistedenombreusessourcesdeprovenance(url,cookie,server...)pourleparamtretype :
G

Input_get Input_post Input_cookie Input_server Input_env

Pour utiliser la fonction filter_input, tudions comment nous effectuons les tests actuellement et ensuite comment nouslefaisonsaveccettenouvellefonction. Nous allons tout dabord utiliser un formulaire classique, pour saisir par exemple un code postal ne contenant que deschiffres. filter/filter1.php

ENI Editions - All rights reserved - Algeria Educ

- 1-

<html> <body> <form name="saisie" method="POST" action="filter1.php"> Code Postal <input name="codepostal" type="text"><br /><br /> <input name="Confirmer" type="submit" value="Confirmer"> </form> </body> </html> Lorsdelavalidationduformulaire,nouseffectuonsuncertainnombredetestscommececi : filter/filter1.php <?php if (sizeof($_POST) > 0) { echo "Resultat : ".$_POST[codepostal]."<br>";

if (empty($_POST[codepostal]) && isset($_POST[codepostal]) echo "champ obligatoire"; elseif ( !is_numeric($_POST[codepostal]) && (intval(0 + $_POST[codepostal]) == $_POST[codepostal]) ) { echo (Le champ ne correspond pas au format demand"); } else { echo "test russi"; } } ?>

Aveccestests,nousavonsvrifisilechampcontientbienunevaleur.Ensuitenousavonstestlavaleurduchamp, cestdirevrifiquilnepossdebienquedeschiffres sicenestpaslecas,unproblmeserasignal. Pourfinir,sitoutsestcorrectementdroul,nouspouvonsconsidrerquelechampestdunformatcorrect. Nousallonsmaintenanteffectuerlesmmestestssurlemmeformulairedesaisie,maisaveclafonctionfilter_input. filter/filter2.php <?php if (sizeof($_POST) > 0) { $resultat=filter_input(INPUT_POST, codepostal, FILTER_VALIDATE_INT); if(is_null($resultat)) echo "Champ obligatoire"; elseif($resultat === false) echo "Le champ ne correspond pas au format demand"; else echo "test russi"; } ?> Lersultatestidentique,laseulediffrencecesontleslignesdecodeutilises.

2.Filter_var
Ilestpossibledefiltrerunevariableavecunfiltrespcifique : filter_var (nom du champ [, nom du filtre [,options]] ) Nomduchamp Lenomduchampdelavariable.

- 2-

ENI Editions - All rights reserved - Algeria Educ

Nomdufiltre Siunfiltrespcifiquedoittreobligatoirementexcut. Nous allons effectuer un test sur une variable par exemple le contrle dun email. Si le contrle de lemail ne correspondpasauformatstandard,nousobtenonsunformatinvalidecommececi : filter/filter3.php <?php $e-mail = "livre@exemple.com"; if(!filter_var($e-mail, FILTER_VALIDATE_EMAIL)) echo "Erreur format Email"; else echo "Email valide"; ?>

3.Filteravecuneexpressionrgulire
Ilestpossibledutiliserlesexpressionsrguliresaveclextensionfilter. Nous allons reprendre lexemple que nous avons utilis dans la partie consacre aux expressions rgulires. Nous effectuonsdenouveauuntestpourobtenirleslignescommececi : filter/filter4.php <?php $chaine = Un diteur de qualit Editions ENI; $expression="[Editions]"; if(filter_var($chaine, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp" => $expression))) !== false) echo "Vrai"; else echo "Faux"; ?> Nousobtenonslersultatvrai,carlemot"Editions"setrouvebiendanslachanedecaractres.

4.ScuritavecFilter
Lorsque nous validons des donnes en provenance de lextrieur, il est ncessaire de prvoir un peu de scurit pourviteruncertaintypedattaque. filter/filter5.php <?php $chaine = <script type="text/javascript">alert("Editions ENI");</script>; echo filter_var($chaine, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES); ?> Nousavonslapossibilitdesupprimerlesbalisesquiauraientputreinjectespartirdundenosformulaires. Lersultat,cestquaulieudavoirsubiuneattaque,nousenprofitonspourscuriserlavaleurdelavariable.

ENI Editions - All rights reserved - Algeria Educ

- 3-

Cartographie
Quand nous parlons de cartographie, nous voquons un plan dynamique car dans cet ouvrage nous ralisons des applicationspourleWeb. La cartographie par lintermdiaire dun plan affiche une partie dune carte, mais nous avons la possibilit de nous dplacerpourvisualiserlespartiescaches. Pouraffichercespartiescachessansrechargerlapagecompltement,nousallonsfaireappelAjaxquiestorient Web2.0. LeWeb2.0correspondlasecondegnrationdelInternet.Ilseveuttreuneinteractionentrelesutilisateursetles rseauxdynamiques(servicesetapplicationsenligne).

1.Ajax
Ajax est une volution de Javascript qui propose une autre approche du dveloppement sur Internet. Ajax permet de :
G

Raliserunegestiondynamiquedesdonnesafficher. Manipulerlesdonnesfacilement(HTTPRequest). Uneprsentationvolue.

LesbasesdAjaxreposentsurdanciennestechnologiesmaisutilisentlesmoyensdecommunicationsmodernespour sepositionnercommeunlangagedynamiquepourlutilisateur,doncWeb2.0. Le principal attrait dAjax, est de mettre jour ou de modifier une partie de lcran sans tre oblig de recharger compltement la page Internet. Ce rafrachissement seffectue en arrireplan sans que lutilisateur attende le rechargementcompletdelapage. Celangageseveutplusprochedelutilisateuretplusrapide,cestpourcelaquelelangagePHPestsouventassoci Ajaxpourrpondreaumieuxsesattentes. Certainesapplications(API)sontsouventarrivesaupremierplancarellesutilisaientlelangagePHPetAjax,citons :
G

chatdynamique gestiondecontenudistant lesapplicationsdynamiquessurcertainstlphonesmobiles desframeworks descalendriers desorientationssouslaformedeplans(Maps).

NousneverronspascommentprogrammerenAjax.Parcontre,nousallonsutiliseruneapplicationdjexistanteet allonslafairecommuniqueraveclelangagePHP. Nousallonsutiliserlagestiondescartesdynamiquesetplusparticulirementlaplusconnue :GoogleMaps. GrcecetteAPI,etlapplicationquenousavonstudiedanscetouvrage,nousallonspouvoirsituerlespersonnes ducarnetdadressessurcescartes.

2.GoogleMaps
GoogleMapsproposeunoutilgratuitdecartographiesurInternet.Lacartographiepeuttreprsentesoustrois formes :

ENI Editions - All rights reserved - Algeria Educ

- 1-

unplansatellitairepourvoirlemondeentier, unplanroutierpourvoirlesruesetlesquartiers, unplanmixte(satellitaireetroutier).

Google Maps est bas sur une API en JavaScript, il permettra de zoomer ou de dzoomer, de se dplacer sur une carte,dajouterdespoints,desicnespersonnalises,etc.

a.Installation
Dansunpremiertemps,ilestncessairedepossderuncompteGoogle.Pourobteniruncompte,ilfautserendre surlapagesuivante :https://www.google.com/accounts/Login?hl=fr Ensuite, il est ncessaire dobtenir une clef Google. Celleci est gratuite, il suffit de sinscrire en vous rendant directementsurleliensuivant :http://www.google.com/apis/maps/signup.html LaclquivousserafournieseralieaveclenomdedomainedevotresiteInternet. Parexemplelegenredeclquinousestfourniequandnoussaisissonslenomdedomainehttp://hellodesign.fr est :ABQIAABAIbuN8MgvQLbcJrQi8lkpBRlXxZPnFaVh_97PJ47RT1LEJW2eVomAWSThx374GwcuRM3A Unepetiteremarquesurcetteclef :sivousnespcifiezpaslabonneclef,lAPInepourrapasfonctionneret vousserezobligdeffectuerunenouvelledemande.

b.Utilisationbasique
CetteAPIfournittoutlencessairepourraliseretafficherunecartepersonnalisesurvotresiteInternet. Pourcommencer,nousallonsafficherjusteunepartiedelacartedeFranceaveclapossibilitdenaviguerdansla carteaveclecontrleurdeMapgauchedelcranetaussiaveclasouris,dansunedimensionde400x300pixels. Nousobtenonslersultatsuivant :

Pouraffichercettecarte,nousutilisonslasourcecidessous. Toutdabord,ilestncessairedemettrelaclefque Googlevousafournielorsdelacrationdevotrecompte.Ensuite,vousdevezinsrerlecodeJavaScript,dfinipar


- 2 ENI Editions - All rights reserved - Algeria Educ

lesbalises<script></script>quipermetdeseconnectersurlescartesdeGoogle. googlemaps/exemple1.php <?php $clef="VOTRE CLEF"; ?> <html> <head> <title>Exemple 1 avec Google Maps</title> <script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key= <?php echo $clef; ?>" type="text/javascript"></script> </head> PourafficherlersultatdanslapageHTML,nousallonsutilisercertainesfonctionsnouspermettantdevisualiserla cartedemande :
G

DclarerunenouvellecartequiseplaceradanslabaliseDIVdelapageHTML. Dfinirunepositionenlongitudeetlatitude. DfinirunetailleauniveauduZoom. Afficherlabarredenavigationsurlagauche.

googlemaps/exemple1.php <body> <div id="map" style="width: 400px; height: 300px"></div> <script type="text/javascript"> //<![CDATA[ var map = new GMap2(document.getElementById("map")); var point = new GLatLng(48.9, 2.3); map.setCenter(point, 6); map.addControl(new GLargeMapControl()); //]]> </script> </body> </html> GoogleMapsproposedenombreusesfonctionsconcernantlagestionetlaffichagedunecartographie.Dcouvrons lesplusutilisesdecesfonctions :
G

Trouveruneposition(longitude,latitude):Point=newGLatLng(48.9,2.3) SepositionneraucentredunpointparrapportauZoom:map.setCenter(point,6) Bloquerledplacementdanslacarteparlasouris:map.disableDragging() Afficher une bulle avec un texte : map.openInfoWindow (map.getCenteg(), document.createTextNode ( votretexte )) Afficherlescontrlesduzoomenpetit:map.addControl(newGSmallMapControl()) Afficherlescontrlesduzoomengrand:map.addControl(newGLargeMapControl()) Ajouterdespositionssurlacarte:Varpoint=(newGlatLng(48.9,2.3,6) map.setCenter(newGlatLng(48.9,2.3,6) map.addOverlay(newGGMarker(point))

Afficherleformatdaffichage :Carte,SatelliteouMixte

ENI Editions - All rights reserved - Algeria Educ

- 3-

map.addControl(newGMapTypeControl())

Pour retrouver toutes les fonctions existantes, http://www.google.com/apis/maps/documentation/reference.html

accdez

la

page :

Nouspouvonsajouterunpointsurunecartepoursituerexactementosetrouveuneadresseouuneposition. Nousutilisonslemmeexemplequeprcdemmentaveclanouvellelignedecommande etenmodifiantlagrosseur duzoom : googlemaps/exemple2.php <div id="map" style="width: 500px; height: 400px"></div> <script type="text/javascript"> //<![CDATA[ var map = new GMap2(document.getElementById("map")); var point = new GLatLng(48.86, 2.3486); map.setCenter(point, 12); map.addControl(new GLargeMapControl()); map.addOverlay(new GMarker(point)); //]]> </script> Pourobtenirlersultatsuivant :

Nouspouvonsenplusdelapositiondupoint,marquerunmessagedindicationsupplmentaire. Parailleurs,nouspouvonseffectuerunaffichageenmodesatellitequiutiliseGoogleEarth(uneautreapplicationde Google) : googlemaps/exemple3.php //<![CDATA[ var map = new GMap2(document.getElementById("map")); var point = new GLatLng(48.9, 2.3); map.setCenter(point, 14,G_SATELLITE_MAP);
- 4 ENI Editions - All rights reserved - Algeria Educ

map.addControl(new GLargeMapControl()); map.openInfoWindow(point, document.createTextNode("Nous nous trouvons ici")); //]]> Etnousobtenonslersultatsuivant :

c.UtilisationavecPHP
Pourrevenirnotreapplication,nousallonsproposerauxtitulairesduncomptedepouvoirsituerlescontactsde leurcarnetdadressesenlespositionnantsurunecarte. Pourafficherlapositiongographique,nousutilisonslaclassefournieparGoogle :GoogleMapAPI.class.php Aumomentdelardactiondecelivre,laversionutilisecorrespondlaversion2.4. Pourvisualiserleplan,lutilisateurdevraslectionnerlesousmenuConsult/ModifdumenuCarnetetslectionner uneentre.Unefoissurlaficheducontact,ilestpossibledeffectuerlesmodificationsdecoordonnes.Lorsquilse trouverasurcettepage,ilpourraaccderauplandegoogleMaps. Voicilersultatobtenu:

ENI Editions - All rights reserved - Algeria Educ

- 5-

PourobtenircersultatenPHP,nousallonsutiliserlaclassequenousvenonsdercuprer.Nouspouvonsutiliser lammeclefquedanslespagesprcdentes. <?php require_once(include/GoogleMapAPI.class.php); $clef="VOTRE CLEF"; ?> NousutilisonsPHPetnouscronsunobjetcarteavecunelargeurethauteurprcise. <?php $map = new GoogleMapAPI(map,map); $map->setAPIKey($clef); $map->setWidth("600"); $map->setHeight("400"); ?> Nousdterminonsletypedaffichageenaffichantlemenupourslectionnerlaprsentationenformedecarte,par satelliteoulesdeux. Nousaffichonsenmmetempsunepetitecarteenbasdroitepouravoirunevueunpeuplusloigne. <?php $map->setMapType(map); $map->enableOverviewControl(); ?> Nous prparons les coordonnes postales avec les mmes critres que pour ldition de la fiche. Ici, il sagit de lutilisationavecunebasededonnesMySQL(lesapplicationsaveclesformatsMySQLietPDOsontdisponibleen tlchargementsurlesitedelditeur). <?php $sql="select carnet.*,user.id,user.idclef FROM carnet,user WHERE user.id=carnet.iduser AND carnet.carnetclef=".$carnetclef." AND carnet.iduser=".$_SESSION[iduser]." AND user.idclef=".$_SESSION[idclef]." ";

- 6-

ENI Editions - All rights reserved - Algeria Educ

assert (mysql_query($sql)); $qid = mysql_query($sql); if (!$qid) die ("Probleme : " . mysql_error()); ?> Nousmmorisonslesinformationssousunecertaineformepourdfinirunpointdemarquageetletexteassoci cepoint.Iciilcomprendlenometprnometlenumrodetlphone. <?php $row=mysql_fetch_object( $qid); $adresse=$row->adresse1.", ".$row->codepostal.", ".$row->ville; $autre=$row->nom." ".$row->prenom."<br>Tel : ".$row->tel; $map->addMarkerByAddress($adresse,$titre,$autre); ?> Lorsquenousavonsprpartouteslesinformations,nouspouvonschargerlAPIdanslapageHTML. <?php $map->printHeaderJS(); $map->printMapJS(); $map->printMap(); ?> Lestroislignescidessuspermettentdepositionnercorrectementladressequenousavonsretenue. Ilexistedenombreusesautresfonctionsquisontfourniesaveccetteclasse,maisnousvouslaissonslesoindeles dcouvrir.

ENI Editions - All rights reserved - Algeria Educ

- 7-

Lesfonctionsparticulires
Nous ne saurions clturer cet ouvrage sans aborder certains aspects plus gnraux de php. Il sagitdlments qui sontconnatrepourlensembledesdveloppements,etquelquesoitltatdavancementdevotreprojet :
G

avantdecommencer pendantledveloppement lorsdelamiseenproduction.

1.PHPINFO
Lafonctionphpinfo()permetdobtenircertainesinformationssurvotreenvironnement,votreserveuretlaversiondu langageutilise. phpinfo AffichedenombreusesinformationssurPHP. particularite/phpinfo.php <?php echo phpinfo(); ?> Lersultatseraobtenusouslaformeduntableaucommecidessous.Nousnexpliqueronspastoutesleslignes,car lersultatesttrsvolumineuxetfournitdenombreuseslignesdefonctionsetdaccs.

Cette fonction est utiliser avec prcaution car elle affiche beaucoup dinformations sur le serveur et aussi sur le visiteur. Elle sera utile pour connatre exactement les fonctions disponibles sur le serveur. Mais lorsque nous connaissons les possibilits des fonctions, et donc avant de mettre en ligne le site internet, il est prfrable de supprimercettelignecarellepourraittreutilisepourdesattaquesmalveillantes.Leslignesquinousintressentle pluscorrespondent :
G

lalanguedelordinateurquiestlaplusutilise lenavigateur

ENI Editions - All rights reserved - Algeria Educ

- 1-

laversiondePHP lesbasesdedonnesacceptes lIPduvisiteur lAdressedeprovenance.

CettefonctionPHPINFOestunefonctiondoubletranchant:elleesttrscomplte,donctrsutile,maisellepermet devrifierlersultatparrapportauxdiffrentesfonctionsPHPpouvantexister.

2.Informationsduserveur
LesinformationsprovenantduserveurpeuventtreutilisesgrcediffrentesfonctionsspcifiquesduPHP.Cela nous permet dobtenir des lments utiles qui seront ncessaires dans un cas prcis. Ces fonctions peuvent aussi permettredexcutercertainesmanipulationsoudirectionsversuneautrepageInternet. Nous avons dj tudi certaines dentreelles dans cet ouvrage, nous allons les revoir mais aussi en dcouvrir dautres. PHP_SELF Cette fonction est souvent utilise pour le dveloppement et la gestion des formulaires. Elle scrit de la faon suivante : $_server[PHP_SELF] Dans ce livre, nous utilisons souvent cette fonction car lors du dveloppement avec des formulaires nous sommes souventobligsderechargerlapagepourcontrlerlesdonnessaisies. Lavantage de cette fonction est de recharger la page en cours, sans chercher savoir si le nom de fichier qui se trouve dans la page Internet est le bon. Si nous dcidons de changer le nom de la page, il serait ncessaire de mettrecenouveaunomlaplaceetpourvitercegenredemanipulations,cettefonctionlefaittoutseul. HTTP_POST Cettefonctionaffichelhte,cestdirelenomdenotreespaceWeb.Ellescritdelafaonsuivante : $_SERVER[HTTP_POST] HTTP_REFERER Cettefonctionaffichelaprovenancedevotrevisiteur.Ellescritdelafaonsuivante : $_SERVER[HTTP_REFERER] DOCUMENT_ROOT Cette fonction affiche le rpertoire racine de larborescence des documents sur le serveur. Elle scrit de la faon suivante : $_SERVER[DOCUMENT_ROOT] QUERY_STRING Cettefonctionaffichelecontenudelachanequisuitlurldelapage.Cestdiretoutcequisetrouveaprslepoint interrogation ? .Ellescritdelafaonsuivante : $_SERVER[QUERY_STRING] REQUEST_METHOD Cettefonctionpermetdeconnatrelamthodeutiliselorsdelenvoidesdonnespartirdunformulaire.Ellescrit delafaonsuivante : $_SERVER[REQUEST_METHOD] REMOTE_ADDR

- 2-

ENI Editions - All rights reserved - Algeria Educ

Cettefonctionpermetdeconnatreladresseipdelamachinequutiliselevisiteur.Ellescritdelafaonsuivante : $_SERVER[REMOTE_ADDR] [REQUEST_URI Cettefonctionpermetdeconnatrelecheminduscript.Ellescritdelafaonsuivante :$_SERVER[REQUEST_URI] Nouspouvonsmontrercommentobtenircesinformations,grceunpetitscript : particularite/serveur.php <?php echo "Hote : ".$_SERVER[HTTP_POST]."<br>"; echo "Provenance : ".$_SERVER[HTTP_REFERER]."<br>"; echo "Racine du serveur : ".$_SERVER[DOCUMENT_ROOT]."<br>"; echo "Paramtres : ".$_SERVER[QUERY_STRING]."<br>"; echo "Methode : ".$_SERVER[REQUEST_METHOD]."<br>"; echo "IP : ".$_SERVER[REMOTE_ADDR]."<br>"; echo "Chemin : ".$_SERVER[REQUEST_URI]."<br>"; ?>

3.Lesvisiteurs
Lorsquune personne accde notre site Internet, il est parfois utile de disposer de certaines informations comme sonenvironnementousaprovenancerelle. Cequisuitprsenteunaperuglobal,carcesontdespointsquionttdjabordsdanslouvrage.Nouspouvons considrerquilsagitdunpetitrsum,quenouspouvonsinsrersansproblmedansnosdiffrentesapplications. particularite/visiteur.php <?php echo "DNS: ".gethostbyaddr($_SERVER[SERVER_ADDR])."<br>"; echo "Serveur ip : ".$_SERVER[SERVER_ADDR]."<br>"; echo "adresse ip visiteur: ".$_SERVER[REMOTE_ADDR] ."<br>"; echo "adresse de la page : ".$_SERVER[REQUEST_URI]."<br>"; echo "chemin complet du script: ".$_SERVER[PATH_TRANSLATED] ."<br>"; echo "navigateur: ".$_SERVER[HTTP_USER_AGENT] ."<br>"; echo "nom de domane: ".$_SERVER[HTTP_HOST] ."<br>"; echo "langage: ".$_SERVER[HTTP_ACCEPT_LANGUAGE] ."<br>"; echo "DOCUMENT_ROOT : ".$_SERVER[DOCUMENT_ROOT]."<br>"; echo "Protocol : ".$_SERVER[SERVER_PROTOCOL]."<br>"; echo "Accept : ".$_SERVER[HTTP_ACCEPT]."<br>"; ?> Nousobtenonslersultatsuivant :

ENI Editions - All rights reserved - Algeria Educ

- 3-

- 4-

ENI Editions - All rights reserved - Algeria Educ

UTF8
1.Introduction
Danslouvrage,certainespagessignalentlutilisation de la norme UTF8.Cettenormese rpandnormmentpour permettre de communiquer entre diffrents sites internet qui se situent dans diffrents pays, avec des langues diffrentesdelalanguefranaise. LanormeUTF8permetderemplacerlesdiffrentsencodagesISOeuropenspouvantexister.Lechoixdunenorme setrouvesouventlilutilisationdescaractresspciauxetdescaractresaccentus.

2.Gnralits
Lorsquunenormeestretenue,elleestsouventlielaconfigurationdhbergementduserveur.Cettenormepeut tremodifiegrceauxdveloppements. PourimposerUTF8auxnavigateursdesinternautes,nouspouvonsinsreruneligneHTMLspcifique,commececi : Utf-8/exemple1.html <html> <head> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"/> </head> <body> Mode UTF-8 </body> </html> oudelafaonsuivante : Utf-8/exemple2.php <?php header (Content-type: text/html; charset=UTF-8); echo "Mode UTF-8"; ?> Lorsque nous vrifions lencodage de notre navigateur, nous pouvons lui imposer la norme ISO qui est utilise en Europeetlancernotreexemplecidessus. Lersultatobtenuestlesuivant :

ENI Editions - All rights reserved - Algeria Educ

- 1-

La norme actuellement utilise en PHP est la norme ISO. En PHP 6, la norme dencodage sera UTF8 permettantainsidecommuniquerentrelesdiffrenteslanguesdechaquepays.

3.Miseenpratique
a.Vrification
Nouspouvonsvrifierlanormeprsentesurnotreserveureneffectuantcepetittest : Utf-8/exemple3.php <?php echo "Caractres accepts :".$_SERVER[HTTP_ACCEPT_CHARSET]."<br>"; ?> Pourobtenirlersultatsuivant :

- 2-

ENI Editions - All rights reserved - Algeria Educ

b.Identifications
Lorsque nous excutons une page web, nous pouvons obtenir laffichage de caractres diffrents suivant linterprtationetlaconfigurationdenotreordinateur. Lescaractresseprsententsousdiffrentesformes :
G

"","",""... :lenregistrementdesdonnesestauformatUTF8etnotrenavigateurafficheauformat ISO. "?" :lenregistrementdesdonnesestauformatISOetnotrenavigateurafficheauformatUTF8.

c.Manipulations
Lesmanipulationsdesnormesdecodagessontpossibleslorsquelesdonnesproviennentdenormesdiffrentes commelorsdelutilisationdunebasededonnes. Lesfonctionsdisponibles : utf8_encode() :convertitunechaneISO88591enUTF8. utf8_decode() :convertitunechaneUTF8enISO88591. Ellessutilisentdelafaonsuivante : Utf-8/exemple4.php <?php $chaine="Les ditions ENI : Caractres accepts "; echo $chaine."<br>"; $chaine_encoder=utf8_encode($chaine); echo $chaine_encoder."<br>"; ?> Nousobtenonslersultatsuivant :

ENI Editions - All rights reserved - Algeria Educ

- 3-

- 4-

ENI Editions - All rights reserved - Algeria Educ

cURL
cURL signifie "client URL Request Library" et possde une interface en ligne de commande destine rcuprer le contenu dune ressource accessible sur le Web. Grce cette extension, nous pouvons changer des donnes provenantdediffrentssitesInternet(Twitter,Facebook...).

1.Gnralits
LextensioncURLnestpastoujoursdisponibleaveclaversiondePHPquevousutilisez.Poursavoirsicetteextension estdisponible,nousallonseffectuerunpetittest : Particularit /phpinfo.php <?php echo phpinfo(); ?> Lutilisation de cette fonction est dcrite dans louvrage et il est conseill de relire cette partie (cf. section PHPINFO). Lersultatquenousobtenonsvanouspermettredetrouverlalignereprsenteparlcransuivant :

Si nous ne voyons pas la ligne, nous devons diter le fichier php.ini qui est disponible sur notre serveur local et enleverle devantlalignephp_curl. Attentionsurchaquesystmedexploitation,lesextensionssontdiffrentes:Mac:extension=php_curl.so, Windows:extension=php_curl.dll,Linux:extension=php_curl.so Aprs avoir supprim le pointvirgule de la ligne, nous sauvegardons et relanons notre serveur pour que cette modificationsoitpriseencompte. Nousallonsvrifierquenotreextensionfonctionneenutilisantlesfonctionssuivantes : curl_init() :initialiseunesessioncURL. curl_setopt() :dfinituneoptiondetransmissioncURL. curl_errno() :retournelederniermessagederreurcURL. curl_exec() :excuteunesessioncURL. curl_close() :fermeunesessioncURL. Pourobteniruncodesourceexemplecommeceluici : Curl/curl.php <?php $chemin = curl_init("http://www.php.net/"); curl_setopt($chemin, CURLOPT_RETURNTRANSFER, true);

ENI Editions - All rights reserved - Algeria Educ

- 1-

$data = curl_exec($chemin); if(curl_errno($chemin)) echo Erreur Curl : . curl_error($chemin); curl_close($chemin); print_r($data); ?> Lexemplecidessussedcomposeainsi :
G

initialisationverslesiteInternet dfinitiondesdonnesretourner excution affichagedeserreurssiunproblmeapparat fermeturedelaconnexion

Nousaffichonslecontenubrutdesdonnesquenousavonsrceptionnescommececi :

2.Miseenpratique
Dansnotreapplication,nouspouvonsutilisercetteextensionpourvaliderlesliensInternetquenousenregistrons dansnotrecarnetdadresses. Pourralisercetteopration,nousutilisonsplusieursoptionsde curl_setopt quinoussontproposessurlesite php.net.Lesoptionsretenuessont :
G

CURLOPT_URL :lURLrcuprer. CURLOPT_HEADER :truepourinclurelenttedanslavaleurderetour.

- 2-

ENI Editions - All rights reserved - Algeria Educ

CURLOPT_NOBODY :truepourquelecorpsdutransfertnesoitpasincludanslavaleurderetour. CURLOPT_RETURNTRANSFER : true retourne directement le transfert sous la forme dune chane de la valeurretourneparcurl_exec().

LautrefonctionutilepournotrevalidationdesliensInternetestlasuivante : Curl_getinfo() :litlesinformationsdtaillantuntransfertcURL. Nousmettonsdansunefonctionletestdevalidationdesliensinternet : Fichier : include/fct.php <?php function url_test($url) { $chemin = curl_init(); curl_setopt($chemin, CURLOPT_URL, $url); curl_setopt($chemin, CURLOPT_HEADER, true); curl_setopt($chemin, CURLOPT_NOBODY, true); curl_setopt($chemin, CURLOPT_RETURNTRANSFER, true); curl_exec($chemin); $ret = curl_getinfo($chemin, CURLINFO_HTTP_CODE); curl_close($chemin); if ($ret==200) return "URL oki"; else return ""; } ?> pourobtenirlersultatsuivant :

Commelemontrenotrecran,lesliensexistentetsontbienvalides.

ENI Editions - All rights reserved - Algeria Educ

- 3-

Introduction
POOsignifieProgrammationOrienteObjetetconsistedfinirlinteractiondebriqueslogiciellesappelesobjets. CettemthodeaprisplusdimportanceavecledploiementdePHP5etlarrtdePHP4,mmesilatechniqueexiste depuis de nombreuses anciennes versions, mais aujourdhui la dfinition de lensemble des fonctions disponibles permetdelesutiliserplusfacilement. La programmation oriente objet est avant tout une autre mthode de programmation par rapport la mthode procduraledulivreetcettemthodeaaussisesavantagesetsesinconvnients.

ENI Editions - All rights reserved - Algeria Educ

- 1-

LesbasesdelaprogrammationObjet
1.Gnralits
Laprogrammationobjetsedfinitparlutilisationdesclasses,dclaresparlemot class suiviparlenomdela classe(ilnedoitpassagirdunmotrservenPHP).Ensuitelafonction class sedlimitepardesparenthseset seprsentesouslaformesuivante : class NomClasse { var $variable; // variable sans valeur var $variable2=exemple; // variable avec valeur } Dansuneclasse,ilestpossibledinsreruneouplusieursfonctionspermettantdavoirlesmmespossibilitsquune autremthodedeprogrammation. Par ailleurs, lutilisation de variables se fait avec la fonction this , suivie dun tiret puis du signe suprieur > cequisignifiequelleappellelecontenudunevariabledelaclasseproprementdite. NousallonsprsentersouslaformedunscriptPHPladcompositionduneclasseaveclensemble des possibilits voques. Dans un premier temps, nous devons dfinir la classe comprenant une fonction qui va afficher le contenu dune variable. Poo/class.php <?php class MaClasse { public $nom = Les ditions ENI; public function afficheNom() { echo $this->nom; } } ?> Lorsquenotreclasseestdfinie,nousdevonslappelerpourenafficherlersultat. Poo/exemple1.php <?php $MonObject=new MaClasse(); $MonObject->afficheNom(); unset($MonObject) ; ?> Lapremirelignedclareunenouvelleclasseetladeuximeligneappellelafonction afficheNom delaclasse.La lignesuivantelibrenotreclassedontnousnavonsplusbesoin. Voicilersultatobtenu :

ENI Editions - All rights reserved - Algeria Educ

- 1-

2.ConstructeuretDestructeur
a.Constructeur
Une particularit peut exister dans une classe. Il sagit dun constructeur de la classe qui scrit de la faon suivante : __construct() Lorsquunconstructeurexistedansuneclasse,ilestautomatiquementappellorsdelacrationdelobjet.Cette mthode permet dinitialiser lobjet lors de sa cration. Cela signifie que ds que vous excutez une classe, la mthode __construct sera excute avant toute autre chose, par exemple, les paramtres de connexions une basededonnes. Nouspouvonscrire : Poo/exemple2.php <?php class MaClasse { var $nom; function __construct($nom) { $this->nom=$nom; echo "constructeur : ".$this->nom."<br>"; } } $MonObject=new MaClasse(Les ditions ENI); echo $MonObject->nom."<br />"; ?> pourobtenirlersultatsuivant :

- 2-

ENI Editions - All rights reserved - Algeria Educ

b.Destructeur
Ledestructeurpermetdedtruirelinstanceduneclasse.Ilpossdelesmmescaractristiquesquunconstructeur carcettefonctionestautomatiquementexcute. Elleseprsentedelafaonsuivante : Poo/exemple3.php <?php function __destruct() { echo "destructeur : ".$this->nom."<br>"; unset ($this->nom); } ?> pourobtenirlersultatsuivant :

ENI Editions - All rights reserved - Algeria Educ

- 3-

3.Basededonnes
Dansuneclasse,nouspouvonsaussicommuniqueravecunebasededonnes. NousallonseffectuerloprationencommuniquantavecnotrebasededonnesauformatMySQLi.Pourcela,nous choisissonslemultifichier,permettantunemeilleuremaintenancedelaprogrammation. Nouscronsnotrefichiercomprenantlaclasseaveclensembledesfonctionsdeconnexion. Ladescriptiondesfonctionsdeconnexionsavecunebasededonnesestidentiquecequiatvudans leschapitresprcdents. Toutdabord,nousdclaronsnosvariablesdeconnexionetnotreconstructeur. Poo/maclasse.class.php <?php class CnxBDD { var $host; var $login; var $password; var $base; public function__construct($serveur=$serveur,$user=$user, $password=$password, $bdd=$bdd) { $this->host=$serveur; $this->login=$user; $this->password=$password; $this->base=$bdd; } Nousprparonslafonctiondeconnexioncommeuneutilisationclassiqueavecretourdubondroulementdans$this.

- 4-

ENI Editions - All rights reserved - Algeria Educ

<?php function connect() { $connect = mysqli_connect ($this->host, $this->login, $this->password,$this->base); if (mysqli_connect_errno()) die ("Echec de la connexion : ". mysqli_connect_error()); $this->connect = $connect; } ?> Nous crons une nouvelle fonction permettant de slectionner une table. Nous ne mettons pas cet endroit la requteendurcaruneclasseestavanttoutunesuitedefonctionsquipeuventtreutilisesdiffrentsendroits dunprojet. <?php function requete ($sql) { $result = mysqli_query($this->connect,$sql); if(!$result) die ("Probleme requete : ".$sql); while ($Row = mysqli_fetch_object( $result)) { $Rows[] = $Row; } return $Rows; } ?> Lorsque la requte sexcute, nous enregistrons les valeurs dans une variable qui sera renvoye directement la pagewebpourtraiterlesdonnes. Ilestimportantdepenserfermerlaconnexion : <?php function deconnect() { mysqli_close($this->connect); } } ?> Maintenantquenotreclasseatcre,nousralisonslapageweb.Nouschargeonslescritresdeconnexiondans notreclassedelafaonsuivante : Poo/exemple4.php <?php $serveur=localhost; $login= root; $password= ; $bdd=ouvrage; require_once (maclasse.php); ?> Nousappelonsunenouvelleclasseetnousnousconnectons : <?php try { $CnxBDD = new CnxBDD($serveur,$login,$password,$bdd);

ENI Editions - All rights reserved - Algeria Educ

- 5-

$CnxBDD->connect(); ?> NousenvoyonsnotrerequteSQLnotrefonctionquisetrouvedanslaclasse.Lorsdelaprocduredexcution, nousrecevonslersultatdelarequte.Nousaffichonslecontenubrutpourvoirlesdonnesquenousrecevonsde notreclasse. <?php $row=$CnxBDD->requete ("SELECT * FROM actualite"); echo" <pre>"; print_r($row); echo "</pre>"; ?> Puisnousnousdconnectonsetlibronslaclasse : <?php $CnxBDD->deconnect(); unset ($CnxBDD); } catch (MySQLExeption $e) { die (Erreur : .$e->getMessage().<br />); } ?> Ledroulementdecetteprocduremontrelaconnexionversunebasededonnes.Lersultatobtenuseprsente delafaonsuivante :

- 6-

ENI Editions - All rights reserved - Algeria Educ

Espacesdenoms
1.Introduction
Lesespacesdenoms,appels Namespace ,sontdisponiblesdepuisPHP5.3. Lutilisation des espaces de noms permet dorganiser logiquement les classes en modules. Lnorme avantage est quilspermettentdviterdesconflitsentrelesnomsdesclassesetsurtoutlesnomsrallongeoulesdoublonsde classes. Lesigneutilispourlesespacesdenoms enPHPest\(prononcez"backslash")etsetraduitdelafaonsuivante : <?php namespace nom\nom ?>

2.Gnralits
Lutilisation des espaces de noms sous cette forme permet de rsoudre les problmes dalias et offre la possibilit dencapsulerlensembledesclassesdunebibliothquedansunespacedenoms.

a.Simplecombinaison
Pourillustrercesquelqueslignesthoriques,nousdevonscrerdeuxfichiers :
G

unfichiercontenantlesnamespaces, unfichierPHPdexcution.

Tout dabord, nous dclarons dans un premier fichier une balise namespace que nous appellerons ESPACEdeNOM . Cette balise est trs importante car toutes les nouvelles dclarations seront places dans le namespace ESPACEdeNOM . Namespace/lib-namespace.php <?php namespace ESPACEdeNOM; ?> Nousdclaronsdeuxnouvellesfonctionsquinousservirontdexemple : <?php function nom() { echo ESPACEdeNOM\nom; } function prenom() { echo ESPACEdeNOM\prenom; } ?> Pourconcevoirledeuximefichier,quiappelleralefichiernamespace,nouseffectuonsloprationsuivante : Namespace/exemple1.php <?php require_once(lib-namespace.php);

ENI Editions - All rights reserved - Algeria Educ

- 1-

ESPACEdeNOM\nom(); echo "<br />"; ESPACEdeNOM\prenom(); ?> Cescriptchargeladclarationdes namespaces etaffichelecontenudesdeuxfonctions. Nousobtenonslersultatsuivant :

Enrsum,notreespacedenomagitcommeunnouveautypedeconteneuretloprateur\estutilispoursparer lenomdelespacedenomdesnomsdefonctionsquilcontient.

b.Multicombinaisons
Nouspouvonsdclarerplusieursespacesdenomsdiffrents.Chaquefichiernepeutcontenirquunseulespacede nom,maisnouspouvonsavoirplusieursfichierspourunespacedenoms. Toutcequisuitaprslespacedenomsestassocidanscetespacejusqulafindufichier. Nous crons un nouveau fichier contenu le nouvel espace de noms. La reprsentation se prsente de la faon suivante : Namespace/lib-namespace2.php <?php namespace PRODUIT; function nom() { echo PRODUIT\nom; } ?> Nous crons notre fichier qui appellera les deux fichiers contenant les espaces de noms pour demander les fonctions. Namespace/exemple2.php

- 2-

ENI Editions - All rights reserved - Algeria Educ

<?php require_once(lib-namespace.php); require_once(lib-namespace2.php); ESPACEdeNOM\nom(); echo "<br />"; PRODUIT\nom(); ?> Nousobtenonslersultatsuivant :

3.Lesclasses
Lutilisationdesespacesdenomsvapermettredutiliserlaprogrammationobjetenemployantlesclasses. Pourcela,nousplaonsavantuneclasseladclarationdesespacesdenoms. Nousrutilisonslescriptpoo/exemple1.phppourobtenirlenouveauscriptPHPsuivant : Namespace/lib-namespace3.php <?php namespace ESPACEdeNOM; class MaClasse { public $nom = Les ditions ENI; public function afficheNom() { echo $this->nom; } } ?> Pourappelercetteclasse,notrescriptseprsentedsormaisdelafaonsuivante :
ENI Editions - All rights reserved - Algeria Educ - 3-

Namespace/exemple3.php <?php require_once(lib-namespace3.php); $row = new ESPACEdeNOM\MaClasse; $row->afficheNom(); unset ($row); ?> Nousretrouvonsdanscescriptexactementlesmmesfonctionnalitsquedanslespagesprcdentes. Nousobtenonslersultatsuivant :

Cependant, lorsque nous manipulons les espaces de noms, les classes, les fonctions, il est parfois difficile de se situer. AussilelangagePHPproposedesmotsclefsquiretournentdesinformations : Namespace/lib-namespace4.php <?php namespace ESPACEdeNOM;

class MaClasse { var $retour;

//retour de donnes

function position() { $retour =""; $retour .= "Classe : ".__CLASS__."<br />"; $retour .= "Namespace : ".__NAMESPACE__."<br />"; $retour .= "Function : ".__FUNCTION__."<br />"; return $retour; } }

- 4-

ENI Editions - All rights reserved - Algeria Educ

?> Lafonctioncidessusdoitretournerlenomdelaclasse,puislenomdesespacesdenomsetpourfinirlenomdela fonctionutilise. Nousexcutonscetteclasseengardantlemmeprincipequeprcdemment,delafaonsuivante : Namespace/exemple4.php <?php require_once(lib-namespace4.php); $row = new ESPACEdeNOM\MaClasse; echo $row->position(); unset ($row); ?> Pourobtenirlersultatsuivant :

ENI Editions - All rights reserved - Algeria Educ

- 5-

Caspratique
1.Sujet
Notrecaspratiquereprendlemmethmequelerestedulivre,cestdirelagestionduncarnetdadressesavec uneseulebasededonnes. Nous allons voir comment utiliser la programmation objet pour deux fonctionnalits du carnet dadresses, cest dire :
G

lidentification lagestiondeladministration

Lesautrespointstudiscommelagestionducarnetdadresses,lesdiffrentesexportations,restentsurlemme principequecequiseratudijusteaprs. Nous allons utiliser la programmation objet avec une base de donnes MySQLi et en employant les espaces de noms .Parconsquent,nousdevonspossderPHP5.3. IlestpossibledutiliserlobjetavecuneautreversiondePHP5ensupprimantlanotiondenamespace.

2.Laclasse
Lacrationdelaclasseestlapartiemajeuredelapplication,carellevacontenirlensembledesfonctionsquenous allonsutiliserpournotreapplication. Nousdclaronslaclassedelafaonsuivante : Fichier : include/class.class.php <?php namespace ESPACEdeNOM; class cnxBDD { var $host; var $login; var $password; var $base; public function __construct($serveur=$serveur,$user=$user, $password=$passwd, $bdd=$bdd) { $this->host=$serveur; $this->login=$user; $this->password=$password; $this->base=$bdd; } function __destruct() { unset ($this->connect); } } ?> Notreclassecontientladclarationdesespacesdenoms,duconteneuretdudestructeur,diffrentspointsquiont ttudisdanslespagesprcdentes. Nous prparons la fonction qui sera utile pour la connexion la base de donnes. Nous utilisons les fonctions try/catchpermettantdercuprerleserreursventuelles.

ENI Editions - All rights reserved - Algeria Educ

- 1-

Lorsquelaconnexionaveclabasededonnesesteffectue,nousrenvoyonslinformationpourexcuterlarequte. LescriptPHPseprsentedelafaonsuivante : <?php function connect() { try { $connect = mysqli_connect ($this->host, $this->login, $this>password,$this->base); if (mysqli_connect_errno()) die ("Echec de la connexion : ". mysqli_connect_error()); $this->connect = $connect; }

catch (PDOException $error) { echo N : .$error->getCode().<br />; die (Erreur : .$error->getMessage().<br />); } } ?> Nousdevonsensuiteprparerdeuxrequtes :
G

unerequtepourlaslectiondedonnes, unerequtepourlamanipulationdedonnes.

Unerequtepourlaslectiondedonnesestutilepourconnatrelenombredelignesdenregistrements,maisaussi pourafficherlecontenuprovenantdelabasededonnes. Desexplicationscomplmentairesserontapportesdanslespagesquivontsuivre. La fonction requte de slection utilise lattribut de la connexion qui a t ouverte prcdemment et excute la requteSQLquiatenvoye. Pourvrifiersicellecipossdeaumoinsunelignedersultat,nousutilisonslafonctionnum_rows. Siaucunrsultatnestprsent,lafonctionnousrenvoieuneinformationfausse. Silarequteretournedesdonnes,cellesciserontstockesdansuntableau. Labouclepourmmoriserlafonctionestutilecarsilersultatcontientplusieurslignesdedonnes,nouspouvons lestraiter.Sanscetteopration,nousserionsobligsdecrerunefonctionsupplmentaire. LescriptPHPseralesuivant : <?php function requeteSelect ($sql) { try { $result = $this->connect->query($sql); if(!$result) die ("Probleme requete : ".$sql); if ($result->num_rows==0 ) { $rows=0; } else { while ($row = $result->fetch_object())

- 2-

ENI Editions - All rights reserved - Algeria Educ

{ $rows[] = $row; } } return $rows; } catch (PDOException $error) { echo N : .$error->getCode().<br />; die (Erreur : .$error->getMessage().<br />); } } ?> Lautre requte va permettre dinsrer, de mettre jour, de supprimer des donnes. Ces oprations utilisent des fonctionsdiffrentes. LafonctionrequteutiliselattributdelaconnexionquiatouverteprcdemmentetexcutelarequteSQLquia tenvoye. Lexcution de la requte se droule en deux temps : nous prparons dabord la requte pour ensuite lexcuter. Cetteoprationatdcritedansleschapitresprcdents. LescriptPHPestlesuivant : <?php function requeteOther ($sql) { try { $qid=$this->connect->prepare($sql); $qid->execute(); } catch (PDOException $error) { echo N : .$error->getCode().<br />; die (Erreur : .$error->getMessage().<br />); } } ?> Lafonctiontry/catchestutilisepourpermettredercuprerlesproblmesventuels. Pourfinirnotreclasse,nousnousdconnectons : <?php function deconnect() { mysqli_close($this->connect); } ?>

3.Lidentification
Lidentificationestlepremiercranverslaconnexionetlagestiondeladministration. LcrandesaisiedidentificationresteidentiqueceluiduchapitreLasaisieetlaffichageConnexionuncompte, carilsagitdunepartieHTML.Nousvousconseillonsderelirecellecipourconnatrelesdiffrentstestsdeschamps desaisie. Lorsqueleschampsonttcorrectementrenseigns,nousexcutonslefichierlogin.inc.phpquivanouspermettre,si lasaisieestcorrecte,laccsnotrecompte. LapartievalidationattudiedanslechapitreLasaisieetlaffichageLaconnexion.Nousutilisonsseulementla classepuisquelleadjtdclareunpeuplushaut.

ENI Editions - All rights reserved - Algeria Educ

- 3-

Nous dclarons lespace de noms et la nouvelle classe en envoyant les paramtres didentification vers la base de donnes,pourensuitenousconnecter. LescriptPHPseprsentedelafaonsuivante : Fichier login.inc.php <?php $cnx = new ESPACEdeNOM\cnxBDD($serveur,$user,$passwd,$bdd); $cnx->connect(); ?> Toutdabord,nouscontrlonssilesidentifiantssontbienuniques.Pourcela,nousutilisonslaconnexionquiat valideetexcutonslarequtedeslection. Lavaleurquiseraretournenouspermettradesavoirsilecompteexistebiendansnotrebasededonnes. LescriptPHPseprsentedelafaonsuivante : <?php $sql="SELECT COUNT(*) as nbre FROM user WHERE login=$login AND password=$password "; $nbre=$cnx->requeteSelect($sql); if ($nbre==0) header("Location:identification.php?erreur=login"); ?> Toutengardantnotreconnexionouverte,nouspouvonsdemandernotreclassedemettrejourlaclefdenotre compteetladatedenotrepassage. Pourcela,nousutilisonslautrerequte.CettefonctionvaexcuterlarequteSQLquiseraenvoyecommececi : <?php $idclef=recup_clef(); $date=DATE("Y-m-d"); $sql="UPDATE user SET idclef=$idclef,date_lastpass=$date login=$login AND password=$password "; $cnx->requeteOther($sql); ?>

WHERE

Laderniretapeconcernelarcuprationdesdonnes.Cetteoprationutiliselammefonctiondeslection. tantdonnquelersultatrenvoycomporterauneseuleligne,nousutilisons[0]pourtrecertaindeprendreles bonnesvaleurs : <?php $sql="SELECT * FROM user WHERE login=$login AND password=$password AND idclef=$idclef "; $row=$cnx->requeteSelect($sql); if ($row[0]->niveau) { session_start(); $_SESSION[login] = $row[0]->login; $_SESSION[idclef] = $row[0]->idclef; $_SESSION[niveau] = $row[0]->niveau; $_SESSION[ip] = $_SERVER[REMOTE_ADDR]; $_SESSION[iduser] = $row[0]->id; $destination=$row[0]->page; header("Location:$destination"); } ?>

4.Lagestiondeladministration
Lagestiondeladministrationestaccessiblepourlespersonnesquipossdentlesdroitsdadministration. CettepartieatdtailledanslechapitreLasaisieetlaffichageLagestiondeladministration.

- 4-

ENI Editions - All rights reserved - Algeria Educ

a.Ajouteruncompte
Le formulaire permettant lajoutdun nouveau compte reste identique ce qui a t dj vu dans le chapitre La saisieetlaffichage. Parcontre,lorsdelaconfirmationdelasaisie,nousnousconnectonslaclassepourinsrerlanouvellepersonne danslabasededonnes. Nousdclaronsnotreclasseetnousnousconnectons : Fichier : admin-add.php <?php $cnx = new ESPACEdeNOM\cnxBDD($serveur,$user,$passwd,$bdd); $cnx->connect(); ?> Loprationestidentiquecelledelapartieprcdente. Concernantlinsertiondesdonnessaisiespartirduformulaire,nousenvoyonssimplementlarequteSQLla fonctionsetrouvantdansnotreclasse. <?php function insere_compte(&$frm) { global $cnx; $creat_compte=date("Y-m-j"); $sql = " INSERT INTO user ( niveau , login , password , email , date_creation page ) VALUES ( $frm[niveau] ,".htmlentities($frm[nlogin])." ,".md5($frm[npassword])." ,".htmlentities($frm[email])." ,$creat_compte ,compte.php )"; $cnx->requeteOther($sql); } ?> Lescriptcidessusnepossdeaucunparamtrecarcestlaclassequieffectueletravailetlesdiffrentstests.

b.Afficheruncompte
Afficher un compte reste identique du ct HTML. La partie La gestion de ladministrationduchapitreLasaisieet laffichageexpliquecespointsendtail. Laconnexionlaclasseestobligatoirepourpouvoirrcuprerlesdonnesdelabase. Pouraffichercesdonnes,nousdevonsenvoyerunerequteSQLnotrefonctiondeslectioncommececi : Fichier admin-view.php <?php $sql="select * from user"; $res=$cnx->requeteSelect($sql); ?>

ENI Editions - All rights reserved - Algeria Educ

- 5-

LarequteretournelersultataveclensembledesvaleursquenouspouvonsafficheraveclafonctionFOREACHde lafaonsuivante : <?php foreach($res as $row) { echo "<td>$row->login</td>"; } ?>

c.diteruncompte
Lditionduncomptesebasesurlemmeprincipequelespartiesprcdentes. Lamanipulationdesdonnesestralisepartirdelaclassequipossdelensembledesfonctions. LditionducompteconsisteraliserunerequteSQLcorrecteetlenvoyerauprsdelafonctiondelaclasse. LescriptPHPestdisponibleentlchargementcarlesdiffrentesfonctionsPHPontdjttudies.

- 6-

ENI Editions - All rights reserved - Algeria Educ

Liensutiles
LinternetestunesourceimportantededocumentationpourlelangagePHP.Ilexistedenombreusesaides,solutions etforumscouvrantlensembledesproblmesquenouspouvonsrencontrer. Voustrouverezciaprsunelistedesites,nhsitezpaslesconsulterrgulirementcarcesontdessitestrsactifs. Cettelisteestnonexhaustivemaisproposelessiteslesplusimportantsetlesplusactifs.

1.Liensfranais
Incontournables PHP:http://fr.php.net ElRoulbio:http://www.elroubio.net/ Association&rendezvous AFUP:http://www.afup.org PHPQuebec:http://www.phpquebec.org PHPApero:http://www.aperophp.net/ Actualit,agrgateurdenouvellesetarticles Nexen:http://www.nexen.net PHPIndex:http://www.phpindex.com PHPSolutions:http://phpsolmag.org/fr PlanetePHP:http://www.planetephp.fr Tutoriaux,Forum PHPTeam:http://www.phpteam.net PHPFrance:http://www.phpfrance.com PHPDebutant:http://www.phpdebutant.org Developpez:http://php.developpez.com/ ASPPHP:http://www.aspphp.net PHPPortail:http://www.phportail.net Sources,scripts PHPScripts:http://www.phpscriptsfr.net Comscripts:http://www.comscripts.com/ Policesdecaractres

ENI Editions - All rights reserved - Algeria Educ

- 1-

Fonttemple:http://www.fontemple.com/ Dafont:http://www.dafont.com/fr/

2.LiensAnglophones
Actualit,agrgateurdenouvelles PHPDeveloppeur:http://www.phpdeveloper.org/ PlanetPHP:http://www.planetphp.org Tutoriaux PHPCodingpratices:http://phpcodingpractices.com/ Sources,scripts,extensions Pear:http://pear.php.net Pecl:http://pecl.php.net PHPBuilder:http://www.phpbuilder.com HotScripts:http://www.hotscripts.com

- 2-

ENI Editions - All rights reserved - Algeria Educ

You might also like