Anda di halaman 1dari 104

Crationd'uneapplicationWEBavecPHP/MySQL

Crationd'uneapplicationWEBavecPHP/MySQL

CreruneapplicationWEB avecPHP/MySQL

ParPhilippeBousquet<Darken33@free.fr>

Copyright(c)20032008PhilippeBousquet.

Crationd'uneapplicationWEBavecPHP/MySQL

Celivrelectroniqueestunerdition d'unarticle de prparationd'une confrence que j'avaiseffectuaulyceCaslerTalenceen2003/2004danslecadredesconfrencesde l'ABUL.

CeLivreestdistribuselonlestermesdelaGNUFreeDocumentationLicense. Copyright(c)20032008PhilippeBOUSQUET

Crationd'uneapplicationWEBavecPHP/MySQL

Tabledesmatires
I. Introduction II. Lemodlededonnes III. Crationdelabasededonnes IV. Maquettagedel'application V. LeXHTML VI.LespagesduforumenXHTML VII.LamiseenformeparCSS VIII.Programmationdel'application IX.LelangagePHP X. L'applicationmyForum XI.Rfrences 5 6 11 21 23 36 41 61 62 81 104

Crationd'uneapplicationWEBavecPHP/MySQL

I.Introduction
Autraversdecelivre,nousallonsvoirlesdiffrentestapespourcreruneapplication WEB, pour cela nous nous proposons de crer un forum de discussion bas sur les technologiessuivantes:

MySQLPourlestockageetlagestiondesdonnes XHTMLetCSSPourlerendudenospagesHTML PHPPourlaprogrammationdespartiesdynamiquesdenotreapplication

Crationd'uneapplicationWEBavecPHP/MySQL

II.Lemodlededonnes
Avantdeselancerdanslaprogrammation,ilconvientdebiendterminerl'ensembledes donnes ainsi que les liaisons qu'elles ont entre elles. En effet la programmation ne reprsentequ'peuprs20%danslacrationd'uneapplication,lerestetantpartag entrel'Etudedecequel'onveutraliseretlestestsfinaux.

Dfinitiondesfonctionnalitsdel'application
Nousdevonsdansunpremiertempsdoncbiendfinircequenotreapplicationestcense faire.Unforumdediscussionestenfaitunmcanismepermettantdesutilisateursde discutersurdessujetsdiverstraversdesmessagescrits. Lesutilisateursdoiventpouvoircrerdenouveauxsujetsdediscussions,ilsdoiventpouvoir lirelessujetsdesautresutilisateursetbienentendupouvoiryrpondre.

Organisationgnraledesdonnes
Une fois les fonctionnalitsfiges, nous devonsorganiser nos donnes afin de pouvoir constituernotrebasededonnes.C'estcelleciquiseralecurdenotreapplication,donc nousdevonsyconsacrerunegrandeattentionpourquecellecinesoitpasmalconue,ce quirendraitnotreapplicationmoinsfonctionnelle. Dansl'tapeprcdentenousavonsvuapparaitretroisnotionsdistinctes:

L'utilisateurc'estunepersonnequimettraetliradesmessages. Lesujet ils'agitdupointdedpartdeladiscussion,ilregroupelesmessagesle concernant. Le message c'estl'objet quipermetauxutilisateursdes'exprimersurunsujet donn.

Doncnousvoyonsiciquenotreapplicationdevraaumoinsgrercestroisentits.Donc nousdevronscrertroistablespourconstituernotrebasededonnes. Cependantpourquenotreapplicationsoitmoinsrbarbative,danslesensouauboutd'un momentlesutilisateursrisquentdeseperdredanslajungledessujets,nousallonsintgrer unenouvellenotion:Lacatgorie. Eneffetnousallonsdciderderegroupernossujetsparcatgories,ceaurapoureffetque nosutilisateur,aulieudelancerunediscussiondanslevide,nousallonsleurproposerdes catgoriesdanslesquellesilspourrontcrerleurssujetsdediscussions.

Crationd'uneapplicationWEBavecPHP/MySQL

Parexemple: Utilisateur Catgorie Sujet :darken :technique :envoyerdesmailsavecOO

Message : "Ilyabiendansoutils/options/programmesauxiliaireslapossibilitde choisirunclientdemessageriepardfaut.Maisjen'arrivepassavoircommentenvoyer desmails....." NousauronsdoncquatreTablesdansnotrebasededonnes:


utilisateurs:quirassembleralesinfossurlesutilisateurs categorie:quilistelensembledescatgoriesduforum sujets:contiendralessujetsdesdiffrentesdiscussions messages:contiendratouslesmessagesmisparlesutilisateurs

Organisationgnraledesdonnes
Maintenantquenousavonsdterminquellestablesconstituerontnotrebasededonnes,il nousfautdfinirlesinformations(champs)quecontiendrontchacunedestables.

TableUtilisateurs
Cettetablecontientlesutilisateursayantaccsauforum,chaqueutilisateurdevradansun premier temps, passer par une procdure d'inscription afin de pouvoir utiliser le forum. Nousauronsdoncbesoinsdesinformationssuivantes:

codeutilisateur:ils'agitdel'identifiantdel'utilisateur,celuicidoittreunique motdepasse:ncessaireaulogindel'utilisateur email :cetteinformationestutilepourrenvoyerlemotdepassel'utilisateurqui l'auraitoubli nom et prenom : ces deux informations ne sont pas vraiment utiles mais il est toujoursintressantdelespossder

Crationd'uneapplicationWEBavecPHP/MySQL

TableCategories
Cettetablecontientlesthmesdediscussionsduforum,chaquesujetdediscussionsera englobdansl'undesthmesprsententable.Cettetableneseradisponiblequ'enlecture seule,c'estdirequec'estleDBAquiajouteralesthmesventuelsdanslatable,iln'y aurapasdemisejourparprogramme. Peud'informationssontncessairespouridentifierunthme:

unnumeroidentifiant:ils'agitd'unnumroautoincrmentquipermetd'identifier unthme,cenumroestunique unnom :Ils'agitdunomduthme,parexemple:Devel(pourunthmesurle dveloppement) unedescription:cetteinformationpermetd'expliqueruntantsoitpeulethme,par exemple:"Discussionssurledveloppementdelogiciellibres"

TableSujets
Cettetablecontient l'ensembledessujetsdu forum,Elledoit possder lesinformations suivantes:

un numero d'identifiant : il s'agit d'un numro autoincrment qui permet d'identifierunsujet,cenumroestunique untitre:titrequidcritlesujet datecreation:ladatedecrationdusujet heuredecreation:l'heuredecrationdusujet

Cependant un sujet est cr par un utilisateur, il est intressant de connaitre cette information,doncnousajoutons:

codeutilisateur:c'estlecodedel'utilisateurayantcrlesujet,ildoitexisterdans latableusers.

De plus nous avons prcis qu'un sujettait en rapportavecune catgorie donc cette informationdoittregalementdanslatable:

identifiant catgorie : s'est l'identifiant de la catgorie laquelle le sujet est rattach,lacatgoriedoitexisterdanslatablethmes.

Crationd'uneapplicationWEBavecPHP/MySQL

TableMessages
Cettetablecontientl'ensembledesmessagesduforum,Elledoitpossderlesinformations suivantes:

un numero d'identifiant : il s'agit d'un numro autoincrment qui permet d'identifierunmessage,cenumroestunique untitre:titrequidcritlemessage untexte:ils'agitducorpsdumessage datecreation:ladatedecrationdumessage heuredecreation:l'heuredecrationdumessage

Cependant un message est cr par un utilisateur, il est ncessaire de connaitre cette information,doncnousajoutons:

codeutilisateur:c'estlecodedel'utilisateurayantcrlemessage,ildoitexister danslatableusers.

De plus nous avons prcis qu'un message tait en rapport avec un sujet donc cette informationdoittregalementdanslatable:

identifiantsujet:s'estl'identifiantdusujetauquellemessageestrattach,lesujet doitexisterdanslatablesujets.

Crationd'uneapplicationWEBavecPHP/MySQL

Lastructurecompltedelabasededonnes
Nousavonsdoncdfinit,defaonthoriquelastructuredenotrebasededonnes,voicile schmagnral:

10

Crationd'uneapplicationWEBavecPHP/MySQL

III.Crationdelabasededonnes
Maintenant que nous avons dfinis les diffrentes donnes que notre application devra grer,nousallonscrerphysiquementnotrebasededonnes. PourcelanousallonsutiliserleSGBDMySQL,quiestl'undesplusconnudanslemonde duWEBetdulogiciellibre. Afindefaciliter,lamanipulationdeMySQL,nousallonsutiliserPhpMyAdmin. Cetoutil,critenPHP,permetdegrersesbasesdedonnessansavoirbesoind'une grandeconnaissancedeMySQL.Deplusdufaitqu'ilestcritenPHP(doncsurvotre serveurHTTP)vouspouvezsurtoutgrervosbasesdistance.

Prparationetconfiguration
Iln'estpasrecommandd'utiliserle"compte"administrateurMySQL(root)pourmanipuler une base de donnes donc nous allons dans le client MySQL, crer un utilisateur qui permettradegrernotrebasededonnes(crationdetable,ajoutd'enregistrements,...). Premirement,ilfautseconnecterMySQLentantquerootvialeclientMySQL,dansle butdecrernotrebaseetd'ajouterl'utilisateur(quipermettradegrerlabasesous PhpMyAdmin):
[darken@localhostdarken]$mysqlurootp Enterpassword: WelcometotheMySQLmonitor.Commandsendwith;or\g. YourMySQLconnectionidis1toserverversion:4.0.15 Type'help;'or'\h'forhelp.Type'\c'toclearthebuffer. mysql>

Ilfautmaintenantcrernotrebasededonnes:
mysql>createdatabasemyforum; QueryOK,1rowaffected(0.00sec)

Nousallonsmaintenantcrerl'utilisateurquiseraleDBAdenotrebasededonnes,nous allonsdoncnouspositionnersurlabasemyforum,puisdonnerl'utilisateurwwwadmin touteslesautorisationssurcettebase:


mysql>grantallprivilegesonmyforum.*towwwadmin@localhost; QueryOK,0rowsaffected(0.82sec) mysql>grantallprivilegesonmyforum.*towwwadmin; QueryOK,0rowsaffected(0.82sec)

11

Crationd'uneapplicationWEBavecPHP/MySQL

NouspouvonsdoncmaintenantquitterleclientMySQL:
mysql>quit Bye [darken@localhostdarken]$

Donnonsmaintenantunmotdepassepourl'utilisateurwwwadmin:
[darken@localhostdarken]$mysqladminpuwwwadminpassword'azerty' Enterpassword: [darken@localhostdarken]$

VrifionsmaintenantquelaconfigurationdePhpMyAdmin,afinquelorsquel'onseconnecte MySQLviaPhpMyAdminildemandeunnomd'utilisateuretunmotdepasse.dansle fichier/var/www/html/phpMyAdmin/config.inc.php Remplacerlaligne:


$cfg['Servers'][$i]['auth_type']='config';

Par:
$cfg['Servers'][$i]['auth_type']='http';

OnpeutmaintenantceconnecterPhpMyAdminviavotrenavigateurprfr: http://localhost/phpMyAdmin:

12

Crationd'uneapplicationWEBavecPHP/MySQL

Crationdenostables
Maintenantquel'onestconnectMySQLsousPhpMyAdmin,nousallonsdonccrernos tablesdansnotrebaseMyForum:pourcelaslectionnonslabase"myforum".

Nousarrivonssuruncranquinousproposedecrerunenouvelletable,eneffetpour l'instantc'estlaseuleactionquenouspouvonseffectuercarnotrebaseestvide.

13

Crationd'uneapplicationWEBavecPHP/MySQL

Nousallonsdonccrerlatable"users"quicontiendralesinformationssurlesutilisateurs. Indiquonslenomdelatable("users")etlenombredechampsqu'ellecontiendra(5).

Nousvoyonsdonc5lignesquicorrespondentnoscinqchampsquenousvoulonsdcrire, pourcelailfautfournirplusieursinformations:

Field:ils'agitdunomdeschamps Type:ils'agitdutypededonnesquesechampcontiendra(caractres,nombres, dates...) Lalongueurduchamp:Parexempleuncodepostalcontient5caractres. Desattributsparticuliers(nonsigns,binaire,...)jeconseilledenelesutiliserque sivousenavezvraimentbesoin. Null:permetdedfinirsilechamppeunepastrerenseign. Default:quipermetdedfinirlavaleurpardfautduchamp. Extra:permetdedfinirdesnombresautoincrments. Primary:dterminesilechampestlacldelatable.
14

Crationd'uneapplicationWEBavecPHP/MySQL

Index:permetdedterminersilechampfaitpartidel'indexsecondaire. Unique:Permetd'indiquequelavaleurduchampdoittreuniquedanslatable.

MySQLpermetdegrerunemultitudedetypesdiffrents:chainesdecaractres,entiers, flottants,dates,... Voiciuntableauprsentantlestypeslespluscourantsetquinousservironspournostables : Type VARCHAR TINYINT TEXT DATE INT BIGINT FLOAT DOUBLE DECIMAL TIME BLOB Description Chainedecaractreslongueurvariable(1255) Entierentre127et128 Textede165535caractres DateauformatAAAAMMJJ Entierde21474836482147483647 Entierde9223372036854775808 9223372036854775807 Permetdestockerdesnombredcimaux Permetdestockerdesnombredcimaux Permetdestockerdesnombredcimaux PermetdestockeruneheureauformatHH:MM:SS Permetdestockerdesobjetsbinairesdegrandetaille

Nousallonsdonccrernotretableaveclastructuresuivante:

id_user:varchar(15) passwd:varchar(15) name:varchar(50) firstname:varchar(50) email:varchar(255)

15

Crationd'uneapplicationWEBavecPHP/MySQL

Lorsquel'onsoumetleformulaire,onobtientenrponselemessage"Tableusershasbeen created"quiindiquequel'actions'estbiendroule. OnobtientgalementlarequteSQLquivientd'treexcute,ceciestunebonnechose lorsquel'onneconnatpasleSQLetquel'ondsirel'apprendre.

16

Crationd'uneapplicationWEBavecPHP/MySQL

Excutionderequtes
Nous venons de crer notre table grce l'interface fournit par phpMyAdmin, on peut galementlancernosrequtesdirectementgrcel'ongletSQL.

Eneffetnousallonscrerlatablethmedecettefaon.Cettetableestdelastructure suivante:

`id_theme`quiestunnombreautoincrment `name`quiestunechainedecaractre `description`quiestgalementunechainedecaractre.

Nousallonsdoncutiliserlarequtesuivante:
CREATETABLEthemes( id_themeTINYINTUNSIGNEDNOTNULLAUTO_INCREMENT, nameVARCHAR(20)NOTNULL, descriptionVARCHAR(255)NOTNULL, PRIMARYKEY(id_theme) );

17

Crationd'uneapplicationWEBavecPHP/MySQL

Ilfautdoncmaintenantcrerlesautrestablesafind'obtenirlastructurecompltedenotre basededonnes:
CREATETABLEsubjects( id_subjectINTUNSIGNEDNOTNULLauto_increment, titleVARCHAR(255)NOTNULL, dateDATENOTNULL, timeTIMENOTNULL, id_userVARCHAR(15)NOTNULL, id_themeTINYINTUNSIGNEDNOTNULL, PRIMARYKEY(id_subject), KEYid_user(id_user), KEYid_theme(id_theme) );

18

Crationd'uneapplicationWEBavecPHP/MySQL

CREATETABLEmessages( id_messageBIGINTUNSIGNEDNOTNULLauto_increment, titleVARCHAR(255)NOTNULL, textTEXTNOTNULL, dateDATENOTNULL, timeTIMENOTNULL, id_userVARCHAR(15)NOTNULL, id_subjectINTUNSIGNEDNOTNULL, PRIMARYKEY(id_message), KEYid_user(id_user), KEYid_subject(id_subject) );

19

Crationd'uneapplicationWEBavecPHP/MySQL

Sauvegarderlastructure
Unefois,notrestructurecre,ilestbondelasauvegarder.PhpMyAdminpermetd'exporter lastructureainsiquelesdonnesd'unebasededonnes.

20

Crationd'uneapplicationWEBavecPHP/MySQL

IV.Maquettagedel'application
AvantdeprogrammerlespagesduforumenPHPaveclesaccslabasededonnes MySQL, nous allons passer par une phase de maquettage de l'application. Ils'agitdecrerlespagesavecdesvaleursstatiquesdanslebutderaliserl'interfaceetla navigationentrepages. Pournotreforumdediscussion,nousauronsbesoindespagessuivantes:

Login:cettepageestlapremirepagequel'utilisateurverra,ildevras'authentifier pourutiliserleforum Inscription:cettepagepermetunnouvelutilisateurdes'inscrire,elleest accessiblepartirdelapagelogin Listethmes:cettepages'affichelorsquel'utilisateurseseraauthentifi,elle affichelalistedesthmesdisponiblessurleforum Listesujets:cettepageaffichel'ensembledessujetsdediscussionsappartenant unthme. Listemessages:cettepageaffichelefildediscussiond'unsujet. Ecrituremessage:cettepageestappelelorsquel'utilisateurveutrpondresurun sujetou,crerunnouveausujetdediscussion.

21

Crationd'uneapplicationWEBavecPHP/MySQL

PourralisercespagesnousallonsutiliserlestechnologiesXHTMLpourlecontenudes pagesetCSSpourlamiseenformedecellesci.

22

Crationd'uneapplicationWEBavecPHP/MySQL

V.LeXHTML
Ils'agitdustandardenvigueurdatantdu26janvier2000.LeXHTML1.0estbassurle langageXML. Ils'agituniquementduHTML4lasauceXML.DoncsivoussavezcrireduHTML4,vous savezcrireduXHTML1.0 Voustrouverezl'ensembledesspcificationsduXHTML1.0l'adressesuivante: http://www.w3.org/TR/xhtml1 ParmilespointslesplusimportantsdeXMLparrapportSGML: Chaquelmentouvertdoittreferm lesbalisessonttoujoursorthographiesenminuscule lesvaleursdesattributssonttoujoursrenseignesetentreguillemets

Lestypesdedocuments
Il existe, comme pour le HTML 4.01, trois types de documents dfinissant le standard XHTML: LetypeStrict Ils'agitdutypequ'ilfautchoisirchaquefoisquecelaestpossible,eneffetilpermetde sparercompltementlecontenudelaprsentation. IlinterditlesbalisesHTMLdetype<font>ou<b>leseffetsdeprsentationdevanttre dcrituniquementl'aidedeCSS. Pour implmenter ce type le document doit imprativement commencer par les lignes suivantes:
<?xmlversion="1.0"encoding="ISO88591"?> <!DOCTYPEhtmlPUBLIC"//W3C//DTDXHTML1.0Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1strict.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="fr"lang="fr"> <head> .... </head> <body> .... </body> </html>

23

Crationd'uneapplicationWEBavecPHP/MySQL

LetypeTransitional Ilpermetdemlangercontenuetprsentationetonpeutl'utilisersil'utilisationdeCSSn'est paspossibleousatisfaisante(casolesvisiteursciblsnedisposentquedenavigateurs anciensetlerenducompteplusquel'information,etc.). Pour implmenter ce type le document doit imprativement commencer par les lignes suivantes:
<?xmlversion="1.0"encoding="ISO88591"?> <!DOCTYPEhtmlPUBLIC"//W3C//DTDXHTML1.0Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="fr"lang="fr"> <head> .... </head> <body> .... </body> </html>

LetypeFrameset Cetypeestutilisersivoussouhaitezutiliserdescadresdanslaprsentationdevospages HTML. Pourimplmentercetypeledocumentdoitimprativementcommencerparlalignesuivante :


<?xmlversion="1.0"encoding="ISO88591"?> <!DOCTYPEhtmlPUBLIC"//W3C//DTDXHTML1.0Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1frameset.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="fr"lang="fr"> <head> .... </head> <body> .... </body> </html>

24

Crationd'uneapplicationWEBavecPHP/MySQL

L'enttedudocument:<head></head>
L'lmentHEADrassembledesinformationssurledocumentcourant,tellesquesontitre, desmotsclefspouvanttreutilisspardesrobotsderecherche,ettouteautredonne considrecommevenantpartducontenududocument.Leslmentssitusl'intrieur deladclarationHEADnedevrontpastrevisualisesdanslecasd'agentsutilisateurs conformes,saufmentionparticulire. Labalise<title> ToutdocumentHTMLdoitcomporterunetunseullmentTITLEdanssasectionHEAD. Lesagentsutilisateursutilisentlecontenudel'lmenttitrepourdonnerl'utilisateurune informationconcisesurlecontenuprobabledudocument,parexemple,enl'crivantdansla barredetitredefentre,ouenlecitantparsynthsevocale. Lestitrespeuventcontenirdesentitscaractres(pourlescaractresaccentus,les caractresspciaux,etc.),maisnepourrontconteniraucuneautrebalise.Voiciunexemple detitrededocument:
<title>myForum:Login</title>

Lesbalises<meta> Cetypedebalisen'estpasobligatoiremaispermetdedonnerdiversesinformationstelles quel'encodagedelapage,lenomdel'auteur,lesmotscls(pourlesmoteursde recherches),unedescriptionducontenudelapage...


<metahttpequiv="contenttype"content="text/html;charset=ISO88591" /> <metaname="keywords"lang="fr"content="forum,discussion,logiciel, libre,PHP,mysql,xhtml,css"/>

Lesbalises<link> Labaliselinkpermetd'effectuerdesliensversdesressourcesexternesafindedfinirpar exemplelesrelationsentrepages,maisaussidedfinirlefichierdestyleCSSutiliser(que nousverronsplustard).


<linkrel="next"href="Chapitre3.html"/> <linkrel="stylesheet"href="default.css"type="text/css"/

25

Crationd'uneapplicationWEBavecPHP/MySQL

EnttepourMyForum Pournotreapplicationnousallonsutiliserlecodesuivant:
<head> <title>myForum:Login</title> <metahttpequiv="contenttype"content="text/html;charset=ISO8859 1"/> <metaname="keywords"lang="fr"content="forum,discussion,logiciel, libre,PHP,mysql,xhtml,css"/> <metaname="author"lang="fr"content="PhilippeBousquet"/> <metaname="copyright"content="&copy;2004PhilippeBousquet."/> <metaname="license"content="GNUGeneralPublicLicense."/> <linkrel="stylesheet"href="default.css"type="text/css"/> </head>

Bienentendunousallonschangerletitrepourchaquepage.

Lecontenudelapage:<body></body>
Lecorpsd'undocumentcontientsoncontenueffectif.Cecontenupourratrereprsentpar unagentutilisateurd'unemultitudedefaons.Parexemple,pourlesnavigateursvisuels, vouspourrezconsidrerlecorpscommeuncadredanslequellecontenuapparat:texte, images,couleurs,dessins,etc.Pourlesagentsutilisateursaudio,lemmecontenupourra tre"parl". Balisesdegroupes<div></div>et<span></span> LeslmentsDIVetSPAN,enconjonctionaveclesattributsidetclass,proposentun mcanismegnriquepourrenforcerlastructurationd'undocument.Cesontlesdeuxseuls lmentsduHTMLquin'ajoutentaucuneinformationdeprsentationleurcontenu.Dece fait,ilestpossibledelesutiliserassocisdesidentificateursetdesassignationsdeclasse pourpouvoirformaterl'apparencedezonesdetexteparapplicationultrieuredefeuillesde style. Balisesd'enttes<h1>,<h2>,<h3>,<h4>,<h5>,<h6> Unlmentdetitragedcritbrivementlethmedelasectionqu'ilintroduit.Les informationsdetitragepourronttrercoltesparlesagentsutilisateurspour,parexemple, construireunetabledesmatiresautomatiquespourcedocument. LeHTMLdfinitsixniveauxdetitragedepuisH1affichcommeleplusimposantjusqu'H6 leplusdiscret.Lesnavigateursvisuelsutiliserontdespolicesplusoumoinsgrossespour rendrecompteduniveaudetitre.
<h1>Niveau1</h1> <h6>Niveau6</h6>

26

Crationd'uneapplicationWEBavecPHP/MySQL

Lersultatobtenu:

Niveau1
Niveau6 Labalisedelienoud'ancre<a></a> L'lmentApeuttreutilispourdfiniruneancre,unlienoulesdeux. L'exemplequisuitspcifieunlien:
Pourplusd'informationsurduW3C,consultezle<a href="http://www.w3.org/">siteWebduW3C</a>

Celiendsignela"homepage"duWorldWideWebConsortium.Lorsqu'unutilisateuractive celiendansunagentutilisateur,cedernierirarcuprerlaressourcepointe,etdansnotre cas,undocumentHTML. L'exemplesuivantillustreunedfinitiond'ancre.Supposezquenousdfinissionsuneancre nomme"ancreune".


...texteprcdentl'ancre... <aname="anchorone">l'endroitdel'ancreune</a> ...texteaprsl'ancre...

Cettedfinitionassigneunnomd'ancrelazoneentiredudocumentquicontientletexte "l'endroitdel'ancreune".Normalement,lecontenudeslmentsAneserontpasaffich diffremmentquelanormalelorsquel'lmentAnesertqu'dfiniruneancre. Unefoisl'ancredfinie,nousaimerionspouvoirnousyrfrerdepuisundocument(le mmeouunautre).LesURLquidsignentlesancresseterminentparun"#"suividunom del'ancre.Voiciquelquesexemplesd'URLainsiconstitues:


UneURLabsolue:http://www.mycompany.com/one.html#anchorone UneURLrelative:../one.html#anchorone Lorsquelel'ancreestsituedanslemmedocument:#anchorone

27

Crationd'uneapplicationWEBavecPHP/MySQL

Texteprformats<pre></pre> L'lmentPREindiqueauxagentsutilisateursvisuelsqueletextequiyestinclusest "prformat". Lesagentsutilisateursvisuelsdoiventtraiterletexteprformatcommesuit:


Ilsdoiventlaisserlesespacesblancsintacts. Ilsdevrontcrireletexteavecunepoliceespacementfixe. Leretourautomatiquelalignepourraytredsactiv. Letraitementdeladirectionnalitdoitresteroprationnel.

L'exemplesuivantmontreuntexteprformat:
<pre> Bonjour,j'aimeraisraliserunforumenPHPavecMySQL, Maisjenesaispasdutoutparoucommencer. Quelqu'unauraitiluneide? </pre>

Voicilerendudevotrenavigateur: Bonjour,j'aimeraisraliserunforumenPHPavecMySQL, Maisjenesaispasdutoutparoucommencer. Quelqu'unauraitiluneide?

Lestableaux<table></table>
L'lment TABLE contient tous les autres lments qui spcifient le titre, les lignes, le contenu,etleformatd'untableau.
<table> ...Lerestedutableau... </table>

Titresdetableaux:<caption></caption> Lorsqueprsent,letextedel'lmentCAPTIONdcrirausuellementlanaturedutableau. L'lmentCAPTIONdoitvenirimmdiatementaprslabalisededbutdel'lmentTABLE.


<table> <caption>Listedesthemesduforum</caption> ...Lerestedutableau... </table>

28

Crationd'uneapplicationWEBavecPHP/MySQL

Groupesdelignes:<thead>,<tbody>,<tfoot> Untableaudoitconteniraumoinsungroupedelignes.Chaquegroupedelignesestdivis entroisparties:entte,corps,etpitement.Lesenttesetpitementsdetableauxsont optionnels.L'lmentTHEADdfinitl'entte,l'lmentTFOOTdfinitlepitement,et l'lmentTBODYdfinitlecorpsdetableau. Lorsqu'ilexiste,chacundesinstancesd'lmentsTHEAD,TFOOT,etTBODYDOITcontenir aumoinsuneligne(voirTR). L'exemplesuivantillustrel'ordreetlastructuredesenttes,piedsetcorpsdetableaux.


<table> <thead> <tr>...informationd'entte...</tr> </head> <tfoot> <tr>...informationdepitement...</tr> </tfoot> <tbody> <tr>...premirelignedublocdedonnes...</tr> <tr>...deuximelignedublocdedonnes...</tr> </tbody> </table>

Lignesdetableau:<tr></tr> L'lmentTRagitcommeuncontaineraccueillantdescellulesd'uneligned'untableau. Cellulesdetableau:<th>et<td> LeslmentsTHcontiennentlesenttesdecolonnes(oudeligne),tandisqueles lmentsTDdfinissentdescellulesdedonnes.Cettedistinctionpermetauxagents utilisateursdereprsenterdiffremmentlesenttesetlescellulesdedonnes,mmeen l'absencedefeuillesdestyle. Lescellulespeuventtrevides(c.d.,neconteniraucunedonnes).

29

Crationd'uneapplicationWEBavecPHP/MySQL

Example:
<table> <caption>MyForum:Listedesthmes</caption> <thead> <tr><th>Thme</th><th>Description</th><th>Sujets </th><th>Date</th></tr> </thead> <tbody> <tr> <tdclass="left"><ahref="sujets.html">Dbutants</a></td> <tdclass="left"><ahref="sujets.html">Aideauxdbutantsous Linux</a></td> <tdclass="right">15</td> <tdclass="right">2003122112:45</td> </tr> <tr> <tdclass="left"><ahref="sujets.html">Devel</a></td> <tdclass="left"><ahref="sujets.html">Qestionsrelativesau dveloppement</a></td> <tdclass="right">2</td> <tdclass="right">2003122110:42</td> </tr> </tbody> </table>

Lesobjetsexternes
Lesimages<img> Cettebalisepermetd'intgrerdesimagesdansundocumentXHTML. Aujourd'hui,laplupartdesnavigateursWebsupportentlesimages,cependantLynx(le navigateurleplusutilisparlesaveuglesetlesmalvoyants)nelessupportentpas,eneffet unaveuglenepeuenaucuncasapprcierlecontenud'uneimage,saufsionluidcritson contenu. Danscetteoptiquelabalise<img>donnelapossibilitdafficheruntextealternatifpourles navigateursn'arrivantpasafficherlesimages:
<imgsrc="bienvenue.jpg"alt="Bienvenuesurnotresiteweb" title="Accueil"/>

30

Crationd'uneapplicationWEBavecPHP/MySQL

Lesobjetsexternes<object> DanslesanciennesversionsduHTMLintgrerdesscriptsexternes(AppletJava,Objet ActiveX,...),n'taitpastoujoursunechoseaise.Aujourd'huiuneseulebalisepermet d'implmentercetypederessource,labalise<object>. Cellecipermetenplusdeproposerunesolutionalternativelorsquelenavigateurnepeut afficherl'objet(pluginnonactiv,...):


<!Enpremiertenterl'appletPython> <objecttitle="TheEarthasseenfromspace" classid="http://www.observer.mars/TheEarth.py"> <!SinonessayerunevidoMPEG> <objectdata="TheEarth.mpeg"type="application/mpeg"> <!SinonafficherunGIFanim> <objectdata="TheEarth.gif"type="image/gif"> <!Sinonafficheruntextealternatif> The<strong>Earth</strong>asseenfromspace. </object> </object> </object>

LabaliseOBJECTpermetaussid'intgrerdesimages(toutcommelabaliseIMG),aussi vautilmieuxprfrerOBJECT(caruneimageestunobjetexterne).

LesFormulaires<form></form>
L'lmentFORMfaitofficedecontainerpourdescontrles.Ilspcifie:

Leprogrammequitraiteraleformulaireunefoiscompltetdmentsoumis(l'attribut action). Lamthodeparlaquellelesdonnesdposesparl'utilisateurseronttransmisesau serveur(l'attributmethod,valeurs'get'ou'post').

Unformulairepeutcontenirdutexteetdesbalises(paragraphes,listes,etc.)ainsiqueles contrlesdtaillsciaprs. Laportedel'attributnameassocichacundescontrlessitul'intrieurd'unlment FORMestlimitecetlmentFORM.

31

Crationd'uneapplicationWEBavecPHP/MySQL

Labalise<label> L'lmentLABELpeuttreutilispourattacheruneinformationunautrecontrle( l'exceptiondeslmentsLABELeuxmmes).Leslabelspourronttreaffichsparles agentsutilisateursd'unemultitudedefaons(ex.,visuellement,auditivementpardes synthtiseursvocaux,etc.)


<formaction="..."method="post"> <divclass="field"> <labelfor="cuser">Codeuser:</label><inputtype="text" name="cuser"id="cuser"value=""/> </div> <divclass="field"> <labelfor="pass">Motdepasse:</label><inputtype="password" name="passwd"id="pass"value=""/> </div> <divclass="buttons"> <inputclass="button"type="submit"name="action"value="Jeme connecte"/><br/> <inputclass="button"type="submit"name="action"value="J'aiperdu monmotdepasse"/> </div> </form>

NotezqueleslmentsLABELsontassocisauxlmentsINPUTvial'attributid. Labalise<input> Lanatured'uncontrledfiniparunlmentINPUTdpenddelavaleurdesonattribut type. Typesdechampsdesaisie L'attributtypedel'lmentINPUTdterminequelcontrledoittrecr. text Cetypecreunchampdetextemonoligne.Lavaleurmiselorsdelasoumissiondu formulaireestletexteentr. password Commeletype"text",maisletexteentrestvisualisl'crandesortequelescaractres nepuissenttrereconnus(parexempleunesried'toiles).Cecontrleestutilispour l'entrededonnessensiblestellesquedesmotsdepasse.Lavaleurmiselorsdela soumissionduformulaireestletextetap(etnonpasletexteaffich(!)).

32

Crationd'uneapplicationWEBavecPHP/MySQL

checkbox Unecasecocherestunesortedecommutateurbipolaire.Lorsqu'elleestcoche,lacase estdite"active".Lorsqu'elleestvide,lacaseest"inactive".Lavaleurdelacasecocher n'estmisequesicettedernireestactive. Plusieurscasescocherdummeformulairepourrontpartagerlemmenom.Aumoment delasoumission,toutecasecocher"active"ycompriscellesdenomsemblablemet unepairenom/valeurdanslaquellelenomseraidentique.Cecipermettraauxutilisateursde choisirdesvaleursmultiplespourunepropritunique. radio Unboutonradioestaussiuncommutateurbipolaire.Lorsqu'ilestmarqu,leboutonradio estdit"actif".Lorsqu'ilestvide,ilestrput"inactive".Lavaleurduboutonradion'estmise quesicedernierestactif. Plusieursboutonsradiodummeformulairepourrontpartagerlemmenom.Cependant, seull'und'entreeuxpourratreactiflafois.Lorsquel'undesboutonsradioestmarqu, touslesautresportantlemmenomsontautomatiquementdslectionns.Pourcet ensembledeboutonsradio,ilnepeutdonctremisqu'uneseulepairenom/valeur. submit Creunboutondesoumission.Lorsquel'utilisateurcliquesurcebouton,lecontenudu formulaireestsoumisauprogrammespcifiparlalocalisationdfinieparl'attributactionde l'lmentFORMenglobant. Unformulairepeutcontenirplusieursboutonsdesoumission.Cependant,seulelapaire nom/valeurduboutondesoumissionactionnseraenvoyedansleformulaire. image Creunboutondesoumissiongraphique.Lavaleurdel'attributsrcspcifiel'URLdel'image quiserviradereprsentationgraphiquedubouton.Certainsutilisateursnepourront visualisercetteimage.Nousrecommandonsfortementd'adjoindreladfinitiond'unattribut altvalantpouralternativetextuelledel'image. reset Creunboutonderinitialisation.Lorsqueceboutonestactivparl'utilisateur,lesvaleurs detouslescontrlesduformulairesontremisesleurvaleurinitiale,tellequementionne dansl'attributvalue.Lecouplenom/valeurd'unboutonderinitialisationn'estjamaisenvoy lorsdelasoumissiond'unformulaire. hidden Creunlmentquinedoitpastrereprsentparl'agentutilisateur.Cependant,lecouple nom/valeurdecetlmentserajointauxdonnesenvoyeslorsdelasoumissiondu formulaire. Cetypedecontrleseraengnralutilispourenregistrerdesdonnesd'changes client/serveurquiseraientautrementperduesdufaitdelanaturevolatiledesprocessus HTTP.
33

Crationd'uneapplicationWEBavecPHP/MySQL

file Demandel'utilisateurdedsignerunfichier.Lorsqueleformulaireestsoumis,lecontenu decefichierseratransmisauserveurcommeunevaleurden'importequelautrecontrle. Labalise<textarea> L'lmentTEXTAREAcreunezonedesaisiedetextemultilignes(paroppositionau champdetexteINPUTd'uneseuleligne).Lecontenudecetlmentfournitletexteinitial quiestprsentdanslazonedesaisie.


<formaction="..."method="post"> <divclass="field2"> <labelfor="titre">Titre:</label><br/> <inputtype="text"name="titre"id="titre"value=""/> </div> <divclass="field2"> <labelfor="message">Message:</message><br/> <textareacols="50"rows="12"name="message"id="message">Entrez icivotretexte...</textarea> </div> <divclass="buttons"> <inputclass="button"type="submit"name="action"value="Envoyer" /> <inputclass="button"type="reset"name="reset"value="Reset"/> </div> </form>

Lesbalises<select>et<option> L'lmentSELECTcreunelisted'optionspouvanttreslectionnesparl'utilisateur. ChaquelmentSELECTdoitconteniraumoinsunedfinitiond'option.Chaqueoptionest spcifieparuneinstancedel'lmentOPTION. Lesagentsutilisateurssebaserontsurlecontenudel'lmentOPTIONpourafficherle libelldel'optiondanslaliste.


<formaction="..."method="post"> <selectsize="4"name="user"> <optionselectedvalue="darken">PhilippeBOUSQUET</option> <optionvalue="alex">Alex</option> <optionvalue="akira">Akira</option> <optionvalue="tiana">Tatiana</option> <optionvalue="chris">Chistophe</option> <optionvalue="liloune">Liloune</option> </select> <inputtype="submit"name="action"value="Valider"/> </form>

34

Crationd'uneapplicationWEBavecPHP/MySQL

Vrifierlavaliditdespages
Aprsl'critureoulagnrationdepagesHTMLilfautquelespagessoientvalides.Ilne suffitpasdevrifierlerendudespagessurdiffrentsnavigateurs,cettevalidationdoittre faiteauprsdesvalidateursderfrenceduW3C: ServicedevalidationHTML:http://validator.w3.org/(fourniparleW3C) LynxviewerestunservicequipermetdevrifierlerendudepagesWeb,tellesqu'elles apparaissentdanslenavigateurenmodetexteLynx.Lynxesttrsutilisparlesnon voyantsetlesmalvoyantsainsiquesurcertainesconfigurationsinformatiquesnedisposant pasd'interfacegraphiquevolue.

35

Crationd'uneapplicationWEBavecPHP/MySQL

VI.LespagesduforumenXHTML
Pournotreforum,nousavonsdoncbesoinsdesixpagesXHTML,quenousallonsdcrire.

Lapaged'identification
Ceciestlapaged'entreduforum;toutepersonnevoulantutiliserleforumdoitsesigner(et doncdoittreinscrite). Cettepagecontientdoncunformulaire,avecdeuxchampssaisissables: Codeuser:reprsentantlepseudodel'utilisateur Motdepasse:sonmotdepasseluipermettantdeseconnecter. Ilyadeuxboutons: Seconnecter:quipermetd'effectuerlaconnexionproprementdit,etd'accderau forum J'aiperdumonmotdepasse:quipermetderenvoyerl'utilisateursonmotdepasse paremail. Pourlespersonnesquinesontpasencoreinscrites,ilyagalementunlienverslapage d'inscription.

Lapaged'inscription
Cettepageesttoutsimplementleformulairepermettantunepersonnedes'inscriresurle forum. Ceformulaireestcomposde6champssaisissablesetobligatoires: LeNomdel'utilisateur LePrnomdel'utilisateur L'emaildel'utilisateur(pourpouvoirluirenvoyersonmotdepasse) Lecodeuser:l'utilisateurdevrachoisirunpseudoquiluiservirapourseconnecter. Lemotdepasse:l'utilisateurdevrachoisirunmotdepassequiluiservirapourse connecter. Laconfirmation:l'utilisateurdevraressaisirsonmotdepasseici(vrifierl'galit aveclechampprcdent) Ilyadeuxboutons: S'inscrire:quipermetd'enregistrerlesdonnesdel'utilisateur,depluscelaeffectue laconnexionauforum Rtablir:quipermetderinitialiserleformulaire.

36

Crationd'uneapplicationWEBavecPHP/MySQL

Lalistedesthmes
Cettepagelistelesthmesdisponiblessurleforum,elleestconstituedeslments suivants: Labarredenavigation:laseuleoptionproposeestQuitter,quirenvoiverslapage d'identification. Letableaudressantlalistedesthmes: Nomduthme(lienverslapagedessujets) Descriptionduthme(lienverslapagedessujets) Lenombredesujetsposts Ladateduderniermessage

Lalistedessujets
Cettepagelistelessujetspostspourunthmedonnsurleforum,elleestconstituedes lmentssuivants: Labarredenavigation: Quitter,quirenvoiverslapaged'identification. Thmes,quirenvoiverslapagedelistedesthmesduforum Letableaudressantlalistedessujets: Auteurdusujet Titredusujet(lienverslapagedesmessages) Lenombrederponsesausujet Ladateduderniermessageconcernantlesujet UnboutonNouveau:quipermetdeposterunnouveausujet(lienversEdition Message).

Lesmessagesconcernantunsujet
Cettepageafficheladiscussionconcernantunsujet,elleestconstituedeslments suivants: Labarredenavigation: Quitter,quirenvoiverslapaged'identification. Thmes,quirenvoiverslapagedelistedesthmesduforum Sujets,quirenvoiverslapagedessujetsconcernantlethmeencours Letableaudressantladiscussion,etcecidansl'ordred'arriv: Auteurdumessage Titredumessage Datedumessage Textedumessage UnboutonRpondre:quipermetd'ajouterunmessagedansladiscussion(lienvers EditionMessage).

37

Crationd'uneapplicationWEBavecPHP/MySQL

L'ditiond'unmessage
Cettepagepermetlacrationdunsujetoud'effectuerunerponsesurunsujetdonn,elle estconstituedeslmentssuivants: Labarredenavigation: Quitter,quirenvoiverslapaged'identification. Thmes,quirenvoiverslapagedelistedesthmesduforum Sujets,quirenvoiverslapagedessujetsconcernantlethmeencours Messages,quirenvoiverslapageaffichantladiscussionencours(dansle casoul'onrpondunmessage) Unformulairecomposdedeuxchampssaisissables: Untitredemessage(pralimentavec"RE:titresujet"danslecasd'une rponse) Unezonedetexte,oul'utilisateursaisirasonmessage. Deuxboutons: UnboutonEnvoyerquipermetd'enregistreunmessageetderevenirverla pagedeladiscussion. UnboutonRtablirquipermetderinitialiserleformulaire. Letableaudressantladiscussion,dansl'ordreinversed'arrive: Auteurdumessage Titredumessage Datedumessage Textedumessage

UnepageXHTMLvalide
VoiciparexemplelecodesourceXHTMLdelapaged'ditiond'unmessageauformat XHTML(pagevalidparlevalidateurduW3C),sansmiseenformeparticulire.

<?xmlversion="1.0"encoding="ISO88591"?> <!DOCTYPEhtmlPUBLIC"//W3C//DTDXHTML1.0Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1strict.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="fr"lang="fr"> <head> <title>MyForumv0.1</title> <metahttpequiv="contenttype"content="text/html;charset=ISO 88591"/> <metaname="keywords"lang="fr"content="forum,discussion, logiciel,libre,php,mysql,xhtml,css"/> <metaname="author"lang="fr"content="PhilippeBousquet"/> <metaname="copyright"content="&copy;2004PhilippeBousquet."/> <metaname="license"content="GNUGeneralPublicLicense."/> </head> <body> <!Entetedesite> <divclass="header"> <imgclass="icon"src="imgs/linux.png"alt="ABUL"/>
38

Crationd'uneapplicationWEBavecPHP/MySQL <h1>MyForumv0.1</h1> <hr/> </div> <!Lapartieprincipale> <divclass="main"> <divclass="pwd"> Darken&gt;&gt;<ahref="login.html" title="quitter">Quitter</a>::<ahref="themes.html"title="retouraux thmes">Thmes</a>::<ahref="sujets.html"title="retoursur Devel">Sujets</a>::<ahref="messages.html"title="retoursurComment raliserunforumenPHP?">Messages</a> </div> <!Messaged'erreur> <divclass="err"> ERREUR:Vousdevezsaisirvosidentifiantspourvousinscrire </div> <!Rpondreaumessage> <divclass="box"> <h1>Rpondreaumessage</h1> <formaction="messages.html"method="get"> <divclass="field2"><labelfor="title">Titre: </label><br/><inputtype="text"id="title"name="titre"value="RE: CommentraliserunforumenPHP?"size="50"/></div> <divclass="field2"><labelfor="mess">Message: </label><br/><textareacols="50"id="mess"rows="12" name="message">Saisissezvotretexteici...</textarea></div> <divclass="buttons"> <inputclass="button"type="submit"name="action" value="Envoyer"/> &nbsp;<inputclass="button"type="reset"/> </div> </form> </div> <!Lalistedesthemes> <tableclass="old"> <caption>Devel:CommentraliserunforumenPHP?</caption> <tbody> <!1message> <trclass="row"><thclass="left">Darken</th><th class="left">RE:CommentraliserunforumenPHP?</th><th class="right">2003122112:45</th></tr> <trclass="row"><tdcolspan="3"class="left">Salut,<br/>En faittutombebien,jedonneactuellementuneconfrencesurle sujet.<br/>CellecilieuaulicKastler...<br/>@++</td></tr> <!1message> <trclass="row"><thclass="left">Akira</th><th class="left">CommentraliserunforumenPHP?</th><th class="right">2003122110:05</th></tr> <trclass="row"><tdcolspan="3"class="left"><pre>Bonjour, j'aimeraisraliserunforumenPHPavecMySQL,<br/>Maisjenesaispas dutoutparoucommencer.<br/>Quelqu'unaurraitilune ide....</pre></td></tr> </tbody> </table> </div> <!Lepieddepage> <divclass="footer"> <hr/> Copyright&copy;20032004PhilippeBOUSQUET<br/> CelogicielestsouslicenceGnuGenralPublicLicense </div>
39

Crationd'uneapplicationWEBavecPHP/MySQL </body> </html>

Etvoicilersultatdansvotrenavigateurinternet:

40

Crationd'uneapplicationWEBavecPHP/MySQL

VII.LamiseenformeparCSS
Lors la cration de nouveaux sites web, la sparation du contenu structur de sa prsentationestuneaubainepourlesdveloppeursWeb.Eneffet,ilestpossibledecrer desfeuillesdestylequis'appliquerontunouplusieursdocuments,permettantainside changerl'apparenced'unsiteenchangeantsimplementlafeuilledestyle. Il faut essayer de sparer au maximum le contenu de la prsentation. Pour cela il est prfrabled'crire,degnrer,desdocumentssuivantslaDTDXHTML1.0Strictpluttque laDTDXHTML1.0Transitional.

Lemodledesbotes
Chaquebotepossdeuneairedecontenu(ex.untexte,uneimage,etc.)entoureen optionparuneaired'espacement,uneairedebordureetuneairedemarge;Leschma suivantillustrelesrelationsentrecesairesetlaterminologieemployepourlesdsigner:

Onpeutsubdiviserlamarge,labordureetl'espacementselonqu'ils'agisseductgauche,droite, hautoubas(ex.dansleschma,"MG"mispourmargegauche[ndt.marginleft],"ED"mispour espacementdroit[ndt.paddingright],"BH"mispourbordurehaute[ndt.bordertop],etc.).

41

Crationd'uneapplicationWEBavecPHP/MySQL

Lespropritsdemarge:'margintop','marginright','marginbottom','marginleft' et'margin' Cespropritsspcifientlalargeurdel'airedelamarged'unebote.Lapropritraccourcie 'margin'spcifielavaleurdelamargepourlesquatrectslafois,lesautresproprits fixantcelledeleurctrespectif. Lespropritsdfiniesiciserfrentautypedevaleur<margelargeur>,celuiciaccepte unedesvaleurssuivantes: <longueur>:Spcifieunelargeurfixe; <pourcentage>:Lepourcentageestcalculparrapportlalargeurdublocconteneurde labotegnre.Ceciestvraiaussipourlesproprits'margintop'et'marginbottom',sauf dansuncontextedepageolepourcentageserfrelahauteurdelabotedelapage. auto Lespropritsd'espacement:'paddingtop','paddingright','paddingbottom', 'paddingleft'et'padding' Cespropritsspcifientlalargeurdel'aired'espacementd'unebote.Laproprit raccourcie'padding'spcifielavaleurdel'espacementpourlesquatrectslafois,les autrespropritsfixantcelledeleurctrespectif. Lespropritsdfiniesiciserfrentautypedevaleur<espacementlargeur>,celuici accepteunedesvaleurssuivantes: <longueur>:Spcifieunelargeurfixe. <pourcentage>:Lepourcentageestcalculparrapportlalargeurdublocconteneurde labotegnre.Demmepourlesproprits'paddingtop'et'paddingbottom'. ladiffrencedespropritsdemarge,lesvaleursd'espacementnepeuventpastre ngatives.Lesvaleursdepourcentagedespropritsd'espacement,toutcommecellesdes propritsdemarge,serfrentlalargeurdublocconteneurdelabotegnre.

42

Crationd'uneapplicationWEBavecPHP/MySQL

Lespropritsdebordure Cespropritsspcifientl'paisseur,lacouleuretlestyledel'airedebordured'unebote. Cellescis'appliquenttousleslments. L'paisseurdebordure:lesproprits'bordertopwidth','borderrightwidth', 'borderbottomwidth','borderleftwidth'et'borderwidth' Cespropritsspcifientl'paisseurdel'airedebordure.Lespropritsdfiniesicise rfrentautypedevaleur<bordurepaisseur>,celuiciacceptel'unedesvaleurssuivantes : thin:Uneborduremince. medium:Uneborduremoyenne. thick:Unebordurepaisse. <longueur>:L'paisseurdelabordureaunevaleurexplicite.Cettevaleurexplicitenepeut trengative. L'interprtationdestroispremiresvaleursdpenddel'agentutilisateur.Cependant,celuici doitrespecterlesdirectivessuivantes Lacouleurdebordure:lesproprits'bordertopcolor','borderrightcolor', 'borderbottomcolor','borderleftcolor'et'bordercolor' Cespropritsspcifientlacouleurdesborduresd'unebote. Voicilasignificationdesvaleurs: <couleur>:Spcifielavaleurd'unecouleur; transparent:Labordureesttransparent(toutenayantunepaisseur).

43

Crationd'uneapplicationWEBavecPHP/MySQL

Lestyledebordure:lesproprits'bordertopstyle','borderrightstyle','border bottomstyle','borderleftstyle'et'borderstyle' Cespropritsspcifientledessindesborduresd'unebote(entraitplein,traitdouble,trait pointill,etc.).Lespropritsdfiniesiciserfrentautypedevaleur<bordurestyle>,celui ciacceptel'unedesvaleurssuivantes: none:Aucunebordure.Cettevaleurforcelavaleurcalculedelaproprit'borderwidth' 0; hidden:Idem'none',saufpourlarsolutiondesconflitsdeborduredeslmentsde table; dotted:Labordureestuneligneenpointill; dashed:Labordureestuneligneentirets; solid:Labordureestuneligneentraitplein. double:Labordureestunelignedouble,dedeuxtraitspleins.Lasommedecesligneset del'espaceentreellesestgalelavaleurde'borderwidth'. groove:Laborduredonnel'impressionqu'elleestgravedanslecanevas; ridge:l'opposde'groove',laborduresemblesortirducanevas; inset:Laborduredonnel'impressionquelaboteentireestincrustedanslecanevas; outset:l'opposde'inset',laborduredonnel'impressionquelaboteentireestextrude ducanevas Lalargeurducontenu:laproprit'width' Cettepropritspcifielalargeurducontenudesbotesgnresparleslmentsdetype bloc. Lesvaleursontlessignificationssuivantes: <longueur>:Spcifieunelargeurfixe; <pourcentage>:Spcifieunelargeurenpourcentage.Lepourcentageestcalculen fonctiondelalargeurdublocconteneurdelabotegnre; auto Laproprit'width'n'admetpasdevaleursngatives. Lahauteurducontenu:laproprit'height' Cettepropritspcifielahauteurducontenudesbotesgnresparleslmentsdetype bloc. Lessignificationsdesvaleurssont: <longueur>:Spcifieunehauteurfixe; <pourcentage>:Spcifieunehauteurenpourcentage.Celuiciestcalculenfonctiondu blocconteneurdelabotegnre.Silahauteurdublocconteneurn'estpasspcifie explicitement(c..d.,cellecidpendantdelahauteurducontenu),savaleurestconsidre commetant'auto';
44

Crationd'uneapplicationWEBavecPHP/MySQL

auto Laproprit'height'n'admetpasdevaleurngative.

Lescouleursetarriresplans
Chaquebotepossdeuneairedecontenu(ex.untexte,uneimage,etc.)entoureen optionparuneaired'espacement,uneairedebordureetuneairedemarge;Leschma Lacouleurd'avantplan:laproprit'color' Cettepropritdcritlacouleurd'avantplanducontenudetexted'unlment.Voici plusieursfaonsd'indiquerlacouleurrouge: Exemple(s):
em{color:red}/*nomdecouleurprdfini*/ em{color:rgb(255,0,0)}/*couleursenRGBallantde0255*/ em{color:#FF0000}/*CouleurHTMLRGBHexadcimal*/

L'arrireplan Lesauteurspeuventspcifierl'arrirepland'unlment(c..d.lasurfaceoceluiest rendu)commetantunecouleuroubienuneimage.Selonlemodledelabote,l'arrire plancorrespondauxairesducontenu,del'espacementetdebordure.Lescouleursetstyles deborduresontspcifiesparlespropritsdebordure.Lesmargestanttransparentes, l'arrireplanduparentesttoujoursvisibleautraversdecellesci. Bienquelespropritsd'arrireplannes'hritentpas,l'arrireplandelaboteduparent transparatrapardfaut,dufaitdelavaleurinitiale'transparent'delaproprit'background color'. L'arrireplandelabotegnreparl'lmentracinerecouvrelatotalitducanevas. DanslecasdedocumentsHTML,onrecommandeauxauteursdespcifierunarrireplan l'lmentBODY,pluttqu'l'lmentHTML.Lesagentsutilisateursdevraientsuivreles rglesdeprsancesuivantespourremplirlefondducanevas:quandlavaleurdela proprit'background'pourl'lmentHTMLdiffrede'transparent',alorsutiliserlavaleur spcifie,autrementutilisercellespcifieparlaproprit'background'del'lmentBODY. Lerendun'estpasdfinisilavaleurfinalereste'transparent'. Lesproprits:'backgroundcolor','backgroundimage','backgroundrepeat', 'backgroundattachment','backgroundposition'et'background'

45

Crationd'uneapplicationWEBavecPHP/MySQL

'backgroundcolor' Valeur:<couleur>|transparent|inherit Initiale:transparent Cettepropritdonnelacouleurd'arrirepland'unlment,avecunevaleurde<couleur>, oubienaveclemotcl'transparent',celuicilaissantventuellementvoirlescouleurs situesplusendessous. 'backgroundimage' Valeur:<uri>|none|inherit Initiale:none S'applique:tousleslments Cettepropritspcifiel'imaged'arrirepland'unlment.Enmmetempsqu'uneimage, lesauteursdevraientaussispcifierunecouleurd'arrireplan,cettecouleurtantemploye enremplacementd'uneimageindisponible.Celleci,unefoisdisponible,vientse superposersurlefondcolor.Lacouleurdufondtantainsivisibleautraversdeszones transparentesdel'image. 'backgroundrepeat' Valeur:repeat|repeatx|repeaty|norepeat|inherit Initiale:repeat Quandonspcifieuneimaged'arrireplan,cettepropritindiquesil'imageestrpte (appose)etlamaniredelarptition.Lamosaquedefondrsultantecorrespondaux airesdecontenu,d'espacementetdeborduredelabotedel'lmentenquestion.Les significationsdesvaleurssont: Unexemplairedel'imaged'arrireplanestplacaucentre,puisd'autresexemplairesde cellesciseplacentlesunesaudessus,lesautresendessous,produisantunebande verticalederrirel'lment. 'backgroundattachment' Valeur:scroll|fixed|inherit Initiale:scroll Quandonspcifieuneimaged'arrireplan,cettepropritindiquesil'imageestfixepar rapportl'espacedevisualisation(pourlavaleur'fixed'),ousicellecidfileenmmetemps queledocument(pourlavaleur'scroll'). 'backgroundposition' Valeur:[[<pourcentage>|<longueur>]{1,2}|[[top|center|bottom]||[left|center|right] ]]|inherit Initiale:0%0%

46

Crationd'uneapplicationWEBavecPHP/MySQL

Quandonspcifieuneimaged'arrireplan,cettepropritindiquelapositioninitialede celleci. Quandl'imaged'arrireplanestfixeparrapportl'espacedevisualisation(voirlaproprit 'backgroundattachment'),cetteimageseplacerelativementceluici,etnonparrapport l'aired'espacementdel'lment.

Lespolices
Chaquebotepossdeuneairedecontenu(ex.untexte,uneimage,etc.)entoureen optionparuneaired'espacement,uneairedebordureetuneairedemarge;Leschma Lafamilledepolices:laproprit'fontfamily' Cettepropritdonneuneliste,parordredepriorit,denomsdefamillesdepoliceset/ou denomsdefamillesgnriques.Pourcontournercertainesdifficults,unepoliceseulene contenantpasncessairementtouslesglyphespourlerendudechacundescaractres d'undocument,oudespolicestantabsentesdecertainssystmes,ainsilaproprit permetauxauteursdespcifierunelistedepolices,cellescidemmestyleettaille,qui sontessayessuccessivementpourvrifierlacorrespondanced'unglypheavecun caractredonn.Onappellecettelisteunjeudepolices. Lafamilledepolicesgnriqueserautilisesiune,ouplusieurs,despolicesd'unjeude policesn'taientpasdisponibles.Bienquecertainespolicesfournissentunglyphede substitutionpourindiquerun"caractremanquant",celuiciprenanttypiquementl'aspect d'uncarr,onnedevraitpasconsidrerceglyphecommeunecorrespondancevalide. Ilexistedeuxtypesdenomsdefamilledepolices: <famillenom> Lenomd'unefamilledepoliceschoisi.Dansl'exempleprcdent,"Baskerville","Heisi MinchoW3"et"Symbol"sontdesnomsdefamilledepolices.Cellesdontl'intitulcontient desblancsdevraienttrecritesentreguillemets.Sionometlesguillemets,chacundes caractresblancsavantetaprslenomdelapolicesontignorsetchaquesquencede blancs,dansceluici,estconvertieenunseulespace; <famillegnrique> Ondfinitlesfamillesgnriquessuivantes:'serif','sansserif','cursive','fantasy'et 'monospace'.Voirlepassagetraitantdesfamillesdepolicesgnriquespourleur description.Lesnomsdefamilledepolicesgnriquessontdesmotscls,onnedoitpas lesmettreentreguillemets. Onrecommandeauxauteursdeciterunefamilledepolicesgnriquecommedernire alternative,pourunemeilleureefficacit.

47

Crationd'uneapplicationWEBavecPHP/MySQL

Lestyledepolice:lesproprits'fontstyle','fontvariant','fontweight'et'font stretch' 'fontstyle' Valeur:normal|italic|oblique|inherit Initiale:normal Laproprit'fontstyle'slectionne,parmilespolicesd'unefamilledepolices,cellesavecun dessinnormal(aussiappel"roman"ou"upright"),italiqueetoblique.Lessignificationsdes valeurssont: normalSpcifieunepoliceditenormaledanslabasededonnesdepolicedel'agent utilisateur; oblique:Spcifieunepolicediteobliquedanslabasededonnesdepolicedel'agent utilisateur.LespolicesdontlenomcontientlesmotsOblique,SlantedouInclinesont typiquementtiquetes'oblique'danslabasededonnesdepolicedel'agentutilisateur. Cellesaveccelabelayantpuavoirtobtenueslectroniquementeninclinantunepolice normale; italic:Spcifieunepolicediteitaliquedanslabasededonnesdepolicedel'agent utilisateur,ou,s'iln'yenapas,uneavecunlabel'oblique'.Lespolicesdontlenomcontient lesmotsItalic,CursiveouKursivseronttypiquementtiquetes'italic'. Exemple(s): 'fontvariant' Valeur:normal|smallcaps|inherit Initiale:normal Dansunepoliceenpetitescapitales,lesglyphesdeslettresminusculesontunaspect similaireauxlettresmajuscules,cependantavecunetaillerduiteetdesproportions lgrementdiffrentes.Laproprit'fontvariant'appellecegenredepolicebicamrale(qui adeuxcasses,commelescritureslatines).Cellecineproduitaucuneffetvisiblepourles crituresmonocamrales(quin'ontqu'uneseulecasse,commelaplupartdessystmes d'crituremondiaux).Lessignificationsdesvaleurssont: normal:Spcifieunepolicequin'estpastiquetecommetantenpetitescapitales; smallcaps:Spcifieunepolicetiquetecommetantenpetitescapitales.S'iln'yapas unetellepolice,lesagentsutilisateursdevraienteneffectuerlasimulation,parexempleen slectionnantunepolicenormaleetyremplaantleslettresminusculespardesmajuscules misesl'chelle.Endernierressort,leslettresmajusculesinchangesd'unepolicenormale peuventsesubstituerauxglyphesenpetitescapitales,ainsiletexteapparatraitentirement enmajuscule.

48

Crationd'uneapplicationWEBavecPHP/MySQL

'fontweight' Valeur:normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900| inherit Initiale:normal S'applique:tousleslments Hrite:oui Pourcentage:sansobjet Mdias:visuel Laproprit'fontweight'spcifielagraissedelapolice. 'fontstretch' Valeur:normal|wider|narrower|ultracondensed|extracondensed|condensed|semi condensed|semiexpanded|expanded|extraexpanded|ultraexpanded|inherit Laproprit'fontstretch'slectionnelesdessinsnormal,comprimoulargidansune familledepolices.Lesvaleursdesmotsclsabsolus,duplustroitauplusespac,sont: ultracondensed extracondensed condensed semicondensed normal semiexpanded expanded extraexpanded ultraexpanded Lemotclrelatif'wider'spcifielavaleurd'expansionsuprieurecellehrite(sanseffet silavaleurhriteestdj'ultraexpanded'),l'inversedumotclrelatif'narrower'celuici spcifiantlavaleurdecontractioninfrieurecellehrite(sanseffetsilavaleurhriteest dj'ultracondensed').

49

Crationd'uneapplicationWEBavecPHP/MySQL

Latailledepolice:laproprit'fontsize' 'fontsize' Valeur:<tailleabsolue>|<taillerelative>|<longueur>|<pourcentage>|inherit Initiale:medium Cettepropritdcritlatailled'unepolicespcifieexplicitement.Cellecicorrespondau carrem,unconceptissudelatypographie.Noterquecertainsglyphespeuventdborder deleurcarrem.Lessignificationsdesvaleurssont: <tailleabsolue> Unmotcl<tailleabsolue>serfreuneentredelatabledestaillesdepolice,celleci tantdresseetmiseenuvreparl'agentutilisateur.Lesvaleurspossibles: [xxsmall|xsmall|small|medium|large|xlarge|xxlarge] Pouruncrandemoniteur,onsuggreunfacteurd'chellede1.2entrelesvaleurs conscutivesdelatable;silavaleur'medium'correspond12pt,lavaleur'large'devrait correspondre14.4pt.Lesfacteursd'chellepeuventdiffrerselonlesmdiasconsidrs. Parailleurs,l'agentutilisateurdevraitprendreencomptelaqualitetladisponibilitdes policesaumomentducalculdecettetable.Cellecipeutaussidiffrerd'unefamillede policesuneautre. <taillerelative> Unmotcl<taillerelative>s'entendparrapportlatabledestaillesdepoliceetparrapport latailledelapolicedel'lmentparent.Lesvaleurspossibles: [larger|smaller] Parexemple,quandl'lmentparentaunetailledepolicedevaleur'medium',l'lmenten questionayantunevaleur'larger',latailledepolicersultantedeceluicicorrespondra 'large'.Silatailledepolicedel'lmentparentaunevaleurtroploigned'unedesvaleurs delatable,l'agentutilisateurestlibred'effectueruneinterpolationentrelesdeuxvaleursqui lacirconscriventouunarrondilavaleurlaplusproche.L'agentutilisateurpeutdevoir procderuneextrapolationdesvaleursdelatablequandunevaleurnumriquesortdu champdesmotscls. <longueur> Unevaleurdelongueurspcifieunetailledepoliceabsolue(indpendantedelatabledes taillesdepolicedel'agentutilisateur).Lesvaleursngativesnesontpasadmises; <pourcentage> Unevaleurenpourcentagespcifieunetailledepoliceabsolueparrapportcellede l'lmentparent.Leuremploi,demmepourlesvaleursexprimesen'em',conduitdes feuillesdestyleplusfiables,enpleinaccordavecleprincipedelacascade. Lavaleurrelle,pourcetteproprit,peutdiffrerdelavaleurcalcule,laproprit'font sizeadjust'ayantunevaleurnumriqueetcertainestaillesdepolicetantindisponibles.
50

Crationd'uneapplicationWEBavecPHP/MySQL

Letexte
L'alina:laproprit'textindent' 'textindent' Valeur:<longueur>|<pourcentage>|inherit Initiale:0 Cettepropritspcifieunalinapourlapremirelignedutextedansunbloc.Plus prcisment,celuidelapremirebotedelapremirerangedanslapremirebotede lignedecebloc.Cetteboteestindentepartirdubordgauche(oudroit,pourunemiseen pagededroitegauche)delabotedeligne.Lesagentsutilisateursdevraientreprsenter cetteindentationcommeunespacevide. L'alignement:laproprit'textalign' 'textalign' Valeur:left|right|center|justify|<chane>|inherit Initiale:selonl'agentutilisateuretselonlesensd'criture Cettepropritdcritl'alignementd'uncontenuenlignedansunlmentdetypebloc. Lessignificationsdesvaleurssont: left,right,centeretjustify Respectivement,l'alignementgauche,droite,centretjustifid'untexte; <chane> Spcifieunechanesurlaquellelescellulesd'unetablevonts'aligner(voirlepassagesur l'alignementhorizontaldansunecolonnepourledtailetpourunexemple).Cettevaleurne s'appliquequ'auxcellulesd'unetable.Appliqueunautrelment,cellecisera considrecommetant'left'ou'right',enfonctiondelavaleurdelaproprit'direction', respectivement'ltr'ou'rtl'. Unpavdetexteconsisteenunempilementdebotesdeligne.Pourlesvaleurs'left','right' et'center',cettepropritindiquelafaondontlesbotesenligne,danschacunedesbotes deligne,s'alignentparrapportauxctsgaucheetdroitedecesbotesdeligne; l'alignementn'estpaseffectuparrapportl'espacedevisualisation.Pourlavaleur'justify', l'agentutilisateurpeut,enplusdesajustementsdeposition,tirerlesbotesdeligne.Voir galementlesproprits'letterspacing'et'wordspacing').

51

Crationd'uneapplicationWEBavecPHP/MySQL

Ladcoration:laproprit'textdecoration' 'textdecoration' Valeur:none|[underline||overline||linethrough||blink]|inherit Initiale:none S'applique:tousleslments Cettepropritdcritlesdcorationsquisontajoutesautexted'unlment.Quandla propritestappliqueunlmentdetypebloc,elleagitsurtouslesdescendantsdetype enlignedeceluici.Quandelleestappliqueunlmentdetypeenligne,ouagitsur celuici,cettepropritinfluencetouteslesbotesgnresparcetlment.Quandles lmentssontvidesousanscontenutextuel(ex.l'lmentIMGenHTML),lesagents utilisateursdoiventignorercetteproprit. Lessignificationsdesvaleurssont: none:Aucunedcoration; underline:Chaquelignedetexteestsouligne; overline:Chaquelignedetextereoituntraitaudessus; linethrough:Chaquelignedetexteestrayeensonmilieu; blink:Letexteclignote(unealternanceentrevisibleetinvisible).Lesagentsutilisateurs conformesnesontpastenusdereconnatrecettevaleur. Cettepropritn'estpashrite,cependantlesbotesquidescendentd'unebotedebloc donnedevraientrecevoirlammedcorationquecelleci(ex.toutesdevraienttre soulignes).Lacouleurdeladcorationdevraittreconserve,mmesilavaleurdela proprit'color'deslmentsdescendantstaitdiffrente.

52

Crationd'uneapplicationWEBavecPHP/MySQL

Divers
Lepositionnementdesflottants:laproprit'float' 'float' Valeur:left|right|none|inherit Initiale:none S'applique:tousleslments,saufceuxpositionnsetceuxdontlecontenuest gnr Cettepropritspcifieleflottementd'unebotegauche,droiteoupasdutout.Onpeut l'employerpourdeslmentsgnrantdesbotesquinesontpasenpositionabsolue. Voicilasignificationdesvaleursquecelleciadmet: left:L'lmentgnreunebotedeblocquiflottegauche.Lecontenus'coulesurson flancdroitencommenantenhaut(enfonctiondelavaleurdelaproprit'clear').En ignorantlavaleurdelaproprit'display',saufsicettevaleurest'none'; right:Identique'left',maiseninversantlagauchedeladroite; none:Laboteneflottepas.

53

Crationd'uneapplicationWEBavecPHP/MySQL

Lecontrledufluxautourdesflottants:laproprit'clear' 'clear' Valeur:none|left|right|both|inherit Initiale:none S'applique:ceuxdeslmentsdetypebloc Cettepropritindiquequelsctsd'uneoudesbotesd'unlmentnedoiventpastre adjacentsuneboteflottanteprcdente.(Ilpeutarriverquel'lmentluimmeaitdes descendantsflottants,laproprit'clear'n'aalorsaucuneffetsureux). Cettepropritnepeuts'appliquerquauxlmentsdetypebloc(dontlesflottants).Dansle casdesbotescompactesetenenfilade,laproprits'appliquelabotedeblocfinale laquellecellesciappartiennent. Voicilasignificationdesvaleursadmisesparlapropritquandonl'appliqueauxbotesde blocnonflottantes: left:Lamargehautedelabotegnreestaugmentejusteassezpourquelebordhaut desaborduresoitsouslebordexternebasd'uneboteflottantgaucheissued'unlment prcdentdudocumentsource; right:Reprendreleprcdenteninversantgaucheetdroite; both:Labotegnresedplacesouschacunedesbotesflottantesquisontissues d'lmentsprcdentsdudocumentsource; none:Labotenesubitaucunecontraintedepositionvisvisdesflottants.

54

Crationd'uneapplicationWEBavecPHP/MySQL

Laproprit'display' 'display' Valeur:inline|block|listitem|........|none|inherit Initiale:inline S'applique:tousleslments Lesvaleursdecettepropritontlesenssuivant: block:induitunlmentgnrerunebotedeblocprincipale; inline:induitunlmentgnreruneouplusieursbotesenligne; listitem:induitunlment(ex.l'lmentLIenHTML)gnrerunebotedebloc principaleetuneboteenlignepourunitemdeliste;Consulterlapartietraitantdeslistes pourdesinformationsetdesexemplesdemiseenformedecellesci; none:cettevaleurfaitqu'aucuneboten'estgnreparl'lmentdanslastructurede formatage(c..d.,cetlmentn'apasd'influencesurlamiseenformedudocument).Les lmentsquiendescendentnegnrentpasdebotesnonplus;onnepeutplusmodifier leurcomportementaveclaproprit'display'. Ilestnoterqu'unevaleur'none'necrepasdeboteinvisible,ellenecrepasdebotedu tout.CSScomprenddesmcanismespermettantlagnrationdebotesdanslastructure deformatage,botesquiinfluencentlamiseenformemaisquinesontpasvisibles. Lavisibilit:laproprit'visibility' 'visibility' Valeur:visible|hidden|collapse|inherit Initiale:visible S'applique:tousleslments Laproprit'visibility'spcifielerendu,ounon,desbotesgnresparunlmentdonn. Cesbotes,bienqu'invisibles,influencenttoujourslamiseenformedudocument(utiliserla proprit'display'aveclavaleur'none'pourprohiberlagnrationd'unebote,etainsi toutesinfluencessurlamiseenforme). Lesvaleursontlessignificationssuivantes: visible:Labotegnreestvisible; hidden:Labotegnreestinvisible(entirementtransparente),maiscelleciinfluenant toujourslamiseenforme

55

Crationd'uneapplicationWEBavecPHP/MySQL

Ledbordement:laproprit'overflow' 'overflow' Valeur:visible|hidden|scroll|auto|inherit Initiale:visible S'applique:ceuxdeslmentsdetypeblocetceuxremplacs Cettepropritspcifiesilecontenud'unlmentdetypeblocdoittrerognquandceluici dbordedelabotedecetlment(quisecomportecommeunblocconteneur). Lessignificationsdesvaleurssont: visible:Lecontenuneserapasrogn,etceluicipeuttrereprsenthorsdelabotedu bloc; hidden:Lecontenuserarognetaucunmcanismededfilementnedevraittrefourni pourvoirlapartiequiauratrogne.Onspcifielatailleetlaformedureliquatdurognage aveclaproprit'clip'; scroll:Lecontenuserarognet,sidisponible,l'agentutilisateurfournitunmcanismede dfilementvisiblel'cran(telqu'unebarrededfilementouundispositifpanoramique), celuicidevraitapparatrepourunebotedonne,quelecontenudecellecisoitrognou non.Cecipourviterl'inconvnientquereprsenteraitdesbarresdedfilement apparaissantetdisparaissantdansunenvironnementdynamique.Quandcettevaleurest spcifieconjointementavecuntypedemdia'print,lapartieducontenuayantdborde devraitaussitreimprime; auto:L'interprtationdecettevaleurdpenddel'agentutilisateur,cependant,celuici devraitfournirunmcanismededfilementquandlesbotesdbordent. Mmequandlavaleurdelaproprit'overflow'est'visible',ilpeutarriverquelecontenusoit rognparlesystmed'exploitation,pourtenirdanslafentredudocumentdel'agent utilisateur.

ValidersafeuilledestyleCSS
Aprsl'critureoulagnrationdefeuillesdestylesCSS,onpeutvrifierlavaliditde cellescigrceunservicedevalidationduW3C. ServicedevalidationCSS:http://jigsaw.w3.org/cssvalidator/(fourniparleW3C)

56

Crationd'uneapplicationWEBavecPHP/MySQL

Exemple:MyForumavecCSS
VoiciunexempledefeuilledestyleCSS(default.css):
*{ fontfamily:Verdana,Arial,sansserif; } *.left{ textalign:left; } *.center{ textalign:center; } *.right{ textalign:right; } body{ background:#FFFFFF; color:#000000; } a:link{ color:#800060; background:transparent; textdecoration:none; } a:visited{ color:#800060; background:transparent; textdecoration:none; } a:hover{ color:#FFFFFF; background:#800060; textdecoration:none; } div.header{ borderbottom:1px#800050solid; } div.headerh1{ fontsize:30pt; color:#800050; } hr{ display:none; } img.icon{ float:left; } div.main{ margin:20px; } div.err{ textalign:center; fontsize:12pt; fontweight:bold;
57

Crationd'uneapplicationWEBavecPHP/MySQL color:#FF0000; } div.box{ marginleft:20%; marginright:20%; margintop:15px; marginbottom:15px; background:#800050; color:#FFFFFF; } div.boxh1{ fontsize:14pt; textalign:center; color:#FFFFFF; } div.field{ margintop:10px; width:70%; textalign:right; fontsize:8pt; fontweight:bold; } div.field2{ margintop:10px; marginleft:10%; textalign:left; fontsize:8pt; fontweight:bold; } div.buttons{ margintop:10px; paddingtop:10px; bordertop:1pxwhitesolid; textalign:center; fontsize:8pt; fontweight:bold; } input.button{ margin:5px; background:#C00060; color:#ffffff; bordercolor:#C00060; } div.pwd{ background:#C0C0C0; fontsize:12pt; fontweight:bold; marginbottom:20px; } table{ margintop:15px; marginleft:10%; width:80%; bordercollapse:collapse; borderspacing:0; border:1px#C00060solid; background:#800050; color:#FFFFFF; } caption{ margin:15px;
58

Crationd'uneapplicationWEBavecPHP/MySQL textalign:center; color:#800050; fontsize:14pt; fontweight:bold; } table.oldcaption{ display:none; } tablea:link{ color:#FFFFFF; background:transparent; textdecoration:none; } tablea:visited{ color:#FFFFFF; background:transparent; textdecoration:none; } tablea:hover{ color:#FFFF00; background:transparent; textdecoration:none; } td{ bordertop:1px#C00060solid; fontsize:8pt; } th{ bordertop:1px#C00060solid; background:#C00060; textalign:left; fontsize:8pt; fontweight:bold; } textarea{ fontsize:8pt; } div.footer{ bordertop:1px#800050solid; fontsize:8pt; }

59

Crationd'uneapplicationWEBavecPHP/MySQL

Voicigalementcequeceladonnelorsquel'onappliquelafeuilledestylelapageXHTML dveloppeprcdemment:

PourappliquerlafeuilleCSSilfautrajouterlalignesuivantedanslapartie<head></head> delasourceXHTML:
<linkrel="stylesheet"href="default.css"type="text/css"/>

60

Crationd'uneapplicationWEBavecPHP/MySQL

VIII.Programmationdel'application
Unefoislemodlededonnesdfinitetlemaquettagedel'applicationralis,onpeut remplacer le contenu statique de nos page web par de la programmation PHP, NousallonsdoncvoirdansunpremiertempslesbasesdulangagePHP,puis,dansun deuximetempslaprogrammationquenousallonsimplmenterdansnospagesHTML pourrendrenotreforumOprationnel.

61

Crationd'uneapplicationWEBavecPHP/MySQL

IX.LelangagePHP
PHPestunlangagedescriptsmultiplatesformes,embarqudansdesdocumentsHTML. PlussimplementPHPvousoffreunmoyendeplacerdesinstructionsdansvosdocuments HTMLenvuedecrerdescontenusdynamiques. Cesinstructionssontluesetanalysesparleserveurweb.Ellesneparviennentjamais jusqu'au navigateur qui affiche la page. Le serveur web remplace le code PHP par le contenuquelecodeavaitpourbutdegnrer.

Lesbasesdulangage
PHPestunvritablelangagedeprogrammation.SyntaxiquementiltientduPerletduC.Il s'agit d'un langage interprt, c'est dire que les fichiers crits dans ce langage ne ncessitentpasdecompilationsoudetraitementspcifiquedelapartd'uneapplication tierce.CequevouscodezenPHPestdirectementutilisablesurvotreserveurWeb. Commentaires L'utilitdeplacerdescommentairesjudicieuxdansvotrecodesourcen'estaujourd'huiplus dmontrer,eneffetilpermetdeprciserlesalgorithmesutilisdansunlangagehumain, cequisimplifiegrandementlamaintenanceouledbogageduprogramme. LePHPfournittroistypesdecommentaires:
/*CommentairedetypeC*/ //CommentairedetypeC++ #CommentairedetypeShellouPerl

62

Crationd'uneapplicationWEBavecPHP/MySQL

Variables LePHPestunlangagenontyp.Enclair,celasignifiequ'unevariablepeutcontenir indiffremmentunevaleurnumriqueouunechainedecaractres.paropposition,les langagestypscommeleCobligentdfinirunevariabled'uncertaintypeenfonctionde cequ'ellevacontenir. LesvariablesenPHPsontprfixsparlecaractre'$'.LelangagePHPpermetde manipulertroisgenresdevariables:

Lesvariablesscalaires:
$toto=5

Lestableaux:
$tab[0]="philippe"

Lestableauxassociatifs:
$age["philippe"]=27

Typesdedonnes PHPfournittroistypesdedonnesprimaires:nombresentiers,nombresdcimauxet chanes. Entiers LaplagedesentiersdansPHPestquivalentelaportedutypelongdulangageC. Surlesplateformes32bits,lesvaleursentiresvontde2147483648+2147483647. PHPconvertitautomatiquementlesvaleurssuprieuresennombredcimaux. Unentierpeuttreexprimendcimal(base10),hexadcimal(base16)ouenoctal(base 8). Parexemple:
$decimal=16; $hex=0x10; $octal=020;

Nombresdcimaux LaplagedesnombresdcimauxdansPHPestquivalentelaportdutypedoubleenC. Lesvaleurs,surlaplupartdesplateformes,vontde1.7E3081.7E+308. Unnombredcimalpeuttreexprimsousformedenombrenormalavecunpointdcimal ouennotationscientifique. Parexemple:


$var=0.017; $var=17.0E3;

63

Crationd'uneapplicationWEBavecPHP/MySQL

Chanes Unechaneestunesquencedecaractres. Unechanepeuttredlimitpardesguillemetssimplesoudoubles:


'Bonjourtous' "C'estcoollePHP"

Leschainesplacesentredoublesguillemetssontsujettesauxsubstitutionsdevariableset autraitementdessquencesd'chappement,alorsquecellesplacesentreguillemets simplesnelesontpas:


$a="jour!"; /*affiche:Bonjour!*/ echo"Bon\t$a"; /*affiche:Bon\t$a*/ echo'Bon\t$a';

Tableaudessquencesd'chappements \n Nouvelleligne \t \r \\ \$ Tabulation Retourchariot Antislash Signedollar

ValeursBoolennes ChaquevaleurpossdedansPHPunevaleurboolenneditedevrit(trueoufalse)quilui estassoci. C'esttypiquementutilisdanslesstructuresdecontrle,tellesqueif/elseoufor. Expressions L'expressionestlapierrematressedulangage.Toutcequipossdeunevaleurpeuttre considrcommeuneexpression,voiciquelquesexemples:


5 5+5 $a $a==5 sqrt(9)

64

Crationd'uneapplicationWEBavecPHP/MySQL

Oprateurs Lesexpressionssontcombinesetmanipulesl'aided'oprateurs. Letableaucidessousdresselalistedesoprateursdisponiblesainsiqueleurprioritetleur associativit. CesoprateursdevraientvousparatrefamiliersivousavezuneexprienceduC,Javaou dePerl: Oprateurs Priorit Associativit !,~,++,,@,(oprateursde transtypage) *,/,% +,,. <<,>> <,<=,>=,> ==,!= & ^ | && || ?:(oprateurconditionnel) And Xor Or 16 15 14 13 12 11 10 9 8 7 6 5 3 2 1 Droite Gauche Gauche Gauche Nonassociatif Nonassociatif Gauche Gauche Gauche Gauche Gauche Gauche Gauche Gauche Gauche Gauche

=,+=,=,*=,/=,%=,^=,.=,&=,|= 4

65

Crationd'uneapplicationWEBavecPHP/MySQL

Structuresdecontrles LesstructuresdecontrledePHPsonttrssimilairescellesutilisesparlelangageC. EllessontutilisespourcontrlerunfluxlogiquedansunscriptPHP. If L'instructionifestuneconditionstandardquel'ontrouvedanslaplupartdeslangages. Elleforcel'excutiond'uncodeparticuliersil'expressionsurlaquelleelleagitesttrue.


if(expr){ instructions } elseif(expr){ instructions } else{ instructions }

Switch L'instructionswitchpeuttreutiliselaplaced'unelongueinstructionif. L'expressiondechaqueinstructioncaseestcomparel'expressionswitchet,sielles correspondent,lecodesuivantcetteinstructionestexcute.


switch(expr){ caseexpr: instructions break; default: instructions break; }

While L'instructionwhileestuneconstructiondebouclequiexcuteducodedefaonrptitive aussilongtempsqu'uneexpressionparticulireestvraie.L'expressionestvrifieavant chaquedmarragedelaboucle.


while(expr){ instructions }

Onpeutarrterlefonctionnementd'uneboucleparl'instructionbreak.Onpeutgalement sauterlerestedesinstructionsetrecommencerl'itrationparlemotclcontinue.

66

Crationd'uneapplicationWEBavecPHP/MySQL

Do/while L'instructiondo/whileestsimilairel'instructionwhile,exceptionfaitequel'expressionest vrifieenfind'itrationaulieududbut:


do{ instructions } while(expr)

For uneboucleforoffreuneconstructionpluscomplexequelasimplebouclewhile. Ellecontienttroisexpressions:


Lapremireestl'expressiondedmarrage,ellen'estexcuterqu'endbutdela premireitration,onl'utiliseengnralpourinitialiseruncompteur. Lasecondeestuneexpressionconditionnellequicontrlel'itrationdelaboucle. Cetteexpressionestvrifieendbutdechaqueitration. Latroisimeexpressionestvalueenfindechaqueitration.Elleestengnral utilisepourincrmenteruncompteurdeboucle.


for(start_expr;cond_expr;iter_expr){ instructions }

Fonctions Unefonctionestunesquenced'instructionsdecode,doted'unnom,quipeutaccepter desparamtresetquiretourneunevaleur. Unappeldefonctionestuneexpressionayantunevaleur;cettevaleurestlavaleur retourneparlafonction.PHPproposeungrandnombredefonctionsinternes.PHPprend galementenchargelesfonctionsdfiniesparl'utilisateur. Pourdfinirunefonctiononutiliselemotclfunction:


functionbonjour($prenom){ return"Bonjour$prenom!"; }

Aprsavoirdfinitunefonction,onl'appellel'aided'argumentsappropris:
echobonjour("Philippe");

Onpeutgalementdfinirdesfonctionsavecdesparamtresoptionnels.Ilfautpourcela donnerunevaleurpardfautauparamtreoptionnel:
functionbonjour($prenom="toutlemonde"){ return"Bonjour$prenom!"; }

67

Crationd'uneapplicationWEBavecPHP/MySQL

Programmationobjet Uneclasseestunecollectiondevariablesetdefonctionsquifonctionnentavecces variables.Uneclasseestdfinieenutilisantlasyntaxesuivante:


<? classCaddie{ var$items;//Elmentsdenotrepanier //Ajoutde$numarticlesdetype$artnraupanier functionadd_item($artnr,$num){ $this>items[$artnr]+=$num; } //Suppressionde$numarticlesdutype$artnrdupanier functionremove_item($artnr,$num){ if($this>items[$artnr]>$num){ $this>items[$artnr]=$num; returnTRUE; }else{ returnFALSE; } } } ?>

68

Crationd'uneapplicationWEBavecPHP/MySQL

L'exemplecidessusdfinitlaclasseCaddiequiestcomposed'untableauassociatif contenantlesarticlesdupanieretdedeuxfonctions,unepourajouteretunepourenlever deslmentsaupanier. Note:EnPHP4,seulslesinitialiseursconstantspourlesvariablesvarsontautoriss. Utilisezlesconstructeurspourlesinitialisationsvariables,ouutilisantdesexpressions.


<? /*AucunedecessyntaxesnefonctionneraenPHP4*/ classCaddie{ var$date_du_jour=date("d/m/Y"); var$name=$firstname; var$owner='Fred'.'Jones'; /*etc...*/ } /*Voicicommentceladoitsefairedsormais.*/ classCaddie{ var$date_du_jour; var$name; var$owner; functionCaddie(){ $this>date_du_jour=date("d/m/Y"); $this>name=$GLOBALS['firstname']; /*etc...*/ } } ?>

Lesclassesformentuntypedevariable.Pourcrerunevariabledutypedsir,vousdevez utiliserl'oprateurnew.
<? $cart=newCaddie; $cart>add_item("10",1); ?>

L'instructioncidessuscrel'objet$cartdelaclassCaddie.Lafonctionadd_idem()est appeleafind'ajouterl'articlenumro10danslepanier. Uneclassepeuttreuneextensiond'uneautreclasse.Lesclasses"extended"ou"derived" hritentdetouteslesvariablesetdetouteslesfonctionsdelaclassepreplustoutesles dfinitionsquevousrajoutezcetteclasse.Celasefaitaveclemotclef"extends". L'hritagemultiplen'estpassupport.


<? classCaddie_nommeextendsCaddie{ var$owner; functionset_owner($name){ $this>owner=$name; } } ?>

69

Crationd'uneapplicationWEBavecPHP/MySQL

L'exemplecidessusdfinitlaclasseCaddie_nommequipossdelesmmevariablesque laclasseCaddieetlavariable$ownerenplus,ainsiquelafonctionset_owner().Vouscrez unpaniernominatifdelammemanirequeprcdemment,etvouspouvezalorsaffecter unnomaupanierouenconnatrelenom.Vouspouvezdetouteslesfaonsutiliserles mmesfonctionsquesurunpanierclassique.


<? $ncart=newCaddie_nomme;//Crationd'unpaniernominatif $ncart>set_owner("kris");//Affectationdunomdupanier print$ncart>owner;//Affichagedunomdupanier $ncart>add_item("10",1);//(hritagedesfonctionsdelaclasse pre) ?>

Danslesfonctionsd'uneclasse,lavariable$thisestgalel'objetdelaclasse.Vous pouvezutilisezlaforme"$this>quelquechose"pouraccderauxfonctionsouauxvariables del'objetcourant.Aussibiendepuisl'objetluimmequedel'extrieur,vousn'avezpas besoinde$pouraccderauxpropritsd'unobjet.


<? $ncart>owner="chris";//pasde'$' $ncart>$owner="chris"; //Ceciestinvalide,car$ncart>$ownerquivaut$ncart>"" $myvar='owner'; $ncart>$myvar="chris"; //Ceciestvalide,car$ncart>$ownerquivaut$ncart>owner ?>

Leconstructeurestlafonctionquiestappeleautomatiquementparlaclasselorsquevous crezunenouvelleinstanced'uneclasse.Lafonctionconstructeuralemmenomquela classe.


<? classAuto_CaddieextendsCaddie{ functionAuto_Caddie(){ $this>add_item("10",1); } } ?>

L'exemplecidessusdfinitlaclasseAuto_CaddiequihritedelaclasseCaddieetdfinitle constructeurdelaclasse.Cedernierinitialiselepanieravec1articledetypenumro10ds quel'instruction"new"estappele.Lafonctionconstructeurpeutprendreounon,des paramtresoptionnels,cequilarendbeaucouppluspratique.

70

Crationd'uneapplicationWEBavecPHP/MySQL

<? classConstructor_CaddieextendsCaddie{ functionConstructor_Caddie($item="10",$num=1){ $this>add_item($item,$num); } } //Placedanslecaddietoujourslammechose... $default_cart=newConstructor_Caddie; //Placedanslecaddiedesobjetsdiffrents,commedanslaralit $different_cart=newConstructor_Caddie("20",17); ?>

Pourlesclassesquiutilisentl'hritage,leconstructeurdelaclassepren'estpas automatiquementappellorsqueleconstructeurdelaclassedriveestappel.

71

Crationd'uneapplicationWEBavecPHP/MySQL

PHPdanslespagesXHTML
Vousavezpeuttreremarqu,quetoutcequiestaffichl'aidedel'instructionechofigure danslecodeHTMLfinal,envoyaunavigateur. C'est la base du fonctionnement de PHP comme langage embarqu dans HTML et galement sa grande force par rapport l'utilisation de scripts ou d'excutables CGI. L'imbricationdePHPdansHTML,permetainsidecrerdesfichiersmixtes.Oncomprend alorspleinementlesavantagesdePHP. CidessousunpetitexempledescriptPHP:
<!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"> <html> <head> <title>Pagedebienvenue</title> <metahttpequiv="contenttype"content="text/html;charset=ISO 88591"> </head> <body> <h1>Bienvenuesurcesite</h1> <hr/> <? $action=$HTTP_POST_VARS["action"]; if($action!="OK"){ echo"<formaction=\"bienvenue.php\"method=\"POST\">\n"; echo"<h2>VeuillezentrervotrePrnometvotreannede naissance</h2>\n"; echo"<strong>Prenom:</strong><inputtype=\"text\" name=\"prenom\"value=\"\"/><br/>\n"; echo"<strong>Annedenaissance:</strong><inputtype=\"text\" name=\"dnaiss\"value=\"\"/> <br/>\n"; echo"<inputtype=\"submit\"name=\"action\"value=\"OK\"/>"; echo"</form>"; } else{ $prenom=$HTTP_POST_VARS["prenom"]; $dnaiss=$HTTP_POST_VARS["dnaiss"]; $date=date("Y");echo"<h2>Bonjour$prenom</h2>\n"; echo"Aujourd'huinoussommele",date("d/m/Y"),"<br/>\n"; echo"Tuas<strong>",($date$dnaiss),"</strong>ans.<br/>\n"; } ?> <hr/> Copyright(c)2003PhilippeBOUSQUET.<br/> Celogicielestsouslicence<strong>GnuGeneralPublic License</strong>. </body> </html>

72

Crationd'uneapplicationWEBavecPHP/MySQL

Lesfonctionsprdfinies
Nousneverronsiciquelesfonctionsdontnousallonsnousservirpourlacrationdenotre forum,pouravoirlalistecompltedesfonctionsdisponiblesenPHPveuillezconsulterla page:http://dev.nexen.net/docs/php/manuel_toc.html#functions Sessions LagestiondessessionsavecPHPestunmoyendesauverdesinformationsentredeux accs.Celapermetnotammentdeconstruiredesapplicationspersonnalises,etd'accrotre l'attraitdevotresite. Chaquevisiteurquiaccdevotresitesevoitassignerunnumrod'identifiant,appelplus loin"identifiantdesession".Celuiciestenregistrsoitdansuncookie,chezleclient,soit dansl'URL. Lessessionsvouspermettrontd'enregistrerdesvariables,pourlesprserveretlesrutiliser toutaulongdesrequtes.Lorsqu'unvisiteuraccdevotresite,PHPvrifiera automatiquement(sisession.auto_startest1)oumanuellement(explicitementavec session_start()ouimplicitementavecsession_register())siunesessionadjtouverte. Siunetellesessionexistedj,l'environnementprcdentserarecr. Touteslesvariablesenregistrerserontenregistressurledisquelafindechaque requte.Lesvariablesenregistresmaisnondfiniesserontmarquescommetel.Lorsdes accsultrieurs,ellesneserontdfiniesquesil'utilisateurlefait. Ilyadeuxmodesdepropagationdel'identifiantdesession:

Cookies ParamtreURL

Lemoduledesessionsupportelesdeuxtechniques.Lamthodeparcookieestoptimale, maistantdonnlepeudefiabilit(lesclientspeuventlesrefuser,ouleseffacer),onne peutpassecontenterdecettetechnique.Ladeuximemthodeplacel'identifiantde sessiondirectementdansl'URL. session_start Initialiselesdonnesdesession


boolsession_start(void)

session_start()creunesession(oucontinuelasessioncourante,enfonctiondel'identifiant desessionpassparunevariableGETouparuncookie) session_start()retournetoujoursTRUE. session_destroy Dtruittouteslesdonnesenregistresd'unesession


boolsession_destroy(void)

session_destroy()dtruittouteslesdonnesassocieslasessioncourante. session_destroy()retourneTRUEencasdesuccs,etFALSEsinon.
73

Crationd'uneapplicationWEBavecPHP/MySQL

session_name Affecteet/ouretournelenomdelasessioncourante
stringsession_name(stringname)

session_name()retournelenomdelasessioncourante.Sinameestfourni,lenomdela sessionchangera,etprendralavaleurfournie. Lenomdesessionfaitrfrencel'identifiantdesessiondanslescookies.Ilnedoit contenirquedescaractresalphanumriques;ildoittrecourtetdescriptif.(i.e.surtoutpour lesutilisateursd'alertesdecookie).Lenomdesessionestremisunevaleurpardfaut, enregistresdanssession.nameaumomentdudmarrage.Ainsi,vousdevezappeler session_name()chaquerequte(etavantsession_start()ousession_register()). Exemple:


<? #ChangelenomdelasessionWebsiteID $previous_name=session_name("WebsiteID"); echo"L'anciennomdelasessiontait$previous_name<P>"; ?>

session_id Affecteet/ouretournel'identifiantdesessioncourante
stringsession_id(stringid)

session_id()retournel'identifiantdesessioncourante.Siidestfourni,ilremplacera l'identifiantcourantdelasession. LaconstanteSIDpeutaussitreutilisepourretrouverlenomdelasessioncouranteetson identifiant,commechaneajouterdanslesURL. session_register Enregistreunevariabledanslasessioncourante


boolsession_register(mixedname,mixed...)

session_register()enregistreunevariableaveclenomnamedanslasessioncourante. session_register()accepteunnombred'argumentsvariable,quipeuventtresoitdes chanesreprsentantslenomdelavariable,soituntableau,contenantdeschanesou d'autrestableaux(casd'untableaurcursif). session_register()retourneTRUElorsquelesvariablessontcorrectementenregistres. session_unregister Supprimeunevariabledanslasessioncourante


boolsession_unregister(mixedname)

session_unregister()supprimelavariablenommenamedanslasessioncourante. session_unregister()retourneTRUElorsquelavariableatcorrectementsupprimedela session.

74

Crationd'uneapplicationWEBavecPHP/MySQL

Envoidemail
boolmail(stringto,stringsubject,stringmessage,string additional_headers,stringadditional_parameters)

mail()posteautomatiquementlemessagemessagedestinationdeto.Lesdestinataires multiplesdoiventtresparspardesvirgules. Envoidecourrierlectronique(mail)


<? mail("rasmus@lerdorf.on.ca","MonSujet","Ligne1\nLigne2\nLigne 3"); ?>

Lequatrimeargumentpassserainsrlafindel'entte.Typiquement,celapermet d'insrerdesenttessupplmentaires.Lesenttesmultiplesdoiventtresparspardes virgules. Silecinquimeargumentadditional_parametersestfourni,PHPl'utiliseradanssonappel duprogrammed'envoidecourrierlectronique.Ceciestpratiquepourpasserunevaleur correctel'entteReturnPath,avecsendmail. Note:LecinquimeparamtreatajoutenPHP4.0.5. EnvoideeMailavecdesenttessupplmentaires.


<? mail("nobody@aol.com","Lesujet",$message, "From:webmaster@$SERVER_NAME\nReply To:webmaster@$SERVER_NAME\nXMailer:PHP/".phpversion()); ?>

Aveclecinquimeparamtre,vouspouvezajouterd'autresparamtresdelignede commandequiserontutilissparleprogrammed'envoidecourrier.Dansl'exempleci dessous,l'entteReturnPathestcorrectementparamtr.Normalement,sendmailajoute automatiquementl'entteXAuthenticationWarning(paramtref),carl'utilisateur"serveur web"n'estprobablementpasundesesutilisateursdeconfiance("trustedusers").Pour supprimercettealerte,ajoutezl'utilisateurduserveurwebdanslaconfigurationdesendmail. EnvoideeMailavecdesenttessupplmentairesetunparamtredelignedecommande supplmentaire


<? mail("nobody@aol.com","thesubject",$message, "From:webmaster@$SERVER_NAME","fwebmaster@$SERVERNAME"); ?>

75

Crationd'uneapplicationWEBavecPHP/MySQL

MySQL Cesfonctionsvouspermettentd'accderauxbasesdedonnesMySQL.Afindepouvoirles utiliser,vousdevezcompilerPHPaveclesupportMySQL,enutilisantl'optionwithmysql. Sivousutilisezcettefonctionsansprciserlechemind'accslabaseMySQL,PHP utiliseraleslibrairiesclienteMySQLfourniesenstandard.Lesutilisateursquifonttourner d'autresapplicationsquiutilisentellesmmesMySQL(parexemple,PHP3etPHP4 utilisscommedesmodulesconcurrentsapache,ouencoreauthmysql),devraittoujours spcifierlecheminjusqu'MySQL:withmysql=/path/to/mysql.CelavaforcerPHP utiliserleslibrairiesclientesinstallesparMySQLetviteralesconflits. Plusd'informationssontdisponibleshttp://www.mysql.com/. LadocumentationdeMySQLestdisponibleshttp://www.mysql.com/documentation/,ainsi qu'enfranaischeznexen. mysql_affected_rows RetournelenombredelignesaffecteslorsdeladernirerequteSQL.
intmysql_affected_rows(resourcelink_identifier)

mysql_affected_rows()retournelenombredelignesaffecteslorsdeladernirerequte INSERT,UPDATEouDELETEsurleserveurassocil'identifiantdeconnexion.Sicet identifiantn'estpasprcis,mysql_affected_rows()utiliseladernireconnexionouverte. Siladernirerequteachou,mysql_affected_rows()retourne1. mysql_close FermelaconnexionMySQL


boolmysql_close(ressourcelink_identifier)

mysql_close()retourneTRUEencasdesuccsetFALSEsinon. mysql_close()fermelaconnexionauserveurMySQLassociel'identifiantlink_identifier.Si cetidentifiantn'estpasspcifi,cettecommandes'appliqueladernireconnexion ouverte. mysql_connect OuvreuneconnexionunserveurMySQL


intmysql_connect(stringhostname,stringusername,stringpassword)

mysql_connect()retourneunidentifiantpositifdeconnexionencasdesuccs,etsinon FALSE. mysql_connect()tablituneconnexionunserveurMySQL.Touslesargumentssont optionnels,ets'ilsmanquent,lesvaleurspardfautsontutilises(('localhost',nomdu propritaireduprocessus,motdepassevide). Siunsecondappelmysql_connect()estfaitaveclesmmesarguments,PHPnevapas ouvrirunenouvelleconnexion,maisvaretournerl'identifiantdelaconnexiondjouverte. Lelienserafermautomatiquementdsquel'excutionduscriptseratermine,moins d'trefermexplicitementavecmysql_close().


76

Crationd'uneapplicationWEBavecPHP/MySQL

ExampleMySQLconnect
<?PHP $link=mysql_connect("kraemer","marliesle","secret") ordie("Connexionimpossible"); print("Connexionrussie"); mysql_close($link); ?>

mysql_db_query EnvoieunerequteMySQLunserveurMySQL
resourcemysql_db_query(stringdatabase,stringquery,resource link_identifier)

mysql_db_query()retourneunidentifiantdersultatsilarequterussitetFALSEsinon. mysql_db_query()slectionneunebasededonnesetexcuteunerequte.Sil'identifiant delienlink_identifiern'estpasprcis,mysql_db_query()prendrapardfautladernire connexionouvertesurleserveuretsiellen'entrouvepas,elletenteradeseconnecter,en utilisantlafonctionmysql_connect(),sansarguments. mysql_errno Retournelenumrodemessaged'erreurdeladernireoprationMySQL.


intmysql_errno(ressourcelink_identifier)

mysql_errno()retournelenumrodemessaged'erreurdeladernireoprationMySQLsur laconnexioncourante,ousurlaconnexionspcifieavecl'optionlink_identifier.Leserreurs quisontremontesdepuisleserveurMySQLnesontplusdesalertes.Alaplace,ilfaut utilisermysql_errno()pourobtenirlenumrod'erreur. mysql_error Retourneletexteassocieavecl'erreurgnrelorsdeladernirerequte.


stringmysql_error(resourcelink_identifier)

mysql_error()retournelederniermessaged'erreurMySQLsurlaconnexioncourante,ou surlaconnexionspcifieaveclink_identifier. LeserreursgnresparmySQLnesetransformentplusenalerte.Alaplace,ellessont accessiblesviacesfonctions:


<?PHP mysql_connect("marliesle"); echomysql_errno().":".mysql_error()."<BR>"; mysql_select_db("nonexistentdb"); echomysql_errno().":".mysql_error()."<BR>"; $conn=mysql_query("SELECT*FROMnonexistenttable"); echomysql_errno().":".mysql_error()."<BR>"; ?>

77

Crationd'uneapplicationWEBavecPHP/MySQL

mysql_fetch_array Retourneunelignedersultatsouslaformed'untableauassociatif.
arraymysql_fetch_array(resourceresult_identifier,intresult_type)

mysql_fetch_array()retourneuntableauquicontientlalignedemande,ouFALSEsiilne resteplusdeligne. mysql_fetch_array()estuneversiontenduedemysql_fetch_row().Enplusd'enregistrerles donnessousformed'untableauindicenumrique,ellepeutaussilesenregistrerdansun tableauassociatif,enutilisantlesnomsdeschampscommeindices. Siplusieurscolonnesontlemmenom,ladernirecolonneauralapriorit.Pouraccder auxautrescolonnesdummenom,vousdevezutiliserl'indexnumriques,oufaireunalias pourchaquecolonne. Ilestimportantdesoulignequemysql_fetch_array()N'estPASpluslenteque mysql_fetch_row(),tandisqu'elleajouteunconfortd'utilisationnotable..
<?PHP mysql_connect($host,$user,$password); $result=mysql_db_query("database","select*fromtable"); while($row=mysql_fetch_array($result)){ echo$row["user_id"]; echo$row["fullname"]; } mysql_free_result($result); ?>

mysql_fetch_row Retourneunelignedersultatsouslaformed'untableau
arraymysql_fetch_row(resourceresult_identifier)

mysql_fetch_row()retourneuntableaunumrquicorrespondlalignedemande,ou FALSE,siilneresteplusdeligne. mysql_fetch_row()varechercherunelignedanslersultatassocil'identifiantdersultat spcifi.Laligneestretournesouslaformed'untableau.Chaquecolonneestenregistr souslaformed'untableaucommenantlaposition0. Lesappelssuivantsmysql_fetch_row()retournerontlalignesuivantedanslersultat,ou FALSEsiiln'yaplusdelignedisponible. mysql_free_result Effacelersultatdelammoire


intmysql_free_result(resourceresult_identifier)

mysql_free_result()n'estappelerquesivousavezpeurd'utilisertropdemmoiredurant l'excutiondevotrescript.Toutelammoireassociel'identifiantdersultatsera automatiquementlibre.

78

Crationd'uneapplicationWEBavecPHP/MySQL

mysql_num_rows Retournelenombredeligned'unrsultat
intmysql_num_rows(resourceresult_identifier)

mysql_num_rows()retournelenombredelignesd'unrsultat.Cettecommanden'estvalide quepourlescommandesSELECT.Pourconnatrelenombredelignesretournespar INSERT,UPDATEouDELETE,utilisezmysql_affected_rows(). Exemplemysql_num_rows()parcrubel@trilizio.org


<?PHP $conn=mysql_connect("adressedel'hote","utilisateur","motde passe"); mysql_select_db("base",$conn);//ncessairesivousavezplusieurs bases $Resultfornummembers=mysql_query("SELECT*FROMAccounts",$conn); $NumMembers=mysql_num_rows($Resultfornummembers); echo"$NumMembersMembres"; ?>

mysql_query EnvoieunerequteSQLunserveurMySQL
resourcemysql_query(stringquery,resourcelink_identifier)

mysql_query()envoieunerequteSQLlabasededonnesactuellementactivesurle serveurMySQL.Silink_identifiern'estpasprcis,ladernireconnexionestutilise.Si aucuneconnexionn'atouverte,lafonctiontenterad'enouvrirune,aveclafonction mysql_connect()maissansaucunparamtre(c'estdireaveclesvaleurspardfaut). mysql_query()retourneTRUEouFALSE,pourindiquerlesuccsoul'checdelarequte. EncasderetourTRUE,larequtetaitvalideetaputreexcutsurleserveur.Cela n'indiquepaslenombredeligneaffectes,ouretournes.Ilestparfaitementpossible qu'unerequtevaliden'affecteaucuneligneouneretourneaucuneligne. mysql_result Retourneunchampd'unrsultat
mixedmysql_result(resourceresult_identifier,introw,mixedfield)

mysql_result()retournelecontenud'unchampdanslersultatMySQLresult_identifier. L'argumentrowpeuttreunoffsetdechamps,oulenomd'unchamp,oulenomdelatable +point+lenomduchamp("table.champ").Silacolonneataliase,utilisezde prfrencel'alias. Lorsquevoustravaillezsurdesrsultatsdegrandetaille,vousdevriezutiliserunedes fonctionsquivontrechercheruneligneentiredansuntableau.Cesfonctionssont NETTEMENTplusrapides.Deplus,l'utilisationd'unoffsetnumriquesestaussibeaucoup plusrapidequedespcifierunnomlittral. Lesappelsmysql_result()nedevraientpastremlangsavecd'autresfonctionsqui travaillentaussisurlersultat.
79

Crationd'uneapplicationWEBavecPHP/MySQL

mysql_select_db SlectionneunebasededonnesMySQL
intmysql_select_db(stringdatabase_name,resourcelink_identifier)

mysql_select_db()retourneTRUEencasdesuccs,FALSEsinon. mysql_select_db()changelabasededonnesactivesurlaconnexionreprsentepar link_identifier.Siaucunidentifiantn'estspcifi,ladernireconnexionestutilise.S'iln'ya pasdedernireconnexion,lafonctiontenteradeseconnecterseule,avecmysql_connect() etlesparamtrespardfaut. Touteslesrequtessuivantesavecmysql_query()serontfaitesaveclabasededonnes active. ChainesdeCaractres strtoupper Mettouslescaractresenmajuscules
stringstrtoupper(stringstring)

strtoupper()retournestringavectoussescaractresalphabtiquesmisenmajuscule. Notezquelecaractre'alphabtique'estdterminparlatabledecaractreslocale.Par exemple,danslatabledescaractrespardfautdu"C",descaractrestelsqueaumlaut ()neserontpasconvertis. Exempleavecstrtoupper()


<?PHP $str="MarieAUnPetitAgneau,EtElleL'Adore"; $str=strtoupper($str); print$str; #Affiche:MARIEAUNPETITAGNEAU,ETELLEL'ADORE ?>

strtolower Mettouslescaractresenminuscules
stringstrtolower(stringstring)

strtolower()retournestringavectoussescaractresalphabtiquesmisenmajuscule. ucfirst Mettouslepremiercaractredelachaneenmajuscule


stringucfirst(stringstring)

ucfirst()retournestringaveclepremiercaractremisenmajuscule.

80

Crationd'uneapplicationWEBavecPHP/MySQL

X.L'applicationmyForum
Voicilastructuredel'application:
myForum/ +imgs/ |+linux.png +inc/ |+config.inc.php |+session.inc.php |+user.inc.php +default.css +editer.php +inscription.php +inscrit.php +login.php +mail.php +messages.php +savemessage.php +sujets.php +themes.php

LaclasseConfig
Cetteclassepermetdestockerdansunobjetlesdonnespermettantd'accderlabase dedonnes,ellepermetgalementdevrifierquelaconnexionauserveurMySQLestOK.
<? // //config.inc.php // classConfig{ var$db_host; var$db_name; var$db_user; var$db_pass; functionConfig(){ $this>db_host="localhost"; $this>db_name="myforum"; $this>db_user="root"; $this>db_pass=""; } functiongetDbHost(){ return$this>db_host; } functiongetDbName(){
81

Crationd'uneapplicationWEBavecPHP/MySQL return$this>db_name; } functiongetDbUser(){ return$this>db_user; } functiongetDbPass(){ return$this>db_pass; } functiontestConnection(){ $dbh=mysql_connect($this>getDbHost(),$this>getDbUser(), $this>getDbPass()); if($dbh==false){ returnfalse; } else{ $dbh=mysql_select_db($this>getDbName()); if($dbh==false){ returnfalse; } else{ returntrue; } } } } ?>

82

Crationd'uneapplicationWEBavecPHP/MySQL

LaclasseSession
Cetteclassecreunobjetpermettantdegrerlessessions:rcuprationsdedonnes, sauvegardededonnes(notezl'utilisationde$_SESSIONaulieudesession_(un)register), modificationsdesURL(ajoutdesparamsdesession).
<? // //session.inc.php // classSession{ //Constructeur functionSession(){ session_start(); } //SupportSessionpourlesurls functionparseURL($url,$vars=""){ return$url."?".session_name()."=".session_id(). ($vars!=""?"&".$vars:""); } //Sauvegarded'unevariable functionsave($name,$value){ $_SESSION[$name]=$value; } //Chargerunevariablesauvegarde functionload($name){ return$_SESSION[$name]; } //Fermerlasession functionclose(){ session_destroy(); } } ?>

83

Crationd'uneapplicationWEBavecPHP/MySQL

LaclasseUser
Cetteclassecreunobjetpermettantdegrerl'utilisateur.
// //user.inc.php // classUser{ var$user_code; var$user_name; var$user_firstname; var$user_email; //Constructeur functionUser(){ $user_code=""; $user_name=""; $user_firstname=""; $user_email=""; } //Verificationdelasession functionisValid($session){ //Lasessionestelleactive $this>restoreData($session); if($this>getId()==""){ returnfalse; } else{ //Lasessionestactive returntrue; } } functionconnect($cuser,$pass,$cfg,$session){ $this>user_code=$cuser; $dbh=mysql_connect($cfg>getDbHost(),$cfg>getDbUser(), $cfg>getDbPass()); $dbh=mysql_select_db($cfg>getDbName()); $dbr=mysql_query("SELECTid_user,name,firstname,emailFROM usersWHEREid_user='$cuser'ANDpasswd='$pass';"); if(mysql_num_rows($dbr)>0){ $enr=mysql_fetch_array($dbr); if($enr['id_user']==$this>user_code){ $this>user_name=$enr['name']; $this>user_firstname=$enr['firstname']; $this>user_email=$enr['email']; $this>saveData($session); returntrue; } else{ returnfalse; } } else{ returnfalse;
84

Crationd'uneapplicationWEBavecPHP/MySQL } } functionsaveData($session){ $session>save("userId",$this>user_code); $session>save("userName",$this>user_name); $session>save("userFirstname",$this>user_firstname); $session>save("userEmail",$this>user_email); returntrue; } functionrestoreData($session){ $this>user_code=$session>load("userId"); $this>user_name=$session>load("userName"); $this>user_firstname=$session>load("userFirstname"); $this>user_email=$session>load("userEmail"); returntrue; } functiongetId(){ return$this>user_code; } functiongetName(){ return$this>user_name; } functiongetFirstname(){ return$this>user_firstname; } functiongetEmail(){ return$this>user_email; } } ?>

85

Crationd'uneapplicationWEBavecPHP/MySQL

Lapagelogin
Ceciestlapremirepagesurlequell'utilisateurvapouvoirs'authentifier.
<? // //login.php // require("inc/config.inc.php"); require("inc/session.inc.php"); require("inc/user.inc.php"); //Fermerunesessionquiseraitresteouverte $session=newSession; $user=newUser; if($user>isValid($session)){ $session>close(); } ?> <?echo"<?xmlversion=\"1.0\"encoding=\"ISO88591\"?>"?> <!DOCTYPEhtmlPUBLIC"//W3C//DTDXHTML1.0Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1strict.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="fr"lang="fr"> <head> <title>MyForumv0.1</title> <metahttpequiv="contenttype"content="text/html;charset=ISO 88591"/> <metaname="keywords"lang="fr"content="forum,discussion, logiciel,libre,php,mysql,xhtml,css"/> <metaname="author"lang="fr"content="PhilippeBousquet"/> <metaname="copyright"content="&copy;2004PhilippeBousquet."/> <metaname="license"content="GNUGeneralPublicLicense."/> <linkrel="stylesheet"href="default.css"type="text/css"/> </head> <body> <!Entetedesite> <divclass="header"> <imgclass="icon"src="imgs/linux.png"alt="ABUL"/> <h1>MyForumv0.1</h1> <hr/> </div> <!Lapartieprincipale> <divclass="main"> <!Messaged'erreur> <divclass="err"> <? if($ERROR!=""){ echo"ERREUR:$ERROR"; } ?> </div> <!Laboitedeconnection> <divclass="box"> <h1>Identifiezvous</h1> <?echo"<formaction=\"".$session>parseURL("themes.php")."\" method=\"post\">";?> <divclass="field">
86

Crationd'uneapplicationWEBavecPHP/MySQL <labelfor="cuser">Codeuser:</label><inputtype="text" id="cuser"name="cuser"value=""/> </div> <divclass="field"> <labelfor="passwd">Motdepasse:</label><input type="password"id="passwd"name="passwd"value=""/> </div> <divclass="buttons"> <inputclass="button"type="submit"name="action"value="Je meconnecte"/><br/> <inputclass="button"type="submit"name="action" value="J'aiperdumonmotdepasse"/> </div> </form> </div> <divclass="center"> Sivousn'tespasencoreinscritveuillezcliquer<a href="inscrit.php">ici</a>. </div> </div> <!Lepieddepage> <divclass="footer"> <hr/> Copyright&copy;20032004PhilippeBOUSQUET<br/> CelogicielestsouslicenceGnuGenralPublicLicense </div> </body> </html>

87

Crationd'uneapplicationWEBavecPHP/MySQL

Lapageinscrit
Ceciestlapaged'inscriptionlorsquel'utilisateurveuts'inscriresurleforum.
<? // //inscrit.php // require("inc/config.inc.php"); require("inc/session.inc.php"); require("inc/user.inc.php"); //Fermerunesessionquiseraitresteouverte $session=newSession; $user=newUser; if($user>isValid($session)){ $session>close(); } ?> <?echo"<?xmlversion=\"1.0\"encoding=\"ISO88591\"?>"?> <!DOCTYPEhtmlPUBLIC"//W3C//DTDXHTML1.0Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1strict.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="fr"lang="fr"> <head> <title>MyForumv0.1</title> <metahttpequiv="contenttype"content="text/html;charset=ISO 88591"/> <metaname="keywords"lang="fr"content="forum,discussion, logiciel,libre,php,mysql,xhtml,css"/> <metaname="author"lang="fr"content="PhilippeBousquet"/> <metaname="copyright"content="&copy;2004PhilippeBousquet."/> <metaname="license"content="GNUGeneralPublicLicense."/> <linkrel="stylesheet"href="default.css"type="text/css"/> </head> <body> <!Entetedesite> <divclass="header"> <imgclass="icon"src="imgs/linux.png"alt="ABUL"/> <h1>MyForumv0.1</h1> <hr/> </div> <!Lapartieprincipale> <divclass="main"> <!Messaged'erreur> <divclass="err"> <? if($ERROR!=""){ echo"ERREUR:$ERROR"; } ?> </div> <!Laboited'inscription> <divclass="box"> <h1>Inscription</h1> <formaction="inscription.php"method="post"> <divclass="field"> <labelfor="name">Nom:</label><?echo'<inputtype="text" id="name"name="name"value="'.$name.'"/>';?>
88

Crationd'uneapplicationWEBavecPHP/MySQL </div> <divclass="field"> <labelfor="first">Prnom:</label><?echo'<input type="text"id="first"name="firstname"value="'.$firstname.'"/>';?> </div> <divclass="field"> <labelfor="email">Email:</label><?echo'<input type="text"id="email"name="email"value="'.$email.'"/>';?> </div> <divclass="field"> <labelfor="cuser">Codeuser:</label><?echo'<input type="text"id="cuser"name="cuser"value="'.$cuser.'"/>';?> </div> <divclass="field"> <labelfor="passwd">Password:</label><inputtype="password" id="passwd"name="passwd"value=""/> </div> <divclass="field"> <labelfor="passwd2">Confirmation:</label><input type="password"id="passwd2"name="passwd2"value=""/> </div> <divclass="buttons"> <inputclass="button"type="submit"name="action" value="s'inscrire"/> &nbsp;<inputclass="button"type="reset"/> </div> </form> </div> </div> <!Lepieddepage> <divclass="footer"> <hr/> Copyright&copy;20032004PhilippeBOUSQUET<br/> CelogicielestsouslicenceGnuGenralPublicLicense </div> </body> </html>

89

Crationd'uneapplicationWEBavecPHP/MySQL

Lapartiemtierinscription
Ceciestpurementunactemtierquiajoutel'utilisateurdanslabasemySQL,elleredirigera ensuiteverslapagedeslectiondesthmes.
<? // //inscripttion.php // require("inc/config.inc.php"); require("inc/session.inc.php"); require("inc/user.inc.php"); //Fermerunesessionquiseraitresteouverte $session=newSession; $cfg=newConfig; $user=newUser; if($user>isValid($session)){ $session>close(); } if(!($cfg>testConnection())){ header("Location: inscrit.php?ERROR=Erreur%20du%20serveur%20MySQL%20!"); exit(); } //Controles $name=strtoupper($name); $firstname=strtolower($firstname); $cuser=strtolower($cuser); if($name==""){ header("Location: inscrit.php?ERROR=Vous%20devez%20saisir%20votre%20nom.&name=$name&first name=$firstname&email=$email&cuser=$cuser"); exit(); } if($firstname==""){ header("Location: inscrit.php?ERROR=Vous%20devez%20saisir%20votre%20prnom.&name=$name&fi rstname=$firstname&email=$email&cuser=$cuser"); exit(); } if($email==""){ header("Location: inscrit.php?ERROR=Vous%20devez%20saisir%20votre%20email.&name=$name&fir stname=$firstname&email=$email&cuser=$cuser"); exit(); } if($cuser==""){ header("Location: inscrit.php?ERROR=Vous%20devez%20choisir%20un%20code%20user.&name=$name &firstname=$firstname&email=$email&cuser=$cuser"); exit(); } if($passwd!=$passwd2){ header("Location: inscrit.php?ERROR=Mot%20de%20passe%20incorrect,%20pensez%20%20la%20con firmation.&name=$name&firstname=$firstname&email=$email&cuser=$cuser"); exit();
90

Crationd'uneapplicationWEBavecPHP/MySQL } //Verificationdel'inexistenceducodeuser $dbh=mysql_connect($cfg>getDbHost(),$cfg>getDbUser(),$cfg >getDbPass()); $dbh=mysql_select_db($cfg>getDbName()); $dbr=mysql_query("SELECT*FROMusersWHEREid_user='$cuser';"); if(mysql_num_rows($dbr)>0){ header("Location: inscrit.php?ERROR=Code%20user%20dja%20utilis,%20veuillez%20en%20chois ir%20un%20autre.&name=$name&firstname=$firstname&email=$email&cuser="); exit(); } //Lescontrolessontokinscriptiondel'utilisateur $requete="INSERTINTO`users`(`id_user`,`passwd`,`name`, `firstname`,`email`)VALUES('$cuser','$passwd','$name', '$firstname','$email');"; $dbr=mysql_query($requete); //Onseconnecte header("Location:themes.php?cuser=".$cuser."&passwd=".$passwd); ?>

91

Crationd'uneapplicationWEBavecPHP/MySQL

Lapartiemtiermail
Ceciestpurementunactemtierquienvoiel'utilisateursonmotdepasseparemail,si celuicil'aoubli.
<? // //mail.php // require("inc/config.inc.php"); require("inc/session.inc.php"); require("inc/user.inc.php"); $session=newSession; $cfg=newConfig; $user=newUser; //Controles if($cuser==""){ header("Location: login.php?ERROR=Vous%20devez%20saisir%20votre%20code%20user."); exit(); } $requete="SELECTpasswd,emailFROMusersWHEREid_user='$cuser';"; $dbh=mysql_connect($cfg>getDbHost(),$cfg>getDbUser(), $cfg>getDbPass()); $dbh=mysql_select_db($cfg>getDbName()); $dbr=mysql_query($requete); if(mysql_num_rows($dbr)==0){ header("Location:login.php?ERROR=Cet%20 utilisateur%20est%20inconnu,%20veuillez%20vous%20inscrire."); exit(); } $enr=mysql_fetch_array($dbr); $text="Bonjourvousavezdemandquel'onvousenvoivotremotde passemyForum.\n\nVotremotdepasse:".$enr['passwd']. "\n\nCordialement."; if(mail($enr['email'],"motdepassemyforum",$text, "From:webmaster@$SERVER_NAME\n ReplyTo:webmaster@$SERVER_NAME\nXMailer:PHP/". phpversion())){ header("Location:login.php?ERROR=Votre%20mot%20 de%20passe%20vous%20%20t%20envoy%20par%20email."); } else{ header("Location:login.php?ERROR=Il%20y%20a%20eu%20un%20 problme%20lors%20de%20l'envoi%20de%20mail."); } ?>

92

Crationd'uneapplicationWEBavecPHP/MySQL

Lapagedeslectiondethme
Cettepagepermetl'utilisateurdeslectionnerlethemesqu'ilveutconsulter.
<? // //themes.php // if($action=="J\'aiperdumonmotdepasse"){ require("mail.php"); exit(); } require("inc/config.inc.php"); require("inc/session.inc.php"); require("inc/user.inc.php"); $session=newSession; $cfg=newConfig; $user=newUser; if(!($cfg>testConnection())){ header("Location:login.php?ERROR=Erreur%20du%20 serveur%20MySQL%20!"); exit(); } if(!($user>isValid($session))&&!($user>connect($cuser,$passwd, $cfg,$session))){ header("Location:login.php?ERROR=Mot%20de%20passe%20incorrect, %20ou%20utilisateur%20inconnu."); exit(); } ?> <?echo'<?xmlversion="1.0"encoding="ISO88591"?>'?> <!DOCTYPEhtmlPUBLIC"//W3C//DTDXHTML1.0Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1strict.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="fr"lang="fr"> <head> <title>MyForumv0.1</title> <metahttpequiv="contenttype"content="text/html;charset=ISO 88591"/> <metaname="keywords"lang="fr"content="forum,discussion, logiciel,libre,php,mysql,xhtml,css"/> <metaname="author"lang="fr"content="PhilippeBousquet"/> <metaname="copyright"content="&copy;2004PhilippeBousquet."/> <metaname="license"content="GNUGeneralPublicLicense."/> <linkrel="stylesheet"href="default.css"type="text/css"/> </head> <body> <!Entetedesite> <divclass="header"> <imgclass="icon"src="imgs/linux.png"alt="ABUL"/> <h1>MyForumv0.1</h1> <hr/> </div> <!Lapartieprincipale> <divclass="main"> <divclass="pwd"> <?echo$user>getId();?>&gt;&gt;<?echo"<a href=\"".$session>parseURL("login.php")."\"title=\"quitter\">";?
93

Crationd'uneapplicationWEBavecPHP/MySQL >Quitter</a> </div> <!Lalistedesthemes> <table> <caption>MyForum:Listedesthmes</caption> <thead> <trclass="title"><th>Thme</th><th>Description</th><th> Sujets</th><th>Date</th></tr> </thead> <tbody> <? $dbh=mysql_connect($cfg>getDbHost(),$cfg>getDbUser(), $cfg>getDbPass()); $dbh=mysql_select_db($cfg>getDbName()); $dbr=mysql_query("SELECTid_theme,name,descriptionFROM themes;"); while($enr=mysql_fetch_array($dbr)){ echo'<tr>'; echo"<tdclass=\"left\"><ahref=\"".$session >parseURL("sujets.php","id_theme=".$enr['id_theme'])."\">".$enr['name'] ."</a></td>"; echo"<tdclass=\"left\"><ahref=\"".$session >parseURL("sujets.php","id_theme=".$enr['id_theme'])."\">".$enr['descri ption']."</a></td>"; $dbr2=mysql_query("SELECTCOUNT(*)asnb_sujets, MAX(date)asdateFROMsubjectswhere id_theme='".$enr['id_theme']."';"); $enr2=array(); if(mysql_num_rows($dbr2)>0){ $enr2=mysql_fetch_array($dbr2); } else{ $enr2['nb_sujets']="0"; $enr2['date']="0000000000:00:00"; } echo"<tdclass=\"right\">".$enr2['nb_sujets']."</td>"; echo"<tdclass=\"right\">".$enr2['date']."</td>"; echo'</tr>'; } ?> </tbody> </table> </div> <!Lepieddepage> <divclass="footer"> <hr/> Copyright&copy;20032004PhilippeBOUSQUET<br/> CelogicielestsouslicenceGnuGenralPublicLicense </div> </body> </html>

94

Crationd'uneapplicationWEBavecPHP/MySQL

Lapagedeslectiondusujet
Cette page permet l'utilisateur de slectionne le sujet sur lequel il veut consulter les messages,ouencrerunnouveau.
<? // //sujets.php // require("inc/config.inc.php"); require("inc/session.inc.php"); require("inc/user.inc.php"); $session=newSession; $cfg=newConfig; $user=newUser; if(!($user>isValid($session))){ header("Location:login.php?ERROR=Utilisateur%20inconnu,%20 ou%20la%20session%20a%20expire."); exit(); } if(!($cfg>testConnection())){ header("Location:login.php?ERROR=Erreur%20du%20serveur%20 MySQL%20!"); exit(); } ?> <?echo'<?xmlversion="1.0"encoding="ISO88591"?>'?> <!DOCTYPEhtmlPUBLIC"//W3C//DTDXHTML1.0Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1strict.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="fr"lang="fr"> <head> <title>MyForumv0.1</title> <metahttpequiv="contenttype"content="text/html;charset=ISO 88591"/> <metaname="keywords"lang="fr"content="forum,discussion, logiciel,libre,php,mysql,xhtml,css"/> <metaname="author"lang="fr"content="PhilippeBousquet"/> <metaname="copyright"content="&copy;2004PhilippeBousquet."/> <metaname="license"content="GNUGeneralPublicLicense."/> <linkrel="stylesheet"href="default.css"type="text/css"/> </head> <body> <!Entetedesite> <divclass="header"> <imgclass="icon"src="imgs/linux.png"alt="ABUL"/> <h1>MyForumv0.1</h1> <hr/> </div> <!Lapartieprincipale> <divclass="main"> <divclass="pwd"> <?echo$user>getId();?>&gt;&gt; <?echo"<ahref=\"".$session>parseURL("login.php"). "\"title=\"quitter\">";?>Quitter</a>:: <?echo"<ahref=\"".$session>parseURL("themes.php"). "\"title=\"retourauxthmes\">";?>Thmes</a> </div>
95

Crationd'uneapplicationWEBavecPHP/MySQL <!Lalistedesthemes> <table> <caption> <? $dbh=mysql_connect($cfg>getDbHost(),$cfg>getDbUser(), $cfg>getDbPass()); $dbh=mysql_select_db($cfg>getDbName()); $dbr=mysql_query("SELECTnameFROMthemesWHERE id_theme='$id_theme';"); $enr=mysql_fetch_array($dbr); echo$enr['name']; ?> &nbsp;:Listedessujets </caption> <thead> <trclass="title"> <th>Auteur</th> <th>Titre</th> <th>Rep.</th> <th>Date</th> </tr> </thead> <tbody> <? $dbh=mysql_connect($cfg>getDbHost(),$cfg>getDbUser(), $cfg>getDbPass()); $dbh=mysql_select_db($cfg>getDbName()); $dbr=mysql_query("SELECTid_subject,title,date,id_userFROM subjectsWHEREid_theme='$id_theme'ORDERBYdateDESC;"); while($enr=mysql_fetch_array($dbr)){ echo'<tr>'; echo"<tdclass=\"left\">".$enr['id_user']."</td>"; echo"<tdclass=\"left\"> <ahref=\"".$session>parseURL("messages.php", "id_theme=".$id_theme."&id_subject=".$enr['id_subject']). "\">".$enr['title']."</a></td>"; $dbr2=mysql_query("SELECTCOUNT(*)asnb_repFROMmessages WHEREid_subject='".$enr['id_subject']."';"); $enr2=array(); if(mysql_num_rows($dbr2)>0){ $enr2=mysql_fetch_array($dbr2); $enr2['nb_rep']; } else{ $enr2['nb_rep']=0; } echo"<tdclass=\"right\">".$enr2['nb_rep']."</td>"; echo"<tdclass=\"right\">".$enr['date']."</td>"; echo"</tr>\n"; } ?> <!Lebouttonnouveau> <trclass="row"><tdcolspan="4"class="center"> <?echo"<formaction=\"".$session>parseURL("editer.php", "id_theme=".$id_theme)."\"method=\"post\">";?> <inputclass="button"type="submit"name="action" value="Nouveau"/> </form> </td></tr> </tbody> </table>
96

Crationd'uneapplicationWEBavecPHP/MySQL </div> <!Lepieddepage> <divclass="footer"> <hr/> Copyright&copy;20032004PhilippeBOUSQUET<br/> CelogicielestsouslicenceGnuGenralPublicLicense </div> </body> </html>

97

Crationd'uneapplicationWEBavecPHP/MySQL

Lapagedesmessages
Cettepageaffichelalistedesmessagesconcernantunsujet,l'utilisateurpourragalement spcifierqu'ilveutrpondresurcesujet.
<? // //messages.php // require("inc/config.inc.php"); require("inc/session.inc.php"); require("inc/user.inc.php"); $session=newSession; $cfg=newConfig; $user=newUser; if(!($user>isValid($session))){ header("Location:login.php?ERROR=Utilisateur%20inconnu,%20 ou%20la%20session%20a%20expire."); exit(); } if(!($cfg>testConnection())){ header("Location:login.php?ERROR=Erreur%20du %20serveur%20MySQL%20!"); exit(); } ?> <?echo'<?xmlversion="1.0"encoding="ISO88591"?>'?> <!DOCTYPEhtmlPUBLIC"//W3C//DTDXHTML1.0Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1strict.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="fr"lang="fr"> <head> <title>MyForumv0.1</title> <metahttpequiv="contenttype"content="text/html;charset=ISO 88591"/> <metaname="keywords"lang="fr"content="forum,discussion, logiciel,libre,php,mysql,xhtml,css"/> <metaname="author"lang="fr"content="PhilippeBousquet"/> <metaname="copyright"content="&copy;2004PhilippeBousquet."/> <metaname="license"content="GNUGeneralPublicLicense."/> <linkrel="stylesheet"href="default.css"type="text/css"/> </head> <body> <!Entetedesite> <divclass="header"> <imgclass="icon"src="imgs/linux.png"alt="ABUL"/> <h1>MyForumv0.1</h1> <hr/> </div> <!Lapartieprincipale> <divclass="main"> <divclass="pwd"> <?echo$user>getId();?>&gt;&gt; <?echo"<ahref=\"".$session>parseURL("login.php"). "\"title=\"quitter\">";?>Quitter</a>:: <?echo"<ahref=\"".$session>parseURL("themes.php"). "\"title=\"retourauxthmes\">";?>Thmes</a>:: <?echo"<ahref=\"".$session>parseURL("sujets.php",
98

Crationd'uneapplicationWEBavecPHP/MySQL "id_theme=".$id_theme)."\"title=\"retour auxsujets\">";?>Sujets</a> </div> <!Lalistedesthemes> <table> <caption> <?$dbh=mysql_connect($cfg>getDbHost(),$cfg>getDbUser(), $cfg>getDbPass()); $dbh=mysql_select_db($cfg>getDbName()); $dbr=mysql_query("SELECTnameFROMthemesWHERE id_theme='$id_theme';"); $enr=mysql_fetch_array($dbr); echo$enr['name'].":"; $dbr=mysql_query("SELECTtitleFROMsubjectsWHERE id_subject='$id_subject';"); $enr=mysql_fetch_array($dbr); echo$enr['title'];?> </caption> <tbody> <?$dbh=mysql_connect($cfg>getDbHost(),$cfg>getDbUser(), $cfg>getDbPass()); $dbh=mysql_select_db($cfg>getDbName()); $dbr=mysql_query("SELECTid_user,title,text,date,id_userFROM messagesWHEREid_subject='$id_subject'ORDER BYdate,id_message;"); while($enr=mysql_fetch_array($dbr)){ echo'<trclass="row">'; echo'<thclass="left">'.$enr['id_user'].'</th>'; echo'<thclass="left">'.$enr['title'].'</th>'; echo'<thclass="right">'.$enr['date'].'</th>'; echo'</tr>'."\n"; echo'<trclass="row">'; echo'<tdcolspan="3"class="left"><pre>'.$enr['text']. '</pre></td>'; echo'</tr>'."\n"; } ?> <!Lebouttonrpondre> <trclass="row"><tdcolspan="3"class="center"> <?echo'<formaction="'.$session>parseURL("editer.php", "id_theme=".$id_theme."&id_subject=".$id_subject). '"method="post">';?> <inputclass="button"type="submit"name="action" value="Rpondre"/> </form> </td></tr> <tbody> </table> </div> <!Lepieddepage> <divclass="footer"> <hr/> Copyright&copy;20032004PhilippeBOUSQUET<br/> CelogicielestsouslicenceGnuGenralPublicLicense </div> </body> </html>

99

Crationd'uneapplicationWEBavecPHP/MySQL

Lapagedecrationdemessage
Cettepagepermetsoitderpondresurunsujetdonn,soitdecrersonpropremessage surunnouveausujet.
<? // //editer.php // require("inc/config.inc.php"); require("inc/session.inc.php"); require("inc/user.inc.php"); $session=newSession; $cfg=newConfig; $user=newUser; if(!($user>isValid($session))){ header("Location:login.php?ERROR=Utilisateur%20inconnu,%20 ou%20la%20session%20a%20expire."); exit(); } ?> <?echo'<?xmlversion="1.0"encoding="ISO88591"?>'?> <!DOCTYPEhtmlPUBLIC"//W3C//DTDXHTML1.0Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1strict.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="fr"lang="fr"> <head> <title>MyForumv0.1</title> <metahttpequiv="contenttype"content="text/html;charset=ISO 88591"/> <metaname="keywords"lang="fr"content="forum,discussion, logiciel,libre,php,mysql,xhtml,css"/> <metaname="author"lang="fr"content="PhilippeBousquet"/> <metaname="copyright"content="&copy;2004PhilippeBousquet."/> <metaname="license"content="GNUGeneralPublicLicense."/> <linkrel="stylesheet"href="default.css"type="text/css"/> </head> <body> <!Entetedesite> <divclass="header"> <imgclass="icon"src="imgs/linux.png"alt="ABUL"/> <h1>MyForumv0.1</h1> <hr/> </div> <!Lapartieprincipale> <divclass="main"> <divclass="pwd"> <?echo$user>getId();?>&gt;&gt; <?echo"<ahref=\"".$session>parseURL("login.php"). "\"title=\"quitter\">";?>Quitter</a>:: <?echo"<ahref=\"".$session>parseURL("themes.php"). "\"title=\"retourauxthmes\">";?>Thmes</a>:: <?echo"<ahref=\"".$session>parseURL("sujets.php", "id_theme=".$id_theme)."\"title=\"retour auxsujets\">";?>Sujets</a> <? if($id_subject!=""){
100

Crationd'uneapplicationWEBavecPHP/MySQL echo'::<ahref="'.$session>parseURL("messages.php", "id_theme=".$id_theme."&id_subject=".$id_subject). '"title="retoursurlesmessages">Messages</a>'; } ?> </div> <!Messaged'erreur> <divclass="err"> <? if($ERROR!=""){ echo"ERREUR:$ERROR"; } ?> </div> <!Rpondreaumessage> <divclass="box"> <? $titre=""; if($id_subject!=""){ $dbh=mysql_connect($cfg>getDbHost(),$cfg>getDbUser(), $cfg>getDbPass()); $dbh=mysql_select_db($cfg>getDbName()); $dbr=mysql_query("SELECTtitleFROMsubjectsWHERE id_subject='$id_subject';"); $enr=mysql_fetch_array($dbr); $titre="RE:".$enr['title']; } ?> <h1>Rpondreaumessage</h1> <?echo'<formaction="'.$session>parseURL("savemessage.php", "id_theme=".$id_theme."&id_subject=".$id_subject). '"method="post">';?> <divclass="field2"><labelfor="title">Titre:</label><br/> <?echo'<inputtype="text"id="title"name="titre" value="'.$titre.'"size="50"/>';?></div> <divclass="field2"><labelfor="mess">Message:</label><br/> <textareacols="50"id="mess"rows="12"name="message"> Saisissezvotretexteici... </textarea></div> <divclass="buttons"> <inputclass="button"type="submit"name="action" value="Envoyer"/> &nbsp;<inputclass="button"type="reset"/> </div> </form> </div> <!Lalistedesthemes> <? if($id_subject!=""){ echo'<tableclass="old"summary="Devel:Comment raliserunforumenPHP?">'; echo'<caption>Devel:Commentraliserunforumen PHP?</caption>'; echo'<tbody>'; $dbh=mysql_connect($cfg>getDbHost(),$cfg>getDbUser(), $cfg>getDbPass()); $dbh=mysql_select_db($cfg>getDbName()); $dbr=mysql_query("SELECTid_user,title,text,date,id_user FROMmessagesWHEREid_subject='$id_subject' ORDERBYdateDESC,id_messageDESC;"); while($enr=mysql_fetch_array($dbr)){
101

Crationd'uneapplicationWEBavecPHP/MySQL echo'<trclass="row">'; echo'<thclass="left">'.$enr['id_user'].'</th>'; echo'<thclass="left">'.$enr['title'].'</th>'; echo'<thclass="right">'.$enr['date'].'</th>'; echo'</tr>'."\n"; echo'<trclass="row">'; echo'<tdcolspan="3"class="left"><pre>'. $enr['text'].'</pre></td>'; echo'</tr>'."\n"; } echo'</tbody>'; echo'</table>'; } ?> </div> <!Lepieddepage> <divclass="footer"> <hr/> Copyright&copy;20032004PhilippeBOUSQUET<br/> CelogicielestsouslicenceGnuGenralPublicLicense </div> </body> </html>

102

Crationd'uneapplicationWEBavecPHP/MySQL

Lapartiemtierdesauvegarded'unmessage
CettepartiepermetdecrerunsujetenbaseMySQL(sibesoin),ainsiqued'enregistrerle messagesaisiparl'utilisateur.
<? require("inc/config.inc.php"); require("inc/session.inc.php"); require("inc/user.inc.php"); $session=newSession; $cfg=newConfig; $user=newUser; if(!($user>isValid($session))){ header("Location:login.php?ERROR=Utilisateur%20inconnu,%20 ou%20la%20session%20a%20expire."); exit(); } if($titre==""){ header("Location:".$session>parseURL("editer.php", "ERROR=Vous%20devez%20saisir%20un%20titre. &id_theme=".$id_theme."&id_subject=".$id_subject)); exit(); } if($id_subject==""){ $requete="INSERTINTO`subjects`(`id_subject`,`title`,`date`, `id_user`,`id_theme`)VALUES('','$titre', '0000000000:00:00','".$user>getId()."', '$id_theme');"; $dbh=mysql_connect($cfg>getDbHost(),$cfg>getDbUser(), $cfg>getDbPass()); $dbh=mysql_select_db($cfg>getDbName()); $dbr=mysql_query($requete); $dbr=mysql_query("SELECTMAX(id_subject)asid_subjectFROM subjectsWHEREid_theme='$id_theme';"); $enr=mysql_fetch_array($dbr); $id_subject=$enr['id_subject']; } $date=date("Ymd")."".date("H:i:s"); $requete="INSERTINTO`messages`(`id_message`,`title`,`text`, `date`,`id_user`,`id_subject`)VALUES('','$titre', '$message','$date','".$user>getId()."', '$id_subject');"; if($dbh==""){ $dbh=mysql_connect($cfg>getDbHost(),$cfg>getDbUser(), $cfg>getDbPass()); $dbh=mysql_select_db($cfg>getDbName()); } $dbr=mysql_query($requete); $requete="UPDATE`subjects`SET`date`='$date'WHERE `id_subject`='$id_subject';"; $dbr=mysql_query($requete); header("Location:".$session>parseURL("messages.php","id_theme=". $id_theme."&id_subject=".$id_subject)); ?>

103

Crationd'uneapplicationWEBavecPHP/MySQL

XI.Rfrences
Pourplusd'informationssurMySQL: http://www.mysql.com http://dev.nexen.net/docs/mysql/ Pourplusd'informationssurphpMyAdmin:

http://www.phpmydamin.org

Pourplusd'informationssurXHTMLetCSS:

http://www.w3.org/ (LesiteofficielduW3C) http://openweb.eu.org/ (Pourlesstandardsduweb.Enfranais)

Pourplusd'informationssurPHP:

http://dev.nexen.net/docs/php/

104

Anda mungkin juga menyukai