Faculteit Ingenieurswetenschappen Vakgroep Telecommunicatie en Informatieverwerking
Academiejaar 2006–2007
Ontwerp van een dynamische website
Ilja Strobbe
Promotor: prof. dr. ir. Wilfried Philips Begeleiders: Linda Tessens en Alessandro Ledda Vakgroepvoorzitter: prof. dr. ir. Herwig Bruneel
Scriptie voorgedragen tot het behalen van de graad van Master in de toegepaste informatica
De auteur en promotor geven de toelating deze scriptie voor consultatie beschikbaar te stellen en delen ervan te kopi¨eren voor persoonlijk gebruik. Elk ander gebruik valt onder de beperkingen van het auteursrecht, in het bijzonder met betrekking tot de verplichting uitdrukkelijk de bron te vermelden bij het aanhalen van resultaten uit deze scriptie. The author and promotor give the permission to use this thesis for consultation and to copy parts of it for personal use. Every other use is subject to the copyright laws, more specifically the source must be extensively specified when using from this thesis. Gent, Augustus 2007 De promotor
prof. dr. ir. Wilfried Philips
De begeleiders
Linda Tessens en Alessandro Ledda
De auteur
Ilja Strobbe
Woord vooraf De bedoeling van deze thesis was het ontwerpen van een functionele dynamische website in PHP en MySQL. De nadruk van dit eindwerk ligt dan ook vooral op het praktische aspect. Deze thesis is dus veeleer een gemotiveerd verslag van het ontwikkelingsproces van een website. In hoofdstuk ´e´en bekijken we de probleemstelling en de gebruikte technologie¨en. Deze technologie¨en moesten eerst eigen gemaakt worden alvorens er praktisch mee aan de slag te kunnen. In hoofdstuk twee geven we een overzicht van de verschillende componenten die onze website bevat. De concepten die in hoofdstuk twee besproken werden worden in hoofdstuk drie nader toegelicht. Hierin bestuderen we de code en hoe deze de gewenste functionaliteit kan implementeren. Tenslotte bespreken we in hoofdstuk vier de behaalde resultaten en mogelijke verbeteringen en uitbreidingen. Zoals voorheen gesteld handelt deze thesis over het ontwikkelen van een dynamische website. Bij deze ontwikkeling hoort natuurlijk een pak programmacode. Deze programmacode vindt u niet terug in dit schrijven maar wordt meegeleverd in een cd-rom. De cd-rom is een exacte kopie van wat er zich op de TELIN server bevindt. Na aanpassing van de nodige configuratiegegevens in constants.php in de folder include kan de inhoud van de cd-rom op een webserver gezet worden met de juiste systeemvereisten (zie sectie 1.2) om zo de website operationeel te maken. In deze thesis wordt soms wel een verwijzing gegeven naar de bestanden op de cd-rom om zo tijdens het lezen ook de besproken bestanden even te kunnen bekijken hetgeen de duidelijkheid kan vergroten.
ii
iii Ter voorbereiding van deze thesis werden volgende boeken doorgenomen: Davis & Phillips (2006) Valade (2004a) Valade (2004b) De Tr´e (2007)
Het leerproces werd vooral mogelijk gemaakt door de vele online documentatie op: http: // www. php. net . Ook is er functionaliteit gebaseerd of ge¨ınspireerd op reeds bestaande scripts. • Het inlogsysteem is gebaseerd op een script van JP: http: // www. evolt. org/ PHP-Login-System-with-Admin-Features • De herschaling van afbeeldingen is een bewerking van een script van Alessio Glorioso: http: // scripts. ringsworld. com/ image-galleries/ gallery/ thumbs. php. html • De layout is ge¨ınspireerd door de templates op: http: // www/ mollio. org . Deze voorbeelden gaven een mooie inleiding op PHP en CSS en vormden een startpunt voor eigen idee¨een. De integratie en bewerking van deze scripts alsook de andere functionaliteit in de website zijn het resultaat van eigen werk.
iv Ik zou graag mijn begeleiders Linda Tessens en Alessandro Ledda bedanken voor hun doordachte raadgevingen en hulp bij allerlei kleine probleempjes. Dank ben ik ook verschuldigd aan Diedrik Vermeulen, Wouter Smet, Filip Chiau en Filip Thyssen voor het kritische oog waardoor zij talrijke kleine foutjes wisten op te sporen. Ilja Strobbe Gent 12 augustus 2007
Inhoudsopgave 1 Inleiding 1.1 Websites . . . . . . . . . 1.2 Probleemstelling . . . . 1.3 Technologie¨en . . . . . . 1.3.1 PHP . . . . . . . 1.3.2 MySQL . . . . . 1.3.3 PHP en MySQL
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
1 1 2 3 3 5 6
2 Conceptuele ontwerpfase 2.1 Database . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Gebruikers . . . . . . . . . . . . . . . . . 2.1.2 Kalender . . . . . . . . . . . . . . . . . . 2.1.3 Afbeeldingen . . . . . . . . . . . . . . . . 2.1.4 Gastenboek . . . . . . . . . . . . . . . . . 2.1.5 Nieuws . . . . . . . . . . . . . . . . . . . 2.2 PHP klassen . . . . . . . . . . . . . . . . . . . . 2.2.1 Databaseklasse . . . . . . . . . . . . . . . 2.2.2 Sessieklasse . . . . . . . . . . . . . . . . . 2.2.3 Mailklasse . . . . . . . . . . . . . . . . . . 2.2.4 Formulierklasse . . . . . . . . . . . . . . 2.2.5 Klassen om gebruikersinput te verwerken 2.3 PHP scripts . . . . . . . . . . . . . . . . . . . . . 2.4 Vormgeving . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
7 7 8 9 10 11 11 12 12 12 12 12 13 13 13
. . . . . . . . .
14 14 15 17 17 17 19 21 22 22
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
3 Code 3.1 Ontwerp van de database . . . . . . . 3.1.1 Tabellen . . . . . . . . . . . . . 3.2 Ontwerp van de PHP klassen . . . . . 3.2.1 constants.php . . . . . . . . . . 3.2.2 database.php . . . . . . . . . . 3.2.3 form.php . . . . . . . . . . . . 3.2.4 session.php . . . . . . . . . . . 3.2.5 mailer.php . . . . . . . . . . . 3.3 Ontwerp van de websitefunctionaliteit v
. . . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
Inhoudsopgave 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.3.8
vi Inlogsysteem Kalender . . Afbeeldingen Shop . . . . . Admin . . . . Nieuws . . . Leden . . . . Lay-out . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
23 24 26 28 28 29 29 29
4 Besluit 4.1 Verbeteringen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32 32
Bibliografie
33
Hoofdstuk 1
Inleiding 1.1
Websites
A computer will do what you tell it to do, but that may be much different from what you had in mind! Joseph Weizenbaum
Het is nu al meer dan 16 jaar geleden dat de eerste website1 online kwam en sindsdien wordt er dagelijks een immense hoeveelheid informatie tentoon gespreid door browsers wereldwijd. Het aantal websites wordt vandaag geschat tussen 15 en 30 miljard2 en blijft per seconde toenemen aan een heus tempo! Websites worden geschreven in of dynamisch geconverteerd naar HTML (Hyper Text Markup Language) en worden bekeken door een software programma, de gekende web browser. Web pagina’s kunnen bekeken worden op een almaar toenemend aantal apparaten (desktop computers, laptop computers, gsm, pda, ...) die verbonden kunnen worden met het internet. Een website is opgeslagen op een webserver en kan via het HTTP protocol (Hyper Text Transfer Protocol) opgevraagd worden vanuit verschillende browsers. Een webserver draait hiertoe aangepaste software zoals Apache of Microsoft’s Internet Information Server (IIS) om de verschillende HTTP aanvragen op een gepaste manier af te handelen. De meest recente versies van HTML zijn HTML 4.01 en ISO/IEC 15445:2000. XHTML is een meer strikte formulering en is een toepassing van XML (eXtensible Markup Language). De veranderingen van HTML tot de eerste generatie XHTML 1.0 zijn klein van aard en zijn er vooral op gericht om conform te zijn met de XML regels. De belangrijkste vereiste is dat een document welgevormd moet zijn en dat alle elementen expliciet moeten gesloten worden in XML. Ook zijn alle elementen en attributen hoofdlettergevoelig zodat alle 1 2
De eerste website werd gemaakt in CERN en kwam online 6 augustus 1991 http://www.pandia.com/sew/383-web-size.html
1
Hoofdstuk 1. Inleiding
2
elementen (tags) zonder hoofdletters worden geschreven. De webpagina die ontworpen werd is geschreven in XHTML 1.0 transitional. De transitional slaat op het gebruik van zogenoemde oudere tags (zoals de
tag). Websites kunnen statisch of dynamisch zijn. Met statische websites bedoelen we dat de pagina’s die op de server gezet worden de pagina’s zijn die de gebruiker zal te zien krijgen. Ze zijn onveranderlijk in de tijd. De HTML kan rechtstreeks ingegeven worden in een tekstverwerker naar keuze. Met gebruik van tags maak je zo de structuur van je pagina duidelijk aan de browser die deze tekst interpreteert. Vaak wordt er gebruik gemaakt van een GUI (Graphical User Interface) waardoor men een website kan cre¨eren op het zicht (WYSIWYG, What You See Is What You Get). De nodige code voor de verkregen paginastructuur wordt dan door het programma gegeneerd. Een populair softwarepakket dat zowel als tekstverwerker of als GUI kan gebruikt worden om websites met te maken is bijvoorbeeld Macromedia Dreamweaver. Een dynamische website is een website waarvan de inhoud in de tijd verandert. Dit kan door eventueel bijgewerkte informatie op te vragen elke keer dat de pagina opgevraagd wordt en door het gebruik van databases. Uit die database kan de gewenste informatie worden gefilterd en in een HTML pagina worden gepresenteerd aan de gebruiker. Er bestaat een grote keuze aan scriptingtalen om de ontwikkeling van dynamische websites mogelijk te maken zoals Java Server Pages (JSP), PHP (acroniem voor Hypertext PreProcessor), Active Server Pages (ASP) en ColdFusion (CFM).
1.2
Probleemstelling
Het up-to-date houden van een website kan een heel karwei zijn als er vooraf niet over wordt nagedacht. Bij statische websites heeft over het algemeen ´e´en persoon (webmaster) deze verantwoordelijkheid. Deze zal manueel pagina’s online en offline zetten en de nodige links toevoegen. Het is duidelijk dat deze werkwijze in de praktijk moeilijk houdbaar is, zeker voor grote verenigingen. Het is wenselijk dat meerdere mensen de website kunnen beheren al dan niet op verschillende niveaus. Deze veranderingen moeten dan in de browser kunnen gebeuren zonder dat er enige programmeerkennis verondersteld wordt opdat de veranderingen regelmatig en door een breed publiek kunnen doorgevoerd worden. Dit kan door gebruik te maken van een dynamische website. We zullen de PHP en de MySQL technologie gebruiken om onze statische website dynamisch te maken. We vertrekken dus van een bestaande statische website en we willen deze dynamisch maken en tevens volgende functionaliteit implementeren: • Een login systeem zodat gebruikers zich kunnen onderscheiden van niet gebruikers. • Verschillende gebruikersniveaus zodat onder de gebruikers ook een hi¨erarchie bestaat.
Hoofdstuk 1. Inleiding
3
• Een admin centrum waar een hoofdgebruiker (zie vorig puntje) het gebruikersbestand kan bekijken en wijzigen alsook nieuwsitems toevoegen. • Een webgebaseerd kalendersysteem waaraan leden evenementen kunnen toevoegen en verwijderen. • Een afbeeldingsectie waar leden foto’s kunnen opladen en verwijderen. • ... Om deze website te kunnen hosten is er een webserver nodig die PHP4 draait in samenwerking met een MySQL database. De site werd ontwikkeld in WordPad op een Windows XP Home Edition systeem. De webserver (telin.ugent.be) is een Linux systeem met Apache 2.0 Handler, PHP 4.3.8 en MySQL 4.0.20 erop ge¨ınstalleerd. De upload van de verschillende bestanden werd gedaan met behulp van WinSCP3. De site werd getest met verschillende browsers waaronder IE7, Firefox2, Safari3 en Opera9. Er wordt beroep gedaan op JavaScript voor het tonen van pop-ups. Hoewel schaars is het toch een aanbevolen systeemvereiste om de site te bekijken.
1.3 1.3.1
Technologie¨ en PHP
PHP is een open source scripttaal die ontwikkeld werd voor website ontwikkeling. De afkorting PHP stond voor Personal Home Page tools3 maar groeide door zijn gebruiksvriendelijkheid en populariteit uit tot een volwaardige taal. De naam PHP bleef behouden maar de afkorting staat nu bekend als Hypertext Preprocessor (verwerk webpagina’s voor ze weergegeven worden) om zijn uitgebreide mogelijkheden eer aan te doen. De populariteit van PHP groeit snel door zijn vele voordelen: • Het is snel: De tijd om een webpagina te laden is klein omdat de code ingebed zit in de HTML code. • Het is gratis: PHP is een open source taal die volledig gratis te verkrijgen is. • Het is veelzijdig: PHP draait op Windows, Linux, Mac OS, en de meeste vari¨eteiten van Unix. • Veel online documentatie: Er bestaan een verscheidenheid aan forums over PHP, alsook een offici¨ele site (www.php.net). 3
Rasmus Lerdorf ontwikkelde deze vroege versie om gebruikers bij te staan bij verschillende taken uitgevoerd in webpagina’s
Hoofdstuk 1. Inleiding
4
• Het is veilig: Als de scripts correct worden gemaakt dan kan de gebruiker de PHP code nooit zien. • Het is aanpasbaar: Omdat PHP een open source taal is kunnen programmeurs de PHP software aanpassen om functionaliteit te cre¨eren voor eigen omgevingen. PHP en webapplicaties PHP is een server-side scripttaal, wat wil zeggen dat de scripts worden uitgevoerd op de server (waar de website ook staat). Dit is verschillend van een taal zoals JavaScript, een andere populaire scripttaal ter ontwikkeling van dynamische websites. Het verschil ligt erin dat JavaScript wordt uitgevoerd door de browser op de computer van de gebruiker. JavaScript is m.a.w. een clientside scripttaal. Omdat PHP scripts worden uitgevoerd op de server kan PHP dynamisch de HTML code genereren zodat verschillende gebruikers aangepaste informatie te zien krijgen die ook kan veranderen in de tijd. Het enige wat de gebruikers te zien krijgen is de pure HTML code en de scripts worden dus afgeschermd. PHP werd bedacht met het WWW in het achterhoofd zodat vele toepassingen speciaal hiervoor ontworpen zijn: • De interactie met HTML formulieren: PHP kan een HTML formulier weergeven en de informatie verwerken die een gebruiker ingeeft. • De communicatie met databases: PHP kan interageren met databases om informatie op te slaan en weer te geven. • De veiligheid van webpagina’s: PHP laat een ontwikkelaar toe om veilige webpagina’s te ontwikkelen die authenticatie eisen zoals een gebruikersnaam en een wachtwoord. Zoals voorheen gesteld is PHP enkel een server-side scripttaal zodat er geen interactie mogelijk is met de computer van de gebruiker. Er kunnen bijgevolg geen acties getriggerd worden door een gebeurtenis op de computer van de gebruiker (muisacties, schermgrootte, ...). Om populaire effecten te verkrijgen moet er dus gebruik gemaakt worden van een clientside scripttaal zoals JavaScript. Omdat een clientside scripttaal op zijn beurt geen toegang heeft tot de server ligt de kracht in een wederzijdse samenwerking. PHP en databaseapplicaties PHP is bijzonder sterk in zijn mogelijkheid om met databases te interageren. Vrijwel alle databases worden ondersteund in PHP. Zowel de verbinding met de database als de eigenlijke communicatie worden door PHP afgehandeld zodat een grondige kennis van technische details niet nodig is om gebruik te maken van databaseapplicaties. Volgende populaire databases worden ondersteund in PHP:
Hoofdstuk 1. Inleiding
5
• dBASE • Informix • Ingres • Microsoft SQL Server • mSQL • MySQL • Oracle • PostgreSQL • Sybase Het nadeel van PHP is dat vele middelgrote en grote bedrijven al jarenlang met Microsoft producten werken en dat deze dus eerder geneigd zijn om ASP en ASP.NET te gebruiken als scripttalen. Vele commerci¨ele toepassingen worden dan ook ontwikkeld in ASP.NET.
1.3.2
MySQL
MySQL is een snelle en gebruiksvriendelijke open source RDBMS (Relational DataBase Management System) dat gebruikt wordt voor databases op vele websites. De nadruk ligt op snelheid zodat er minder toepassingen zijn dan bij commerci¨ele alternatieven. De functionaliteit is echter voldoende uitgebreid voor de overgrote meerderheid van databasetoepassingen. MySQL wordt ontwikkeld en verspreid door MySQL AB, een Zweeds bedrijf. De licentie is afhankelijk van het gebruik. Voor websiteontwikkeling is de licentie gratis en is de software open source. Een commerci¨ele licentie is nodig als de MySQL database deel uitmaakt van een nieuw softwareproduct dat verkocht zal worden. MySQL is een populaire database onder de webontwikkelaars. Verschillende voordelen zijn: • Het is snel: MySQL is ontwikkeld met snelheid in het achterhoofd. • Het is gratis: MySQL is gratis onder de open source GPL licentie. • Het is gebruiksvriendelijk: Door gebruik te maken van slechts een klein aantal SQL statements kan al een aanzienlijke interactie met de database tot stand gebracht worden. • Veel online documentatie: Er bestaan een verscheidenheid aan forums over MySQL, alsook een offici¨ele site (www.mysql.com). • Het draait op veel besturingssystemen: Windows, Linux, Mac OS, meeste vari¨eteiten van UNIX en andere.
Hoofdstuk 1. Inleiding
1.3.3
6
PHP en MySQL
Al de interactie met de database wordt gedaan door berichten te sturen naar de MySQL server. Dit kan op verschillende manieren maar wij zijn ge¨ınteresseerd in de PHP manier. De PHP software heeft specifieke commando’s die gebruikt moeten worden om instructies naar de MySQL server de zenden. De MySQL server moet de instructies op zijn beurt kunnen interpreteren. De communicatie gebeurt met een specifieke taal, namelijk SQL (Structured Query Language). Dit is de standaardtaal die gebruikt wordt in de meeste RDBMS. De MySQL verstaat en interpreteert de queries opgesteld in SQL. PHP op zijn beurt verstaat SQL niet, maar dit is ook niet nodig: PHP verzorgt enkel de connectie naar de database en zend de query over die connectie. De interpretatie gebeurt pas in de MySQL server die reageert met een return message waarin zijn status en welke actie er ondernomen is staan. Een handig script om SQL queries te verwerken is phpMyAdmin.4 Hiermee kunnen in een browservenster de queries worden ingegeven en deze worden dan uitgevoerd op de server. Vooral bij het databaseontwerp is dit zeer handig. De queries voor het aanmaken van tabellen kunnen ingegeven worden en achteraf ziet men een visuele voorstelling van deze tabel. Ook het aanpassen van waarden is mogelijk. Het toevoegen en verwijderen van tabellen en kolommen wordt op deze manier snel geklaard.
4
http://www.phpmyadmin.net
Hoofdstuk 2
Conceptuele ontwerpfase We bespreken hier de algemene concepten waar de website op steunt. Dit hoofdstuk schetst op welke fundamenten de website steunt zonder de technische details te geven. Een diepere toelichting van deze bouwstenen wordt in volgend hoofdstuk gegeven.
2.1
Database
Bij de aanvang van deze scriptie werd er een database istrobbe aangemaakt op de TELIN server van UGent. De communicatie met deze database kan gemakkelijk gedaan worden met behulp van PHP scripts.1 Bij de opslag van gegevens in een database moet opgelet worden dat er geen gegevens meerdere keren worden opgeslagen (redundantie). Het is daarom aangewezen goed op te letten wat de gegevens zo uniek maakt en dit attribuut is dan een kandidaat eerste sleutel (primary key). Deze sleutels worden gebruikt om de database snel en effici¨ent te kunnen doorzoeken bij queries. Bij het gebruik van wachtwoorden zal het aangewezen zijn om een md5 (Message-Digest algorithm 5) encryptie te gebruiken om eventueel misbruik tegen te gaan. Misbruik zou eventueel kunnen ontstaan als iemand aan de databasegegevens weet te komen en er de onbeveiligde wachtwoorden van gebruikers uit kan halen. Een md5 encryptie van een tekststring van eender welke lengte geeft een soort vingerafdruk terug van een vaste 128 bit. Dit is de zogeheten md5 hash. Deze hash wordt vaak voorgesteld door een rij van 32 hexadecimale tekens. Het is een goede veiligheidsmaatregel voor wachtwoorden omdat de berekening irreversibel is. Men kan dus onmogelijk uit een hash de oorspronkelijke gegevens terughalen. Om met tijdstippen (data, uren, ...) gemakkelijk te kunnen werken zullen we deze opslaan als Unix tijdstippen. De Unix tijd is de tijd (uitgedrukt in seconden) die verstreken is sinds 1 januari 1970. 1
Details omtrent de code worden in volgend hoofdstuk gegeven.
7
Hoofdstuk 2. Conceptuele ontwerpfase
8
We geven in wat volgt een overzicht van de tabellen die nodig zullen zijn voor onze website.
2.1.1
Gebruikers
In een vereniging is een gebruikersbestand zeer wenselijk. Men kan zo op een gemakkelijke manier de gegevens bijhouden van alle leden. Het is onontbeerlijk wanneer men login opties wenst voor de website. Bij de constructie van deze tabel moeten we bekijken welke kolom uniek is en dus als identificator kan gebruikt worden. Deze wordt doorgaans gekozen als eerste sleutel en cre¨eert een index op deze tabel om sneller doorzoeken mogelijk te maken. Hieronder bespreken we de drie tabellen die verband houden met het beheren van de gebruikers en hun ontwerp. Merk op dat in de code vele Engelse benamingen zullen gekozen worden. Table users Dit is de belangrijkste tabel. Hierin worden alle gegevens van een geregistreerd lid opgeslagen. De verschillende velden zijn: • userid: Hierin wordt een random id opgeslagen wanneer een user zich aanmeldt. • username: De unieke gebruikersnaam die gekozen wordt bij registratie. • password: Het md5 ge¨encrypteerde wachtwoord • userlevel: Een getal 1 of 9 dat het gebruikserniveau aanduidt, gewoon of administrator. • email: Het emailadres dat opgegeven wordt bij registratie. • timestamp: Het Unix tijdstip van de laatste aanmelding • status: Een getal 1 of 0 dat aanwijst of een gebruiker al dan niet is toegelaten door de administrator. • realname: De naam van de gebruiker. • realfirstname: De voornaam van de gebruiker. • address: Het adres van de gebruiker. • postcode: De postcode van de gemeente waar de gebruiker woont. • city: De stad of gemeente waar de gebruiker woont. • phone: Het gsmnummer van de gebruiker. Er wordt heel wat gebruikersinformatie bijgehouden en dat kan handig zijn. Deze gebruikersinformatie zal gewonnen worden uit een online invulformulier dat moet ingevuld worden bij de registratie. De gebruikersnaam moet uniek zijn hetgeen impliceert dat we dit telkens
Hoofdstuk 2. Conceptuele ontwerpfase
9
moeten verifi¨eren bij een nieuwe registratie. Verder betekent dit ook dat we de gebruikersnaam kunnen gebruiken als eerste sleutel. Dit klinkt ook logisch aangezien we regelmatig op een gebruikersnaam zullen moeten zoeken. Voor de andere velden zullen ook specifieke foutopsporingsalgoritmes moeten ontworpen teneinde een consistente tabel te verkrijgen. Table active guests Dit is een kleine tabel voor het bijhouden van actieve gasten. Dit zijn niet geregistreerde gebruikers die naar de site aan het kijken zijn. De verschillende velden zijn: • ip: Het ip-adres van de gast. • timestamp: Het Unix tijdstip waarop de gast de site bezocht. Via PHP kunnen we het ip-adres opvragen van de gebruiker die zich aanmeldt op de site. Aangezien elk ip-adres per definitie uniek is kunnen we dit veld als eerste sleutel kiezen. Table active users Dit is een kleine tabel voor het bijhouden van actieve leden. De verschillende velden zijn: • username: De gebruikersnaam van het lid. • timestamp: Het Unix tijdstip waarop het lid zich het laatst heeft aangemeld. In feite is dit een kleine subtabel van de hoofdtabel users. De eerste sleutel is opnieuw de gebruikersnaam.
2.1.2
Kalender
Onze website heeft een online kalendersysteem nodig waar de ingelogde leden een event kunnen toevoegen en verwijderen. We zullen dus een tabel moeten aanmaken om evenementen en bijkomende info te kunnen herbergen. Table calendar Dit is de tabel waar de evenementen in worden bewaard. De verschillende velden zijn: • id: Een uniek id dat door het DBMS wordt toegekend aan een toegevoegd evenement. • event: Een korte beschrijving van het evenement. • date: Het Unix tijdstip waarop het evenement doorgaat. • description: Een eventuele langere beschrijving van of extra bij het evenement. • timestamp: Het Unix tijdstip waarop het evenement is toegevoegd.
Hoofdstuk 2. Conceptuele ontwerpfase
10
• addedby: De gebruiker door wie het evenement is toegevoegd. Bij het construeren van deze tabel was er geen veld dat per definitie uniek was. Men kan echter het DBMS een uniek id laten kiezen. Dit wordt gedaan door middel van een interne teller die telkens met ´e´en vermeerdert (auto increment) wanneer er een evenement toegevoegd wordt aan de database. Verder kan het ook handig zijn om verjaarde evenementen te laten verwijderen uit de database. Dit kan gedaan worden met behulp van een PHP script. Table calendar comments Dit is de tabel om opmerkingen bij evenementen op te slaan. We voorzien dus de mogelijkheid om per evenement een soort discussielijst van opmerkingen te hebben. • id: Een uniek id dat door het DBMS wordt toegekend aan de toegevoegde opmerking. • calendar id: Het id van het evenement waar de opmerking over gaat. • username: De gebruiker door wie de opmerking is toegevoegd. • comment: De opmerking. We zien dat deze tabel in verband staat met de vorige door het gebruik te maken van een tweede id. Omdat er meerdere opmerkingen per evenement kunnen gemaakt worden is dit echter geen uniek id. We maken daarom gebruik van een id veld voor de opmerking dat door het DBMS een unieke waarde toegekend wordt. We zullen rekening moeten houden dat wanneer een evenement wordt verwijderd dat dan ook alle opmerkingen die aan dit evenement gelinkt zijn verwijderd worden. Dit is een voorbeeld van een zwak entiteitstype omdat er geen opmerkingen bestaan zonder een evenement.
2.1.3
Afbeeldingen
Table pictures We willen de mogelijkheid om afbeeldingen op te laden naar de webserver. Om bijkomende informatie omtrent die afbeelding op te slaan zullen we dus nood hebben aan een tabel voor de afbeeldingen. De verschillende velden zijn: • path: Het unieke pad dat naar het bestand op de webserver verwijst. • user: De gebruiker die de afbeelding heeft opgeladen. • timestamp: Het Unix tijdstip waarop de afbeelding is toegevoegd. • title: Een titel voor de afbeelding. • info: Eventueel bijkomende informatie omtrent de afbeelding.
Hoofdstuk 2. Conceptuele ontwerpfase
11
Het is niet de bedoeling om afbeeldingen op te slaan in onze database (dit is wel mogelijk!) maar wel het pad naar het bestand. Dit pad is per definitie uniek en kan dus gebruikt worden als een eerste sleutel. Bij het opladen van bestanden zullen we een unieke bestandsnaam genereren op basis van de afbeeldingskarakteristieken en de tijd. Deze unieke bestandsnaam zal ook voor de miniaturen (thumbnails) kunnen gebruikt worden mits deze in een andere folder worden opgeslagen.
2.1.4
Gastenboek
Table guestbook Een bijkomende optie voor een website van een vereniging is een gastenboek. Om de verschillende items in dit gastenboek bij te houden moeten we hiervoor een tabel aanmaken. De verschillende velden zijn: • id: Een uniek id dat door het DBMS wordt toegekend aan het toegevoegde gastenboekitem. • name: De achternaam van de schrijver van het item. • firstname: De voornaam van de schrijver van het item. • comment: Het gastenboekitem. • timestamp: Het Unix tijdstip waarop het gastenboekitem is toegevoegd. Deze tabel is analoog aan wat we in het voorgaande al gezien hebben.
2.1.5
Nieuws
Table news We willen als extra functionaliteit ook een optie inbouwen om via een formulier content toe te voegen. Om de informatie in dit formulier bij te houden maken we een tabel aan voor nieuws. De verschillende velden zijn: • id: Een uniek id dat door het DBMS wordt toegekend aan het toegevoegde nieuwsitem. • title: De titel van het nieuwsitem. • content: Het nieuwsitem. • timestamp: Het Unix tijdstip waarop het nieuwsitem werd geschreven. • username: De gebruikersnaam van de schrijver van het nieuwsitem. Nieuwsitems zullen enkel door de administrator kunnen toegevoegd worden. Dit is een bewuste keuze, niet alle leden hebben evenveel schrijftalent en dus bepaalt de administrator (eventueel meerdere) welke artikels online mogen en welke niet.
Hoofdstuk 2. Conceptuele ontwerpfase
2.2
12
PHP klassen
Klassen in een programmeertaal zijn verzamelingen van variabelen en functies die op deze variabelen inwerken. Ze zijn het centrale thema in Object-Oriented Programming (OOP). Ze beschrijven steeds een object. Hun grote voordeel komt tot uiting wanneer een bepaald object meerdere keren gebruikt wordt. Door het gebruik te maken van klassen moet een bepaald object maar ´e´en keer gedefinieerd worden en kan het gebruikt worden in meerdere scripts. Het is dikwijls een goed idee om de klassen in een apart bestand op te slaan zodat de klasse achteraf gemakkelijk kan aangepast of uitgebreid worden. Bij het ontwerp van een website moet dus nagedacht worden over welke functies meermaals zullen gebruikt worden in verschillende scripts. In de volgende secties bekijken we welke klassen er zullen moeten worden geprogrammeerd. De details zullen echter pas in volgend hoofdstuk besproken worden. Deze sectie is bedoeld om een ruw beeld te geven van de siteopbouw en het denkproces dat hiermee gepaard gaat.
2.2.1
Databaseklasse
De communicatie met de database bijvoorbeeld zal zeer zeker door meerdere scripts gebruikt worden aangezien we tabellen hebben voor een waaier aan functies. Het klinkt dus logisch om de verbinding met de database en allerhande databasegerichte functies af te scheiden in een databaseklasse. Een variabele die de verbinding weergeeft zal zeker nodig zijn en een functie die de verbinding met de database maakt.
2.2.2
Sessieklasse
De sessieklasse is een klasse die functionaliteit herbergt. Ze zorgt voor het bijhouden van informatie over wie ingelogd is en hoeveel gasten er zijn. Ze voorziet ook de code achter de foutopsporing bij het invullen van formulieren. Elk deel van de website komt dus in contact met de sessieklasse!
2.2.3
Mailklasse
We wensen een mail functie te hebben voor onze site. Door gebruik te maken van een mailklasse kan dit gemakkelijk bereikt worden en kan elk script gebruik maken van deze functie. Verschillende soorten mails kunnen vertolkt worden door verschillende functies in onze mailklasse .
2.2.4
Formulierklasse
Wanneer er fouten optreden bij het verzenden van formulieren zoals verkeerde gebruikers input is het handig om te weten waar deze fouten zijn opgetreden om een specifieke foutmelding
Hoofdstuk 2. Conceptuele ontwerpfase
13
te kunnen geven. Hiertoe kunnen we een formulierklasse maken die bijhoudt waar een fout is opgetreden. Een variabele kan bijvoorbeeld het aantal fouten zijn die gemaakt werden en een functie kan bijvoorbeeld inhouden dat een foutboodschap met een specifieke melding teruggegeven wordt.
2.2.5
Klassen om gebruikersinput te verwerken
Omdat vele delen van onze site gebruikersinput verwachten zal er telkens een klasse aanwezig zijn om de verwerking op zich te nemen. Deze klasse is echter specifieker als de vorige en zal enkel opgeroepen worden door ´e´en enkel script maar is hier niet toe gelimiteerd. We bekijken alle klassen en scripts in detail in volgend hoofdstuk.
2.3
PHP scripts
Buiten deze klassen hebben we de gewone scripts die ingebed zitten in onze HTML code. We plannen om voor elke pagina een PHP bestand aan te maken waar bijvoorbeeld de terugkerende header in een apart bestandje zit. Verder is het ook gemakkelijk om constanten te defini¨eren die in alle scripts gebruikt worden en om deze af te zonderen in een apart bestand. Zo kunnen benamingen zoals de database- en tabelnamen achteraf zeer gemakkelijk gewijzigd worden.
2.4
Vormgeving
De vormgeving is een zeer belangrijk aspect in website design. Mensen klikken weg als de site slordig oogt of niet logisch geordend is. Daarom is het belangrijk om hier ook over na te denken. Er werd geopteerd voor een vormgeving door middel van CSS2(Cascading Style Sheets level 2). CSS zorgt voor een scheiding van opmaak en inhoud en dus kan op beiden afzonderlijk beter gewerkt worden. Verder zorgt het ook voor een daling van de bestandsgrootte doordat slechts ´e´en keer het CSS-bestand moet gedownload worden.2 Het zorgt er ook voor dat de opmaak gemakkelijker consistent gemaakt kan worden. Door gebruik te maken van een paar sleutelwoorden kan de gehele siteopmaak gemanipuleerd worden. We kozen een design met drie kolommen en een header.
2
waarna het in de cache zit
Hoofdstuk 3
Code In dit hoofdstuk wordt de eigenlijke code in detail besproken. Hoe worden de verschillende tabellen in onze database aangemaakt? Hoe worden de verschillende klassen effici¨ent geprogrammeerd? Op welke manier werken verschillende scripts samen om zo tot een functionele website te komen? Al deze vragen worden in wat volgt beantwoord.
3.1
Ontwerp van de database
De database werd aangemaakt op de servers van de vakgroep TELIN van de UGent. Een databasenaam, namelijk istrobbe, en een wachtwoord werden bezorgd zodat er met de database kon gecommuniceerd worden. In eerste instantie werd de databaseconnectie getest door middel van een simpel PHP script.
PHP heeft een ingebouwde functionaliteit om met MySQL te spreken door middel van allerlei mysql_...(...) functies. mysql_connect heeft 3 argumenten nodig, namelijk de server, de gebruikersnaam en het wachtwoord voor de database. Wanneer er meerdere databases zijn kan er door middel van een mysql_select_db functie gekozen worden tussen databases. localhost is een gereserveerde naam die deze computer bedoelt. Als de website op dezelfde 14
Hoofdstuk 3. Code
15
server staat als de database is het een voor de hand liggende keuze om localhost te gebruiken. Bij het opladen naar en uitvoeren op de TELIN server krijgen we een Connected succesfully boodschap. We kunnen dus beginnen communiceren met onze database! Het eindigen van ons scriptje met een mysql_close functie is eigenlijk optioneel omdat de verbinding met de database automatisch wordt verbroken op het einde van het script.
3.1.1
Tabellen
De volgende stap is om de nodige tabellen aan te maken in de database. Hiertoe maken we gebruik van het handige phpMyAdmin dat ons toelaat om SQL statements in de browser in te voeren. Deze worden dan via een PHP script naar de MySQL server gezonden waar ze verwerkt worden. De gebruikerstabel We leggen het ontwerp van tabellen uit aan de hand van de gebruikerstabel. Een gebruikerstabel is er ´e´en die de gebruikers definieert. De velden moeten dus enkel de gebruiker beschrijven. Wanneer een tabel verkeerde attributen bevat loopt de database tal van gevaren De Tr´e (2007, Hoofdstuk 5) zoals redundantie van gegevens, overtollige data kan anomalie¨en bevatten en gegevens kunnen ongewenst verloren gaan. Problemen zoals deze kunnen vermeden worden door ervoor te zorgen dat de basisrelaties van een databaseschema in een zo hoog mogelijk normaalvorm staan. Men kan stapsgewijs deze hogere normaalvorm bereiken. In eerste instantie moet er voor gezorgd worden dat alle attributen atomair zijn. Dit wil zeggen dat de waarden in een kolom enkelvoudig moeten zijn. Een voorbeeld van meervoudige waarden in een kolom van de tabel gebruikers is een gebruikersnaam die geregistreerd staat op twee verschillende echte namen. In dit geval moet de tabel opgesplitst worden in twee of meerdere tabellen tot de meervoudige waarden niet meer optreden. Verder moet er een eerste sleutel zijn die uniek is voor de verzameling gegevens op een rij. Wanneer aan deze vereisten voldaan is is de tabel in de eerste normaalvorm (1NF) gebracht. De volgende stap is er voor te zorgen dat alle attributen volledig afhankelijk zijn van de eerste sleutel (al dan niet samengesteld). Als de eerste sleutel een samengestelde sleutel is wil dit zeggen dat een attribuut niet afhankelijk kan zijn van slechts een deel van de sleutel (parti¨ele afhankelijkheid). Als aan deze vereisten is voldaan dan is de tabel in de tweede normaalvorm (2NF) gebracht. De derde normaalvorm eist dat alle kolommen (attributen) direct afhankelijk zijn van de eerste sleutel. Tabellen waarin een kolom afhankelijk is van een andere kolom die op zijn beurt afhankelijk is van de eerste sleutel (transitieve afhankelijkheid) schenden de derde normaalvorm. Een praktische methode om transitieve afhankelijkheden te onderscheiden is te kijken
Hoofdstuk 3. Code
16
of een verandering van een kolom een verandering van een andere kolom vereist. Als er zo een kolom bestaat dan schendt ze hoogstwaarschijnlijk de derde normaalvorm. Een volledige normalisatie is gewenst maar in de praktijk kan dit een grote complexiteit van het databaseontwerp met zich meebrengen. Meer tabellen brengen meer JOIN operaties met zich mee en dat kan leiden tot een prestatievermindering. Een goed evenwicht tussen een hoge normaalvorm en een lage complexiteit vormt meestal de sleutel voor een goede werkwijze. Over het algemeen moeten de tabellen wel op zijn minst in de derde normaalvorm gebracht worden. Voor onze toepassingen zijn de tabellen niet altijd in de hoogst mogelijke normaalvorm gebracht. Er is vooral gekeken naar de overzichtelijkheid van de tabellen omdat de databasestructuur helemaal niet complex is. De gebruikerstabel bijvoorbeeld is een grote tabel die vele attributen herbergt die met deze gebruiker te maken hebben. De redundantie van gegevens is evenwel uitgesloten omdat al deze attributen rechtstreeks afhankelijk zijn van de eerste sleutel, namelijk de unieke gebruikersnaam. We zouden eventueel het adresgedeelte in deze tabel kunnen afzonderen in een aparte tabel maar dit brengt geen directe voordelen met zich mee. Elke tabel beschrijft wel juist ´e´en entiteit zodat het een logisch databaseontwerp is. CREATE TABLE users ( username varchar(30) primary key, password varchar(32), userid varchar(32), userlevel tinyint(1) unsigned not null, email varchar(50), timestamp int(11) unsigned not null, status tinyint(1) not null, realname varchar(30), realfirstname varchar(30), address varchar(50), postcode int(10), city varchar(30), phone varchar(20) ); Een algemeen CREATE TABLE statement wordt gevolg door de tabelnaam en dan door een lijst van de verschillende kolommen met hun respectievelijke datatypes.1 De verschillende velden die in vorig hoofdstuk zijn besproken zijn hierdoor nu aanwezig in de tabel. 1
Voor een volledig overzicht van de mogelijke datatypes in MySQL verwijzen we naar de online handleiding: http://dev.mysql.com/doc/refman/5.0/en/data-types.html.
Hoofdstuk 3. Code
17
Andere tabellen Voor de andere tabellen werd een analoge werkwijze gehanteerd. Voor elke entiteit in het gestelde probleem waarvoor externe opslag nodig of wensbaar was is uiteindelijk een tabel gecre¨eerd. Uiteindelijk kwamen we tot acht verschillende tabellen. Een tabel voor de gebruikers, ´e´en voor de actieve gebruikers, ´e´en voor de actieve gasten, ´e´en voor de kalender en ´e´en voor de kalenderopmerkingen, ´e´en voor het gastenboek, ´e´en voor de afbeeldingen en tenslotte nog ´e´en voor de nieuwsitems. Het centrale attribuut dat alomtegenwoordig is in alle tabellen is de gebruikersnaam. Het zorgt voor een connectie tussen de verschillende tabellen. De link tussen de kalender tabel en de kalenderopmerkingen tabel wordt verzorgt door een kalenderid.
3.2
Ontwerp van de PHP klassen
Aan de hand van de verschillende bestanden leggen we uit hoe deze klassen werken. Ook wordt de PHP syntax verduidelijkt met voorbeelden uit onze programmacode.
3.2.1
constants.php
Om bepaalde gegevens die kunnen veranderen van tijd tot tijd af te scheiden van de rest van de programmacode is er een bestand constants.php aangemaakt waarin constanten worden gedefinieerd die in heel de programmacode moeten kunnen gebruikt worden. Dit is mogelijk door de include(filename.php); functie in PHP waarbij filename.php willekeurig is. In dit bestand worden bijvoorbeeld de databasegegevens gedefinieerd (deze kunnen veranderen wanneer er overgeschakeld wordt naar een andere database). Ook het e-mailadres van de redactie en de administrator kunnen hier aangepast worden. Door bijvoorbeeld Vvsio team aan te passen in define("EMAIL_FROM_NAME", "Vvsio team"); wordt er vanaf dan gemaild uit de nieuwe gekozen naam. Dit verhoogt de flexibiliteit voor de vereniging. We verwijzen graag naar het originele bestand constants.php in de folder include.
3.2.2
database.php
Nu we een databaseontwerp hebben gemaakt moeten we met deze database kunnen communiceren. Het bestand dat de naam database.php draagt bevat de PHP klasse (MySQLDB) die de communicatie met de database omhelst. Het zorgt voor de correcte handelingen telkens wanneer een script toegang tot de database nodig heeft. Dit zorgt ervoor dat andere scripts zich niet meer moeten bekommeren omtrent de details van de databaseverbinding. De klasse MySQLDB bestaat uit een aantal variabelen en functies. De belangrijkste variabele is var $connection. Bij het construeren van een klasse moeten we een constructor voorzien. Dit is een functie die dezelfde naam draagt als de klasse en die altijd wordt uitgevoerd wanneer een nieuwe instantie wordt gecre¨eerd van de klasse door middel van new. In de constructor
Hoofdstuk 3. Code
18
voor MySQLDB wordt er een connectie met de database gemaakt en wordt deze opgeslagen in de variabele $connection. De connectie wordt als volgt gerealiseerd: $this->connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS) or die(mysql_error()); mysql_select_db(DB_NAME, $this->connection) or die(mysql_error()); Hierin zijn de DB ... constanten gedefinieerd in constants.php. Klassen zijn types, een soort blauwdrukken voor variabelen. Er kunnen variabelen van dit soort type gemaakt worden door een new constructie: $database = new MySQLDB;. Op dit moment hebben we een variabele $database aangemaakt waarop de verschillende functies en variabelen van de MySQLDB klasse kunnen inwerken. Op die manier kunnen we onbeperkt variabelen aanmaken van zelf gedefinieerde types. Deze hebben allen dezelfde functies en variabelen ter beschikking. De functies in een klasse moeten nu een onderscheid kunnen maken tussen deze variabelen die instanties zijn van dezelfde klasse. Dit wordt gedaan door middel van een -> operator. Op een computersysteem kunnen ook meerdere bestanden dezelfde naam dragen als hun pad maar verschillend is, i.e. de folder waarin ze zich bevinden. In PHP termen hebben we dus eenzelfde hoogste niveau folder, namelijk de globale naamruimte. De scheiding tussen het pad en dit hogere niveau wordt aangeduid door ->. Maken we nog een variabele aan van het type MySQLDB: $nogeendatabase = new MySQLDB; dan kunnen we van beiden de variabele connection opvragen. We hebben dus $database->connection en $nogeendatabase->connection hetgeen twee verschillende variabelen zijn die de verbinding weergeven met de database.2 Functies In de MySQLDB klasse zitten vele functies die allen een gelijkaardige structuur hebben. Deze basisstructuur kan geschreven worden als: function functieNaam(Arg1,Arg2,...){ eventuele acties op de argumenten; eventuele condities waaraan voldaan moet zijn; $q = een string met een SQL query; $result = mysql_query($q, $this->connection); return boodschap; } 2
In de klassedefinitie zelf is er niet geweten welke naam de toekomstige instantie zal dragen. Om toch te kunnen refereren naar klassefuncties is er een pseudo-variabele $this ingevoerd die verwijst naar het object dat op dat moment met de klasse communiceert.
Hoofdstuk 3. Code
19
Op deze manier zijn bijna alle functies opgebouwd in onze MySQLDB klasse. Onder deze functies behoren bijvoorbeeld, functies om evenementen aan de kalendertabel toe te voegen of ervan te verwijderen. Een functie om nieuwe gebruikers aan de database toe te voegen of gebruikersinformatie te wijzigen en nog vele andere. Een belangrijke functie die veel gebruikt wordt in andere scripts is de query functie: function query($query) { return mysql_query($query, $this->connection); } Hiermee kunnen scripts SQL queries verzenden door de variabele $database->query($q) te gebruiken met $q een querystring. De laatste opdracht in database.php is de opdracht die een instantie aanmaakt van de MySQLDB database. $database = new MySQLDB; Deze regel zorgt ervoor dat er een variabele $database ge¨ınstantieerd wordt wanneer database.php geladen wordt. Deze variabele is dan onze toegangspoort tot de databasefunctionaliteit! Voor alle functies en de volledige programmacode verwijzen we naar het bestand database.php in de folder include.
3.2.3
form.php
De data die in onze database zal opgenomen worden zal voor het grootste deel afkomstig zijn van gebruikers die online formulieren invullen. Bij het invullen van formulieren kunnen veel problemen optreden. Er zijn bepaalde velden niet ingevuld maar wel vereist door de applicatie. Sommige velden verwachten bijvoorbeeld enkel numerieke input terwijl de gebruiker dit niet doet of een wachtwoord dat ingegeven werd is niet het juiste. Al deze problemen moeten opgevangen worden door de programmacode opdat de site een meer gebruiksvriendelijk karakter krijgt. Concreet hebben we dus een object, i.e. een formulier, dat bepaalde eigenschappen heeft (variabelen) en die kunnen veranderen door externe invloed (functies). Deze formulieren worden tevens over de hele website gebruikt. Een klasse voor formulier is dus eigenlijk onontbeerlijk. De formulierklasse heeft drie variabelen: • een array voor de waarden in het verzonden formulier • een array voor de foutmeldingen • het aantal fouten die gemaakt werden
Hoofdstuk 3. Code
20
Om de waarden van de verschillende velden en de foutmeldingen over de verschillende velden van een formulier beschikbaar te maken voor en te bewaren over verschillende bestanden wordt er gebruikt gemaakt van de $_SESSION[] array. Dit is een globale variabele en is beschikbaar voor alle scripts. Voor er gebruik kan gemaakt worden van deze variabele moet de sessie gestart worden door middel van de session_start(); functie in PHP. Dit moet gebeuren voor er andere output naar de browser is gegeven, dus voor de HTML header. Wanneer nu de verschillende velden van een formulier worden verzonden door een gebruiker kunnen de waarden van de velden opgeslagen worden in $_SESSION[’value_array’] en de foutmeldingen in $_SESSION[’error_array’]. Op deze manier kunnen we er voor zorgen dat het verwerken van het formulier en de foutopsporing door verschillende scripts gebeuren. Dit zorgt wederom voor een fragmentatie van de code en dus een stijging van de overzichtelijkheid. De constructor van onze formulierklasse stelt de initi¨ele waarden van de variabelen van de klasse in. Deze worden bepaald door de waarden van $_SESSION[’value_array’] en $_SESSION[’error_array’]. De functies die we terugvinden in de formulierklasse zijn setValue($field,$value), setError($field,$errmsg), getErrorArray() Deze functies zorgen voor het toevoegen van waarden en fouten voor de velden in een formulier en voor het teruggeven van alle foutberichten. Merk op dat er geen functie getValueArray() aanwezig is. Dit komt omdat de waarden van de velden in een globale variabele opgeslagen zitten als een formulier verzonden wordt, namelijk $_POST. Door nu dit array toe te wijzen aan $_SESSION[’value_array’] kunnen we overal aan de waarden van de velden. Voor de volledige code verwijzen we naar form.php in de folder include. Een algemeen formulier in onze website ziet er als volgt uit:
Het value attribuut in de