Crationd'uneapplicationWEBavecPHP/MySQL
CreruneapplicationWEB avecPHP/MySQL
ParPhilippeBousquet<Darken33@free.fr>
Copyright(c)20032008PhilippeBousquet.
Crationd'uneapplicationWEBavecPHP/MySQL
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:
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:
Crationd'uneapplicationWEBavecPHP/MySQL
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:
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:
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)
11
Crationd'uneapplicationWEBavecPHP/MySQL
NouspouvonsdoncmaintenantquitterleclientMySQL:
mysql>quit Bye [darken@localhostdarken]$
Donnonsmaintenantunmotdepassepourl'utilisateurwwwadmin:
[darken@localhostdarken]$mysqladminpuwwwadminpassword'azerty' Enterpassword: [darken@localhostdarken]$
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:
15
Crationd'uneapplicationWEBavecPHP/MySQL
16
Crationd'uneapplicationWEBavecPHP/MySQL
Excutionderequtes
Nous venons de crer notre table grce l'interface fournit par phpMyAdmin, on peut galementlancernosrequtesdirectementgrcel'ongletSQL.
Eneffetnousallonscrerlatablethmedecettefaon.Cettetableestdelastructure suivante:
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>
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>
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="©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>
27
Crationd'uneapplicationWEBavecPHP/MySQL
L'exemplesuivantmontreuntexteprformat:
<pre> Bonjour,j'aimeraisraliserunforumenPHPavecMySQL, Maisjenesaispasdutoutparoucommencer. Quelqu'unauraitiluneide? </pre>
Lestableaux<table></table>
L'lment TABLE contient tous les autres lments qui spcifient le titre, les lignes, le contenu,etleformatd'untableau.
<table> ...Lerestedutableau... </table>
28
Crationd'uneapplicationWEBavecPHP/MySQL
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
LabaliseOBJECTpermetaussid'intgrerdesimages(toutcommelabaliseIMG),aussi vautilmieuxprfrerOBJECT(caruneimageestunobjetexterne).
LesFormulaires<form></form>
L'lmentFORMfaitofficedecontainerpourdescontrles.Ilspcifie:
31
Crationd'uneapplicationWEBavecPHP/MySQL
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
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="©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>><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"/> <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©20032004PhilippeBOUSQUET<br/> CelogicielestsouslicenceGnuGenralPublicLicense </div>
39
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:
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
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
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;
63
Crationd'uneapplicationWEBavecPHP/MySQL
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
Onpeutarrterlefonctionnementd'uneboucleparl'instructionbreak.Onpeutgalement sauterlerestedesinstructionsetrecommencerl'itrationparlemotclcontinue.
66
Crationd'uneapplicationWEBavecPHP/MySQL
Aprsavoirdfinitunefonction,onl'appellel'aided'argumentsappropris:
echobonjour("Philippe");
Onpeutgalementdfinirdesfonctionsavecdesparamtresoptionnels.Ilfautpourcela donnerunevaleurpardfautauparamtreoptionnel:
functionbonjour($prenom="toutlemonde"){ return"Bonjour$prenom!"; }
67
Crationd'uneapplicationWEBavecPHP/MySQL
68
Crationd'uneapplicationWEBavecPHP/MySQL
Lesclassesformentuntypedevariable.Pourcrerunevariabledutypedsir,vousdevez utiliserl'oprateurnew.
<? $cart=newCaddie; $cart>add_item("10",1); ?>
69
Crationd'uneapplicationWEBavecPHP/MySQL
70
Crationd'uneapplicationWEBavecPHP/MySQL
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
session_destroy()dtruittouteslesdonnesassocieslasessioncourante. session_destroy()retourneTRUEencasdesuccs,etFALSEsinon.
73
Crationd'uneapplicationWEBavecPHP/MySQL
session_name Affecteet/ouretournelenomdelasessioncourante
stringsession_name(stringname)
session_id Affecteet/ouretournel'identifiantdesessioncourante
stringsession_id(stringid)
74
Crationd'uneapplicationWEBavecPHP/MySQL
Envoidemail
boolmail(stringto,stringsubject,stringmessage,string additional_headers,stringadditional_parameters)
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)
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)
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)
78
Crationd'uneapplicationWEBavecPHP/MySQL
mysql_num_rows Retournelenombredeligned'unrsultat
intmysql_num_rows(resourceresult_identifier)
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)
strtolower Mettouslescaractresenminuscules
stringstrtolower(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="©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©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="©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"/> <inputclass="button"type="reset"/> </div> </form> </div> </div> <!Lepieddepage> <divclass="footer"> <hr/> Copyright©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="©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();?>>><?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©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="©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();?>>> <?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']; ?> :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©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="©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();?>>> <?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©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="©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();?>>> <?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"/> <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©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:
Pourplusd'informationssurPHP:
http://dev.nexen.net/docs/php/
104