PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in...

135
PHP door Leerkracht: Dany Pinoy zaterdag 8 december 2012 Versie: September 2012 Website: http://webdesign.pindanet.be

Transcript of PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in...

Page 1: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

PHP

door

Leerkracht: Dany Pinoy

zaterdag 8 december 2012

Versie: September 2012

Website: http://webdesign.pindanet.be

Page 2: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat
Page 3: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

U gaat akkoord met ...

Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat met het volgende:

De auteur(s) van deze cursus heeft (hebben) alles in het werk gesteld om een juiste werkwijze voor te stellen en eventuele bijhorende oefenprogramma's zowel geprint of digitaal in staat van goede werking en virusvrij te houden.

Geen enkel geheel of gedeelte van software aanwezig op de SNT-schoolcomputers mag in enige vorm of op enige wijze worden gekopieerd of opgeslagen naar/op enig welke gegevensdrager zonder uitdrukkelijke voorafgaande toestemming van de onderwijzende SNT-informaticaleerkracht bevoegd voor deze cursus.

Geen enkel geheel of gedeelte van software mag in enige vorm of op enige wijze worden gekopieerd of opgeslagen naar/op enig welke gegevensdrager van de SNT-schoolcomputers zonder uitdrukkelijke voorafgaande toestemming van de onderwijzende SNT-informaticaleerkracht bevoegd voor deze cursus. Het gebruik van de SNT-internet toegang wordt uitsluitend toegelaten met betrekking tot de theorie of oefeningen van voorliggende cursus en enkel zoals door de leerkracht aangegeven en afgebakend. Enkel legale internet downloads/uploads die gebeuren op vraag van de leerkracht in het kader van deze lessen horend bij deze cursus zijn toegelaten. Meervoudig internetmisbruik leidt tot uitsluiting.

De vzw, het Centrum voor Volwassenenonderwijs Stedelijke Nijverheids- en Taalleergangen, de auteur(s), de Inrichtende Macht, in casu Stad Brugge, zijn geenszins aansprakelijk in geval de gebruiker van deze cursus en/of eventueel bijhorend oefenmateriaal schade zou lijden aan zijn computerapparatuur of programmatuur die voortvloeit uit enige fout die in het aangeboden materiaal zou kunnen voorkomen.

Alle rechten voorbehouden. Niets uit deze uitgave mag verveelvoudigd, opgeslagen in een geautomatiseerd gegevensbestand of openbaar worden gemaakt in enige vorm of op enige wijze, hetzij elektronisch, mechanisch, door fotokopieën, opnamen of enige andere manier, zonder voorafgaande schriftelijk toestemming van de uitgever en auteur. De enige uitzondering die hierop bestaat is dat eventuele programma's en door de gebruiker in te typen voorbeelden mogen worden ingevoerd, opgeslagen en uitgevoerd op een computersysteem, zolang deze voor privé-doeleinden worden gebruikt, en niet bestemd zijn voor reproductie of publicatie.

Page 4: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Evaluaties aan de SNT

Voor de evaluatie van uw leervorderingen gebruikt SNT een systeem van “Permanente Evaluatie”.

Permanente Evaluatie betekent dat u punten “verdient” gedurende het semester, terwijl u een oefening maakt tijdens de les of op het leerplatform. Concreet betekent dit dat “het eindexamen” wordt vervangen door één of meerdere taken tijdens de lesweken.

Tijdens een permanent evaluatiemoment controleert de leerkracht of u de leerstof voldoende beheerst en krijgt u een score toegewezen (0 tem 3).

Scorewijzer

scorewijzer schaal [3210]3 – AA: heel sterke prestatie2 – A: sterke prestatie, streefniveau1 – B: middelmatig prestatie0 – C: te zwakke prestatie, leerdoelen niet bereikt

Op het einde van het semester wordt de totale gemiddelde score berekend en via een transformatieschaal omgezet naar een percentage.

Transformatietabel

Bovenste getal is de gemiddelde behaalde score volgens de scorewijzer.Onderste getal is de gemiddelde score getransformeerd naar een percentage op 100.

U behaaldeMeer dan 70% heel sterke prestatie70% sterke prestatie, streefniveauMeer dan 50% en minder dan 70% middelmatige prestatie

Minder dan 50% te zwakke prestatie, leerdoelen niet bereikt

Indien u nog vragen hebt, aarzel niet om contact op te nemen met uw SNT-leerkracht.

Page 5: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

InhoudPHP ORIENTATIE........................................................................................................1

Wat is PHP? ...........................................................................................................................1Scripting- en programmeertalen ................................................................................................1Client- en ServerSide ..............................................................................................................2Zijn er alternatieven? ..............................................................................................................2Wat zijn webservers? ...............................................................................................................2

Algemeen ...........................................................................................................................2IIS .....................................................................................................................................3Apache ...............................................................................................................................3Meerdere servers naast elkaar ...............................................................................................3

PHP-module ...........................................................................................................................3RDBMS ..................................................................................................................................4Xampp ..................................................................................................................................4Waarom PHP? .........................................................................................................................4

Open source pakketten ......................................................................................................5

PHP KENNISMAKING...................................................................................................5

Virtuele webserver...................................................................................................................5Een eerste scriptje ..................................................................................................................5

Het tikwerk .........................................................................................................................5De broncode .......................................................................................................................5Wat is dat allemaal? .............................................................................................................6

De editor .........................................................................................................................6De extensie ......................................................................................................................6Plaats van het PHP-script ...................................................................................................6Het MVC-model ................................................................................................................6De openingstags ...............................................................................................................6Het eerste commando .......................................................................................................7Afsluiten van de regel ........................................................................................................7Het testen van het script ....................................................................................................7De broncode van de HTML-pagina .......................................................................................8

Wat is er nu allemaal gebeurd... .............................................................................................8Een aantal mogelijke problemen ............................................................................................8

Pagina niet toegankelijk .....................................................................................................8Downloaden van de pagina .................................................................................................8Blanco pagina wordt weergeven ..........................................................................................8Parse Error ......................................................................................................................8Onverwachte uitvoer .........................................................................................................9

Iets uitgebreider .....................................................................................................................9Nog wat tikwerk ..................................................................................................................9Hoe loopt dit nu? ................................................................................................................10

Commentaar ..................................................................................................................10Variabelen .........................................................................................................................10

Termen ................................................................................................................................11Oefeningen.....................................................................................................................................12

Vraag en antwoord .............................................................................................................12Juist of fout en verklaar? .....................................................................................................12Haal de foute variabelen er uit: ............................................................................................12Maak een script .................................................................................................................12

PHP OPERATOREN.....................................................................................................13

Algemeen .............................................................................................................................13Voorbeelden .........................................................................................................................13

Gemiddelde berekenen van 2 getallen ...................................................................................132 stukken tekst aan elkaar kleven .........................................................................................13De restbepaling van een rekeningnummer .............................................................................14Binaire wiskunde ................................................................................................................14

Soorten operatoren ...............................................................................................................14Toekenningsoperator ..........................................................................................................14

Page 6: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Stringoperatoren ................................................................................................................15Rekenkundige operatoren ....................................................................................................15

Standaard operatoren ......................................................................................................15Optel- en aftrekoperatoren ...............................................................................................15Binaire wiskunde .............................................................................................................16

Gecombineerde operatoren .....................................................................................................17Vergelijkingsoperatoren .........................................................................................................17Logische operatoren ..............................................................................................................17Foutcontrole-operatoren .........................................................................................................18Array-operatoren ..................................................................................................................18Voorrang van operatoren ........................................................................................................19

Oefeningen.....................................................................................................................................19Script ...............................................................................................................................19

PHP VARIABELEN......................................................................................................20

Algemeen.............................................................................................................................20Voorbeelden..........................................................................................................................20

Wijzigingen inhoud..............................................................................................................20Gegevens die niet veranderen...............................................................................................21Controle correcte gegevens..................................................................................................21

Naamgeving..........................................................................................................................21Gebruik van dubbele en enkele aanhalingstekens........................................................................22

Concatenatie......................................................................................................................23Meer escapen.....................................................................................................................23

Nieuwe regels .......................................................................................................................23Heredoc................................................................................................................................23Verwarrende variabelen..........................................................................................................24Verschillende types.................................................................................................................24

Voorbeelden ......................................................................................................................24Boolean ............................................................................................................................24Integer..............................................................................................................................25Float.................................................................................................................................25Strings..............................................................................................................................25NULL.................................................................................................................................25Arrays...............................................................................................................................25Objecten............................................................................................................................26Resources..........................................................................................................................26

Omzetten van type of casting...................................................................................................26Zelf omzetten.....................................................................................................................26Automatische conversie van types.........................................................................................26

Controleren van het type.........................................................................................................27Gelijkheid.............................................................................................................................27Testen van variabelen.............................................................................................................28Constanten...........................................................................................................................29

Oefeningen.....................................................................................................................................30Haal de fouten er uit ...........................................................................................................30Het project van deze cursus: Webshop...................................................................................30Ronde-tijden......................................................................................................................31Ronde-tijden in een tabel ....................................................................................................31Types ...............................................................................................................................32Constanten .......................................................................................................................32Don Quichot.......................................................................................................................33Punten..............................................................................................................................33Samengestelde woorden......................................................................................................33

PHP FORMULIERVERWERKING..................................................................................34

Algemeen .............................................................................................................................34Voorbeelden..........................................................................................................................34Werking van HTTP: GET en POST.............................................................................................35

Volgen van een hyperlink.....................................................................................................36Formulieren........................................................................................................................36

Formulieren...........................................................................................................................37Formulieren maken.............................................................................................................37Input-tags .........................................................................................................................39

Verwerken van de formulieren.................................................................................................39

Page 7: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Verwerken van URL's..............................................................................................................40Opletten met URL's ............................................................................................................41

Textarea's en nieuwe regels.....................................................................................................41oefeningen.....................................................................................................................................41

Het project van deze cursus: Webshop...................................................................................41Enquête.............................................................................................................................47Zoeken..............................................................................................................................48

PHP EVALUATIES EN LUSSEN....................................................................................50

Algemeen .............................................................................................................................50Voorbeelden..........................................................................................................................50

Voorbeeld 1........................................................................................................................50Voorbeeld 2........................................................................................................................51

Evaluaties.............................................................................................................................52If ... else............................................................................................................................52

Verschillende testen in één statement.................................................................................53Switch-statement................................................................................................................53

Lussen..................................................................................................................................54While................................................................................................................................54Do...while..........................................................................................................................54For....................................................................................................................................55HTML code binnen while, for en if structuren...........................................................................55

Oefeningen.....................................................................................................................................56Het project van deze cursus: Webshop...................................................................................56Opsplitsen voor MVC ...........................................................................................................57Getallen afdrukken while......................................................................................................58Getallen afdrukken for.........................................................................................................58Getallen afdrukken en verwoorden.........................................................................................58Dynamische tabel ...............................................................................................................59Dynamische tabel met alternerende rijen................................................................................59Dynamische tabel met alternerende rijen en tabelopties...........................................................59

PHP ARRAYS.............................................................................................................60

Algemeen.............................................................................................................................60Voorbeeld.............................................................................................................................60Vullen van arrays...................................................................................................................62

Array()..............................................................................................................................62Vierkante haakjes [ ]...........................................................................................................63

Opvragen van de gegevens......................................................................................................64Gemengde arrays...................................................................................................................64Array leegmaken....................................................................................................................65Array-gerelateerde functies.....................................................................................................65

Afdrukken van array-inhoud.................................................................................................65Sorteren van arrays.............................................................................................................65Tellen van het aantal elementen in een array..........................................................................66Strings omzetten naar arrays en omgekeerd...........................................................................67Minimum en maximum waarden zoeken.................................................................................67Gegevens zoeken in een array..............................................................................................67

Arrays doorlopen....................................................................................................................68Voorgedefinieerde arrays.........................................................................................................68

$_SESSION, $_POST, $_GET en $_REQUEST..........................................................................68$_SERVER..........................................................................................................................68$_COOKIE..........................................................................................................................68$_FILES.............................................................................................................................69$GLOBALS.........................................................................................................................69

Oefeningen.....................................................................................................................................69Het project van deze cursus: Webshop...................................................................................69

Opslaan van de gegevens in arrays ....................................................................................69Doorlopen van de gegevens ..............................................................................................69Meerdere categorieën ......................................................................................................70

Speelkaarten .....................................................................................................................7210 willekeurige speelkaarten trekken.....................................................................................7210 willekeurige speelkaarten grafisch weergeven.....................................................................72Bezoeker bepaalt aantal te trekken speelkaarten.....................................................................72HTML en arrays...................................................................................................................72

Page 8: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

PHP FUNCTIES..........................................................................................................73

Algemeen.............................................................................................................................73Voorbeelden..........................................................................................................................73

Opzoeken functie................................................................................................................73Gemiddelde berekenen........................................................................................................73

Opbouw van functies..............................................................................................................74Voorbeeld 1........................................................................................................................74Voorbeeld 2........................................................................................................................75

Nog functies..........................................................................................................................76Eigen functies........................................................................................................................76

Hoe zit dit in mekaar?..........................................................................................................76Variabelen en functies.............................................................................................................77

Lokale en globale variabelen.................................................................................................77Lokale variabelen.............................................................................................................77Globale variabelen............................................................................................................77

Variabelen doorgeven via verwijzing (referentie)......................................................................78Statische variabelen............................................................................................................78Argument met een standaardwaarde......................................................................................78Aantal argumenten opvragen................................................................................................79

Recycleren van functies...........................................................................................................79Specifieke functies voor getallen...............................................................................................81

Integers en floats ...............................................................................................................81Werken met getallen........................................................................................................82

Specifieke functies voor datums...............................................................................................83Huidige tijd........................................................................................................................83Datums weergeven .............................................................................................................84Zelf tijden samenstellen.......................................................................................................85Tekst omzetten naar een tijdstip...........................................................................................85Microseconden ...................................................................................................................86Controleren van datums ......................................................................................................86Opletten met datums ..........................................................................................................86

Specifieke functies voor strings................................................................................................87Lengte van een string..........................................................................................................87Opmaak van tekst...............................................................................................................87

Sprintf() en printf()..........................................................................................................87Hoofdletters en kleine letters................................................................................................88Vergelijken van strings........................................................................................................88Zoeken van substrings.........................................................................................................89

Uitfilteren van een substring..............................................................................................89Positie vinden van een substring........................................................................................89

Nog meer uitfilteren............................................................................................................90Tekens en substrings vervangen............................................................................................90Vervangen van substrings op basis van positie........................................................................90Vervangen van substrings op basis van tekst..........................................................................90

Recursieve functie..................................................................................................................91Oefeningen.....................................................................................................................................91

Het project van deze cursus: Webshop...................................................................................91Prijzen netjes weergeven .................................................................................................91Prijs van een cursus opzoeken...........................................................................................91Datum weergeven ...........................................................................................................92Ingevulde datum controleren.............................................................................................92Ingevulde e-mailadres controleren......................................................................................93

Koppen..............................................................................................................................93Alle kopformaten weergeven.................................................................................................93Zinnen beginnen met een hoofdletter.....................................................................................94Horeca .............................................................................................................................94Jubileum............................................................................................................................94Factuur opmaken................................................................................................................95Analyse van e-mailadressen .................................................................................................96

PHP EN AJAX.............................................................................................................96

Wat is AJAX?......................................................................................................................97Hoe werkt AJAX?....................................................................................................................97AJAX is gebaseerd op Internet Standaarden...............................................................................97

Page 9: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

AJAX PHP Voorbeeld...............................................................................................................98AJAX Database voorbeeld......................................................................................................100

De MySQL Database..........................................................................................................100De HTML pagina................................................................................................................100Het PHP script...................................................................................................................101

AJAX en XML........................................................................................................................102Het XML bestand...............................................................................................................102De HTML pagina................................................................................................................103Het PHP script...................................................................................................................104

Opiniepeiling met resultaten...................................................................................................106De HTML pagina................................................................................................................106Het PHP script...................................................................................................................107Het tekstbestand...............................................................................................................108

Oefeningen...................................................................................................................................108Het project van deze cursus: Webshop.................................................................................108LiveSearch.......................................................................................................................112

PHP SESSIES...........................................................................................................112

Algemeen ...........................................................................................................................112Voorbeelden .......................................................................................................................113Werking .............................................................................................................................114Werken met sessies .............................................................................................................114

Opstarten van een sessie ...................................................................................................115Gebruik van de sessie variabelen.........................................................................................115Sessies verwijderen ..........................................................................................................115

Gedeeltelijk verwijderen van sessievariabelen ....................................................................115De volledige sessie verwijderen .......................................................................................115

Oefeningen...................................................................................................................................115Het project van deze cursus: Webshop.................................................................................115

Meerdere cursussen........................................................................................................116Cursussen aan de winkelwagen toevoegen ........................................................................116Het winkelmandje weergeven...........................................................................................116De winkelwagen leegmaken.............................................................................................117Weergeven van de winkelwagen bij de inschrijving..............................................................118Weergeven van de winkelwagen bij het verwerken van de inschrijving...................................119Categorie bijhouden........................................................................................................120Webshop afwerken.........................................................................................................120Waarschuwing...............................................................................................................120

Aanmelden.......................................................................................................................120

PHP BEVEILIGING...................................................................................................121

Sql-injectie en xss: de beste verdediging.................................................................................121Cross site scripting............................................................................................................123Vertrouw nooit een gebruiker..............................................................................................123Voorbereiding...................................................................................................................124

Tot slot...............................................................................................................................124

Page 10: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat
Page 11: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

PHP OrientatieWat is PHP?

PHP staat voor PHP: Hypertext Preprocessor en is een scriptingtaal voor dynamische webpagina's.

Een dynamische webpagina is een pagina waarvan de inhoud verandert.

Je kan PHP ook gebruiken om pagina's te beveiligen. Een aantal voorbeelden:

• weblogs • webwinkels • gastenboeken • fotoboeken • menukaarten • begroetingen naargelang het tijdstip

PHP zorgt voor HTML-code en dus niet voor browser-output (hetgeen de modale bezoeker ziet). Het is van groot belang om dit te onthouden. We zijn dus genoodzaakt om HTML te kennen.

Een aantal van bovenstaande zaken kunnen we ook bereiken door gebruik te maken van JavaScript. Helaas werken JS niet op alle browsers. Meestal omdat een gebruiker deze uitgeschakeld heeft uit veiligheidsoverwegingen. Daarom mogen we voor beveiligde pagina's niet uitgaan van een beveiliging door JS. PHP kan niet uitgeschakeld worden door de gebruiker, omdat deze draait op de server in niet bij de eindgebruiker. Dit betekent ook een grotere flexibiliteit voor de programmeur, omdat deze enkel rekening moet houden met de beperkingen van de server en niet met die van elke potentiële bezoeker.

Ook kun je met JS geen (of moeilijk) connectie maken met een database.

PHP wordt ook gebruikt voor populaire webtoepassingen zoals:

• Drupal • Joomla • PHPBB • Dokeos • ...

Scripting- en programmeertalen

PHP wordt een scripting-taal genoemd. Dit is een verschil met een “echte” programmeertaal. Bij een programmeertaal vertrekken we vanaf een broncode, maar voor we deze kunnen uitvoeren, moet deze eerst gecompileerd worden (bij een Windows-computerprogramma, maken we hier een .exe van, en wordt deze gebundeld met een aantal dll-bestanden). Dit heeft als voordeel dat de uitvoer van het programma heel snel kan lopen.

Het nadeel is echter, dat bij elke wijziging van de broncode, het programma opnieuw moet gecompileerd worden. Bij grote programma's kan dit soms oplopen tot ettelijke uren .

Bij een scriptingtaal, wordt de broncode niet gecompileerd, maar wordt “geparsed” (omgezet) bij het uitvoeren van het programma. Dit heeft als nadeel dat het uitvoeren trager loopt dan een gecompileerd programma. Maar bij de meeste programma's de gemaakt worden voor het web zal dit van geen invloed zijn, omdat deze programma's meestal heel beperkt zijn (als we dit vergelijken met stand-alone programma's). Ook wordt een webprogramma bijna altijd onderverdeeld in verschillende pagina's, waardoor ook deze tijd gedeeld wordt. Een andere grote invloed op onze webprogramma's is de overdracht van het internet zelf. De uitvoer van het programma is bijna altijd sneller dan de overdracht van het internet, waardoor ook hier weer de vertraging niet opvalt.

1 | P a g i n a

Page 12: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Client- en ServerSide

We spreken over een ClientSide-scriptingtaal als deze uitgevoerd wordt door de browser van de bezoeker. De uitvoer van het script gebeurt op de client. Dit heeft als nadeel dat we afhankelijk zijn van de browser van de bezoeker, en aangezien deze op verschillende manieren kan ingesteld zijn, moeten we bij het gebruiken van ClientSide-scriptingtalen hier ook rekening mee houden. Een clientSide-scriptingtaal is bijvoorbeeld JavaScript.

ServerSide-scriptingtalen worden op de server uitgevoerd, waarna de uitvoer naar de browser van de bezoeker gestuurd wordt in de vorm van HTML. Dit heeft als voordeel dat we enkel rekening moeten houden met de beperkingen van de server. Bijkomend voordeel is bijvoorbeeld, dat we wachtwoorden nooit zullen oversturen via het internet. Ook is de doorgestuurde informatie soms minder groot bij ServerSide dan bij ClientSide. Bij een database-query, moeten we enkel de nodige gegevens doorsturen, terwijl bij een CS, alle gegevens moeten doorgestuurd worden, waarna de JS zal bepalen welke gegevens er moeten weergegeven worden.

Het grote voordeel van CS daarentegen, is dat er wel controle kan uitgevoerd worden op bijvoorbeeld een aantal invoervelden, nog voor deze doorgestuurd worden naar de server. Maar aangezien we hier niet kunnen op rekenen, moeten we altijd via een SS-taal ook nog de gegevens controleren.

In recentere web-programmeermethoden zoals Ajax, wordt er een combinatie van beide soorten talen gebruikt, waardoor een gebruiker meer het gevoel krijgt van met een stand-alone applicatie te werken.

Zijn er alternatieven?

Natuurlijk. Het grootste alternatief is ASP (Active Server Pages) van Microsoft. Andere veelgebruikte scriptingtalen zijn JSP (Java Server Pages) en CFM (ColdFusion). Alles hangt uiteindelijk af van welke webserver we gebruiken. Om ASP te kunnen gebruiken moeten we IIS op de server installeren. JSP heeft Sun Java Server nodig en CFM de ColdFusion-server van Adobe. PHP draait daarentegen op elke webserver, maar wordt meestal gebruikt in combinatie met de Apache-webserver.

Verder hangen de verschillende alternatieven ook samen met een “grote” programeertaal. Zo leunt ASP dicht aan bij Visual Basic (ook van Microsoft), JSP tegen Java en PHP tegen C. Programmeurs die deze talen kennen zullen dan ook sneller kiezen voor één van de server-scriptingtalen die het dichtst er tegenaan leunt.

Een aantal andere overwegingen om voor PHP te kiezen kunnen zijn:

• meestal goedkopere hosting voor Linux/Apache-servers dan voor Microsoft/IIS-server; • heel eenvoudige koppeling naar de gratis database-server MySQL; • vlotte ondersteuning op het internet door een grote gemeenschap van gebruikers; • scripts werken heel snel; • ...

Wat zijn webservers?

Algemeen

Iedereen is bekend met de webbrowser, in de meeste gevallen Microsofts Internet Explorer, Mozilla Firefox of Chrome. Andere webbrowsers zijn Opera of Lynx (een zuivere tekstbrowser, vaak gebruikt door slechtzienden).

Deze webbrowser heeft de bezoeker nodig om een webpagina te kunnen opvragen. Deze webpagina's bevinden zich altijd op een server. Op deze server staat een toepassing geïnstalleerd die, bij aanvraag, een webpagina teruglevert: de webserver. Deze heeft dus als enige bedoeling de juiste webpagina aan de juiste bezoeker terug te geven. De meest populaire webservers zijn hierboven al aangehaald:

• IIS (Internet Information Server / Services)

2 | P a g i n a

Page 13: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

• Apache • nginx (klein en snel, BSD licentie)• google (gebaseerd op linux, GWS)

De 2 meest gebruikte zijn echter IIS en Apache.

IIS

Deze server werd gemaakt door Microsoft en draait dus ook enkel op de besturingssystemen van deze fabrikant. Het systeem wordt vooral gekenmerkt door een hoeveelheid aan bugs, en wordt dan ook minder aangeraden als webserver. Het hoge aantal wordt verklaard door de agressieve marketing-politiek van Microsoft.

Het grote voordeel van IIS is wel dat het, naast de webserver, ook beschikt over een ingebouwde FTP- en NNTP-server.

Alle PHP-programma's uit deze cursus zouden in principe moeten werken op een IIS-server. Maar het kan altijd zijn dat er eentje struikelt over deze webserver, waardoor je een workaround zult moeten bedenken.

IIS heeft een marktaandeel van 14,46% of 84 288 985 webservers (op januari 2012) .

IIS-servers is de server die het traagst reageert bij een aanvraag van een webpagina.

Apache

Apache is een open-source server die draait op alle Unix-achtige systemen, Microsoft-besturingssystemen, Novells Netware en IBM OS/400. Door het Open-source karakter worden fouten sneller gevonden én gedicht. Door gebruik te maken van verschillende modules is het mogelijk om de functionaliteit van Apache serieus uit te breiden.

Het "nadeel" van Apache zou kunnen zijn, dat je het niet kunt installeren vanaf de originele Windows-cd's, maar apart moet downloaden van het internet. Een tweede mogelijk nadeel is dat het niet beschikt over een FTP-server, maar je aangewezen bent op een extern programma hiervoor, waar er (Open Source-)alternatieven genoeg voor zijn.

Apache bezit een marktaandeel van 64,91% of 378 267 399 webservers (op januari 2012).

In deze cursus zullen we gebruik maken van de Apache-webserver.

Meerdere servers naast elkaar

In theorie is het mogelijk om de verschillende webservers op 1 toestel te draaien hebben. Maar dit wordt niet aangeraden, omdat volgens de overeenkomsten van het IANA, een webserver standaard poort 80 krijgt toegewezen. Als een server een aanvraag binnenkrijgt, moet hij deze duidelijk weten voor welk van de webservers deze nu bedoelt is.

Let er dus goed voor op dat je niet toevallig al IIS staan hebt als je Apache bij installeert.Let op met Skype, ook deze heeft een ingebouwde webserver die op poort 80 draait. De eenvoudigste manier is om Skype uit te schakelen als je Apache gebruikt.

PHP-module

Als we gebruik willen maken van Apache, moeten we duidelijk maken dat deze PHP-pagina's moet kunnen verwerken. Aangezien Apache dit niet zelfstandig kan, moeten we gebruik maken van een externe module: de PHP-module of PHP-parser.

Ook deze moeten we apart downloaden, installeren en configureren.

Op dit ogenblik is de te downloaden stabiele versie 5.3.8. Op heel veel servers zul je echter nog versie 4.x tegenkomen, maar hier zullen we niet langer meer bij stilstaan, omdat deze niet meer ondersteund wordt door PHP zelf. Je kan best aan je hosting-bedrijf vragen om de servers om te schakelen naar versie 5.x.

Ondertussen is versie 6 ook op komst. Maar er is nog geen exacte release-datum bekend.

3 | P a g i n a

Page 14: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

De PHP-modules zijn verkrijgbaar voor zowel Linux-systemen als Windows-systemen. Als wij ontwikkelen, zal dit echter meestal gebeuren op een Windows-systeem, waarna we het geheel zullen op een Linux-server plaatsen.

Helaas hebben de Windows-systemen enkele beperkingen die we in de Linux-versies niet hebben, die alles te maken hebben met de opbouw van het Microsoft-besturingssysteem. Deze tekortkomingen worden ook vermeld in de PHP-documentiatie.

RDBMS

Een Relational DataBase Management System is een systeem dat verschillende databases beheert. Een database is op zijn beurt een systeem dat gegevens bijhoudt. Vergelijk het met een uitgebreide spreadsheet, waar je kan op filteren, combineren, gegevens toevoegen, wissen, wijzigen, ...

Het meest bekende desktop-systeem voor een RDBMS is Microsoft Access. Helaas is dit weinig schaalbaar (kan geen grote databases aan), is het duur, ...

Andere mogelijkheden zijn Microsoft SQL-server , PostgreSQL , Oracle , MySQL , ...

Wij maken gebruik van MySQL omdat PHP een heel uitgebreide ondersteuning heeft voor deze database. Het grote voordeel is ook dat MySQL zo goed als gratis te gebruiken is. Let wel op er zijn een paar regels:

• MySQL is gratis als het gebruikt wordt voor niet-commerciële toepassingen; • MySQL is gratis als het als aparte module geleverd wordt voor commerciële

toepassingen; • MySQL is NIET gratis als deze gebundeld wordt met de applicatie én het een

commerciële applicatie betreft.

Ondertussen is MySQL overgenomen door Oracle. Ondersteuning is dan ook via dit bedrijf te verkrijgen, of op de vele gratis fora.

Een alternatief die ook heel vaak gebruikt wordt is PostgreSQL. Deze sql-server is altijd gratis en kan ook heel snelle verwerkingen op extreem grote databases uitvoeren. Deze komt echter niet verder aan bod in deze cursus.

Xampp

Omdat we in deze cursus een webserver, een PHP-module en een RDBMS nodig zullen hebben, moeten we deze allen installeren. Dit kan behoorlijk omslachtig en ingewikkeld zijn. Gelukkig hebben de Apache friends deze drie programma's gebundeld als 1 geheel, waardoor er aan configuratie niets meer te doen is. Het geheel wordt gedownload, uitgepakt, en is klaar voor gebruik. Hou er echter rekening mee, dat xampp niet geschikt is als productie-server, wegens te onveilig, maar ideaal is als ontwikkel-omgeving.

Naast de bovenstaande programma's biedt xampp ook nog de mogelijkheid om een mailserver, een ftp-server, ... te draaien.

Voor meer uitleg over xampp zelf, zie internet.

Naast Xampp zijn er op het internet nog andere mogelijkheden te vinden zoals EasyPHP , of je kan alles zelf manueel installeren, wat natuurlijk omslachtiger is, maar wel stabieler zal draaien.

Waarom PHP?

PHP is uitgegroeid tot een volwaardige taal die kan concurreren met de anderen. Het zelfs uitgegroeid tot een taal die te gebruiken is voor zowel command-line gebruik , als voor het programmeren van echte desktop-applicaties .Een bijkomend voordeel is dat alle tools die we nodig hebben gratis van het internet te downloaden zijn.

4 | P a g i n a

Page 15: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Open source pakketten

Naast het zelf schrijven van webpagina's, maken ook heel wat Open source-pakketten gebruik van PHP. Hieronder vallen een aantal heel bekende namen:

• Drupal: CMS • Joomla: CMS • Wordpress: CMS • Dokeos: ELO • Chamilo: ELO • Magento: CMS • PHPBB: Forum • MediaWiki: Wiki • ...

PHP KennismakingVirtuele webserver

Op de site linux.pindanet.be staat een gratis te gebruiken virtuele webserver.

Raadpleeg de informatie op de betreffende pagina om deze webserver te installeren op Windows, Linux of Mac OS X systemen.

Een eerste scriptje

Het tikwerk

Sla alle scripts op in een oefenmap in Documenten. Maak eventueel submappen aan per hoofdstuk en geef je scripts een duidelijke naam.We vallen meteen met de deur in huis en starten Dreamweaver op.

Tik in Dreamweaver de volgende code zonder nummering over:

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml">3 <head>4 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />5 <title>Kennismaking</title>6 </head>7 <body>8 <?php print "Hallo wereld"; ?>9 </body>10 </html>

Maak in je oefenmap een nieuwe map “kennismaking” aan en sla dit bestand op als hallo.php.

Publiceer de site.

Open je browser en tik in de adresbalk: http://ip-adres/pc01/kennismaking/hallo.php en aanschouw het resultaat.

De broncode

Bekijk ook eens de broncode van dit script:

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml">

5 | P a g i n a

Page 16: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

3 <head>4 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />5 <title>Kennismaking</title>6 </head>7 <body>8 Hallo wereld</body>9 </html>

Wat is dat allemaal?

De editor

We hebben gebruik gemaakt van Dreamweaver. MS Word of Wordpad slaan niet alleen de zuivere tekst op, maar ook de opmaak van je documenten.

Je kan echter ook gratis, opensource editors zoals Notepad ++, Aptana, enz. gebruiken.

Een volledig pakket die volledig op php-scripting gericht is, is Zend-studio van Zend, de makers van PHP. Deze editor is niet gratis, maar je kan wel een proefversie downloaden om die 30 dagen te gebruiken. In ruil voor een betaalbare som krijg je een heel handige editor die je helpt via:

• codehighlighting • aanvullen van functies • aanvullen van variabelen • ...

De extensie

Elk document waarin er PHP-code voorkomt moet de extentie .php krijgen. Doen we dit niet dan weet de webserver niet dat hij deze documenten moet doorsturen naar de PHP-parser (zie ook verder).

Plaats van het PHP-script

We zullen onze PHP-code altijd ergens tussen de HTML-code moeten plaatsen. Naargelang de bedoeling kan dit overal staan:

• vóór alle HTML-code • ná alle HTML-code • tussen de HTML-code

Meestal komt er niet veel PHP-code meer na de HTML. Er staat wel bijna altijd PHP-code voor of tussen de HTML.

Door PHP vóór je HTML te plaatsen, kun je bijvoorbeeld de titel van je HTML-pagina aanpassen of bepalen welke css-opmaak er geladen moet worden. Of kun je de afmetingen van een foto opvragen om die afmetingen te gebruiken in JavaScript om de browser-grootte aan te passen.

Het MVC-model

In dit model wordt gebruik gemaakt van gescheiden pagina's voor weergave en controller-logica. We zullen dit zoveel mogelijk in deze cursus toepassen. Hierdoor blijft het eindresultaat veel overzichtelijker.

De openingstags

Om aan te geven dat we PHP zullen gebruiken, moeten we altijd de openingstags voor PHP plaatsen, op die manier weet de PHP-parser dat hij alles hiertussen moet verwerken. Vergeten we deze tags te plaatsen, dan wordt alles als zuivere HTML beschouwd, en dus letterlijk weergegeven, let daarvoor dus op.

De standaard openingstags (en sluittags) zijn: <?php en ?>. Deze mogen aan het begin van de regels staan, aan het begin en het einde, tussenin, ... waar je maar wilt en deze nodig hebt.

6 | P a g i n a

Page 17: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Het overschakelen tussen HTML-mode en PHP-mode wordt ook wel “uittreden” genoemd.

Het eerste commando

We spreken bij PHP over functies en language constructs. Beide zorgen ze ervoor dat er “iets” gebeurd. Dit iets is afhankelijk van de functie of de language construct. Functies zijn miniprogramma's die bepaalde bewerkingen uitvoeren. Een functie geeft altijd een bepaalde waarde terug. Later meer hierover. Een language construct wordt voornamelijk gebruikt om gegevens naar de browser te sturen, en geeft geen waarde terug. In het gebruik speelt het niet veel rol of we met een functie dan wel een language construct werken.

De print hoort echter in de categorie language constructs en stuurt hetgeen na de print staat door als HTML. De meeste functies nemen de argumenten aan tussen haakjes ( ). Doordat we met tekst (strings) werken, moet deze tussen enkele ( ' ) of dubbele ( " ) aanhalingstekens staan.We kunnen dus het volgende schrijven:

• print "hello world"; • print ("hello world"); • print ('hello world'); • print 'hello world';

en telkens dezelfde uitvoer bekomen. Een andere manier om hetzelfde te bekomen is gebruik te maken van de language construct echo:

• echo "hello world"; • echo ("hello world"); • echo ('hello world'); • echo 'hello world';

Er zijn een aantal verschillen, die later aan bod komen.

Het wordt echter aangeraden om language-constructs niet tussen ronde haakjes te plaatsen.

Afsluiten van de regel

In onze gewone taal sluiten we elke zin af met een punt. Als we PHP-scripts schrijven, doen we dit door gebruik te maken van een puntkomma (;). In sommige gevallen moet (mag) je deze niet gebruiken, maar later daar meer over.

De puntkomma moet er echter staan omdat we al onze PHP-code ook achter elkaar mogen schrijven, maar onze parser moet natuurlijk telkens weten wat er een nieuwe opdracht is.Vergelijk bijvoorbeeld eens onderstaande voorbeelden:

<?phpprint "zin 1<br />";print "zin 2<br />";print "zin 3<br />";print "zin 4<br />";?>

<?php print "zin 1<br />"; print "zin 2<br />"; print "zin 3<br />"; print "zin 4<br />"; ?>

Beide voorbeelden zullen dezelfde uitvoer hebben, maar het eerste voorbeeld is wel duidelijker leesbaar.

Het testen van het script

Als je je script wilt testen, lukt dit niet door het te openen via de Verkenner, maar ben je verplicht om dit te doen door het script te publiceren en te openen via een internetbrowser naar keuze. In de adresbalk begin je altijd met http://ip-adres/pc01/.

Dit is jouw eigen virtuele webserver. Alles wat er na komt zijn de submappen. Let er op: in je Verkenner wordt er gebruik gemaakt van de “\” (backslash), in je browser ven de “/” (gewone slash).

7 | P a g i n a

Page 18: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

De broncode van de HTML-pagina

Zoals je ziet, staat er in de broncode van onze HTML-pagina geen letter PHP-code meer. Deze is allemaal omgezet naar HTML-code. Als je later op zoek gaat naar fouten, moet je ook niet kijken in je browser-uitvoer, maar in de broncode van je HTML-document.

Wat is er nu allemaal gebeurd...

bij het opvragen van de pagina script01.php ?

Toen je de pagina opgevraagd hebt via je webbrowser, heeft deze de aanvraag doorgestuurd naar de webserver (die nu toevallig op jouw pc staat). De webserver ziet dat de gevraagde pagina de extensie .php heeft. In het configuratiebestand van de webserver staat beschreven, dat .php-bestanden moeten doorgestuurd worden naar de PHP-parser.

Deze parser zal op zijn beurt de pagina overlopen, en overal kijken waar er PHP-openingstags staan. Alles wat tussen deze tags staat wordt door de parser verwerkt, en de parser maakt er op zijn beurt HTML-code van. Als de parser op het einde van het document komt, stuurt hij de “nieuwe” HTML-pagina door naar de webserver. De webserver verstuurt deze pagina naar de browser, en de bezoeker ziet nu een webpagina.

De bezoeker zal dus, zelfs als hij naar de bron kijkt, enkel zuivere HTML zien.

Hierdoor speelt het dus ook geen enkele rol welke browser de bezoeker gebruikt aangezien er zuivere html doorgestuurd wordt. Dit in tegenstelling tot javascript of andere client-side-programmeertalen.

Een aantal mogelijke problemen

Het kan nu zijn, dat dit bovenstaande script niet wil uitvoeren, dat je een melding krijgt dat de pagina niet toegankelijk is, of dat er gevraagd wordt om de pagina te downloaden. Misschien krijg je een compleet andere pagina te zien. We zullen de mogelijkheden eens overlopen.

Pagina niet toegankelijk

Dit is omdat je webserver niet opgestart is. Controleer om deze te starten, en herlees desnoods de handleiding om te zien of je niets verkeerd gedaan hebt. Controleer ook of er misschien geen 2de webserver actief is.

Downloaden van de pagina

De webserver weet niet wat hij met de extensie moet aanvangen, en vraagt daarom om deze te downloaden op de eigen computer (waar het in ons geval eigenlijk al staat). Controleer of je de PHP-parser wel geïnstalleerd hebt.

Blanco pagina wordt weergeven

Er zit waarschijnlijk een fout in je code, herzie je code op typfouten (syntaxisfouten). Dit heeft meestal te maken met een instelling die ervoor zorgt dat je fouten niet ziet. Dit is uit veiligheidsoverwegingen.

De instelling waarover het gaat is error_reporting. Zie het configuratiebestand voor meer uitleg. Als deze niet ingesteld is, krijg je volgende:

Parse Error

Er zit een fout in je code op de regel die aangegeven wordt. Hou er wel rekening mee dat de fout ook kan zitten op een plaats vóór de aangegeven plaats, soms 10-tallen regels hoger. De parser duidt ook duidelijk aan welke fout het is. Misschien heb je een puntkomma vergeten? Of de sluittags? Controleer alle mogelijkheden, je zal zeker voorbeelden genoeg zien.

Het gebruik van een goede editor zal je kans op parse errors al verkleinen.

Fouten kun je op een webserver zonder ingeschakelde PHP-foutmeldingen met behulp van het volgende script toch opsporen:

8 | P a g i n a

Page 19: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

1 <?php //debug.php2 error_reporting(E_ALL);3 ini_set("display_errors", 1);4 include("fout.php");5 ?>

Dit script schakelt de foutmeldingen in voor het script fout.php. Een voorbeeld:

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml">3 <head>4 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />5 <title>Fouten opsporen</title>6 </head>7 <body>8 <?php print "Geen fouten gevonden; ?>9 </body>10 </html>

Onverwachte uitvoer

Er worden geen foutmeldingen weergegeven, en je krijgt een HTML-pagina te zien, echter niet hetgeen je verwacht. Waarschijnlijk heb je een verkeerde operator gebruikt, of 2 namen van variabelen door elkaar gehaald, of een structuur op de verkeerde plaats beëindigt. Dit zijn logische fouten en je parser kan je hier niet op wijzen, aangezien je structureel niets verkeerd doet.

Iets uitgebreider

Nog wat tikwerk

We zullen het eerste script wat uitbreiden:

1 <?php2 /* hier zullen we ons script aanpassen zodat we gebruik kunnen maken

van 3 variabelen. Met variabelen wordt een script eenvoudiger en we kunnen

er 4 later meer mee doen. */5 $titel = "Kennismaking"; //de variabele $titel6 $weer_te_geven_tekst = "Hallo allemaal";7 ?>8 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">9 <html xmlns="http://www.w3.org/1999/xhtml">10 <head>11 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />12 <title><?php print $titel; ?></title>13 </head>14 <body>15 <p><?php print $weer_te_geven_tekst; ?></p>16 </body>17 </html>

Tik dit zonder nummering over in een nieuw document, sla op onder de naam titel.php, publiceer en vraag de pagina opnieuw op in je webbrowser (http://192.168.1.2/pc01/kennismaking/titel.php) en aanschouw opnieuw het resultaat.

9 | P a g i n a

Page 20: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Bekijk ook eens de broncode:

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml">3 <head>4 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />5 <title>Kennismaking</title>6 </head>7 <body>8 <p>Hallo allemaal</p>9 </body>10 </html>

Hoe loopt dit nu?

Commentaar

In je script wordt er bij het uitvoeren geen rekening gehouden met commentaar. Dit heeft dus geen invloed op de snelheid van het parsen, of op de grootte van het uiteindelijke HTML-bestand. Ook wordt de commentaar niet doorgestuurd naar de browser van de bezoeker en dus niet getoond in de broncode.

In dit stukje zien we dat er gebruik is gemaakt van 3 soorten commentaar:

1. lange commentaar of c-style: Deze begint met een combinatie slash-asterisk (/*) en eindigt met de combinatie asterisk-slash (*/). Deze soort commentaar kan over verschillende lijnen lopen, en wordt gebruikt voor het gebruik van langere commentaar.

2. korte commentaar of c++-style: Deze begint met een dubbele slash (//) en eindigt op het einde van de regel. Deze wordt gebruikt om kortere commentaar in te voegen. Je kan echter gerust de dubbele slash gebruiken om verschillende regels onder elkaar van commentaar te voorzien. Vergeet alleen niet om elke regel met een nieuwe // te beginnen. Hou er rekening mee dat je de afsluit-puntkomma van je code niet nà de commentaar zet.

3. Perl- of shell style: Deze laatste methode wordt niet echt courant gebruikt maar heeft het zelfde effect als de korte commentaar (//) maar de dubbele slash wordt vervangen door een hash-teken(#).

Variabelen

In dit script hebben we voor het eerste gebruik gemaakt van variabelen. Variabelen zijn een plaatsje in het geheugen van de server waar we een naam aan toe kennen. In dit stukje geheugen kunnen we tijdelijk gegevens stockeren. Deze gegevens kunnen veranderlijk zijn. Vandaar de naam.In dit geval hebben we aan de variabele $titel de string-waarde "ons tweede script" toegekend. Bij het uitvoeren van de printfunctie wordt de variabele $titel dan vervangen door de eigenlijke inhoud er van.

Variabelen beginnen in PHP altijd met een dollarteken ($), het eerstvolgende teken van de variabele moet een letter of een underscore (_) zijn, geen cijfer. Voor de volgende tekens kun je cijfers, letters en underscores gebruiken. Verder moet je er rekening mee houden dat variabelen hoofdlettergevoelig zijn, zo is $titel niet gelijk aan $Titel of aan $TITEL, maar zijn dit drie verschillende variabelen. Een aantal geldige variabelen:

• $naam • $vNaam • $WeerTeGevenTekst • $cijfer1 • $Cijfer2 • $_andere • $kinJL123

10 | P a g i n a

Page 21: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Sommige variabelen zijn duidelijker dan andere. Het is aan te raden om altijd voor duidelijke namen te kiezen.De mogelijke gebruikte karakters zijn dus:

• cijfers (behalve als eerste karakter) • letters • elk ASCII-karakter gaande van 127 tot 255 (zie hiervoor ASCII-tabellen)

Aan variabelen kunnen verschillende types toegekend worden. In dit voorbeeld is gebruik gemaakt van strings (opeenvolging van 1 of meerdere willekeurige karakters), maar we kunnen ook integers (gehele getallen), floats (kommagetallen), booleaanse waarden (true of false) of arrays (verzameling) gebruiken (http://be.php.net/manual/en/language.types.php). In PHP is een variabele niet gebonden aan 1 type zoals in de meeste andere programmeertalen, maar kan deze variabele de ene keer een string en de volgende keer een integer bevatten:

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml">3 <head>4 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />5 <title>Variabelen</title>6 </head>7 <body>8 <p><?php 9 $variabele = "Dit is een string of tekenreeks<br />";10 print $variabele; //geeft weer: Dit is een string of tekenreeks11 $variabele = 4;12 print $variabele; //geeft weer: 413 ?></p>14 </body>15 </html>

Als we floats willen gebruiken in PHP, moet je er rekening mee houden, dat je als scheiding tussen de eenheden en de decimalen gebruik moet maken van een punt en niet van een komma, zoals wij gewend zijn.

Elke opdracht uit ons script wordt ook een expressie genoemd. Elke expressie wordt afgesloten met een punt-komma. Deze expressies kunnen zowel het uitvoeren van functies, toekenningen, bewerkingen als een combinatie van beide zijn.

Termen

Hier volgt een kort overzicht van de verschillende termen die we in deze cursus (en bij PHP en andere programmeertalen in het algemeen) zullen gebruiken. Hier worden ze heel kort behandeld, later komen ze uitgebreider aan bod:

• Types: een gegeven is altijd van een bepaald type. De voornaamste types zijn string, integer, float, boolean of array. Het is ook mogelijk om een bepaald gegeven te dwingen een ander type aan te nemen.

• Variabele: een stukje geheugen waar een naam aan toegekend wordt, en waar een gegeven kan in bewaard worden. Een variabele begint altijd met een dollarteken ($) gevolgd door de naam van de variabele.

• Constante: een stukje geheugen die, eenmaal geïnitialiseerd, NIET meer van waarde kan veranderen. Een constante kan van hetzelfde type zijn als een variabele.

• Expressie: alles wat je schrijft in PHP is een expressie. Daarmee wordt er bedoelt dat er iets uitgevoerd wordt. Commentaar is dus GEEN expressie. Voorbeeld: $b = 5;

• Operatoren: een operator zorgt er voor dat je bewerkingen kunt uitvoeren met gegevens, je kan ze optellen, samenvoegen, toekennen, vermenigvuldigen, ...

• Controlestructuren: om een andere uitvoer van je script te krijgen, kun je gebruik maken van controle structuren. Deze zorgen ervoor dat er iets uitgevoerd wordt, als er

11 | P a g i n a

Page 22: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

aan bepaalde voorwaarden voldaan wordt, of net niet. Een andere soort, zijn structuren die ervoor zorgen dat een aantal expressies een aantal keer uitgevoerd kan worden. De bekendste structuren zijn: if/else, while, do...while, for, ...

• Functie: een miniprogramma dat één of meerdere bewerkingen op gegevens kan uitvoeren. Geeft altijd een waarde terug aan het hoofdscript, waar we niet noodzakelijk iets mee moeten doen. Er zijn duizenden voorgedefinieerde functies, maar je kunt ze ook zelf maken.

Deze termen zullen allen uitgebreider aan bod komen doorheen de cursus.

Oefeningen

Vraag en antwoord

1. Welke extentie moet een script hebben om juist door de PHP-parser herkend te worden: 2. Wat heb je nodig om je eigen scripts te testen: 3. Waarom is MS Word niet geschikt als editor om scripts te maken? 4. Op welke plaatsen in je PHP-script kun je PHP-code plaatsen?

Juist of fout en verklaar?

1. Kladblok is een betere PHP-editor dan Dreamweaver: 2. Ik kan mijn PHP-scripts (locatie in het bestandssysteem) zetten waar ik wil: 3. De PHP-code wordt rechtstreeks door de webserver gelezen en omgezet:

Haal de foute variabelen er uit:

En vertel er bij wat er fout is.

• $variabele1 • $variabele 2 • $1234 • $____ • $abcd • $**ab • $AbCdEf • $voorNaam • $Familie_naam • $geboorte-datum • $fout.code • $dit is juist

Maak een script

Maak een script waarin je volgende gegevens opslaat in een variabele en deze daarna op de pagina worden weergegeven:

• voornaam

• naam

• straat

• huisnummer

• postcode

• gemeente

• email

• cursus

12 | P a g i n a

Page 23: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

PHP OperatorenAlgemeen

Operatoren worden gebruikt om bepaalde zaken uit te voeren. De meest gekende – en gebruikte – zullen deze zijn om getallen op te tellen, om strings aan elkaar te plakken, ...Andere operatoren worden gebruikt om gegevens met elkaar te vergelijken, foutmeldingen uit te schakelen, enz.Er zijn operatoren om te werken met verschillende types van gegevens.De ene operator heeft ook voorang op de andere.

Voorbeelden

Gemiddelde berekenen van 2 getallen

Om het gemiddelde van 2 getallen te berekenen maken we gebruik van eenvoudige basiswiskunde:

• Tel de 2 getallen op en deel het resultaat door 2,

In PHP maken we er het onderstaande van:

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml">3 <head>4 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />5 <title>Operatoren</title>6 </head>7 <body>8 <p><?php9 $som = 2 + 10;10 $gemiddelde = $som / 2;11 print "Het gemiddelde is ";12 print $gemiddelde;13 ?></p>14 </body>15 </html>

Wat is er gebeurd? We tellen de getallen 2 en 10 bij elkaar op (+), en kennen dit toe (=) aan $som. $som delen we (/) door 2 en kennen het resultaat toe (=) aan $gemiddelde. Uiteindelijk drukken we dit gemiddelde af.

In dit voorbeeld maken we gebruik van wiskundige operatoren en toekenningsoperatoren.

In de praktijk zullen de getallen 2 en 10 ook aan een variabele toegekend worden.

2 stukken tekst aan elkaar kleven

Stel dat we 2 stukjes tekst hebben. Deze tekst willen we toekennen aan 1 variabele. Dit kunnen we als volgt oplossen:

14 <p><?php15 $groet = "Een goede morgen";16 $wens = " toegewenst.";17 $zin = $groet . $wens;18 print $zin;19 ?></p>

13 | P a g i n a

Page 24: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

We maken naast de toekenningsoperator (=) gebruik van een string-operator: de concatenatie, met het punt (.)

De restbepaling van een rekeningnummer

Als we een rekeningnummer hebben, zijn de laatste 2 cijfers altijd een controlenummer. Dit controlenummer is altijd de rest van de deling van de eerste 10 cijfers van het rekeningnummer door 97.

Ter verduidelijking:

• Rekeningnummer: 159 6357412 88 • Laatste 2 cijfers: 88 • Deling van eerste 10 cijfers door 97• Enkel het gehele getal: 16457292 • De vermenigvuldiging van het gehele getal met 97 • Het verschil tussen dit getal en de eerste 10 cijfers van het rekeningnummer

Een eenvoudiger manier om dit te berekenen is de restdeling of modulus:

20 <p><?php21 $rekeningnr = 1596357412;22 $controle_cijfer = $rekeningnr % 97;23 print "Het controlecijfer is " . $controle_cijfer;24 ?></p>

Met de modulus-operator bekomen we het restgedeelte van de deling van 2 getallen.

Binaire wiskunde

Je moet de logische AND-vergelijking maken tussen 2 binaire getallen. Dit kunnen we oplossen met:

25 <p><?php26 $bin1 = "00111100";27 $bin2 = "11110000";28 $bin_and = $bin1 & $bin2;29 $bin_or = $bin1 | $bin2;30 print "Het resultaat van de AND bewerking: " . $bin_and . ", en de

OR bewerking: " . $bin_or;31 ?></p>

De binaire and-operator (&) en or-operator (|) maken standaard deel uit van de mogelijke operatoren.

Soorten operatoren

Toekenningsoperator

Dit is de meest voorkomende operator die gebruikt worden om een bepaalde waarde toe te kennen aan een variabele:

32 <p><?php33 $a = 3;34 $b = $a + 4;35 $c = $c + 1;36 $eersteStuk = "De variabelen ";37 $tweedeStuk = "a, b en c bevatten ";38 // de punt-operator voegt stukken tekst samen39 $tekst = $eersteStuk . $tweedeStuk;40 print $tekst . $a . ", " . $b . " en " . $c;41 ?></p>

14 | P a g i n a

Page 25: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

De toekenningsoperator kan ook gebruikt worden in combinatie met andere wiskundige of string-operatoren. Zie verder.

Stringoperatoren

Er bestaat hier maar 1 van, nml de "." die 2 strings samenvoegt:

42 <p><?php43 $a = "Hallo ";44 $b = "iedereen.";45 $c = $a . $b; //$c bevat "Hallo iedereen"46 print $c;47 ?></p>

Rekenkundige operatoren

Standaard operatoren

Dit zijn de meest eenvoudige operatoren. Ze worden gebruikt zoals in de gewone basiswiskunde:

Naam Resultaat

-$a Negatie Tegengestelde van $a

$a + $b Optelling Som van $a en $b

$a - $b Verschil Verschil tussen $a en $b

$a * $b Vermenigvuldiging Vermenigvuldiging van $a en $b

$a / $b Deling Deling van $a en $b

$a % $b Modulus Rest van deling van $a en $b Voorbeelden:

48 <p><?php49 $var1 = 1;50 $var2 = 2;51 $som = $var1 + $var2; //$som bevat de waarde 352 $quotient = 9 / $var2; //$quotient bevat de waarde 4.553 $negatie = -$var1; //$negatie bevat de waarde -154 print "De som is " . $som . ", het quotiënt is " . $quotient . " en

de negatie is " . $negatie; 55 ?></p>

Hou er rekening mee dat het delen van 2 getallen, zelfs van 2 integers, als resultaat een float geeft.

Naast de standaard rekenkundige operatoren zijn er ook nog een aantal wiskundige functies die gebuikt kunnen worden.

Optel- en aftrekoperatoren

Dit is een uitbreiding van de gewone rekenkundige operatoren. Ze zijn er om het optellen en aftrekken eenvoudiger te maken:

Naam Resultaat

++$a Pre-increment Tel 1 op bij $a, en geeft $a daarna weer

$a++ Post-increment Geeft $a weer, en telt er daarna 1 bij op

--$a Pre-decrement Trekt 1 af van $a, en geeft dan $a weer

$a-- Post-decrement Geeft $a weer, en trekt er daarna 1 van af Een aantal voorbeelden:

56 <p><?php

15 | P a g i n a

Page 26: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

57 $a = 5;58 print "Eerst weergeven: " . $a++ . ", daarna 1 bijtellen: "; //geeft

5 weer, er wordt 1 bij $a opgeteld59 print $a; //geeft 6 weer60 print " en 1 bijtellen en weergeven: " . ++$a; //telt 1 op bij $a,

geeft daarna 7 weer61 ?></p>

Binaire wiskunde

Deze heb je minder nodig, maar soms is het nodig om met binaire getallen te werken. Let wel op dat deze niet gelijk zijn aan logische operatoren:

Naam Resultaat

$a & $b And Bits die in zowel $a als in $b op “1” staan worden “1”

$a | $b Or Bits die in $a en / of in $b op “1” staan worden “1”

$a ^ $b Xor Bits die in $a óf in $b op “1” staan worden “1”, niet als ze beide op “1” staan

~ $a Not Bits worden geïnverteerd

$a << $b Shift left

Schuift de bits van $a het aantal stappen dat door $b wordt aangegeven, op naar links – elke stap betekend vermenigvuldigen met 2

$a >> $b

Shift right

Schuift de bits van $a het aantal stappen dat door $b wordt aangegeven, op naar rechts – elke stap betekend delen door 2

Hierbij kan volgend eenvoudig tabelletje helpen:

$a operator $b $resultaat

0 & 0 0

0 & 1 0

1 & 0 0

1 & 1 1

0 | 0 0

0 | 1 1

1 | 0 1

1 | 1 1

0 ^ 0 0

0 ^ 1 1

1 ^ 0 1

1 ^ 1 0

0 ~ 1

1 ~ 0Een aantal voorbeelden:

62 <p><?php63 $a = "1001";64 $b = "1010";65 print "And bewerking: ";66 print $a & $b; //drukt af: 100067 print "<br />Or bewerking: ";68 print $a | $b; //drukt af: 101169 ?></p>

16 | P a g i n a

Page 27: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Gecombineerde operatoren

We kunnen ook gecombineerde operatoren gebruiken, dit zijn operatoren die een toekenning uitvoeren, en tegelijkertijd een wiskundige of stringoperator toepassen:

70 <p><?php71 $a = 3;72 $a += 4; //bijtellen73 $tekst = "Bewerking ";74 $tweedeStuk = "tijdens toekenning: ";75 $tekst .= $tweedeStuk; //toevoegen76 $tekst .= $a;77 print $tekst;78 ?></p>

Bovenstaande zal er voor zorgen dat:

• de waarde 3 toegekend wordt aan de variabele $a • dat de variabele $a zal verhoogd worden met 4 (+=) • de strings "Bewerking " en "tijdens toekenning: " zullen toegekend worden aan

respectievelijk $tekst en $tweedeStuk. Hierna wordt de variabele $tweedeStuk bij de variabele $tekst gevoegd, zodat $tekst de string "Bewerking tijdens toekenning: " bevat.

Vergelijkingsoperatoren

Deze operatoren, niet te verwarren met toewijzingsoperatoren, hebben we voornamelijk nodig als we verschillende gegevens met elkaar willen vergelijken. Denk hierbij aan het evalueren van gegevens binnen een if-structuur:

Operator Naam Resultaat

$a == $b Equal Waar als $a gelijk is aan $b

$a === $b Identical Waar als $a gelijk is aan $b én van het zelfde type

$a != $b Not equal Waar als $a niet gelijk is aan $b

$a <> $b Not equal Waar als $a niet gelijk is aan $b

$a !== $b Not identical Waar als $a niet gelijk is aan $b of ze zijn van een verschillend type

$a < $b Less than Waar als $a kleiner is dan $b

$a > $b Greater than Waar als $a groter is dan $b

$a <= $b Less than or equal to

Waar als $a kleiner of gelijk is aan $b

$a >= $b Greater than or equal to

Waar als $a groter of gelijk is aan $b

Voorbeeldjes:

79 <p><?php80 $integer = 2;81 $float = 2.0;82 if ($integer == $float) print "integer is gelijk aan float";83 if ($integer === $float) print "integer is gelijk aan float en van

hetzelfde type";84 ?></p>

Logische operatoren

Deze logische operatoren gebruiken we voornamelijk bij het evalueren van 2 statements bij bijvoorbeeld een if-structuur.

17 | P a g i n a

Page 28: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Operator Naam Resultaat

$a and $b And Waar als $a en $b waar zijn

$a or $b Or Waar als $a of $b waar zijn

$a xor $b Xor Waar als $a of $b waar zijn, maar niet beide

! $a Not Waar als $a niet waar is

$a && $b And Waar als $a en $b waar zijn

$a || $b Or Waar als $a of $b waar zijn Er worden voor "and" en "or" verschillende operatoren gebruikt, dit heeft te maken met de voorrang ervan, zie verder.

Voorbeeld:

85 <p><?php86 $a = 3;87 $b = "vier";88 if ($a and $b){89 print "3 and vier is waar<br />";90 }91 $b = FALSE;92 if ($a or $b){93 print "3 or FALSE is waar<br />";94 }95 if ($a and $b){96 print "3 and FALSE is waar<br />";97 }98 $a = "3";99 $b = "0";100 if (($a >= 0) AND ($b != 0)){101 print "Het quotiënt is " . ($a / $b); 102 }103 ?></p>

Foutcontrole-operatoren

PHP kent maar 1 dergelijke operator: @

Als deze operator voorafgaat aan een expressie, worden eventuele foutmeldingen onderdrukt, en gaat het programma verder met uitvoeren.

Voorbeeldje:

/* BEDOELDE FOUT */

$my_file = @file ('niet_bestaand_bestand') or die ("er is een fout opgetreden”);

Indien voorgaande code niet zou voorafgegaan worden door de @, zou je telkens een standaardfoutmelding krijgen. De gewone foutmelding wordt altijd opgeslagen in de variabele $php_errormsg.

Array-operatoren

Operator Naam Resultaat

$a + $b Union Vereniging van $a en $b.

$a == $b Equality Waar als $a en $b dezelfde elementen bevatten

$a === $b Identity Waar als $a en $b dezelfde elementen bevatten, in dezelfde volgorde

$a != $b Inequality Waar als $a niet gelijk is aan $b

$a <> $b Inequality Waar als $a niet gelijk is aan $b

$a !== $b Non-identity Waar als $a niet identiek is aan $b

18 | P a g i n a

Page 29: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Met de +-operator worden de elementen van de rechtse array toegevoegd aan die van de linkse, waarbij dubbele indexes NIET overschreven worden.

Voorrang van operatoren

Niet alle operatoren hebben dezelfde voorrang zo is bijvoorbeeld 2 + 3 * 4 = 14, en niet gelijk aan 20.

We kunnen de voorrang wijzigen door gebruik te maken van haakjes: (2 + 3) * 4 = 20.

Volgende tabel geeft de voorrang weer van de operatoren, waarbij de bovenste voorrang hebben op degene er onder:

Associativiteit Operator

non-associative new

rechts [

non-associative ++ --

non-associative ! ~ - (int) (float) (string) (array) (object) @

links * / %

links + - .

links << >>

non-associative < <= > >=

non-associative == != === !

links &

links ^

links |

links &&

links ||

links ? :

rechts = += -= *= /= .= %= &= |= ^= <<= >>

links and

links xor

links or

links , Associativiteit betekend de manier waarop de gegevens geëvalueerd worden.

Linkse associativiteit wil zeggen dat de gegevens van links naar rechts bekeken worden.

Oefeningen

Script

Bepaal de waarde van $x, uit het hoofd. Neem daarna de scripts over en kijk wat de uitkomst is:

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml">3 <head>4 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />5 <title>Hoofdrekenen</title>6 </head>7 <body>8 <h1>Hoofdrekenen</h1>9 <?php

19 | P a g i n a

Page 30: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

10 $a = 5;11 $b = 6;12 print $x = $a + $b; // $x = ....13 print "<br />";14 print $x = $a * 2; // $x = ....15 print "<br />";16 print $x = $a++; // $x = ....17 print "<br />";18 $a = 5;19 print $x = ++$a; // $x = ....20 print "<br />";21 $a = 5;22 print $x = 2 * $b + $a; // $x = ....23 print "<br />";24 print $x = 2 * ($b + $a); // $x = ....25 print "<br />";26 print $x = $b / $a; // $x = ....27 print "<br />";28 print $x = $b % $a; // $x = ....29 print "<br />";30 print $x = $a + $b % 4 * 3; // $x = ....31 print "<br />";32 $kreet1 = "Hiep ";33 $kreet2 = "Hoera";34 print $kreet = $kreet1 . $kreet1; // $kreet = ....35 print "<br />";36 print $kreet .= $kreet2; // $kreet = ....37 ?>38 </body>39 </html>

PHP VariabelenAlgemeen

Zoals eerder aangehaald, worden variabelen beschouwd als een naam die gebruikt wordt om tijdelijk gegevens in op te slaan. In feite wordt er in het werkgeheugen van de server een stukje geheugen gereserveerd waar je een waarde in kan plaatsen. Dit werkgeheugen wordt dan aangeduid door de variabele.

In tegenstelling tot de meeste andere programmeertalen, moet je bij PHP de variabelen niet op voorhand declareren vóór je ze kunt gebruiken én kunnen ze binnen 1 script verschillende types bevatten.

Naast variabelen kun je ook gebruik maken van constanten, die een vaste waarde blijven behouden in je script.

Voorbeelden

Wijzigingen inhoud

Als we werken met gegevens, dan zullen deze altijd verschillend zijn van situatie tot situatie. Willen we bijvoorbeeld berekenen wat het netto-jaarloon is van de bezoeker, dan vragen we hem naar zijn maand-loon, en vermenigvuldigen we dit met 12. Aangezien het loon van elke bezoeker verschillend zal zijn zullen ook de gegevens waarmee we werken altijd verschillend zijn.

20 | P a g i n a

Page 31: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml">3 <head>4 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />5 <title>Variabelen</title>6 </head>7 <body>8 <p>Het jaarloon bedraagt 9 <?php10 $maandloon = 1234;11 $jaarloon = $maandloon * 12;12 print $jaarloon;13 ?></p>14 </body>15 </html>

Wat er wel vast ligt, dat is het aantal maanden. Dit veranderd niet in ons script, maar stel dat het er toch ooit van komt, dan kan het handig zijn om dit snel aan te passen. Het aantal maanden kunnen we dan vast definiëren in een constante.

Gegevens die niet veranderen

Willen we bijvoorbeeld een euro-calculator maken, om van Euro om te rekenen naar de oude geliefde Belgische Frank, dan blijft de wisselkoers van de Euro tegenover de BF vast. Tenzij dit op een bepaalde dag zou veranderen:

14 <p>In Belgische frank 15 <?php16 define ("EURO", "40.3399");17 $in_bf = $jaarloon * EURO;18 print $in_bf;19 ?></p>

Controle correcte gegevens

Vooraleer we dit loon willen weergeven, zullen we eerst een test doen. Het resultaat van de test bepaalt hoe we het loon weergeven:

20 <p>Afgerond jaarloon in Belgische frank 21 <?php22 if (is_float($in_bf)) {23 print (int)$in_bf;24 } else {25 print $in_bf;26 }27 ?></p>

Naamgeving

Namen van variabelen beginnen ALTIJD met een dollarteken ($), gevolgd door 1 van volgende karakters:

• letters; • karakters met een ASCII-waarde tussen de 128 en de 255 (die meestal speciale

karakters zijn zoals é, ô, ñ, µ, ...), deze reeks wordt echter (bijna) nooit gebruikt; • underscores.

Als derde karakter en volgende mag je 1 van volgende gebruiken:

21 | P a g i n a

Page 32: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

• letters; • karakters met een ASCII-waarde tussen de 127 en de 255; • underscores; • cijfers.

Hou er dus rekening mee dat cijfers nooit net na het dollarteken mogen komen. Ook punten, koppeltekens en spaties zijn niet toegestaan, op geen enkele plaats.

Maak vooral gebruik van duidelijke namen, met een betekenis. Een variabele als $_inmö98 mag dan wel ge(we)ldig zijn, duidelijk is ze zeker niet. Maak daarom bijvoorbeeld gebruik van onderstaande voorbeelden:

$prijs

$PrijsMetBTW

$prijsMetBtw

$prijs_zonder_btw

Voor namen die bestaan uit meerdere woorden, wordt de voorkeur gegeven aan het derde voorbeeld, waarbij de eerste letter een kleine letter is en vervolgens de eerste letter van elk woord een hoofdletter.

Hou er ook rekening mee dat hoofdletters en kleine letters wel degelijk een verschil maken in PHP. Zo is er een verschil tussen $VOORNAAM, $voornaam en $VoorNaam!

Gebruik van dubbele en enkele aanhalingstekens

Bij het gebruik van de print- en echo-functies, moeten we rekening houden met het verschill tussen dubbele en enkele aanhalingstekens:

28 <p><?php29 $lidwoord = 'Een';30 $begroeting = "goede middag";31 print "$lidwoord $begroeting"; //drukt af: Een goede middag32 print ' ($lidwoord $begroeting).'; //drukt af: ($lidwoord

$begroeting).33 ?></p>

Bij het gebruik van echo heb je hetzelfde.

Bij het gebruik van dubbele aanhalingstekens, wordt de inhoud van de variabele weergegeven, bij het gebruik van enkele aanhalingstekens, wordt de naam van de variabele weergegeven. De inhoud tussen de enkele aanhalingstekens wordt dus niet geparsed.

Voor de rest is het gelijk welke soort we gebruiken, als je er maar voor zorgt dat je je toekenning afsluit met hetzelfde soort, als degene waarmee je begonnen bent.

Soms lijkt het eenvoudiger om over te springen tussen de 2. Als je bijvoorbeeld dubbele aanhalingstekens wilt gebruiken in je string, dan kun je de string beginnen en afsluiten met enkele aanhalingstekens:

Dit kan bijvoorbeeld handig zijn om parameters op te geven voor HTML-code:

34 <?php print '<p>En toen zei hij: "De kat bijt, maar de hond blaft."</p>'; ?>

Wat als je nu binnen in je string beide wilt gebruiken? Dan zullen we gebruik moeten maken van escapetekens:

35 <?php print "<p>En toen zei hij: \"De kat bijt, maar de hond blaft.\"</p>"; ?>

Zo kunnen we onbeperkt gebruik maken van enkele en dubbele aanhalingstekens.

22 | P a g i n a

Page 33: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Deze manier wordt ook meer gebruikt dan het mixen van enkele en dubbele tekens. Voornamelijk omdat je code veel consistenter blijft.

Concatenatie

In het volgende hoofdstuk zullen we ook de concatenatie-operator zien. Dit is gewoon het aan elkaar kleven van 2 verschillende strings. We kunnen dit ook gebruiken om een letterlijke string tussen enkele aanhalingstekens en een variabele aan elkaar te kleven. Dit doen we door middel van de punt-operator (.). Een voorbeeldje:

36 <p><?php print 'Wij wensen u ' . $begroeting;?></p>

Meer escapen

Naast het escapeteken voor de dubbele aanhalingsteken bestaan er nog een aantal:

Te bereiken teken Gebruikte escapecode

" \"

' \'

\ \\

Tabulator \t

Nieuwe regel \n

Carriage return \r Hou er wel rekening mee dat deze karakters weergegeven worden in de HTML-code maar dat bij het verwerken van de HTML-code door de browser, er met deze geen rekening gehouden wordt. Deze worden wel vaak gebruikt om de broncode duidelijker te houden:

37 <p><?php38 print "Bekijk deze tekst in de broncode.<br />";39 print "Deze regel staat in de broncode ..........................<br

/>\n";40 print "En deze regel staat in de broncode .......................";41 ?></p>

Nieuwe regels

In PHP kun je ook nieuwe regels opnemen in je variabele.

42 <p><?php43 $bon = "Tegen inlevering van deze bon krijgt u44 5.- korting op het gehele assortiment!";45 print $bon;46 ?></p>

Heredoc

Om langere stukken tekst toe te kennen aan een variabele, kunnen we ook de heredoc-syntax gebruiken. Om een heredoc te gebruiken, beginnen we de string met <<<, gevolgd door een unieke code, die zelf gekozen wordt. De heredoc wordt afgesloten door exact dezelfde unieke code te herhalen, maar moet beginnen op de eerste kolom van de regel. De afsluitcode mag enkel bestaan uit letters, cijfers en underscores. De heredoc-syntax gedraagt zich net als de dubbele aanhalingstekens, maar als je dubbele aanhalingstekens gebruikt, binnen de toekenning, moeten deze NIET ge-escaped worden:

47 <p><?php48 $tekst = <<<EOD49 Bekijk de volgende tekst in de "broncode".<br />50 $bon

23 | P a g i n a

Page 34: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

51 EOD;52 print $tekst;53 ?></p>

Verwarrende variabelen

In sommige gevallen zul je een waarde, die in een variabele bewaard wordt, direct aan een volgend stuk tekst willen plakken.

<p><?php$breedteInMeter = 2;print "Breedte in centimeter: $breedteInMeter00"; // geeft weer: Breedte in centimeter:?></p>

Dit komt omdat de parser de variabele $breedteInMeter00 niet kent, en er dus gewoon een lege string plaatst. Om dit probleem op te lossen kunnen we de variabele tussen accolades plaatsen:

54 <p><?php55 $breedteInMeter = 2;56 print "Breedte in centimeter: {$breedteInMeter}00"; // geeft weer:

Breedte in centimeter: 20057 ?></p>

De parser weet zo precies waar de variabele begint en eindigt. Bij onduidelijke variabelen moet je deze altijd tussen accolades plaatsen.

Als je de accolades wilt weergeven zul je deze moeten escapen (enkel de eerste vervangen door \{). Bij het gebruik van accolades zonder variabelen, moet je deze niet escapen.

Als je een afkeer hebt van accolades kun je het ook oplossen als volgt:

print "Breedte in centimeter: " . $breedteInMeter . "00";

Toch verdient het gebruik van accolades de voorkeur, omdat dit, weeral, leesbaarder blijft.

Verschillende types

Een variabele kan één van volgende types zijn:

• Boolean • Integer • Float of double • String • Array• Object • Resource • NULL

Voorbeelden

Code Waarde van de variabele

$var_int = 6; Het gehele getal 6

$var_float = 10.5; Het kommagetal 10,5

$var_float_2 = 1.5e3; Het getal 1500

$var_string = "dit is een string"; Een tekst met de opgegeven waarde

$var_array = array (1,2,3,4); Een verzameling met de elementen 1,2,3,4

$var_null = null; Een lege variabele

$var_bool = true; Een geldige waarde

24 | P a g i n a

Page 35: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Boolean

Een boolean kan slechts 2 waarden aannemen: TRUE of FALSE. Bij het omzetten van een variabele naar een boolean zijn alle volgende FALSE, alle andere komen overeen met een TRUE:

• integere waarde 0 • float waarde 0.0 • lege string "" of een string met als waarde "0" • array zonder enig element • object zonder enig element • NULL

Booleans worden gebruikt voor het testen van bepaalde zaken. Deze tests worden gebruikt om na te gaan of bepaalde zaken moeten uitgevoerd worden. Een voorbeeld: als iemand nog niet ingelogd is, moet hij een aanmeldingsscherm krijgen, en als hij wel aangemeld is, moet hij begroet worden met zijn persoonlijke naam.

Integer

Dit zijn eenvoudige gehele getallen, positief of negatief. De minimum- en maximumwaarden zijn afhankelijk van het besturingssysteem en de processor van de server, maar gaan minstens van -2 miljard tot +2 miljard (-231/2 tot +231/2).

Heb je een 64-bits-cpu dan gaat dit bereik veel verder.

Je kan gebruik maken van decimale, octale en hexadecimale getallen. Om aan te duiden dat je met octale getallen werkt, laat je het getal voorafgaan door een 0 (nul) (voorbeeld: 034) en om met hex-getallen te werken laat je het getal voorafgaan door een 0x (nul-x) (voorbeeld: 0x1A).

Als je een integer opgeeft die groter of kleiner is dan de minimum- of maximumwaarden wordt deze automatisch omgezet naar een float.

Float

In PHP wordt de term float gebruikt om aan te geven dat we met een kommagetal werken, positief of negatief. Er wordt gebruik gemaakt van 64 bits om het getal in op te slaan, hierdoor krijgen we getallen gaande van -264/2 tot +264/2.

Hou er rekening mee dat floating point getallen, door de afronding, niet gebruikt mogen worden om te vergelijken. 0.7 kan opgeslagen worden als 0.7000000001, maar ook als 0.699999999999.

Vertrouw dus nooit vergelijkingen tussen floats.

Floats worden ook soms als reals of doubles aangeduid.

Strings

Een string (tekenreeks) is eenvoudigweg een reeks karakters. Strings hebben geen echte grens, en worden alleen beperkt door de instellingen van het php.ini-bestand.

Strings kunnen aan een variabele worden toegewezen door het gebruik van zowel dubbele, als enkele aanhalingstekens of door gebruik te maken van de speciale heredoc-syntax. Deze laatste wordt vaak gebruikt bij lange stukken tekst.Ook 1 enkel karakter wordt gezien als een string.

NULL

Null-types kunnen slechts 1 waarde bevatten, namelijk de waarde NULL. Deze speciale waarde betekent eigenlijk “niets” of “inhoudloos”. Ze wordt vaak gebruikt om de inhoud van een variabele te vernietigen.

25 | P a g i n a

Page 36: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Arrays

Dit is een gemengd type die gegevens van verschillende types kan bevatten. Over arrays zien we later meer.

Objecten

Objecten zijn een verzameling van gegevens (zoals array's) maar bevatten ook acties of methodes.

Resources

Dit type is bedoeld om een verwijzing naar een bestand of een database-koppeling te bevatten. We komen deze later in deze cursus nog tegen.

Omzetten van type of casting

Zelf omzetten

In sommige gevallen is het nodig om zelf het type van een variabele aan te passen naar een ander type. Dit doen we door de naam van de variabele (of een letterlijke waarde) te laten voorafgaan door het type dat we wensen:

58 <p><?php print "De integer \$werkgeheugen wordt als boolean " . (bool)$werkgeheugen; ?></p>

De mogelijkheden zijn:

• (integer) of (int)• (bool) of (boolean)• (float), (double) of (real)• (string) • (array) • (object) • (unset)

unset wordt meestal gebruikt als functie. Meer hierover later.

Automatische conversie van types

Zelf omzetten is in de meeste gevallen zelfs niet nodig. PHP zal zelf het nodige type bepalen en dit zo nodig aanpassen als dit nodig blijkt te zijn:

59 <p><?php60 print "\"100\" + 15 = " . $var = "100" + 15; //$var is een integer

(115)61 print "<br />\"100\" + 15.0 = " . $var = "100" + 15.0; //$var is een

float (115.0)62 print "<br />18 . \" meter\" = " . $var = 18 . " meter"; //$var is

een string ("18 meter")63 print "<br />18 + \" meter\" = " . $var = 18 + " meter"; //$var is

een integer (18)64 print "<br />\"7 zotten zwemmen\" + 3 = " . $var = "7 zotten

zwemmen" + 3; //$var is een integer (10)

Ook verandert het type van de variabele naar gelang de bewerkingen die er op uitgevoerd worden:

65 $var = "1"; //$var is een string66 print "<br />\"1\" + 3 = " . $var = $var + 3; //$var wordt een

integer67 print "<br />\$var / 3 = " . $var = $var / 3; //$var wordt een float

26 | P a g i n a

Page 37: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

68 ?></p>

Bij het omzetten kun je het resultaat bepalen met onderstaande tabel:

(int)$var (bool)$var (string)$var (float)$var

NULL 0 False 0

True 1 True '1' 1

False 0 False '0' 0

0 0 False '0' 0

3.8 3 True '3.8' 3.8

'0' 0 False '0' 0

10 10 True '10' 10

'18 meter' 18 True '18 meter' 18

'testbericht' 0 True 'testbericht' 0

Controleren van het type

Doordat een variabele elk type kan zijn, kan het handig zijn om te weten welk type precies. Hiervoor hebben we een aantal mogelijke functies:

boolean is_int(mixed variabele)

boolean is_float(mixed variabele)

boolean is_string(mixed variabele)

boolean is_array(mixed variabele)

Deze functie omschrijving lees je als volgt:

boolean is_array(mixed variabele)

• boolean --> het type van het resultaat dat weergegeven wordt door de functie• is_array --> de naam van de functie• mixed variabele --> het type de parameter(s) die aan de functie doorgegeven worden

Deze functies leveren een TRUE op, als de aangeleverde variabele van het aangegeven type is, respectievelijk integer, float, string en array. Deze TRUE kan gebruikt worden om een test uit te voeren:

69 <p><?php70 $var = 10;71 if (is_float($var)) { // $var is een int, er wordt dus niets

weergegeven72 print "De variabele \$var is een float.";73 }74 ?></p>

var_dump() is een functie die rechtstreeks het type afdrukt, gettype() levert een string op, en moeten we laten weergeven met de print-functie:

75 <p><?php76 $welkom = "Hallo allemaal";77 var_dump($welkom); //drukt af: string(14) "Hallo allemaal"78 print gettype($welkom); //drukt af: string79 ?></p>

Om in een script te testen van welk type een variabele is, moet je gebruik maken van de is_*()-functies en niet van de gettype()-functie omdat de gettype()-functie soms onverwachte resultaten kan opleveren. Zo leveren sommige PHP-versies de naam float voor een kommagetal, terwijl andere real gebruiken.

27 | P a g i n a

Page 38: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Gelijkheid

Voor het toekennen van een waarde aan een variabele hebben we het gelijkheidssteken gebruikt. Stel dat we 2 variabelen willen vergelijken:

<?php print "<p>";$var1 = 3;$var2 = 4;if ($var1 = $var2){ print "\$var1 en \$var2 zijn gelijk.<br />";} ?>

Dit zal niet het verwachte resultaat opleveren, want in de vergelijking, wordt aan $var1, de waarde van $var2 toegekend, waardoor tussen de haakjes gewoon een toekenning komt te staan, en deze levert altijd de waarde TRUE op. Op het scherm zullen we dus verkrijgen dat "$var1 en $var2 zijn gelijk.".

Om een vergelijking uit te voeren moeten we hiervoor een ander symbool gebruiken: de dubbele gelijkheidstekens (==).

80 <?php print "<p>";81 $var1 = 3;82 $var2 = 4;83 if ($var1 == $var2){84 print "3 en 4 zijn gelijk.<br />";85 } ?>

Deze melding zal niet afgedrukt worden, omdat we gebruik maken van de juiste vergelijkingsoperatoren.

Op een gelijkaardige manier kunnen we ook de ongelijkheid testen:

86 <?php $var1 = 3;87 $var2 = 4;88 if ($var1 != $var2){89 print "3 en 4 zijn niet gelijk.<br />";90 } ?>

We kunnen bijvoorbeeld ook het volgende testen:

91 <?php $var1 = "10";92 $var2 = 10;93 if ($var1 == $var2){94 print "\"10\" en 10 zijn gelijk.<br />";95 } ?>

Deze vergelijking zal waar zijn, maar toch zijn $var1 en $var2 niet helemaal gelijk. De eerste is namelijk een string, de tweede een integer. Om ook de types te controleren gebruiken we driedubbele gelijkheidstekens (===).

96 <?php97 if ($var1 === $var2){98 print "\"10\" en 10 zijn identiek.<br />";99 }100 if ($var1 !== $var2){101 print "\"10\" en 10 zijn niet identiek.<br />";102 } ?></p>

Deze zal dus op ons scherm ""10" en 10 zijn niet identiek." afdrukken.

Testen van variabelen

Soms kan het nuttig zijn, om te controleren of een bepaalde variabele al bestaat of niet, of als er al een waarde is aan toegekend. Dit doen we met:

28 | P a g i n a

Page 39: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

boolean isset(mixed var);

boolean empty(mixed var);

Met isset() controleren we of een variabelen al aangemaakt is of niet, en levert een TRUE op als deze bestaat. empty() controleert of de waarde gelijk is aan 0, FALSE, NULL of een lege string en levert een TRUE op als dit zo is.

Voorbeeld:

103 <p><?php104 $var = NULL;105 if (isset($var)){106 print "NULL bestaat.<br />"; //drukt niets af107 }108 $var = 0;109 if (isset($var)) {110 print "0 bestaat.<br />"; //drukt wel af111 }112 if (empty($var)) {113 print "0 is leeg.<br />"; //drukt wel af114 }115 $var = "test";116 if (isset($var)) {117 print "test bestaat.<br />"; //drukt wel af118 }119 if (empty($var)) {120 print "test is leeg.<br />"; //drukt niet af121 }122 ?></p>

Een variabele wordt altijd vernietigd op het einde van elk script, maar soms kan het nuttig, aangenaam, veilig, leuk zijn om deze toch manueel te vernietigen met:

unset (mixed var)

Voorbeelden:

123 <p><?php124 $fout = true;125 if (isset($fout)) {126 print "Voor het uitvoeren van unset.<br />"; //drukt af127 }128 unset($fout);129 if (isset($fout)) {130 print "Na het uitvoeren van unset.<br />"; //drukt niets af131 }132 $var = 10;133 if ($var > 12) {134 $fout = true;135 }136 if (isset($fout)) {137 print "De variabele is groter dan 12!";138 }139 ?></p>

Constanten

Deze zijn heel goed te vergelijken met variabelen, maar met dit verschil dat de inhoud ervan niet kan gewijzigd worden gedurende de uitvoering van het script. Ook de toewijzing is iets anders, we gebruiken hiervoor namelijk het kernwoord define:

29 | P a g i n a

Page 40: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

140 <p><?php141 define ("GEBRUIKERSNAAM", "Tim Brouckaert");142 print GEBRUIKERSNAAM;143 ?></p>

Ook moeten we deze niet laten voorafgaan door het dollarteken en meestal gebruikt men hoofdletters voor constanten, hoewel dit niet verplicht is. Naast eigen constanten zijn er ook een aantal voorgedefinieerde constanten zoals PHP_VERSION en PHP_OS.

Een overzicht van de voorgedefinieerde constanten vindt je op http://php.net/manual/en/language.constants.predefined.php.

Oefeningen

Haal de fouten er uit

$var 2 = 13;

print "Dit is een variabele: $var 2' //drukt iets af;

if "$var 2 = 12"

print "de variabele $var 2 is gelijk aan 12"

Het project van deze cursus: Webshop

Voor de gegevens in de pagina's zullen we variabelen gebruiken. Hierdoor wordt het onderhoud van de pagina's een stuk eenvoudiger. Je moet niet telkens in de code gaan opzoeken waar het item zich bevindt.

Een volgend voordeel is dat we onze code veel eenvoudiger kunnen maken. Én dat we ook flexibeler kunnen werken met de bron van onze gegevens én het aantal gegevens.

Maak in Dreamweaver in uw oefensite een map aan voor de Webshop (vb: webshop).

Maak de PHP pagina met de naam index.php met de volgende inhoud aan:

1 <?php2 $item1 = "Dreamweaver Deel 1";3 $item2 = "Dreamweaver Deel 2";4 $item3 = "JavaScript";5 $item4 = "PHP";6 $item5 = "Dreamweaver Eindwerk";7 ?>8 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">9 <html xmlns="http://www.w3.org/1999/xhtml">10 <head>11 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />12 <title>SNT Webshop Informatica</title>13 </head>14 <body>15 <h1>SNT Webshop informatica</h1>16 <table border="0">17 <tr>18 <th>Cursus</th>19 <th>Inschrijven</th>20 </tr>21 <tr>

30 | P a g i n a

Page 41: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

22 <td><?php print $item1; ?></td>23 <td><a href="mailto:[email protected]?subject=Inschrijving <?php print

$item1; ?>">Inschrijven</a></td>24 </tr>25 <tr>26 <td><?php print $item2; ?></td>27 <td><a href="mailto:[email protected]?subject=Inschrijving <?php print

$item2; ?>">Inschrijven</a></td>28 </tr>29 <tr>30 <td><?php print $item3; ?></td>31 <td><a href="mailto:[email protected]?subject=Inschrijving <?php print

$item3; ?>">Inschrijven</a></td>32 </tr>33 <tr>34 <td><?php print $item4; ?></td>35 <td><a href="mailto:[email protected]?subject=Inschrijving <?php print

$item4; ?>">Inschrijven</a></td>36 </tr>37 <tr>38 <td><?php print $item5; ?></td>39 <td><a href="mailto:[email protected]?subject=Inschrijving <?php print

$item5; ?>">Inschrijven</a></td>40 </tr>41 </table>42 </body>43 </html>

Je hebt nu een HTML pagina waarin er telkens naar de php-mode overgegaan wordt. Als de parser deze pagina binnenkrijgt, dan gaat hij eerst op zoek naar alle php-tags en zal hetgeen er tussen staat, uitvoeren en omvormen naar zuivere HTML.

De browser die deze pagina opvraagt, zal in de broncode enkel nog HTML code zien staan.

Ronde-tijden

Maak een programma dat uit drie ronde-tijden van bijvoorbeeld schaatsen de totale tijd en het gemiddelde uitrekent en afdrukt. Dat zou je kunnen aanpakken door als volgt te beginnen:

$ronde_1=46; $ronde_2=43; $ronde_3=52;

en dan na het maken van een sommetje het volgende af te drukken:

Totale tijd over 3 ronden is 141 secondenHet gemiddelde was 47 seconden

Ronde-tijden in een tabel

Pas het vorige script aan zodat de ronde-tijden in een tabel staan.

31 | P a g i n a

Page 42: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

De HTML broncode voor een tabel ziet er als volgt uit:

<table border="1">

<tr>

<th>Ronde</th>

<th>1</th>

<th>2</th>

<th>3</th>

</tr>

<tr>

<td>Nederland</td>

<td></td>

<td></td>

<td></td>

</tr>

</table>

Het resultaat van het script ziet er zo uit:

Types

Maak een tabel waarbij de eerste kolom de letterlijke waarde van de variabele $var bevat.In de tweede kolom bepaal je met behulp van PHP het type van $var.In de derde kolom geef je met behulp van PHP de inhoud van $var weer.

Vul aan de hand van dit script onderstaande tabel in.

$var Type Weergave

0

"15"

3.14159

Tekst

"nog meer tekst"

18 + 3.4

"3 konijnen"

5 + "3 konijnen"

"5 + 3 konijnen"

5 . "3 konijnen"

Constanten

Maak een script, waarmee je aan de hand van de voorgedefinieerde constanten, de naam van het script kan afdrukken, welke PHP-versie je gebruikt en welk OS je gebruikt.

Het resultaat:

Dit script (/srv/www/htdocs/pc01/variabelen/constanten.php) wordt uitgevoerd op PHP versie 5.3.5 onder Linux.

32 | P a g i n a

Page 43: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Don Quichot

Maak een script waarin je drie variabelen van het type string definieert. Maak gebruik van de heredoc-syntax. Deze variabelen plaats helemaal bovenaan (nog voor de start van de HTML code).

Geef de volledige tekst weer.

Neem als 1ste variabele de tekst:

Door het lezen van te veel ridderromans is de hidalgo Don Quichot zijn verstand kwijtgeraakt. Denkend dat hij zelf een ridder is, verlaat hij zijn huis en begint een dwaaltocht over de wegen en het platteland van Spanje, op zoek naar avonturen. Als doel heeft hij voor ogen het rechtzetten van alle soorten onrecht, om door deze goede daden beroemd te worden.

De 2de variabele wordt:

Op zijn trektocht wordt Don Quichot vergezeld door zijn buurman en dienaar Sancho Panza. Sancho is een kleine boer, analfabeet maar niet dom, en heeft eten en drinken als zijn belangrijkste interesses. Hoewel Sancho weet dat z'n meester niet helemaal goed bij z'n hoofd is, volgt hij hem, want zijn zwakheid voor de aardse geneugten maakt dat hij gelooft in de grote beloning die Don Quichot hem in het vooruitzicht stelt.

De 3de variabele wordt:

Dat Don Quichot behoorlijk in de war is blijkt als hij herbergen aanziet voor kastelen, windmolens voor reuzen, een hoertje voor een prinses, een kudde schapen voor een leger... Maar zijn waanideeën stuiten steevast op de nuchterheid, de voorzichtigheid, en de spreekwoorden van Sancho. Deze botsing tussen de ideale en fictieve wereld van Don Quichot en de echte en biologische wereld van Sancho is een hoofdthema van het boek, en meteen ook de bron van een groot deel van zijn humor.

Punten

Maak een tabel waarin de resultaten van leerlingen worden bijgehouden. Zowel de namen als de resultaten van de leerlingen worden in variabelen bijgehouden. Deze variabelen plaats je helemaal bovenaan (nog voor de start van de HTML code).

Bereken in de twee laatste kolommen het totaal en het behaalde percentage. Het percentage moet als integer weergegeven worden.

Het resultaat wordt:

Samengestelde woorden

Maak een script waarmee je woorden kunt samenstellen aan de hand van basiswoorden in variabelen. Het script begint met het definiëren van de variabelen. Daarna plaats je met behulp van de heredoc-syntax en de variabelen de volledige htmlcode tussen de body tags samen.

1 <?php2 $woord1 = "school";3 $woord2 = "politie";

33 | P a g i n a

Page 44: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

4 $woord3 = "oefen";5 $woord4 = "kost";6 $htmlcode = <<<EOD7 <h1>Samengestelde woorden</h1>

De rest van de code vul je zelf aan.

Het resultaat wordt:

PHP FormulierverwerkingAlgemeen

Het leuke aan PHP is dat we gebruik kunnen maken van dynamische pagina's. Dit zijn pagina's waarvan de inhoud bepaald wordt door een keuze of invoer van de gebruiker. Zo kun je een bezoeker vragen om zijn naam op te geven, waarna de bezoeker op de volgende pagina('s) wordt aangesproken met zijn eigen naam.

Om de bezoeker zijn naam te vragen hebben we nood aan een invoermethode. In webpagina’s maken we daarom gebruik van formulieren. Deze zijn ook de basis voor het verwerken van mailings, beveiligde webpagina’s, weblogs, ...

We kunnen met 2 verschillende pagina's werken: 1 met het formulier zelf er op (zuiver HTML, eventueel gemengd met PHP, die we kunnen gebruiken om foutmeldingen weer te geven) en 1 waarin er met de gegevens gewerkt wordt.

Een andere manier om gegevens te versturen, is door een parameter in de url te verwerken.

Voorbeelden

Je wilt een pagina maken, waarin er gevraagd wordt naar de naam van de gebruiker, deze naam wordt op de volgende pagina gebruikt voor een vriendelijke groet.

Het formulier formulier.html:

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml">3 <head>4 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />5 <title>POST formulier</title>6 </head>7 <body>8 <form action="verwerk.php" method="post">9 <p>Uw naam: <input name="naam" type="text" />10 <input type="submit" value="OK" /></p>11 </form>

34 | P a g i n a

Page 45: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

12 </body>13 </html>

en de pagina verwerk.php:

1 <?php $naam = $_POST['naam']; ?>2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">3 <html xmlns="http://www.w3.org/1999/xhtml">4 <head>5 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />6 <title>POST verwerken</title>7 </head>8 <body>9 <p>Hallo <?php print $naam; ?></p>10 </body>11 </html>

Je wilt een gebruiker op een link laten klikken waarmee de achtergrondkleur van zijn pagina bepaald wordt:

De pagina kleur.php:

1 <?php 2 $kleur = "ffffff"; // standaard achtergrondkleur3 if (isset($_GET['kleur'])) {4 $kleur = $_GET['kleur'];5 }6 ?>7 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">8 <html xmlns="http://www.w3.org/1999/xhtml">9 <head>10 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />11 <title>Kleur kiezen</title>12 </head>13 <body style="background-color: #<?php print $kleur; ?>;">14 <p>Klik op uw favoriete achtergrondkleur: 15 <a href="kleur.php?kleur=ffff00">Geel</a>, 16 <a href="kleur.php?kleur=00ff00">Groen</a>, 17 <a href="kleur.php?kleur=00ffff">Cyaan</a>.</p>18 <p>De kleurcode van de achtergondkleur is #<?php print $kleur; ?

>.</p>19 </body>20 </html>

Werking van HTTP: GET en POST

Het HTTP-protocol is in principe heel eenvoudig: de browser verstuurt een verzoek naar de webserver (request) en de server antwoord hierop door een antwoord (response) terug te sturen. Elke request wordt gevolgd door een response. Je kan dit het best vergelijken met een gewone conversatie tussen 2 mensen.

Het HTTP-antwoord bevat het HTML-document of de afbeelding of de melding dat de gevraagde pagina niet kon gevonden worden (op voorwaarde dat de server actief is natuurlijk).

35 | P a g i n a

Page 46: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

De request van een pagina kan op verschillende manieren (methods), waarvan deze 2 het meest voorkomen:

• GET: de standaardmanier waarop gegevens, zoals webpagina-aanvragen, naar de server gestuurd worden. Door het toevoegen van extra parameters aan de URL, kunnen we bijkomende opties meegeven voor de volgende pagina.

• POST: deze manier verstuurd gegevens, niet in de URL maar in de body van de HTTP-aanvraag. Deze manier wordt het meest gebruikt voor documenten en formulieren.

Volgen van een hyperlink

Als je op een link klikt op een een webpagina, wordt er altijd gebruik gemaakt van de GET-methode:

<a href="volgende_pagina.php">Klik hier</a>

Je kunt de link ook uitbreiden met één of meerdere extra parameters:

<a href="volgende_pagina.php?actie=weergeven">Alles weergeven</a><br />

<a href="volgende_pagina.php?actie=weergeven&id=14">Dit onderdeel weergeven</a>

Je laat namelijk de naam van de link volgen door een vraagteken en de naam van de parameter met een toekenning via een gelijkheidsteken.

Als je gebruik maakt van meerdere parameters, voeg je deze samen met een ampersand (&).

Formulieren

Bij formulieren kunnen we kiezen om ofwel de POST-methode, ofwel de GET-methode te gebruiken. De keuze zal afhangen van een aantal factoren.

Oorspronkelijk werd GET gebruikt voor acties die geen wijzigingen teweeg brengen op de server, zoals het zoeken in een database naar iets, terwijl POST werd gebruikt voor acties die wel wijzigingen doorvoeren op de server, zoals het toevoegen van een nieuw element, of verwijderen van een bestaand element in een database. Maar uiteindelijk kunnen we beide methoden gebruiken om gegevens te verzenden.

Het voor- en/of nadeel van GET is dat alle parameters meegestuurd worden in de URL. Hierdoor kan gevoelige informatie zichtbaar worden voor anderen (bijvoorbeeld bij het opvragen van de URL in de geschiedenis van de browser). Anderzijds kan dit ook gebruikt worden, om een URL in de favorieten op te slaan, inclusief de parameters.

Hou er ook rekening mee dat de GET-methode er voor kan zorgen, dat je URL behoorlijk lang wordt en uiteindelijk zelfs de maximum lengte voor URL's overschrijdt.

Volgende regels worden aangenomen voor het versturen van formulieren:

• Gebruik POST als minstens één van onderstaande regels waar is: • het resultaat heeft blijvende werking aan de serverkant (vb: toevoegen of

wissen van gegevens uit een database); • data die geproduceerd wordt door het formulier, zal resulteren in een te lange

URL bij het gebruik van GET (meer dan 1024 karakters); • de overgestuurde data bevat enig ander type dan standaard ASCII-karakters.

• Gebruik GET als alle onderstaande regels van toepassing zijn: • de manier van verzenden gaat NIET via een formulier; • de aanvraag wordt gebruikt om gegevens op te halen; • het resultaat van de aanvraag heeft geen blijvende invloed op de webserver; • de uiteindelijke URL bestaat in totaal uit minder dan 1024 karakters.

We zullen dus in bijna alle gevallen de POST-methode gebruiken om gegevens via formulieren te versturen.

36 | P a g i n a

Page 47: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Formulieren

Formulieren maken

Aangezien we allemaal HTML kennen, zal het maken van formulieren heel kort nog eens herhaald worden.

Een formulier in HTML begint altijd met de<form>-tag. Verder wordt er binnen de <form> ook opgegeven naar welke pagina de gegevens versluisd worden en welke methode er gebruikt wordt.

Hieronder een voorbeeld van een formulier:

1 <?php2 if (isset($_POST['naam'])) { // zijn er reeds gegevens?3 $naam = $_POST['naam'];4 $wachtwoord = $_POST['wachtwoord'];5 $geslacht = $_POST['geslacht'];6 $kinderen = $_POST['kinderen'];7 $ouders = $_POST['ouders'];8 $rijbewijs = $_POST['rijbewijs'];9 $opmerking = $_POST['opmerking'];10 $actie = $_POST['actie'];11 }12 ?>13 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">14 <html xmlns="http://www.w3.org/1999/xhtml">15 <head>16 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />17 <title>Persoonlijke fiche</title>18 </head>19 <body>20 <h1>Persoonlijke fiche</h1>21 <?php22 if (isset($_POST['naam'])) { // zijn er reeds gegevens?23 print "<h2>Deze gegevens heeft u doorgestuurd</h2>";24 print "<p>Naam: $naam<br />";25 print "Wachtwoord: $wachtwoord<br />";26 print "Geslacht: $geslacht<br />";27 print "Kinderen ten laste: $kinderen<br />";28 print "Ouders ten laste: $ouders<br />";29 print "Rijbewijs: $rijbewijs<br />";30 print "Opmerking: $opmerking<br />";31 print "Verborgen veld: $actie</p>";32 }33 ?>34 <h2>Vul hier uw gegevens in</h2>35 <form action="persoonlijk.php" method="post">36 <table>37 <tr>38 <td>Naam:</td>39 <td><input name="naam" type="text" value="<?php print $naam; ?>"

/></td>40 </tr>41 <tr>42 <td>Wachtwoord:</td>

37 | P a g i n a

Page 48: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

43 <td><input name="wachtwoord" type="password" value="<?php print $wachtwoord; ?>" /></td>

44 </tr>45 <tr>46 <td>Geslacht:</td>47 <td><label><input name="geslacht" type="radio" value="m" <?php

if ($geslacht == "m") print "checked=\"checked\""; ?> />Man</label>48 <label><input type="radio" name="geslacht" value="f" <?php if

($geslacht == "f") print "checked=\"checked\""; ?> />Vrouw</label>49 </td>50 </tr>51 <tr>52 <td>Ten laste</td>53 <td><input name="kinderen" type="checkbox" id="kinderen" <?php

if ($kinderen == "on") print "checked=\"checked\""; ?> /><label for="kinderen">Kinderen</label>

54 <input type="checkbox" name="ouders" id="ouders" <?php if ($ouders == "on") print "checked=\"checked\""; ?> /><label for="ouders">Ouders</label></td>

55 </tr>56 <tr>57 <td>Rijbewijs</td>58 <td><select name="rijbewijs">59 <option value="Geen" <?php if ($rijbewijs == "Geen") print

"selected=\"selected\""; ?>>Geen</option>60 <option value="A3" <?php if ($rijbewijs == "A3") print

"selected=\"selected\""; ?> <?php if ($rijbewijs == "Geen") print "selected=\"selected\""; ?>>Bromfietsen</option>

61 <option value="A2" <?php if ($rijbewijs == "A2") print "selected=\"selected\""; ?>>Motorfiets</option>

62 <option value="A1" <?php if ($rijbewijs == "A1") print "selected=\"selected\""; ?>>Zware motorfiets</option>

63 <option value="B" <?php if ($rijbewijs == "B") print "selected=\"selected\""; ?>>Gewone wagen</option>

64 <option value="C" <?php if ($rijbewijs == "C") print "selected=\"selected\""; ?>>Zware wagen</option>

65 <option value="D" <?php if ($rijbewijs == "D") print "selected=\"selected\""; ?>>Voertuig voor meer dan 9 personen</option>

66 </select>67 </td>68 </tr>69 <tr>70 <td valign="top">Opmerking:</td>71 <td><textarea name="opmerking"><?php print $opmerking; ?>

</textarea></td>72 </tr>73 <tr>74 <td><input name="actie" type="hidden" value="controle" /></td>75 <td><input name="" type="submit" value="Verzenden" /></td>76 </tr>77 </table>78 </form>79 </body>80 </html>

38 | P a g i n a

Page 49: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Input-tags

Er zijn dus 3 veelgebruikte tags om gegevens in te voeren:

• input • select • textarea

Bij de input hebben we een aantal types die het soort veld bepalen:

• text: wordt gebruikt voor gewone tekst;

• password: wordt vooral gebruikt om wachtwoorden in te geven, de ingetikte tekst wordt weergegeven als sterretjes / bolletjes (afhankelijk van de browser);

• radio: keuzerondjes; • checkbox: selectievakjes,

mogelijkheid om aan of uit te vinken;

• hidden: de gebruiker kan deze niet wijzigen, dit is handig om extra gegevens mee te sturen. Verborgen velden worden niet in de browser weergegeven (wel in de HTML-code).

Inputs van het type ‘button’ bestaan ook, maar die worden vooral gebruikt in combinatie met JavaScript.

Bij select geven we de mogelijkheden weer tussen <option>-tags, die de waarde van de select zullen bepalen en de tekst die weergegeven wordt.

Bij het opstellen van een formulier zorgen we er om te beginnen voor, dat elk veld een duidelijke naam (name) heeft, omdat we deze nodig hebben bij het verwerken.

De value is verplicht bij radio, omdat de gebruiker zelf geen waarde kan invullen.

De value van formuliervelden wordt gebruikt om beginwaarde mee te geven. Deze beginwaarden kunnen met behulp van PHP opdrachten ingevuld worden. Zie regel 39 voor een tekstveld, regel 47 voor keuzerondjes, regel 53 voor selectievakjes, regel 59 voor een vervolgkeuzelijst (menu) en regel 71 voor een tekstgebied. Dit is handig om formulieren reeds op voorhand met gegevens te vullen.

Verwerken van de formulieren

Nadat de gebruiker het formulier heeft ingevuld, is het de bedoeling om hier iets mee te doen. In een later stadium zullen we deze gegevens aan een database toevoegen of mailen naar iemand. Nu geven we deze weer op de pagina.

Ten eerste moeten we weten met welke methode de gegevens doorgestuurd zijn: GET of POST? Dit dienen we te weten omdat er 2 variabelen gecreëerd zijn bij het versturen, waarin de formuliergegevens vervat zitten.

• $_GET: Als de gegevens via een URL worden doorgestuurd of als er geen methode is opgegeven bij een formulier. Parameters worden doorgegeven na het vraagteken;

• $_POST: De gegevens werden verstuurd via een formulier én de methode werd ingesteld op POST.

Alle parameters krijgen de naam van de input-velden.

39 | P a g i n a

Page 50: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Maken we gebruik van de URL om parameters door te sturen, zitten de gegevens altijd in de $_GET-variabele. Bij het gebruik van formulieren hebben we de methode, en dus de variabele, zelf gekozen bij de method van de form-tag.

Nemen we voorgaand formulier, hier is al onze data opgeslagen in de $_POST-variabele. De regels 3 tot en met 10 zorgen voor het opvragen van de opgestuurde formulier gegevens.

Dit geeft al een idee van de mogelijkheden. We zien hier wel nog staan bij geslacht "m" en bij kinderen "on". Als we verder willen werken met deze gegevens zullen we dit moeten "mooier" maken. Dit doen we aan de hand van if- en switch-statements.

Als we in onze textarea gebruik maken van een nieuwe lijn (enter), wordt dit trouwens ook niet verwerkt in de weergave op de volgende pagina. Hierdoor komt alles achter elkaar te staan, in plaats van leesbare tekst te verkrijgen.

En als toetje zullen we controles uitvoeren op de doorgestuurde gegevens: is de naam niet te lang (denk aan de database die komt), is het wachtwoord ingevuld, is een eventueel opgegeven e-mailadres geldig, ...

Verwerken van URL's

Het verwerken van URL's of formulieren die de GET-methode gebruiken, is even eenvoudig, alleen moeten we gebruik maken van de $_GET-array.

Nemen we volgende url.php script

1 <?php 2 $taal = "C++";3 ?>4 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">5 <html xmlns="http://www.w3.org/1999/xhtml">6 <head>7 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />8 <title>GET en URL's</title>9 </head>10 <body>11 Klik op <a href="url_verwerking.php?taal=<?php print

urlencode($taal); ?>">C++</a>.12 </body>13 </html>

Wordt verwerkt door ..................................:

1 <?php 2 $taal = $_GET['taal'];3 ?>4 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">5 <html xmlns="http://www.w3.org/1999/xhtml">6 <head>7 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />8 <title>Verwerking GET en URL's</title>9 </head>10 <body>11 <p><?php print $taal ?> is een programmeertaal.</p>12 </body>13 </html>

40 | P a g i n a

Page 51: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Opletten met URL's

Een URL heeft naast de beperking in lengte (max 1024 karakters) ook nog eens de beperking dat hij met een aantal speciale tekens niet overweg kan. Denk bijvoorbeeld aan é en '.

Om een URL toch op een deftige manier te kunnen verwerken worden deze speciale tekens omgezet naar URL-equivalenten. Waarschijnlijk heb je in een link met spaties al gezien dat deze vervangen worden door '%20'. Dit is het URL-equivalent van een spatie.

Om onze scripts goed te laten werken doen we dit beter zelf. Hiervoor kun je de functie urlencode() gebruiken. Gegevens die op deze manier doorgestuurd worden, worden zeker juist geïnterpreteerd. Bij het ontvangen kun je ze dan weer 'normaal' maken door de functie urldecode() te gebruiken (wat niet altijd noodzakelijk is, testen is hier de boodschap).

Textarea's en nieuwe regels

Als we een textarea gebruiken en we willen nieuwe lijnen gebruiken, dan worden deze niet opgeslagen in de variabele als <br /> maar als new-line (\n).

Gelukkig bestaat er een functie die onze new-lines kan omzetten naar <br />, de nl2br():

$html_tekst = nl2br($tekst_van_textarea);

oefeningen

Het project van deze cursus: Webshop

Om het aantal cursussen per pagina te beperken, zullen we gebruik maken van vier categorieën. Deze categorieën vullen we in het volgende hoofdstuk met cursussen. Om een categorie te kunnen kiezen, maken we juist onder de kop een navigatiebalk met de verschillende categorieën. Voeg daarvoor de volgende regel toe onder de regel met de h1 tag:

<p><a href="index.php?cat=Webdesign">Webdesign</a> | <a href="index.php?cat=Kantoor">Kantoor</a> | <a href="index.php?cat=Multimedia">Multimedia</a> | <a href="index.php?cat=Programmeren">Programmeren</a><p>

Om de gebruiker te tonen welke categorie zichtbaar is, maken we deze zichtbaar in de kop. Daarvoor voeg je de volgende regels (7 – 10) toe aan het script:

$cat = "Webdesign"; // standaard categorie

if(isset($_GET['cat'])) { // gekozen categorie

$cat = $_GET['cat'];

}

De kop wordt dan:

<h1>SNT Webshop Informatica (<?php ....................................................... ?>)</h1>

Om een cursus te kunnen volgen moet er een inschrijvingsformulier ingevuld worden. De koppelingen Inschrijven veranderen we naar:

<td><a href="inschrijven.php?cursus=<?php print $item1; ?>&cat=<?php print $cat; ?>">Inschrijven</a></td>

Doe dit voor alle Inschrijven-koppelingen.

De PHP pagina met het formulier wordt:

1 <?php // Verwerken van de URL2 $cursus = ........................3 $cat = ...........................4 ?>5 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">6 <html xmlns="http://www.w3.org/1999/xhtml">

41 | P a g i n a

Page 52: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

7 <head>8 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />9 <title>SNT Webshop Informatica</title>10 </head>11 <body>12 <h1>Inschrijvingsformulier voor de cursus <?php print $cat ?> - <?

php print $cursus ?></h1>13 <form action="inschrijven_verwerken.php" method="post">14 <p>15 <label for="naam">Naam</label>16 <input type="text" name="naam" id="naam" /> 17 <label for="voornaam">Voornaam</label>18 <input type="text" name="voornaam" id="voornaam" />19 <label for="geslacht">Geslacht</label>20 <select name="geslacht" id="geslacht">21 <option value="man">Man</option>22 <option value="vrouw">Vrouw</option>23 </select>24 </p>25 <p>26 <label for="geboorteplaats">Geboorteplaats</label>27 <input type="text" name="geboorteplaats"

id="geboorteplaats" />28 <label for="geboortedatum">Geboortedatum</label>29 <input type="text" name="geboortedatum" id="geboortedatum" />30 <label for="rijksregisternr">Rijksregisternummer (5 laatste

cijfers)</label>31 <input name="rijksregisternr" type="text"

id="rijksregisternr" />32 </p>33 <h3>Volgende onderstaande velden enkel in te vullen door nieuwe

cursisten of bij wijziging</h3>34 <p>35 <label for="adres">Straat en nr</label>36 <input name="adres" type="text" id="adres" size="80" />37 </p>38 <p>39 <label for="postnr">Postnr</label>40 <input type="text" name="postnr" id="postnr" />41 <label for="woonplaats">Woonplaats</label>42 <input type="text" name="woonplaats" id="woonplaats" />43 <label for="land">Land</label>44 <input type="text" name="land" id="land" />45 </p>46 <p>47 <label for="telefoon">Telefoon</label>48 <input type="text" name="telefoon" id="telefoon" />49 <label for="email">E-mail</label>50 <input type="text" name="email" id="email" />51 </p>52 <p>53 <label for="educatiefverlof">Educatief verlof</label>54 <select name="educatiefverlof" id="educatiefverlof">55 <option value="geen">Geen</option>56 <option value="S">Ambtenaar</option>57 <option value="P">Privé</option>58 </select>

42 | P a g i n a

Page 53: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

59 <label for="socecostatuut">Sociaal en economisch statuut</label>60 <input type="text" name="socecostatuut" id="socecostatuut" />61 <label for="opleidingsniveau">Opleidingsniveau</label>62 <input type="text" name="opleidingsniveau" id="opleidingsniveau"

/>63 <label for="nationaliteit">Nationaliteit</label>64 <input type="text" name="nationaliteit" id="nationaliteit" />65 <label for="datum">Datum</label>66 <input type="text" name="datum" id="datum" />67 </p>68 <h3>Voorbehouden SNT</h3>69 <p>70 <label for="afdeling">Afdeling - jaar - klas</label>71 <input name="afdeling" type="text" id="afdeling"

readonly="readonly" />72 <label for="kwitantienr">Kwitantie nr</label>73 <input type="text" name="kwitantienr" id="kwitantienr"

readonly="readonly" />74 <label for="attest">Attest</label>75 <input type="text" name="attest" id="attest" readonly="readonly"

/>76 <label for="prijs">Prijs</label>77 <input type="text" name="prijs" id="prijs"

readonly="readonly" />78 </p>79 <p>80 <input type="checkbox" name="voorwaarden" id="voorwaarden" />81 <label for="voorwaarden">Stemt in met de

inschrijvingsvoorwaarden (Artikel 50 van het decreet op het volwassenenonderwijs)</label>

82 </p>83 <p>84 <input type="submit" name="button" id="button" value="Verzenden"

/>85 </p>86 <p>87 <input name="cat" type="hidden" value="<?php print $cat ?>" />88 <input name="cursus" type="hidden" value="<?php print $cursus ?

>" />89 </p>90 </form>91 </body>92 </html>

Het resultaat:

43 | P a g i n a

Page 54: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

De PHP pagina om de gegevens van het formulier te verwerken wordt:

1 <?php 2 define ("EMAIL_ADMINISTRATIE", "[email protected]");3 // Verwerken van formulier4 $naam = ........................5 $voornaam = ........................6 $geslacht = ........................7 $geboorteplaats = ........................8 $geboortedatum = ........................9 $rijksregisternr = ........................10 $adres = ........................11 $postnr = ........................12 $woonplaats = ........................13 $land = ........................14 $telefoon = ........................15 $email = ........................16 $educatiefverlof = ........................17 $socecostatuut = ........................18 $opleidingsniveau = ........................19 $nationaliteit = ........................20 $datum = ........................21 $afdeling = ........................22 $kwitantienr = ........................23 $attest = ........................24 $prijs = ........................25 $voorwaarden = ........................26 $cat = ........................27 $cursus = ........................28 29 $formuliergegevens = <<<eod30 Naam: $naam Voornaam: $voornaam Geslacht: $geslacht31 Geboorteplaats: $geboorteplaats Geboortedatum: $geboortedatum

Rijksregisternummer (5 laatste cijfers): $rijksregisternr32 Volgende onderstaande velden enkel in te vullen door nieuwe

cursisten of bij wijziging33 Straat en nr: $adres34 Postnr: $postnr Woonplaats: $woonplaats Land: $land

44 | P a g i n a

Page 55: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

35 Telefoon: $telefoon E-mail: $email36 Educatief verlof: $educatiefverlof Sociaal en economisch statuut:

$socecostatuut Opleidingsniveau: $opleidingsniveau37 Nationaliteit: $nationaliteit Datum: $datum38 Voorbehouden SNT39 Afdeling - jaar - klas: $afdeling Kwitantie nr: $kwitantienr Attest:

$attest Prijs: $prijs40 $voorwaarden Stemt in met de inschrijvingsvoorwaarden (Artikel 50

van het decreet op het volwassenenonderwijs)41 eod;42 43 $berichtAdministratie = <<<eod44 Beste,45 46 De volgende persoon wenst zich in te schrijven voor de cursus $cat -

$cursus.47 48 $formuliergegevens49 eod;50 51 $berichtCursist = ........................52 Beste $voornaam $naam,53 54 U bent ingeschreven voor de cursus .........................55 56 Succes met uw opleiding.57 58 De directeur en zijn team,59 Dirk Temmerman60 ........................61 // Verzenden van de mails. Syntax: mail(naar, onderwerp, bericht,

header);62 mail($email, "Inschrijving cursus $cat - $cursus", $berichtCursist,

"FROM: " . EMAIL_ADMINISTRATIE);63 ........................ // email naar de administratie met als

onderwerp Inschrijving, het hierboven aangemaakte bericht voor de administratie en als afzender het e-mailadres van de cursist

64 ?>65 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">66 <html xmlns="http://www.w3.org/1999/xhtml">67 <head>68 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />69 <title>SNT Webshop Informatica</title>70 </head>71 <body>72 <h2>U bent ingeschreven voor de cursus ........................</h2>73 <p>De volgende gegevens werden naar het secretariaat van de school

gestuurd:74 <pre><?php print $formuliergegevens; ?></pre></p>75 <p>U ontvangt per mail (<?php print $email; ?>) een bevestiging van

de inschrijving.</p>76 <p><a href="index.php">Klik hier om door te gaan</a></p>77 </body>78 </html>

Het resultaat:45 | P a g i n a

Page 56: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

De ontvangen e-mails (opvragen door te surfen naar http://ipadres/webmail en aan te melden met de gebruikersnaam pc01 en het standaard wachtwoord .........................):

46 | P a g i n a

Page 57: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Enquête

Voor het TV programma Ook getest op mensen wordt een fictieve seks-enquête opgemaakt.

Deze enquête bestaat uit verschillende PHP pagina's met telkens één vraag.

Pas na de laatste vraag wordt een overzicht gegeven van de antwoorden (met andere woorden de antwoorden uit de formulieren van de vorige vraag worden in verborgen velden opgeslagen en doorgegeven aan de volgende vraag op de volgende PHP pagina).

De eerste vraag:

De tweede vraag:

De leeftijdscategorieën zijn: 16 – 29 jaar, 30 – 49 jaar en 50+.

De derde vraag:

47 | P a g i n a

Page 58: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

De vierde vraag:

De mogelijke antwoorden zijn Geen enkele keer, Eén keer, Twee keer, Drie keer, Vier keer, Vijf keer, Zes keer, Zeven keer en Meer dan zeven keer.

De vijfde vraag:

Met dezelfde mogelijke antwoorden als in vraag vier.

De zesde vraag:

Met de volgende mogelijke antwoorden: Zeer veel zorgen of stress, Behoorlijk wat zorgen of stress, Een beetje zorgen of stress en Helemaal geen zorgen of stress.

De zevende vraag:

Met dezelfde mogelijke antwoorden als in vraag vier.

Het resultaat:

Het seksueel profiel wordt samengesteld met de antwoorden op de vragen, zorg dus voor aangepaste veldwaarden (value's).

Zoeken

Het internet kent verschillende zoeksites. We combineren deze in één pagina. Daar zoeksites enkel gegevens opvragen, maken ze meestal gebruik van de GET-methode.

De externe pagina's met de zoekresultaten laten we verschijnen in een frame. Daarvoor heb je een de volgende pagina's nodig:

De framesetpagina extern.html:

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

48 | P a g i n a

Page 59: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

2 <html xmlns="http://www.w3.org/1999/xhtml">3 <head>4 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />5 <title>Gecombineerd zoeken</title>6 </head>7 <frameset rows="130,*" frameborder="no" border="0" framespacing="0">8 <frame src="extern_top.php" name="topFrame" scrolling="No"

noresize="noresize" id="topFrame" title="topFrame" />9 <frame src="extern_main.html" name="mainFrame" id="mainFrame"

title="mainFrame" />10 </frameset>11 <noframes><body>12 </body></noframes>13 </html>

De onderste pagina extern_main.html waar de zoekresultaten tevoorschijn komen:

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml">3 <head>4 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />5 </head>6 <body>7 <p>Hier verschijnen de externe pagina's.</p>8 </body>9 </html>

De bovenste pagina .................................. is een PHP pagina met de volgende onderdelen:

1. Een kop 2 waarin de opgegeven zoekwoorden verschijnen.

2. Een formulier om twee zoekwoorden op te geven.

3. De hyperlinks naar de externe zoeksites met de opgegeven zoekwoorden.

Deze pagina heeft daarbij de volgende functionaliteiten:

1. Als het eerste zoekwoord niet werd opgegeven, worden de standaard zoekwoorden snt en brugge gebruikt.

2. Als er twee zoekwoorden zijn, moet in de kop 2 het woord en tussen de twee zoekwoorden staan. Indien geen tweede zoekwoord is opgegeven wordt het woord en niet gebruikt.

3. De formuliervelden bevatten de opgegeven of standaard zoekwoorden als beginwaarde.

4. De hyperlinks stel je als volgt samen:

a. <a href="http://maps.google.be/maps?q=<?php ................ ?>&amp;output=embed" target="mainFrame">Google maps</a>

b. | <a href="http://be.bing.com/search?q=<?php .............................................. ?>" target="mainFrame">Bing</a>

c. | <a href="http://search.yahoo.com/search?p=<?php ...................................... ?>" target="mainFrame">Yahoo</a

d. | <a href="http://video.search.yahoo.com/search/video?p=<?php ..................... ?>" target="mainFrame">Video's</a>

e. | <a href="http://nl.wikipedia.org/w/index.php?&amp;search=<?php ................. ?>" target="mainFrame">Wikipedia</a>

49 | P a g i n a

Page 60: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

f. | <a href="http://commons.wikimedia.org/w/index.php?search=<?php ................ ?> &amp;uselang=nl" target="mainFrame">Wikimedia</a>

g. | <a href="http://www.imdb.com/find?q=<?php .............................. ?>&amp;s=all" target="mainFrame">IMDB</a>

h. | <a href="http://www.amazon.com/s?keywords=<?php .................................. ?>" target="mainFrame">Amazon</a>

i. | <a href="http://www.jamendo.com/en#en/search#qs=q=<?php ................................ ?>" target="mainFrame">Jamendo</a>

Bij alle hyperlinks worden de twee zoekwoorden door een plusteken gescheiden, bij Jamendo echter door een spatie. Hou bij de hyperlink van Jamendo rekening met het feit dat een spatie in een URL eigenlijk niet mag voorkomen.

Het resultaat:

PHP Evaluaties en lussenAlgemeen

In PHP werken we constant op basis van keuzes van de gebruiker: als de bezoeker kiest om een pagina in het Nederlands weer te geven, dan moet dit ook zo getoond worden.

Een andere mogelijkheid is het repetitief uitvoeren van een taak. Gegevens moeten bijvoorbeeld weergegeven worden, zolang er data voorhanden is. Of een formulier moet weergegeven worden, zolang er niet aan bepaalde voorwaarden voldaan is.

Voorbeelden

Voorbeeld 1

Via een formulier wordt het geboortejaar van de bezoeker gevraagd. Naargelang deze ouder of jonger dan 18 is, wordt er een gepaste mededeling op het scherm geplaatst:

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml">3 <head>4 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />5 <title>Leeftijd</title>6 </head>7 <body>8 <form action="leeftijd.php" method="post">9 Uw leeftijd is10 <input name="leeftijd" type="text" value="42" />11 jaar

50 | P a g i n a

Page 61: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

12 <input type="submit" name="submit" value="Verder" />13 </form>14 </body>15 </html>

En zo wordt dit verwerkt:

1 <?php2 $leeftijd = $_POST['leeftijd'];3 if ($leeftijd < 18){4 $melding = "U bent te jong om op deze pagina's toegelaten te

worden.";5 } else {6 $melding = "Welkom, en geniet van deze pagina's.";7 }8 ?>9 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">10 <html xmlns="http://www.w3.org/1999/xhtml">11 <head>12 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />13 <title>Leeftijd</title>14 </head>15 <body>16 <p><?php print $melding; ?></p>17 </body>18 </html>

Voorbeeld 2

Er wordt de gebruiker naar een getal gevraagd, en dit aantal wordt gebruikt om er zoveel sterretjes (*) mee weer te geven, na elke 30ste ster moet er een nieuwe regel gemaakt worden, waardoor deze mooi onder elkaar komen te staan:

1 <?php2 if (!empty($_POST['aantal'])) {3 $aantal = $_POST['aantal'];4 }5 ?>6 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">7 <html xmlns="http://www.w3.org/1999/xhtml">8 <head>9 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />10 <title>Sterretjes weergeven</title>11 </head>12 <body>13 <form action="sterretjes.php" method="post">14 Aantal weer te geven sterretjes: <input name="aantal" type="text"

value="<?php print $aantal ?>"/>15 <input name="submit" type="submit" value="Weergeven" />16 </form>17 <?php if (!empty($_POST['aantal'])): ?>18 <p>Hier zijn uw sterretjes:<br />19 <?php for ($i = 1; $i <= $aantal; $i++):?>20 *21 <?php if (($i % 30) == 0):?>

51 | P a g i n a

Page 62: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

22 <br />23 <?php endif; ?>24 <?php endfor; ?>25 </p>26 <?php endif; ?>27 </body>28 </html>

Evaluaties

Evaluaties worden gebruikt om bepaalde zaken te controleren. Als bijvoorbeeld de naam niet ingevuld is in een veld, dan moet het formulier opnieuw getoond worden, samen met een foutmelding.

If ... else

Dit is de meest voorkomende evaluatie en controleert of er aan een bepaalde voorwaarde (conditie) voldaan is. Afhankelijk hiervan wordt er iets uitgevoerd.

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml">3 <head>4 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />5 <title>Evaluaties</title>6 </head>7 <body>8 <p><?php9 $var = 10;10 if ($var > 5) print "De variabele is groter dan 5.<br />";11 ?></p>12 </body>13 </html>

Dit lezen we als: "de variabele $var krijgt de waarde 10. Als de variabele $var groter is dan 5, zal de expressie uitgevoerd worden die na de if komt."

Het wordt echter aangeraden om na de if-conditie een accolade te plaatsen en deze na het statement weer af te sluiten. Op die manier kun je meerdere statements uitvoeren per if-constructie:

10 if ($var > 5) {11 print "De variabele is groter dan 5.<br />"; 12 $var = 2;13 }

Voorgaande lezen we nu dus als: "als de waarde van $var groter is dan 5, wordt de melding afgedrukt, en wordt $var op 2 gezet."

Als er aan de conditie niet voldaan is, willen we soms dat er iets anders uitgevoerd wordt:

13 } else { 14 print "De variabele is kleiner of gelijk aan 5.<br />";15 }

Daarvoor gebruiken we de else-uitbreiding. Zoals je ziet, kunnen we één statement tussen accolades plaatsen.

We kunnen onze lus nog verder opsplitsen, misschien willen we testen als de variabele niet gelijk is aan 5:

52 | P a g i n a

Page 63: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

13 } else {14 if ($var == 5) {15 print "De variabele is gelijk aan 5.<br />";16 } else {17 print "De variabele is kleiner dan 5.<br />";18 }19 }

Dit noemen we “geneste evaluaties”: als $var groter is dan 5, wordt de eerste melding afgedrukt, als dit niet het geval is, wordt gecontroleerd of $var gelijk is aan 5 en wordt eventueel de juiste melding afgedrukt. Als ook dit niet het geval is, is $var dus kleiner dan 5 en wordt deze melding afgedrukt.

Dergelijke constructies kunnen snel ingewikkeld worden. Dit kunnen we als volgt oplossen:

13 } elseif ($var == 5) {14 print "De variabele is gelijk aan 5.<br />";15 } else {16 print "De variabele is kleiner dan 5.<br />";17 }

Deze manier van werken is veel duidelijker en overzichtelijker en verdient dus ook de voorkeur.

Verschillende testen in één statement

Soms is het nodig om verschillende elementen te testen alvorens een expressie uit te voeren. Hiervoor maken we gebruik van logische operatoren:

18 $dag = "zaterdag";19 if (($dag == "zaterdag") || ($dag == "zondag")) {20 print "Het is weekend.<br />";21 } else {22 print "Het is vandaag werken geblazen.<br />";23 }

Hier wordt er getest of $dag gelijk is aan "zaterdag" of aan "zondag", als dit zo is, dan is het weekend. Een ander voorbeeldje:

24 $kleur1 = "rood";25 $kleur2 = "blauw";26 if (($kleur1 == "rood") && ($kleur2 == "blauw")) {27 print "Deze mengeling geeft \"paars\".<br />";28 }

Switch-statement

Heel veel elseif's worden onoverzichtelijk. Om dit op te lossen kunnen we gebruik maken van een switch-statement:

29 $dag = 3;30 switch ($dag){31 case 1:32 print "Het is maandag.<br />"; 33 break;34 case 2:35 print "Het is dinsdag.<br />";36 break;37 case 3:38 print "Het is woensdag.<br />";39 break;40 case 4:

53 | P a g i n a

Page 64: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

41 print "Het is donderdag.<br />"; 42 break;43 case 5:44 print "Het is vrijdag.<br />";45 break;46 case 6:47 print "Het is zaterdag.<br />";48 break;49 case 7:50 print "Het is zondag.<br />";51 break;52 default:53 print "Dit is een ongeldige dag.<br />";54 }

De variabele $dag wordt geëvalueerd. Als $dag gelijk is aan 1 wordt de melding weergegeven die hier bij staat. Indien dit niet zo is, wordt er verder vergeleken, tot de juiste waarde gevonden wordt. Het gebruik van accolades, zoals bij een if-else-vergelijking, is hier niet toegelaten.

Verder is de break opdracht nodig. Deze zorgt ervoor dat je uit de switch springt. Als je deze achterwege zou laten, worden alle meldingen weergegeven, die gepasseerd worden. Test desnoods eens uit. In sommige toepassingen is dit net wenselijk:

46 case 6:47 case 7:48 print "Het is weekend.<br />";49 break;50 default:51 print "Dit is een ongeldige dag.<br />";52 }

Switch-statements worden alleen gebruikt voor eenvoudige vergelijkingen, waarbij je of een integer, of een string verwacht. Gebruik ze niet voor complexe structuren met and's en or's.

Lussen

Er zijn 4 soorten lussen die vaak gebruikt worden. De keuze ervan zal bepaald worden door het resultaat dat je wilt bereiken.

While

Bij een while-lus worden de expressies die tussen de accolades staan uitgevoerd, zolang de conditie waar is. Deze conditie wordt eerst gecontroleerd, en dan pas worden de expressies uitgevoerd. Dit betekent dat, als de conditie van in het begin al niet waar is, de lus niet zal uitgevoerd worden:

53 print "While";54 $teller = 0;55 while ($teller <= 10){56 print " $teller";57 $teller ++;58 }59 print "<br />";

Deze lus zal dus 10 getallen naast elkaar afdrukken, gaande van 0 tot en met 10.

Do...while

Een do...while-lus doet hetzelfde als de while, met dit verschil, dat de conditie pas op het einde getest wordt, waardoor de lus sowieso altijd een keer uitgevoerd wordt:

54 | P a g i n a

Page 65: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

60 print "Do";61 $teller = 0;62 do {63 print " $teller";64 $teller ++;65 } while ($teller <= 10);66 print " while<br />";

Deze manier kan soms interessant zijn om minstens 1 tekstveld af te drukken, ongeacht de input van de gebruiker.

For

Deze derde, en meestgebruikte, lus bestaat uit 3 delen bij het aanroepen:

67 print "For";68 for ($teller = 0; $teller <= 10; $teller++){69 print " $teller";70 }71 print "<br />";

Tussen de haakjes vinden we het volgende terug:

1. initiële waarde: een statement die één keer uitgevoerd wordt, bij het aanroepen van de for-lus. Meestal wordt hier de startwaarde van een teller opgegeven;

2. lusevaluatie: de evaluatie die na elke lus gecontroleerd wordt, als deze FALSE wordt, stopt de lus;

3. einde-lus-statements: deze statements worden telkens op het einde van de lus uitgevoerd.

In ons voorbeeld, wordt de teller eerst op 0 geplaatst en start de lus. Na de uitvoering wordt er gecontroleerd of de teller kleiner of gelijk is aan 10, als dit zo is, wordt de teller met 1 verhoogd, waarna de lus opnieuw wordt uitgevoerd. Zodra de teller groter wordt dan 10, stopt de lus.

Je kunt tussen de haakjes meerdere waarden gebruiken, bijvoorbeeld om meerdere initiële waarden te gebruiken:

72 for ($teller = 0, $breekpunt = 1; $teller < 10; $teller++){73 print "$teller ";74 $breekpunt++;75 if ($breekpunt == 3){76 $breekpunt = 1;77 print "breekpunt ";78 }79 }80 ?></p>

HTML code binnen while, for en if structuren

Om HTML code in een evaluatieblok of lus te plaatsen, gebruik je een alternatieve schrijfwijze. Daarmee kun je afhankelijk van een evaluatie HTML code toevoegen of weglaten.

81 <?php82 $rijen = 9;83 $kolommen = 5; ?>84 <?php if ($rijen <= 0): ?>85 <p>De tabel moet minstens 1 rij bevatten.</p>86 <?php elseif ($kolommen <= 0): ?>87 <p>De tabel moet minstens 1 kolom bevatten.</p>88 <?php else: ?>

55 | P a g i n a

Page 66: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

89 Deze tabel bevat <?php print $rijen ?> rijen en <?php print $kolommen ?> kolommen.

90 <table border="1">91 <?php for($rij = 0; $rij < $rijen; $rij++): ?>92 <tr>93 <?php for($kolom = 0; $kolom < $kolommen; $kolom++): ?>94 <td><?php print "Rij $rij Kolom $kolom"; ?></td>95 <?php endfor; ?>96 </tr>97 <?php endfor; ?>98 </table>99 <?php endif; ?>

Bovenstaande voorbeeld bouwt een dynamische tabel op.

Het begin van de evaluatie of lus eindigt met de tekens : ?> waarbij eveneens het PHP blok wordt afgesloten. Na een afgesloten PHP blok komt HTML code te staan. Deze HTML code wordt echter alleen gebruikt indien de PHP evaluatie waar is. De evaluatie of lus eindigt met een nieuw PHP blok waarin het evaluatieblok of de lus wordt afgesloten. Deze alternatieve syntax wordt enkel ondersteund voor while, for en if structuren.

Oefeningen

Het project van deze cursus: Webshop

Voorlopig heeft de Webshop enkel items voor de categorie Webdesign. Dit gaan we aanvullen met items voor de andere categorieën:

De eerste regels van de PHP pagina veranderen naar:

1 <?php2 if(isset($_GET['cat'])) { // gekozen categorie3 $cat = $_GET['cat'];4 } else {5 $cat = "Webdesign"; // standaard categorie6 }7 ............... // items naargelang categorie8 case ............... // categorie Webdesign9 $item1 = "Dreamweaver Deel 1";10 $item2 = "Dreamweaver Deel 2";11 $item3 = "Javascript";12 $item4 = "PHP";13 $item5 = "Dreamweaver Eindwerk";14 ...............15 case ............... // categorie Kantoor16 $item1 = "Tekstverwerking";17 $item2 = "Rekenblad";18 $item3 = "Databasebeheer";19 $item4 = "Personal Information Manager";20 ...............21 case ............... // categorie Multimedia22 $item1 = "Fotobewerking";23 $item2 = "Videobewerking";24 $item3 = "Geluidsbewerking";25 $item4 = "Animaties";26 ...............27 case ............... // categorie Programmeren28 $item1 = "Javascript";29 $item2 = "PHP";30 $item3 = "SQL";

56 | P a g i n a

Page 67: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

31 $item4 = "C";32 $item5 = "C++";33 ...............34 default:35 exit("Ongeldige categorie.");36 ...............37 $aantalItems = 1;38 do { // tel het aantal items39 $aantalItems++;40 } while (isset(${'item'.$aantalItems}));41 ?>

Eerst bepalen we de categorie (gekozen via een URL of de standaard categorie Webdesign).

Daarna gaan we op basis van de categorie de verschillende cursussen initialiseren.

Daar niet alle categorieën evenveel items bevatten, tellen we het aantal items. Daar de items opgeslagen worden in variabelen met namen die beginnen met item gevolgd door een nr (vb: item1, item2, enz.) stellen we de te testen variabelenaam samen door het woord 'item' en de variabele $aantalItems samen te voegen. Dit wordt pas een variabelenaam door deze in de ${} constructie te plaatsen. M.a.w. ${aangemaakte variabelenaam}.

Het HTML gedeelte van de pagina wordt dan:

42 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

43 <html xmlns="http://www.w3.org/1999/xhtml">44 <head>45 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />46 <title>SNT Webshop Informatica</title>47 </head>48 <body>49 <h1>SNT Webshop Informatica (<?php print $cat ?>)</h1>50 <p><a href="index.php?cat=Webdesign">Webdesign</a> | <a

href="index.php?cat=Kantoor">Kantoor</a> | <a href="index.php?cat=Multimedia">Multimedia</a> | <a href="index.php?cat=Programmeren">Programmeren</a></p>

51 <table border="0">52 <tr>53 <th>Cursus</th>54 <th>Inschrijven</th>55 </tr>56 <?php for ($nr = 1; $nr < .................; $nr++): ?>57 <tr>58 <td><?php print .................; ?></td>59 <td><a href="inschrijven.php?cursus=<?php

print .................; ?>&cat=<?php print $cat; ?>">Inschrijven</a></td>

60 </tr>61 <?php endfor; ?>62 </table>63 </body>64 </html>

We gebruiken een for lus om de tabel met de items aan te maken.

Opsplitsen voor MVC

Om onze code duidelijker te houden, zullen we in de index-pagina, het logica-gedeelte er uit halen. Hierdoor zal onze uiteindelijke index.php veel eenvoudiger overkomen, én kunnen we,

57 | P a g i n a

Page 68: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

als we aanpassingen moeten doen, dit alleen nog in het logica-gedeelte uitvoeren. Voor de webdesigner wordt het aanpassen van de lay-out dan een stukje makkelijker.

Maak een nieuwe PHP pagina aan en sla deze op als model.php.

Kopieer alles dat tussen de php-tags bovenaan staat naar deze nieuwe pagina. Zorg er wel voor dat de code in de nieuwe builder-pagina tussen php-tags staat.

In de index.php voegen we bovenaan alleen nog volgende regel toe:

1 <?php2 require 'model.php';3 ?>

In Dreamweaver verschijnt onder het tabblad index.php een extra balk met de knoppen broncode en model.php. Als je de knop model.php selecteert, werk je aan de php code in model.php. Selecteer de knop Broncode om aan de PHP pagina index.php te werken.

Test de Webshop door je in te schrijven voor de cursus Programmeren C en C++. Zorg dat je geen tweemaal voor de cursus Programmeren C bent ingeschreven.

Het resultaat:

Getallen afdrukken while

Maak een script dat de getallen 0 tot en met 99 onder elkaar afdrukt. Maak gebruik van een while lus.

Getallen afdrukken for

Pas de bovenstaande oefening aan zodat deze een for lus gebruikt.

Dynamische tabel

Maak een PHP pagina, die een tabel afdrukt met 30 kolommen en 10 rijen. Het aantal kolommen en rijen moet eenvoudig aan te passen zijn. Druk in elke cel een opeenvolgend nummer af, te beginnen bij 0 en eindigend bij 299 (naar gelang het aantal kolommen en rijen).

Dynamische tabel met alternerende rijen

Pas de vorige PHP pagina aan zodat de tabel geen randen heeft (<table border="0">) en zorg ervoor dat de regels afwisselend lichtblauw (oneven rijen) en wit (even rijen) gekleurd zijn. Maak hiervoor gebruik van de achtergrondkleur van de rij<tr bgcolor="#ddddff">.

Dynamische tabel met alternerende rijen en tabelopties

Breidt de vorige PHP pagina uit met de volgende onderdelen:

58 | P a g i n a

Page 69: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Een formulier om het aantal rijen en kolommen in te stellen. Uit wetenschappelijk onderzoek blijkt dat mannen een uitgesproken voorkeur hebben voor blauw terwijl vrouwen een voorkeur hebben voor zowel blauw als paars. M.a.w. Zorg voor een vervolgmenu met deze keuze. De geslachtskeuze bepaalt de achtergrondkleur voor de even rijen (vrouw = #ffddff, man = #ffffff). De achtergrondkleur voor de oneven rijen blijft voor beide geslachten lichtblauw.

Gebruik standaard 10 rijen, 30 kolommen en van het mannelijk geslacht.

Geef het formulier als beginwaarde de opgegeven of standaard instellingen.

Een mannelijk tabel gebruikt als rij-achtergrondkleuren blauw en wit.Een vrouwelijke tabel gebruikt als rij-achtergrondkleuren blauw en paars.

Het resultaat:

Getallen afdrukken en verwoorden

Pas de tweede oefening aan zodat elk getal ook voluit geschreven wordt. Voor het voluit schrijven kan je de volgende werkwijze gebruiken.

Bepaal de eenheden van het getal door de modulus met 10 van het getal te bereken.

De verwoording van de eenheden 1 tot en met 9 is één, twee, drie, vier, vijf, zes, zeven, acht, negen (vb: tweeëntwintig).

Getallen groter dan 20 en een eenheid verschillend van 0 koppelen de eenheden en tientallen met en of ën:

De eenheden twee en drie gebruiken het koppelwoord ën (vb: tweeëntwintig).

De andere eenheden gebruiken het koppelwoord en (vb: vierentwintig).

Bepaal het tiental door het getal te delen door tien en daarna het resultaat om te zetten naar een geheel getal (afronden).

De verwoording van de tientallen 1 tot en met 90 eindigt met tien, twintig, dertig, veertig, vijftig, zestig, zeventig, tachtig, negentig (vb: vierentwintig).

Schrijf de uitzonderingen op deze regels zelf uit. 0, 11, 12, 13 en 14 worden nul, elf, twaalf, dertien en veertien.

Geef het voluit geschreven getal weer op het scherm.

Het resultaat zie je op de afbeelding rechts.

59 | P a g i n a

Page 70: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

PHP ArraysAlgemeen

Een veel gebruikt type variabele is een array. Een array is een verzameling van verschillende elementen. Deze verschillende elementen kunnen daarenboven ook van een verschillend type zijn, ze kunnen zelfs arrays bevatten.

Stel de gegevens van een film:

Naam Type

IMDB nummer String

Titel String

Jaar Integer

Regisseur String

Taal String

Genre String Deze verschillende gegevens, van verschillend types, kunnen we allemaal opslaan in één variabele, namelijk een array.

Voorbeeld

Een filmliefhebber wil enkele gegevens van films bijhouden.

Deze gegevens worden in een array opgeslagen, waardoor we deze op verschillende manieren kunnen presenteren en verwerken.

1 <?php // films.php2 $titels = array ( // op basis van IMDBnrs3 '0111161' => 'The Shawshank Redemption',4 '0068646' => 'The Godfather',5 '0060196' => 'Il buono, il brutto, il cattivo',6 '0050083' => '12 Angry Men'7 );8 $jaartallen = array (9 '0111161' => '1994',10 '0068646' => '1974',11 '0060196' => '1966',12 '0050083' => '1957'13 );14 $regisseurs = array (15 '0111161' => 'Frank Darabont',16 '0068646' => 'Francis Ford Coppola',17 '0060196' => 'Sergio Leone',18 '0050083' => 'Sidney Lumet'19 );20 $talen = array (21 '0111161' => 'Engels',22 '0068646' => 'Engels',23 '0060196' => 'Italiaans',24 '0050083' => 'Engels'25 );26 $genres = array (27 '0111161' => 'Misdaad',28 '0068646' => 'Misdaad',29 '0060196' => 'Avontuur',

60 | P a g i n a

Page 71: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

30 '0050083' => 'Drama'31 );32 ?>33 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">34 <html xmlns="http://www.w3.org/1999/xhtml">35 <head>36 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />37 <title>Films</title>38 </head>39 <body>40 <?php asort($jaartallen); ?>41 <table>42 <tr>43 <th>Titel</th>44 <th>Jaar &#710;</th>45 <th>Regisseur</th>46 <th>Taal</th>47 <th>Genre</th>48 <th>IMDB nr</th>49 </tr>50 <?php foreach ($jaartallen as $IMDBnr => $jaartal):?>51 <tr>52 <td><?php print $titels[$IMDBnr]; ?></td>53 <td><?php print $jaartal; ?></td>54 <td><?php print $regisseurs[$IMDBnr]; ?></td>55 <td><?php print $talen[$IMDBnr]; ?></td>56 <td><?php print $genres[$IMDBnr]; ?></td>57 <td><?php print $IMDBnr; ?></td>58 </tr>59 <?php endforeach; ?>60 <?php asort($genres); ?>61 <tr>62 <th>Titel</th>63 <th>Jaar</th>64 <th>Regisseur</th>65 <th>Taal</th>66 <th>Genre &#710;</th>67 <th>IMDB nr</th>68 </tr>69 <?php foreach ($genres as $IMDBnr => $genre):?>70 <tr>71 <td><?php print $titels[$IMDBnr]; ?></td>72 <td><?php print $jaartallen[$IMDBnr]; ?></td>73 <td><?php print $regisseurs[$IMDBnr]; ?></td>74 <td><?php print $talen[$IMDBnr]; ?></td>75 <td><?php print $genres[$IMDBnr]; ?></td>76 <td><?php print $IMDBnr; ?></td>77 </tr>78 <?php endforeach; ?>79 </table>80 </body>81 </html>

61 | P a g i n a

Page 72: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Vullen van arrays

Om arrays te vullen hebben we twee manieren, de eerste manier zullen we voornamelijk gebruiken, als we een array op voorhand definiëren. De tweede als we een array gaandeweg aanvullen.

Als we het over arrays hebben, dan hebben we altijd een sleutel (of key, of index) en een waarde (of value).

Array()

De eerst manier om een array te vullen is door gebruik te maken van de key => value-syntax:

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml">3 <head>4 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />5 <title>Arrays</title>6 </head>7 <body>8 <?php9 $fruit = array("Appel" => "Groen", "Peer" => "Groen", "Banaan" => "Geel", "Kers" => "Rood", "Citroen" => "Geel", "Pruim" => "Paars", "Aardbei" => "Rood");10 ?>11 <pre>Associatieve array12 <?php print_r($fruit); ?></pre>13 </body>14 </html>

Of iets leesbaarder:

9 $fruit = array(10 "Appel" => "Groen", 11 "Peer" => "Groen", 12 "Banaan" => "Geel", 13 "Kers" => "Rood", 14 "Citroen" => "Geel", 15 "Pruim" => "Paars", 16 "Aardbei" => "Rood");17 ?>18 <pre>Associatieve array19 <?php print_r($fruit); ?></pre>

Arrays waarvan de sleutel aangeduid wordt door een string-waarde, worden associatieve arrays genoemd. Numerieke arrays maken gebruik van een integer-waarde als sleutel:

20 <?php21 $fruit = array(22 0 => "Groen", 23 1 => "Groen", 24 2 => "Geel", 25 3 => "Rood", 26 4 => "Geel", 27 5 => "Paars", 28 6 => "Rood");29 ?>30 <pre>Nummerieke array31 <?php print_r($fruit); ?></pre>

62 | P a g i n a

Page 73: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Bij het gebruik van numerieke arrays, beginnen we meestal op positie 0.

Een numerieke array kun je vullen zonder het opgeven van de numerieke indexen (keys). De index wordt dan automatisch aangemaakt (laatste index + 1). Dit is handig bij het vullen van een array met behulp van een lus.

32 <?php33 for($jaar = 2012; $jaar <= 2050; $jaar += 4){34 $schrikkeljaren[] = $jaar;35 }36 ?>37 <pre>Numerieke array gevuld met een lus38 <?php print_r($schrikkeljaren); ?></pre>

Soms speelt de exacte positie geen rol, en maken we volgende opsomming::

39 <?php $fruit = array("Groen", "Groen", "Geel", "Rood", "Geel", "Paars", "Rood"); ?>

40 <pre>Nummerieke array41 <?php print_r($fruit); ?></pre>

Ook hier zal het eerste element automatisch op 0 beginnen en krijgt het volgende element de index 1, enz.

Als je gegevens wil bijvoegen bij een array kun je geen gebruik maken van de array()-functie of je moet gebruik maken van de functies array_push() en array_unshift(). Óf je maakt gebruik van volgende methode.

Vierkante haakjes [ ]

Om een array te wijzigen wordt de notatie met vierkante haken het meest gebruikt:

42 <?php43 $assoc_fruit["Appel"] = "Groen";44 $assoc_fruit["Peer"] = "Groen";45 $assoc_fruit["Banaan"] = "Geel";46 $assoc_fruit["Kers"] = "Rood";47 $assoc_fruit["Citroen"] = "Geel";48 $assoc_fruit["Pruim"] = "Paars";49 $assoc_fruit["Aardbei"] = "Rood";50 ?>51 <pre>Associatieve array aanpassen52 <?php print_r($assoc_fruit); ?></pre>

Je kan op gelijkaardige manier ook gebruik maken van de nummers. Waarvan de meest eenvoudige vorm is:

53 <?php54 $num_fruit[0] = "Groen";55 $num_fruit[1] = "Groen";56 $num_fruit[2] = "Geel";57 $num_fruit[3] = "Rood";58 $num_fruit[4] = "Geel";59 $num_fruit[5] = "Paars";60 $num_fruit[6] = "Rood";61 ?>62 <pre>Numerieke array aanpassen63 <?php print_r($num_fruit); ?></pre>

Je kunt dit gebruiken om een array die gedefinieerd is met array(), te wijzigen of gegevens toe te voegen.

63 | P a g i n a

Page 74: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Opvragen van de gegevens

Als we nu deze array oproepen met als gegevens de naam, dan verkrijgen we de er aan toegekende waarde, in dit geval het kleur:

64 <p>Een appel is <?php print $assoc_fruit['Appel'] ?>.<br />65 Een aardbei is <?php print $assoc_fruit['Aardbei'] ?>.</p>

Bij numerieke arrays gebruiken we het volgnummer:

66 <p>Het eerste stuk fruit is <?php print $num_fruit[0] ?>.<br />67 Het zevende stuk fruit is <?php print $num_fruit[6] ?>.</p>

Nog een voorbeeld:

68 <p><?php69 $autos = array('Ford', 'Renault', 'Jaguar', 'BMW');70 for ($i=0; $i < 4; $i++): ?>71 Auto <?php print $i; ?>: <?php print $autos[$i]; ?><br />72 <?php endfor; ?></p>

Bij het uitvoeren van dit script wordt er op de eerste regel een array (autos) aangemaakt. De pointer wijst nu nog naar positie 0 en zal dus ook de string-waarde 'Ford' op deze positie bewaren. Intern wordt de pointer verhoogd en wijst nu naar positie 1 die nu nog leeg is. Vervolgens wordt 'Renault' op positie 1 bewaard, 'Jaguar' op 2 en 'BMW' op 3.

In de daaropvolgende for-lus wordt er 4 maal een tekst weergegeven, op de plaats van $i wordt achtereenvolgens 0, 1, 2 en 3 ingevuld, en op de plaats van $autos[$i] de overeenkomstige waarde uit de array. Vervolgens wordt de regel afgesloten met een nieuwe regel.

Gemengde arrays

Persoonsgegevens zijn ideaal om een gemengde array mee te demonstreren:

73 <?php74 $persoon['voornaam'] = 'Dany';75 $persoon['naam'] = 'Pinoy';76 $persoon['straat'] = 'Prachtstraat';77 $persoon['huisnummer'] = 4;78 $persoon['contact']['telefoon'] = '050 33 76 69';79 $persoon['contact']['gsm'] = '0494 12 35 15';80 $persoon['contact']['web'] = 'webserver.snt';81 $persoon['contact']['email'] = '[email protected]';82 ?>83 <pre>Gemengde array84 <?php print_r($persoon); ?></pre>

Deze array bevat elementen van het type string, integer en array. Een andere manier om deze array op te vullen is:

85 <?php86 $persoon = array(87 'voornaam' => 'Dany',88 'naam' => 'Pinoy',89 'straat' => 'Prachtstraat',90 'huisnummer' => 4,91 'contact' => array(92 'telefoon' => '050 33 76 69',93 'gsm' => '0494 12 35 15',94 'web' => 'webserver.snt',95 'email' => '[email protected]'96 )

64 | P a g i n a

Page 75: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

97 );98 ?>99 <pre>Gemengde array initialiseren100 <?php print_r($persoon); ?></pre>

Om gegevens op te vragen, gaan we als volgt te werk:

101 <p>We krijgen les van <?php print $persoon['voornaam']; ?> <?php print $persoon['naam']; ?>.<br />

102 De lesgever kun je bellen op de nummers <?php print $persoon['contact']['telefoon']; ?> en <?php print $persoon['contact']['gsm']; ?>.</p>

Bij het gebruik van strings als key-naam moeten we ook gebruik maken van aanhalingstekens. Op zich speelt het niet veel rol welke je gebruikt, maar enkele worden het meest gebruikt.

$fruit['banaan'] = 'geel';

Als je een variabele gebruikt als key (index), plaats je deze niet tussen aanhalingstekens:$vrucht = 'banaan';$fruit[$vrucht] = 'geel';

Array leegmaken

Om een variabele te verwijderen, maak je gebruik van de functie unset(). Ook voor Arrays kunnen we dit gebruiken:

unset ($persoon['voornaam']);unset ($persoon);

Met de eerste regel maken we het genoemde element leeg, met de tweede de volledige array.

Array-gerelateerde functies

Een overzicht van alle mogelijke functies vind je hier: http://be.php.net/manual/en/book.array.php.

Hieruit halen we de volgende handige functies:

Afdrukken van array-inhoud

Om een idee te krijgen wat er in een array zit, kunnen we, naar analogie met de print-functie, de print_r()-functie gebruiken. Deze geeft weer wat er exact in een array zit. De output die dit oplevert is niet geschikt om te gebruiken in een uiteindelijke website, maar kan wel gebruikt worden, om tijdelijk de resultaten tijdens het ontwikkelen weer te geven.

Sorteren van arrays

De meest eenvoudige functie is sort(). Deze functie sorteert alle elementen van een array in oplopende volgorde (van klein naar groot, alfabetisch). De nieuwe array wordt opgeslagen in de oorspronkelijke array. De oorspronkelijke inhoud gaat dus verloren! Een voorbeeld om dit te illustreren:

103 <?php $groenten = array('sla', 'wortelen', 'aardappelen', 'ajuin'); ?>

104 <pre>Ongesorteerde groenten:105 <?php print_r($groenten); ?>106 </pre>107 <?php sort($groenten); ?>108 <pre>Gesorteerde groeten:109 <?php print_r($groenten); ?></pre>

65 | P a g i n a

Page 76: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Hier wordt print_r() gebruikt om de inhoud van de array af te drukken, eenmaal niet gesorteerd, eenmaal wel gesorteerd.

De tag <pre></pre> zorgt ervoor dat de uitvoer in de browser netjes weergegeven wordt. Deze wordt afgeraden om te gebruiken in je uiteindelijke script.

Bij het aanmaken van de nieuwe array, komt "aardappelen" op positie 0 te staan, "ajuin" op 1, ... Als je gebruik maakt van een associatieve array, dan gaan de oorspronkelijke sleutels ook verloren.

rsort() zal onze tabel omgekeerd sorteren.

Met asort() worden de keys (sleutels) bij de values (waarden) gehouden.

110 <?php111 $fruit = array(112 'citroen' => 'geel', 113 'sinaasappel' => 'oranje', 114 'banaan' => 'geel', 115 'appel' => 'groen'116 );117 ?>118 <pre>Ongesorteerd fruit:119 <?php print_r($fruit); ?></pre>120 <?php asort($fruit); ?>121 <pre>Op kleur gesorteerd fruit:122 <?php print_r($fruit); ?></pre>

M.a.w. de array wordt gesorteerd op de waarden en de associatieve sleutels blijven bij de overeenkomstige waarden staan.

arsort() zal hetzelfde doen als asort, maar in omgekeerde volgorde.

Je kan ook sorteren op de key (sleutel), terwijl de waarde bij de betreffende key (sleutel) blijft met ksort() of omgekeerd met krsort().

123 <?php ksort($fruit); ?>124 <pre>Op naam gesorteerd fruit:125 <?php print_r($fruit); ?></pre>

Tellen van het aantal elementen in een array

Kunnen we met de zelfverklarende functie count():

126 <p>De array $fruit bevat <?php print count($fruit); ?> elementen, de array $groenten bevat <?php print count($groenten); ?> elementen.</p>

Count() geeft een getal terug die het aantal elementen aangeeft, of 0 indien de array leeg is of niet bestaat, controleer dus eerst met de functie is_array() om zeker te zijn van het resultaat.

Als je een array hebt waar een aantal elementen meerdere malen in voorkomen, en je wilt weten hoeveel maal elk element voorkomt, gebruiken we array_count_values(). Deze functie geeft een array terug met enkel de waarden van de oude array als nieuwe sleutel, en het aantal maal dat deze voorkomt als nieuwe waarde:

127 <?php128 $huisdieren = array(129 "Dirk" => "hond", 130 "Sophie" => "paard", 131 "Ingrid" => "eekhoorn", 132 "Lucie" => "paard", 133 "Bart" => "hond"134 );

66 | P a g i n a

Page 77: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

135 $aantal_huisdieren = array_count_values($huisdieren);136 ?>137 <p><?php print $aantal_huisdieren["hond"]; ?> personen hebben als

huisdier een hond.</p>

Strings omzetten naar arrays en omgekeerd

Het kan voorkomen dat je een string hebt, die je wilt opslaan als een array. Hiervoor kunnen we de functie explode() gebruiken:

138 <?php139 $zin = "De woorden in deze zin kan je met een array eenvoudiger

bewerken.";140 $woordarray = explode (" ", $zin);141 ?>142 <p><?php print $zin; ?></p>143 <pre>Bovenstaande zin bevat de volgende woorden:144 <?php print_r($woordarray); ?></pre>

Regel 140 splitst de zin in verschillende array-elementen, daarbij wordt een spatie als scheidingsteken tussen de verschillende woorden (array-elementen) gebruikt.

Omgekeerd kan ook met implode():

145 <?php 146 $mijnhuisdieren = array("hond", "kat", "parkiet", "goudvis");147 $huisdieren_string = implode (", ", $mijnhuisdieren);148 ?>149 <p>Ik heb <?php print count($mijnhuisdieren); ?> huisdieren: <?php

print $huisdieren_string ?>.</p>

De functie join() heeft hetzelfde resultaat.

Minimum en maximum waarden zoeken

Het maximum en het minimum zijn te vinden met max() en min():

150 <?php $meetwaarden = array(1, 56, -5, 16); ?>151 <p>De meetwaarden <?php print implode (", ", $meetwaarden); ?>

variëren tussen het maximum <?php print max($meetwaarden); ?> en het minimum <?php print min($meetwaarden); ?>.</p>

Gegevens zoeken in een array

Met in_array() kunnen we zoeken of een bepaalde waarde voorkomt in de array:

152 <?php if(in_array(1, $meetwaarden)): ?>153 <p>De meetwaarden bevatten de waarde 1.</p>154 <?php elseif(in_array(10, $meetwaarden)): ?>155 <p>De meetwaarden bevatten de waarde 10.</p>156 <?php endif; ?>

Met de functie array_key_exists(): controleer je of een bepaalde sleutel in een array voorkomt:

157 <?php if(array_key_exists("Bart", $huisdieren)): ?>158 <p>Bart heeft als huisdier een <?php print

$huisdieren['Bart']; ?>.</p>159 <?php else: ?>160 <p>Bart heeft geen huisdier.<p>161 <?php endif; ?>

De sleutels haal je uit een array met array_keys():67 | P a g i n a

Page 78: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

162 <?php $eigenaars = array_keys($huisdieren); ?>163 <p>De huisdieren hebben de volgende baasjes: <?php print implode

(", ", $eigenaars); ?>.</p>

Om enkel de waarden over te houden gebruiken we array_values(), die een nieuwe array oplevert, met enkel de waarden, zonder de associatieve sleutels.

Een array met enkel de unieke waarden halen we op met array_unique().

Arrays doorlopen

Een array kun je doorlopen met een for-lus, in combinatie met een count-functie. Maar het nadeel hiervan is, als je de index ook nodig hebt, dat je hier het raden naar hebt. Bij numerieke arrays is dit geen zo'n probleem, maar bij associatieve arrays kunnen we niet verder.

Met de foreach-lus kunnen we eenvoudig een array doorlopen en er alle elementen van weergeven. De foreach loopt totdat alle elementen de revue gepasseerd zijn. Een foreach kunnen we op 2 manieren gebruiken, om enkel de values weer te geven en om de values én de keys weer te geven:

164 <p>Mijn vrienden hebben de volgende huisdieren: 165 <?php foreach($huisdieren as $huisdier){ 166 print $tussenstuk . $huisdier;167 $tussenstuk = ", ";168 }169 ?>170 .</p>171 <p>172 <?php foreach($huisdieren as $baas => $huisdier): ?>173 <?php print $baas; ?> heeft als huisdier een <?php print

$huisdier; ?>.<br />174 <?php endforeach; ?>175 </p>

Let op het gebruik van HTML code binnen de laatste foreach lus.

Voorgedefinieerde arrays

Er zijn een aantal variabelen, voornamelijk arrays, die gebruikt worden voor speciale doeleinden.

Het grootste gedeelte hiervan zijn zogenaamde superglobals, omdat ze voornamelijk dienen om gegevens tussen pagina's uit te wisselen.

$_SESSION, $_POST, $_GET en $_REQUEST.

Deze zullen we vaak gebruiken, om waarden van een pagina, voornamelijk via formulieren en hyperlinks door te sturen naar een volgende pagina. De $_POST en de $_GET zijn we al tegengekomen, de $_REQUEST is een combinatie van de $_POST en de $_GET, maar het gebruik ervan wordt afgeraden. De $_SESSION zullen we gebruiken om gegevens over meerdere pagina's toegankelijk te maken.

$_SERVER

Variabelen die bepaalde instellingen van de server bevatten. Deze kunnen enkel gelezen worden. De opdracht phpinfo() geeft alle instellingen van PHP op de webserver weer.

$_COOKIE

Variabelen die gebruikt worden voor en door cookies. Met cookies kunnen we instellingen opslaan op de computer van de bezoeker van de webpagina. Met deze cookies kunnen we bijvoorbeeld een gebruiker omleiden naar een op voorhand gekozen taal, of een gebruiker

68 | P a g i n a

Page 79: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

automatisch laten aanmelden op een pagina waar hij bij een vorig bezoek zijn gegevens achtergelaten heeft.

$_FILES

Een variabele die namen en gegevens bevat van geüploade bestanden. Deze kunnen we dan gebruiken om bijvoorbeeld een fotoboek mee te maken.

$GLOBALS

Deze variabele wordt gebruikt om globale variabelen te gebruiken, die over verschillende functies heen gebruikt worden, voorbeelden zijn gegevens van databases, zoals de naam ervan, de databasegebruiker, ...

Op de site php.net staat een volledige Array Manual met alle informatie i.v.m. arrays in PHP.

Oefeningen

Het project van deze cursus: Webshop

Om het script nog flexibeler te maken, zullen we onze gegevens niet meer in gewone variabelen plaatsen maar in arrays.

Ook kunnen we nu een winkelmandje toevoegen om weer te geven welke gegevens er al besteld zijn.

Opslaan van de gegevens in arrays

Plaats de volgende PHP code op de juiste plaats in model.php:

switch ($cat){ // items naargelang categorie case 'Webdesign': // categorie Webdesign $items = array( "Dreamweaver Deel 1", "Dreamweaver Deel 2", "Javascript", "PHP", "Dreamweaver Eindwerk" ); break;

Ga op dezelfde manier te werk om de andere categorieën in het array $items op te slaan.

Aangezien we met een foreach lus gaan werken, hebben we de vier regels om het aantal items te berekenen niet meer nodig. Plaats deze voorlopig tussen /* en */ waardoor deze regels niet langer actief zijn (ze worden als commentaar beschouwd). Nadat alle aanpassingen uitgevoerd werden en alles naar behoren werkt, mag je deze uitgeschakelde code verwijderen.

Doorlopen van de gegevens

In index.php (View) passen we de regels om de items weer te geven aan:

<?php foreach ($items as $item): ?> <tr> <td><?php print $item; ?></td> <td><a href="inschrijven.php?cursus=<?php print urlencode($item); ?>&cat=<?php print $cat; ?>">Inschrijven</a></td> </tr><?php endforeach; ?>

Na het succesvol testen van de webshop, mag je de door commentaar uitgeschakelde regels verwijderen.

69 | P a g i n a

Page 80: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Meerdere categorieën

Als we nu het aantal categorieën ook makkelijker bewerkbaar willen maken, dan kunnen we deze ook in een array plaatsen.

Dit wordt de array voor de categorieën:

$categorieen = array( "Webdesign", ................ ................ ................);

Voeg deze code toe aan het begin van het bestand ..................................................

De regel waarmee je de standaard categorie vastlegt, wordt dan:

$cat = $categorieen[0]; // standaard categorie

M.a.w. de eerste categorie in het array $categorieen.

De hyperlinks met de categorieën worden dan opgebouwd met:

<p><?php foreach(................ as $categorie): ?> <a href="index.php?cat=<?php print $categorie; ?>"><?php print $categorie; ?></a> <?php if($categorie != $categorieen[count($categorieen) - 1]): ?> | <?php ................ ?><?php ................ ?></p>

Om de items een omschrijving en een prijs te geven gaan we de array items omvormen tot een gemengde array:

case 'Webdesign': // categorie Webdesign $items = array( array( "naam" => "Dreamweaver Deel 1", "omschrijving" => "Basis webdesign", "prijs" => 77.00 ), array( "naam" => "Dreamweaver Deel 2", "omschrijving" => "Gevorderde webdesign", "prijs" => 77.00 ), array( "naam" => "Javascript", "omschrijving" => "Programmeren in de browser", "prijs" => 77.00 ), array( "naam" => "PHP", "omschrijving" => "Programmeren op de server", "prijs" => 77.00 ), array( "naam" => "Dreamweaver Eindwerk", "omschrijving" => "Webdesign in de praktijk",

70 | P a g i n a

Page 81: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

"prijs" => 77.00 ) ); break;

De tabel wordt dan als volgt aangepast:

<table border="0"> <tr> <th>Cursus</th> <th>Omschrijving</th> <th>Prijs</th> <th>Inschrijven</th> </tr><?php foreach ($items as $item): ?> <tr> <td><?php print $item['naam']; ?></td> <td><?php ................ ?></td> <td>&#8364; <?php print $item['prijs']; ?></td> <td><a href="inschrijven.php?cursus=<?php print urlencode($item['naam']); ?>&cat=<?php print $cat; ?>">Inschrijven</a></td> </tr><?php endforeach; ?></table>

Pas de andere categorieën aan tot je de volgende resultaten bekomt:

71 | P a g i n a

Page 82: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Speelkaarten

Definieer twee array's, één voor de kleuren van de kaarten (Harten, Ruiten, Schoppen en Klaveren) en één voor waarden van de kaarten (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, Boer, Vrouw, Heer).

Maak met behulp van deze twee array's een derde array voor alle 52 speelkaarten.

Laat uit deze lijst een willekeurige kaart weergeven (gebruik daarvoor de functie array_rand(): de werkwijze en correcte notatie zoek je op de site php.net).

10 willekeurige speelkaarten trekken

Pas de vorige oefening aan zodat er 10 willekeurige (en unieke) speelkaarten in de browser worden weergegeven.

10 willekeurige speelkaarten grafisch weergeven

Pas de vorige oefening aan zodat de afbeeldingen van de 10 willekeurige kaarten in de browser weergegeven worden.

De HTML code om een afbeelding van de Harten 1 kaart (uit de gepubliceerde map kaarten) weer te geven is:

<img src="kaarten/harten_1.svg" />

Bezoeker bepaalt aantal te trekken speelkaarten

Pas de vorige oefening aan zodat de bezoeker kan kiezen hoeveel kaarten hij wil zien. Laat het formulier wijzen naar de eigen pagina: als resultaat heb je dus 1 pagina, waarin de gebruiker het aantal kaarten kiest, en waarin het aantal weergegeven wordt.

HTML en arrays

Ook in html kun je arrays gebruiken voor input-velden, dit ziet er als volgt uit:

<input type="text" name="getallen[]><input type="text" name="getallen[]><input type="text" name="getallen[]>

Maak nu een script waarbij een gebruiker kan bepalen hoeveel getallen hij wil ingeven.

Daarna geef je het gevraagde aantal velden weer. Hier kan de gebruiker dan zijn getallen invullen.

Bij het klikken op de knop Berekenen, wordt het maximum, het minimum en het gemiddelde weergegeven. Daaronder geef je de getallen in oplopende volgorde weer.

72 | P a g i n a

Page 83: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

PHP FunctiesAlgemeen

Functies zijn mini-programmaatjes, die een aantal zaken voor ons uitvoeren. In het vorige hoofdstuk hebben we al een paar eenvoudige functies gezien, zoals print(), echo(), unset(), isset(), is_int(), ...

In dit hoofdstuk bekijken we functies nog wat meer in detail en zullen we zelf onze eigen functies maken.

Voorbeelden

Gemiddelde berekenen

In een bepaald programma moeten we regelmatig het gemiddelde berekenen van een onbekend aantal getallen. We weten dat het berekenen van het gemiddelde het optellen van de getallen is, en daarna deze som delen door het aantal getallen.

Dit kan een oplossing zijn:

1 <?php //functies.php2 function som($nummers){3 $som = 0;4 foreach ($nummers as $nummer){5 $som += $nummer;6 }7 return $som;8 }9 function gemiddelde(){10 $aantal = func_num_args();11 $getallen = func_get_args();12 $som = som($getallen);13 $gem = $som / $aantal;14 return ($gem);15 }16 $nummer1 = 2; 17 $nummer2 = 5; 18 $nummer3 = 8;19 $nummer4 = 3; 20 $nummer5 = 6;21 $het_gemiddelde = gemiddelde($nummer1, $nummer2, $nummer3, $nummer4,

$nummer5);22 ?>23 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">24 <html xmlns="http://www.w3.org/1999/xhtml">25 <head>

73 | P a g i n a

Page 84: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

26 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

27 <title>Functies</title>28 </head>29 <body>30 <p>Het gemiddelde van de getallen is <?php print $het_gemiddelde; ?

>.</p>31 </body>32 </html>

Opbouw van functies

Voorbeeld 1

In de PHP-handleiding (php.net) zie je dat functies als volgt uitgelegd worden:

string addslashes (string $str)

Dit lezen we als volgt:

• de naam van de functie is addslashes; • de waarde die de functie addslashes teruglevert is van het type string; • de functie neemt 1 argument aan; • het eerste argument vertelt de functie in welk type het argument doorgegeven moet

worden, in dit geval is dit het type string;

Uit de handleiding kunnen we iets meer details over deze functie halen. Een uittreksel:

addslashes

(PHP 4, PHP 5)

addslashes — Quote string with slashes

Description

string addslashes ( string $str )

Returns a string with backslashes before characters that need to be quoted in database queries etc. These characters are single quote ('), double quote ("), backslash (\) and NUL (the NULL byte).

An example use of addslashes() is when you're entering data into a database. For example, to insert the name O'reilly into a database, you will need to escape it. It's highly recommended to use DBMS specific escape function (e.g. mysqli_real_escape_string() for MySQL or pg_escape_string() for PostgreSQL), but if the DBMS you're using does't have an escape function and the DBMS uses \ to escape special chars, you can use this function. This would only be to get the data into the database, the extra \ will not be inserted. Having the PHP directive magic_quotes_sybase set to on will mean ' is instead escaped with another '.

The PHP directive magic_quotes_gpc is on by default, and it essentially runs addslashes() on all GET, POST, and COOKIE data. Do not use addslashes() on strings that have already been escaped with magic_quotes_gpc as you'll then do double escaping. The function get_magic_quotes_gpc() may come in handy for checking this.

De functie addslashes is toegankelijk in versie 4 én 5 van PHP. 74 | P a g i n a

Page 85: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Deze functie zal dus een backslash toevoegen voor een aanhalingsteken ('), een dubbel aanhalingsteken ("), een backslash (\) of voor NULL.

Dit is vooral van belang als je een string wilt gebruiken in databasequeries: als er in je string gewone aanhalingstekens zouden staan, zal de query zich hierin verslikken.

Hou er wel rekening mee dat dit standaard al gedaan wordt, en dat het aangewezen is om eerst te controleren met get_magic_quotes_gpc() of dit al werd uitgevoerd.

Voorbeeld 2

Een 2de voorbeeldje die in dezelfde reeks thuishoort is volgende:

string htmlspecialchars ( string string [, int quote_style])

Deze functie vertelt ons het volgende:

• de functienaam is htmlspecialchars; • de functie levert als resultaat een string op; • de functie neemt 1 verplicht argument string van het type string; • de functie neemt een 2de optioneel argument (te zien aan de vierkante haakjes [])

quotestyle van het type integer;

Voor meer uitleg weer een stukje uit de handleiding:

htmlspecialchars

(PHP 4, PHP 5)

htmlspecialchars — Convert special characters to HTML entities

Description

string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT [, string $charset [, bool $double_encode = true ]]] )

Certain characters have special significance in HTML, and should be represented by HTML entities if they are to preserve their meanings. This function returns a string with some of these conversions made; the translations made are those most useful for everyday web programming. If you require all HTML character entities to be translated, use htmlentities() instead.

This function is useful in preventing user-supplied text from containing HTML markup, such as in a message board or guest book application.

The translations performed are:

'&' (ampersand) becomes '&amp;' '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set. ''' (single quote) becomes '&#039;' only when ENT_QUOTES is set. '<' (less than) becomes '&lt;' '>' (greater than) becomes '&gt;'

Deze functie zorgt er dus voor dat ingevoerde karakters &, ", ', < en > omgezet worden naar een bruikbare code. Dit zal er voor zorgen dat code die ingegeven wordt via gastenboeken of forums, geen HTML-code zal produceren. Een uitgebreider voorbeeld:

31 <?php32 $var = "<a href='http://www.snt.be'>SNT Brugge</a>";33 ?>34 <p>De variabele bevat HTML-code: <?php print $var; ?>.<br />

75 | P a g i n a

Page 86: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

35 HTML-code weergeven: <?php print htmlspecialchars($var); ?>.</p>

Nog functies

Op de officiële website van PHP (php.net) vind je de volledige lijst met alle PHP-functies, maar in de loop van de cursus zullen we er een flink aantal tegenkomen, waarvan je de volledige uitleg altijd op deze site terugvindt.

Van print en echo, en nog andere, hebben we gezegd dat dit niet echt functies zijn, maar language constructions. Het verschil met functies zit er hem in, dat echte functies een waarde teruggegeven aan het programma zelf, en language constructions niet. Om het verschil duidelijk te maken, worden functies altijd met ronde haakjes gebruikt, en language constructs niet.

Eigen functies

Naast het gebruik van bestaande functies, kunnen we ook eigen functies maken. Zoals we hierboven gezien hebben, kunnen we functies aanroepen, met behulp van parameters en wordt er door de meeste functies een waarde teruggegeven.

Een functie begint altijd met het kernwoord function, gevolgd door de naam van de functie – let er wel op dat deze nog niet bestaat in de bestaande functielijst, anders krijg je conflicten.

36 <?php37 function product($argument1, $argument2){38 $product = $argument1 * $argument2;39 return $product;40 }41 $getal1 = 10;42 $getal2 = 20;43 ?>44 <p>Het product van <?php print $getal1; ?> en <?php print $getal2; ?

> is <?php print product($getal1, $getal2); ?>.</p>

Hoe zit dit in mekaar?

Voor de duidelijkheid plaatsen we de functie vóór de rest van de code. Dit is niet verplicht, maar het maakt de code wel overzichtelijker. Nog beter is trouwens de functies te groeperen in een bibliotheekbestand.

De functie begint met het kernwoord function, gevolgd door de functienaam. Let er op: deze is niet hoofdlettergevoelig zoals bij variabelen wel het geval is (product = Product = PRODUCT = producT). Probeer wel je functienaam op te bouwen volgens het camelCase-principe.

Tussen haakjes worden de namen van de parameters gebruikt, zoals die in de functie gebruikt zullen worden, deze bepalen ook ineens het aantal mogelijke argumenten.

Na de haakjes openen we de accolades, waarin de functie uiteindelijk begint. Binnen deze functie mag elke geldige PHP-code gebruikt worden. Het is zelfs mogelijk om andere, eigen, functies op te roepen, of om de dezelfde functie aan te roepen (recursieve functies). Vergeet ook niet om de accolades op het einde opnieuw te sluiten. Na deze laatste sluitaccolade plaats je geen puntkomma.

De waarde die aan het hoofdscript wordt teruggeleverd, wordt bepaald door de returnwaarde. Deze is niet altijd nodig, soms zul je het afdrukken van de som ook binnen de functie kunnen afwerken, maar ook dan nog wordt er een returnwaarde verwacht door de functie, om eventuele testen te kunnen uitvoeren. Meestal wordt er een true of een false aan het hoofdprogramma teruggegeven, naargelang de functie al dan niet gelukt is.

Binnen het eigenlijke script, kunnen we de functie dan gebruiken, zoals een normale functie.

76 | P a g i n a

Page 87: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Bij het uitvoeren van het script, herkent de parser de functie en weet dat deze bestaat, zodra er in het script dan een aanroep gebeurt naar de functie, wordt de functie op de plaats van de aanroep gezet.

Variabelen en functies

Het gebruik van variabelen kan nu wel verwarrend worden, als we binnen de functie én binnen het hoofdscript gebruik willen maken van variabelen met dezelfde namen.

Variabelen zijn enkel geldig in het script dat uitgevoerd wordt; zodra er naar een deelfunctie gesprongen wordt, zijn deze variabelen ontoegankelijk. Het is ook zo dat de inhoud van een variabele altijd verloren gaat als er gesprongen wordt naar een volgende pagina. Om dit probleem op te lossen maken we gebruik van globale variabelen.

Lokale en globale variabelen

Lokale variabelen

Variabelen zijn, zonder speciale declaratie, altijd local. Dit betekent dat ze niet bereikbaar zijn buiten de functie of buiten het hoofdscript. Een voorbeeld:

45 <?php46 function lokaal(){47 $a = 10;48 print $a;49 }50 $a = 4;51 ?>52 <p style="margin-bottom:0">De waarde van de lokale variabele $a:</p>53 <ul style="margin-top:0">54 <li>voor de functie-aanroep: a = <?php print $a; ?>,</li>55 <li>binnen de functie: a = <?php lokaal(); ?>,</li>56 <li>na de functie-aanroep: a = <?php print $a; ?>.</li>57 </ul>

Neem bovenstaande over in, en sla op. Controleer de uitvoer. Wat zie je? .............................

Om een variabele toch bereikbaar te maken buiten deze functie maken we gebruik van het sleutelwoord global.

Globale variabelen

Onze gebruikte variabelen zijn wel beschikbaar over ons gehele script, daarom noemen we deze variabelen global. Het global maken kan wel enkel en alleen binnen de functie.

Een manier om variabelen verder beschikbaar te hebben, is het gebruik van de speciale arrayvariabele $GLOBALS.

58 <?php59 function globaal(){60 $GLOBALS['a'] = 10;61 print $GLOBALS['a'];62 }63 $a = 4;64 ?>65 <p style="margin-bottom:0">De waarde van de globale variabele

$a:</p>66 <ul style="margin-top:0">67 <li>voor de functie-aanroep: a = <?php print $a; ?>,</li>68 <li>binnen de functie: a = <?php globaal(); ?>,</li>69 <li>na de functie-aanroep: a = <?php print $a; ?>.</li>70 </ul>

77 | P a g i n a

Page 88: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

En voer opnieuw uit. Wat is er gebeurd? ...........................................................................

Variabelen doorgeven via verwijzing (referentie)

Een andere manier om variabelen aan een functie door te geven is door te verwijzen naar het adres waar de variabele wordt opgeslagen. Zo wordt de variabele ook bereikbaar van buiten de functie. Om te verwijzen naar het adres van een variabele, laten we deze variabele voorafgaan door een ampersand (&). Voorbeeld:

71 <?php72 function incrementeren(&$getal){73 $getal++;74 }75 $a = 5;76 ?>77 <p style="margin-bottom:0">De waarde van de variabele doorgegeven

via referentie $a:</p>78 <ul style="margin-top:0">79 <li>voor de functie-aanroep: a = <?php print $a; ?>,</li>80 <li><?php incrementeren($a); ?>na de functie-aanroep: a = <?php

print $a; ?>.</li>81 </ul>

Als gebruiker van een functie moet je dus niet weten of deze functie met het adres werkt, of met de variabele zelf. Het is natuurlijk wel van belang om te weten of je originele waarde niet gewijzigd werd..

Statische variabelen

In een normale functie gaat de inhoud van variabelen verloren, zodra de functie verlaten wordt. Om deze inhoud en variabele toch te bewaren, maken we gebruik van statische variabelen.

De waarde van dergelijke variabele wordt telkens bijgehouden als de functie verlaten wordt. De variabele is echter niet toegankelijk buiten de functie!

Een voorbeeld:

82 <?php83 function statisch(){84 static $a = 1;85 print "$a";86 $a = $a + 1;87 }88 ?>89 <p style="margin-bottom:0">De waarde van de statische variabele

$a:</p>90 <ul style="margin-top:0">91 <li>bij de eerste functie-aanroep: a = <?php statisch(); ?>,</li>92 <li>bij de tweede functie-aanroep: a = <?php statisch(); ?>,</li>93 <li>bij de derde functie-aanroep: a = <?php statisch(); ?>.</li>94 </ul>

Tik dit in, sla op, voer uit en bekijk de uitvoer. Hoe komt dit? ..............................................

Argument met een standaardwaarde

Het is ook mogelijk om een argument in een functie reeds een standaard waarde mee te geven. Dit kan het gebruik van een functie soms eenvoudiger maken:

95 <?php 96 function dessert($dessert = "rijstpap"){

78 | P a g i n a

Page 89: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

97 print $dessert;98 return true;99 }100 $morgen = "yoghurt";101 ?>102 <p style="margin-bottom:0">Standaard argumenten:</p>103 <ul style="margin-top:0">104 <li>Vandaag is er <?php dessert(); ?> als dessert.</li>105 <li>Morgen is er <?php dessert($morgen); ?> als dessert.</li>106 </ul>

Aantal argumenten opvragen

Soms wil je een functie, waarbij het exacte aantal argumenten niet vastligt. Met de functies func_num_args(), func_get_arg() en func_get_args() kunnen we hier mee overweg:

107 <?php108 function aantalArgumenten(){109 $argumenten['aantal'] = func_num_args();110 $argumenten['twee'] = func_get_arg(1);111 $argumenten['argumenten'] = func_get_args(); 112 return $argumenten;113 }114 ?>115 <pre>Functies met een variabel aantal argumenten:116 <?php print_r(aantalArgumenten('eerste', 'tweede', 'derde')); ?

></pre>

Let goed op het verschil tussen func_get_arg() en func_get_args(). De eerste levert één waarde op, de tweede een array.

Bij func_get_arg() bevat de array-waarde met de index 0 het eerste argument.

Recycleren van functies

In bovenstaande voorbeelden hebben we de functies in de pagina opgenomen, maar meestal is het handiger om een functie in meerdere pagina's te kunnen gebruiken, denk maar aan een test of je aangemeld bent, of een teller die het bezoek op elke pagina moet bijhouden, of zelfs een banner die op elke pagina voorkomt, of …

Al onze functies zullen we opslaan in bibliotheekbestanden. Deze bestanden kunnen we dan importeren door gebruik te maken van include- en require-statements. Deze statements zorgen ervoor, dat we een script kunnen binnenhalen in een pagina of een ander script. Je kunt het het best vergelijken met externe javascript.

Stel dat je een volledige bibliotheek met eigen functies hebt aangelegd, en dat je deze in verschillende pagina's of zelfs verschillende websites wilt gebruiken.

Om niet telkens de volledige functies te moeten kopiëren, sla je al je eigen functies op in bibliotheekbestanden. Deze bibliotheekbestanden importeren we in andere scripts met de control-structure include().

Maak daarvoor een nieuwe PHP-pagina en verwijder indien nodig alle HTML code.

Verplaats alle PHP code met functies uit de oorspronkelijke pagina en plak deze in de nieuwe PHP-pagina (script).

1 <?php //functies.inc.php2 function som($nummers){3 $som = 0;4 foreach ($nummers as $nummer){5 $som += $nummer;

79 | P a g i n a

Page 90: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

6 }7 return $som;8 }9 function gemiddelde(){10 $aantal = func_num_args();11 $getallen = func_get_args();12 $som = som($getallen);13 $gem = $som / $aantal;14 return ($gem);15 }16 function product($argument1, $argument2){17 $product = $argument1 * $argument2;18 return $product;19 }20 function lokaal(){21 $a = 10;22 print $a;23 }24 function globaal(){25 $GLOBALS['a'] = 10;26 print $GLOBALS['a'];27 }28 function incrementeren(&$getal){29 $getal++;30 }31 function statisch(){32 static $a = 1;33 print "$a";34 $a = $a + 1;35 }36 function dessert($dessert = "rijstpap"){37 print $dessert;38 return true;39 }40 function aantalArgumenten(){41 $argumenten['aantal'] = func_num_args();42 $argumenten['twee'] = func_get_arg(1);43 $argumenten['argumenten'] = func_get_args(); 44 return $argumenten;45 }46 ?>

Sla het PHP script met de functies op als functies.inc.php.

In de oorspronkelijke PHP-pagina roepen we dan het bestand functies.inc.php op (de eerste 10 regels van de PHP-pagina):

1 <?php //functies.php2 include 'functies.inc.php';3 $nummer1 = 2; 4 $nummer2 = 5; 5 $nummer3 = 8;6 $nummer4 = 3; 7 $nummer5 = 6;8 $het_gemiddelde = gemiddelde($nummer1, $nummer2, $nummer3, $nummer4,

$nummer5);9 ?>10 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

80 | P a g i n a

Page 91: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Naast include kunnen we require() gebruiken. Het verschil tussen beide zit hem in de foutafhandeling. Als een bestand ge-include wordt, maar het bestand bestaat niet, zal dit resulteren in een foutmelding zodra de functie opgeroepen wordt.

Door gebruik te maken van require zal de parser onmiddellijk een foutmelding geven, als hij het gevraagde bestand niet vindt en het script onderbreken.

Gebruik include voor het aanroepen van minder kritische bibliotheken.

Verder kunnen we gebruik maken van include_once() en require_once(). Deze doen net hetzelfde als include() en require(), maar zorgen er voor dat het include-bestand maximum één keer aangeroepen wordt, om eventuele fouten veroorzaakt door het meermaals definiëren van dezelfde functies te vermijden.

OPLETTEN!!

Vaak krijgen include bestanden de extentie .inc mee. Dit mag, omdat het bestand door de php-parser wordt aangeroepen en niet door de webserver. Hou er echter rekening mee, dat als iemand de naam van dit bestand weet, ze via de browser dit bestand kunnen oproepen. De inhoud zal letterlijk weergegeven worden omdat het bestand niet eindigt op .php en de parser zal dit bestand dan dus ook niet verwerken.

Om dit te voorkomen zijn er een aantal oplossingen:

• In de webserverconfiguratie zorg je ervoor dat de gebruiker geen .inc bestanden kan opvragen. Daarvoor heb je wel toegang tot de webserver nodig.

• Je geeft je bestand de extentie .php of .inc.php. Op die manier wordt het sowieso door de parser gehaald, en aangezien er geen print zal instaan van je gegevens, zullen deze dan ook niet weergegeven worden.

• Je plaatst je bibliotheekbestanden buiten de map waar je HTML-documenten opgeslagen worden. Daarvoor heb je wel toegang tot de webserver nodig.

Specifieke functies voor getallen

Integers en floats

Zoals we reeds gezien hebben kan PHP overweg met gehele getallen (integers) en kommagetallen (floats). Gehele getallen worden opgeslagen in 32bits geheugenlocaties. Waardoor we getallen kunnen hebben gaande van -2147483647 tot +2147483647. Als er nu echter nog 1 waarde bijkomt bij het maximum, of afgaat van het minimum, dan wordt het getal opgeslagen als een float (overflow), waarvoor er 64bits in het geheugen voorzien zijn. Volgend voorbeeld (toevoegen aan functies.php) illustreert dit:

<?php $var = 2147483647; ?><pre>Overgang van type door overflow van variabelen:<?php var_dump($var++); ?><?php var_dump($var); ?></pre>

De grenzen van integers kunnen echter verschillend zijn op verschillende systemen, afhankelijk van de processor en het besturingssysteem (32- of 64-bit).

Floats hebben als voordeel dat ze zowel heel grote als heel kleine getallen kunnen opslaan, maar hebben als nadeel dat ze bij bewerkingen een deel van de precisie kunnen verliezen.

Gebruik daarom nooit floats als je twee getallen met elkaar wil vergelijken.

Bij getallen mag je de decimale, hexadecimale en octale schrijfwijze gebruiken:

<?php$pos_int = 42; //positieve integer$neg_int = -42; //negatieve integer$oct_int = 052; //octaal getal$hex_int = 0x2A; //hexadecimaal getal?>

81 | P a g i n a

Page 92: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

<p>Inhoud variabele met positieve integer: <?php print $pos_int; ?>, met negatieve integer: <?php print $neg_int; ?>, met octaal getal: <?php print $oct_int; ?>, met hexadecimaal getal: <?php print $hex_int; ?>.</p>

Floats voor decimale getallen en getallen met exponentiële notatie:

<?php$pos_float = 42.01; //positieve float$neg_float = -18.9876; //negatieve float$grote_float = 1.2e65; //een heel groot getal$kleine_float = 10e-75; //een heel klein getal?><p>Inhoud variabele met positief kommagetal: <?php print $pos_float; ?>, met negatief kommagetal: <?php print $neg_float; ?>, met zeer groot kommagetal: <?php print $grote_float; ?>, met zeer klein kommagetal: <?php print $kleine_float; ?>.</p>

Werken met getallen

Naast de standaardoperators +, -, /, * en % kent PHP nog een uitgebreid aantal functies om op getallen los te laten.

Absolute waarde

De absolute waarde van een getal is de waarde van het getal zonder het teken. Daarvoor kunnen we de functie abs() gebruiken:

<p>De absolute waardevan -122 is <?php print abs(-122); ?>,van 122 is <?php print abs(122); ?>,van -12345.23 is <?php print abs(-12345.23); ?>.</p>

Hoger, lager

Een getal naar boven of naar onder afronden kan zonder problemen. Het resultaat is van het type float, omdat het doorgegeven getal mogelijks te groot zijn voor een integer:

<p>Het getal 27.3 afgerondnaar boven is <?php print ceil(27.3); ?>,naar beneden <?php print floor(27.3); ?>.</p>

Met ceil() rond je altijd af naar het hoger gelegen gehele getal, met floor() naar het lager gelegen gehele getal.

Afronden

Bovenstaande functies zijn niet handig bij het "echte" afronden. Daarvoor gebruiken we round(), die getallen naar boven afrond als het decimaal 5 is of groter, en naar onder als het decimaal kleiner is dan 5. Het is ook mogelijk om een precisie mee te geven, tot op hoeveel getallen er afgerond moet worden. Een negatieve precisie rond af op de tientallen, hondertallen, duizendtallen, ...:

<p>10.4 afronden wordt <?php print round(10.4); ?>,10.5 afronden wordt <?php print round(10.5); ?>,34.3451 op 2 cijfers afronden wordt <?php print round(34.3451, 2); ?>,3452245.345 op duizendtallen afronden wordt <?php print round(3452245.345, -3); ?>.</p>

Getalstelsels

Natuurlijk zijn er ook een aantal functies om getallen om te zetten tussen de verschillende meest gebruikte talstelsels zoals: decimaal, hexadecimaal, octaal en binair:

82 | P a g i n a

Page 93: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

decimaal -> binair

string decbin(integer number)

binair -> decimaal

integer bindec(string binair_getal)

decimaal -> hexadecimaal

string dechex(integer number)

hex -> decimaal

integer hexdec(string hex_getal)

decimaal -> octaal

string decoct(integer number)

octaal -> decimaal

integer octdec(string oct_getal)

Random getallen

Om willekeurige getallen te genereren kent PHP de pseudo-random-functie rand():

integer rand ([integer min, integer max])

Zonder argumenten geeft de functie een geheel getal weer tussen 0 en een getal bepaald door getrandmax(). Getrandmax() is afhankelijk van het systeem.

Als rand() aangeroepen wordt met een minimum en een maximum, krijg je een geheel getal tussen deze:

<p>Een willekeurig getal tussen 0 en <?php print getrandmax(); ?>: <?php print rand(); ?>,een willekeurig getal tussen 1 en 10: <?php print rand(1, 10); ?>.</p>

Specifieke functies voor datums

Met PHP krijgen we heel wat mogelijkheden voor het manipuleren en werken met datums. De meeste datum-gerelateerde functies werken op basis van de Unix-timestamp.

Deze timestamp is het aantal seconden die er verstreken zijn sedert 1 januari 1970 00:00:00 GMT. De meeste systemen slaan deze waarde op in een 32bits integer, waardoor het mogelijk wordt om te rekenen met datums van 13 december 1901 tot 19 januari 2038. Door deze beperking moeten we rekening houden met problemen die kunnen optreden bij integer-overflows.

Huidige tijd

Om de huidige tijd als timestamp weer te geven kunnen we werken met de functie:

integer time(void);

Voorbeeld:

<p>1 januari 1970 00:00:00 GMT ligt reeds <?php print time(); ?> seconden in het verleden.<br />Volgende week al <?php print time() + (60 * 60 * 24 * 7); ?> seconden.</p>

83 | P a g i n a

Page 94: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Aangezien de tijd als een aantal seconden wordt weergegeven, is het mogelijk de timestamp voor over 7 dagen te berekenen (tweede regel in het voorbeeld).

Datums weergeven

Vertrekkende van timestamps kunnen we ook een datum weergeven, met een opmaak naar wens. Hiervoor maken we gebruik van de functie:

string strftime ( string format [, int timestamp])

waarbij het formaat zal bestaan uit 1 of meerdere van in de tabel opgesomde onderdelen (voor een volledige lijst: zie de php.net). Let ook op het verschil in hoofd- en kleine letters:

Karakter Omschrijving Resultaat

Dagen

%a Verkorte tekstuele weergave van de weekdag za

%A Volledige tekstuele weergave van de weekdag zaterdag

%d Dag van de maand, 2 cijfers 01 tot 31

%e Dag van de maand, zonder voorafgaande nullen 1 tot 31

%j Dag van het jaar (beginnend bij 0) 001 tot 366

%u ISO-8601 numerieke weergave van de weekdag 1 (maandag) tot 7 (zondag)

%w Numerieke weergave van de weekdag 0 (zondag) tot 6 (zaterdag)

Week

%V ISO-8601 weeknummer van het jaar, beginnend op maandag

42 (de 42ste week van het jaar)

Maand

%B Volledige tekstuele weergaven van de maand januari tot december

%m Numerieke weergave van de maand, 2 cijfers 01 tot 12

%b Korte tekstuele weergave van de maand jan tot dec

Jaar

%Y Volledige numerieke weergave van het jaar 1999 of 2012

%y Numerieke weergave van het jaar, 2 cijfers 99 of 12

Tijd

%P Weergave am of pm am of pm

%p Weergave AM of PM AM of PM

%l (kleine L) 12uur-formaat, zonder voorafgaande nullen 1 tot 12

%I 12uur-formaat, inclusief voorafgaande nullen 01 tot 12

%H 24uur-formaat, inclusief voorafgaande nullen 00 tot 23

%M Minuten, incl nullen 00 to 59

%S Seconden, incl nullen 00 tot 59 Als er geen timestamp wordt opgegeven, wordt de huidige tijd als basis gebruikt.

Om een tijdstip in een bepaalde taal- en landnotatie weer te geven, stel je alle lokale instellingen voor Nederlandstalig België in met de functie:

string setlocale(LC_ALL, 'nl_BE');

Voorbeelden:

<?php setlocale(LC_ALL, 'nl_BE'); ?><p>Vandaag: <?php print strftime("%A %e %B %Y"); ?>, tijd: <?php print strftime("%H:%M"); ?>.Morgen: <?php print strftime("%A %e %B %Y", time() + (60 * 60 * 24)); ?>.</p>

84 | P a g i n a

Page 95: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Zelf tijden samenstellen

Je kunt de timestamp van een tijd tussen 13 december 1901 tot 19 januari 2038 aanmaken met de functies mktime() en gmmktime():

int mktime(int hour, int minute, int second, int month, int day, int year [, int is_dst])

mktime() gebruik je als volgt:

<p>Zelf aangemaakt tijdstip: <?php$tijdstip = mktime (19, 37, 0, 9, 30, 2012);print strftime("%A %e %B %Y %H:%M", $tijdstip);?>.<br />

Argumenten kunnen en mogen weggelaten worden van RECHTS naar LINKS. De weggelaten argumenten zullen aangevuld worden met de lokale tijd.

Een handige eigenschap van deze functie is dat het mogelijk is om het aantal dagen te laten "overlopen" in het aantal maanden. Zo zal volgend voorbeeld, de timestamp bepalen van 1 oktober 2012:

Tijdstip met overlopende maand:<?php$tijdstip = mktime (19, 37, 0, 9, 31, 2012);print strftime("%A %e %B %Y %H:%M", $tijdstip);?>.<br />

Of die van de laatste dag van de voorgaande maand:

Tijdstip met overlopende maand in het verleden:<?php$tijdstip = mktime (19, 37, 0, 9, 0, 2012);print strftime("%A %e %B %Y %H:%M", $tijdstip);?>.</p>

Of je kunt gebruik maken van variabelen:

<p><?phpfor ($maand = 0; $maand <= 12; $maand++){ $datum[$maand] = mktime (0,0,0, 1 + $maand, 12, 2012);}foreach ($datum as $maand): ?> <?php print strftime("%A %e %B %Y", $maand); ?><br /><?php endforeach; ?></p>

Tekst omzetten naar een tijdstip

Een tekst met een formaat zoals gebruikt in de strftime() kan je met de functie strptime ontbinden in zijn verschillende onderdelen die in een array worden opgeslagen.

array strptime ( string $date , string $format )

De associatieve array bevat de volgende variabelen:

tm_sec Seconden (0-61)

tm_min Minuten (0-59)

tm_hour Uren (0-23)

tm_mday Dag van de maand (1-31)

tm_mon Maand (0-11)

tm_year Jaar sinds 1900

85 | P a g i n a

Page 96: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

tm_wday Weekdag (0-6)

tm_yday Dag van het jaar (0-365)

unparsed Het niet herkende deel van de stringVoorbeeld:

<?php $formaat = "%A %e %B %Y %H:%M";$nu = strftime($formaat);?><pre>Nu weergegeven met strftime: <?php print $nu; ?> en ontbonden in een array:<?php print_r(strptime($nu, $formaat)); ?></pre>

Microseconden

Voor de meeste toepassingen heb je genoeg aan gehele seconden. Soms heb je microseconden nodig. Gelukkig hebben we hiervoor de functie:

string microtime([ bool $get_as_float ]);

die een string teruggeeft met als onderdelen een timestamp in seconden en microseconden, met de microseconden eerst.

Als je echter een true meegeeft als parameter, krijg je het resultaat als een float in de plaats, waardoor het makkelijker rekenen wordt.

<p>Een tijdstip in microseconden: <?php print microtime(); ?> of weergegeven als een float: <?php print microtime(true); ?>.</p>

Controleren van datums

Een heel handige functie is checkdate() waarmee we de geldigheid van datums kunnen controleren:

boolean checkdate (integer month, integer day, integer year)

De functie is niet gebaseerd op timestamps en kan gebruikt worden voor datums gaande van het jaar 1 tot 32767. Deze functie houdt rekening met schrikkeljaren:

<p>2012 is<?php if(checkdate(2,29,2012)): ?> een<?php else: ?> geen<?php endif; ?>schrikkeljaar, 2013 is<?php if(checkdate(2,29,2013)): ?> een<?php else: ?> geen<?php endif; ?>schrikkeljaar.</p>

Opletten met datums

Let goed op met de beperking van timestamps. Als de datum boven de maximumwaarde, of onder de minimumwaarde komt, zul je heel onvoorspelbare resultaten verkrijgen:

<p>PHP en een toekomstige millenniumbug:

86 | P a g i n a

Page 97: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

<?php$laatstedag = mktime(2,0,0,1,19,2038);for ($i=1; $i<7; $i++){ print "<br />" . strftime("%A %e %B %Y %H:%M", $laatstedag); $laatstedag += 3600;}?></p>

Als je buiten deze grenzen wilt werken, zul je de datums zelf moeten berekenen.

Specifieke functies voor strings

In dit deel zullen we wat dieper ingaan op het gebruik van strings en het opmaken van tekst.

Lengte van een string

Net zoals we het aantal elementen in een array kunnen bepalen, kunnen we met een eenvoudige functie, strlen(), het aantal karakters in een string bepalen:

<?php $tekst = "Deze tekst is opgeslagen in een string."; ?><p>De zin "<?php print $tekst; ?>" bevat <?php print strlen($tekst); ?> tekens.</p>

Opmaak van tekst

Sprintf() en printf()

Deze functies, die identiek zijn aan die in C, zorgen er voor dat tekst met een mooiere opmaak kunnen weergegeven worden.

Het verschil tussen de 2 is dat printf() de uitvoer onmiddellijk afdrukt, zoals het geval is bij de print(), en dat sprintf() een string oplevert, die verder kan gebruikt worden. Voorbeeld:

<?php $wortel = sqrt(2); ?><p>De vierkantswortel van 2 is <?php printf("%.2f", $wortel); ?>.</p>

De "%.2f" zorgt ervoor dat de variabele, die erna opgeroepen wordt, afgerond wordt op 2 decimalen.

De omzetting begint altijd met een "%", gevolgd door een aantal parameters die de opmaak zullen bepalen, deze parameters zijn optioneel:

Naam Omschrijving Voorbeeld

Sign specifier

Geeft aan of er ook voor positieve getallen een teken moet worden afgedrukt, gebruik hiervoor een +

printf("resultaat: %+.2f\n", $var); //resultaat: +3.14

Padding specifier

Geeft weer welk soort karakter er moet gebruikt worden voor het uitlijnen van een waarde, dit kan een spatie (standaard) of een 0 (nul) zijn. De eventuele padding specifier laat je voorafgaan door een enkele aanhalingsteken ('), enkel van belang als ook de width specifier is opgegeven

printf("resultaat: %'010.2f\n", $var); //resultaat: 0000003.14

Width specifier

Een getal voor het punt duidt het aantal karakters aan dat minimum zal gebruikt worden voor het weergeven van het getal. Als er minder karakters zijn om weergegeven te worden, wordt het getal rechts uitgelijnd en verder opgevuld met spaties ervoor (of wat er opgegeven is in de padding specifier). De

printf("resultaat: %'010.2f\n", $var); //resultaat: 0000003.14

87 | P a g i n a

Page 98: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

precisie wordt ook meegeteld in de width specifier.

Precision specifier

Een getal na het punt duidt de precisie aan. Kan enkel gebruikt worden bij floats. Bij strings: geeft het getal ná de punt het maximaal weer te geven karakters aan.

Type specifier

Deze geeft aan als welk type de variabele moet weergegeven worden. Zie onderstaande tabel

Type Omschrijving

%% Weergeven van een %

%b Integer opgemaakt als binair getal

%c Integer opgemaakt als ASCII-karakter

%d Integer opgemaakt als signed decimaal getal

%u Integer opgemaakt als unsigned decimaal getal

%o Integer opgemaakt als octaal getal

%x of %X Integer opgemaakt als hexadecimaal getal met kleine letters of met hoofdletters

%f Floating point getal

%s String Het zal ook duidelijk zijn dat je enkel decimalen kunt gebruiken als je met kommagetallen te maken hebt. Een paar voorbeelden:

<p><?phpprintf("Pi is gelijk aan %f,<br />", 3.14159);printf("en afgerond: %.2f,<br />", 3.14159);printf("met 10 cijfers na de komma: %.10f.<br />", 3.14159); printf("%.15s<br />", "Toont slechts een stukje van deze regel.");printf("Binair: %b, decimaal: %d en kommagetal: %f.<br />", 123, 123, 123);printf("De BTW bedraagt %d%% (%.2f Euro).", 21, 126.3554);?></p>

Om de eerste n karakters van een string weer te geven, gebruik je "%.ns", waarbij n het aantal karakters is, dat je wilt weergeven.

Deze functies worden in de eerste plaats gebruikt om opmaak met cijfers mee te geven, zonder dat de inhoud ervan verloren gaat.

Hoofdletters en kleine letters

Er zijn 4 functies ter beschikking die we kunnen gebruiken om met hoofdletters te spelen:

<p>Spelen met hoofdletters:<br /><?php $tekst = "The Fantastic Four: HTML, CSS, JavaScript en PHP.";print strtolower ($tekst) . "<br />";print strtoupper ($tekst) . "<br />";print ucfirst ($tekst) . "<br />";print ucwords ($tekst);?></p>

Vergelijken van strings

Terwijl we integers heel eenvoudig kunnen vergelijken, wordt dit bij strings iets moeilijker, vooral als er gebruik gemaakt wordt van binaire inhoud. Met strcmp() en strncmp() lukt dit zonder probleem.

Beide functies nemen 2 strings als argument en de functie levert een 0 af als beide argumenten gelijk zijn, een getal groter dan 0 als string 1 groter is dan string 2, en een getal kleiner dan 0 als string 1 kleiner is dan string 2. De vergelijking gebeurt op ASCII-niveau.

88 | P a g i n a

Page 99: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

strncmp() neemt nog een derde argument dat bepaald tot hoeveel karakters er moet vergeleken worden:

<?phpfunction vergelijk($woord1, $woord2, $aantal) { if (isset($aantal)){ $volgorde = strncmp($woord1, $woord2, $aantal); } else { $volgorde = strcmp($woord1, $woord2); } if($volgorde == -1){ print "voor"; } elseif ($volgorde == 1) { print "na"; } else { print "naast"; }}?><p>Sorteren:<br />aap komt <?php vergelijk("aap", "zebra"); ?> zebra.<br />zebra komt <?php vergelijk("zebra", "aap"); ?> aap.<br />aap komt <?php vergelijk("aap", "aap"); ?> aap.<br />aap komt <?php vergelijk("aap", "Aap"); ?> Aap.<br />zeehond komt <?php vergelijk("zeehond", "zeekoe", 3); ?> zeekoe (sortering op eerste 3 tekens).</p>

Als we hoofdletterongevoelig willen werken doen we dit met strcasecmp() en strncasecmp().

Zoeken van substrings

Net zoals we in arrays kunnen zoeken naar onderdelen, kunnen we dit ook met strings. En net zoals bij arrays, begint een string te tellen vanaf positie 0 voor het eerste karakter.

Uitfilteren van een substring

Met substr() kunnen we een stukje uit een string filteren:

<?php $alfabet = "abcdefghijklmnopqrstuvwxyz"; ?><p>Het alfabet vanaf de derde letter: <?php print substr($alfabet, 2); ?>.<br />Drie letters vanaf de derde letter: <?php print substr($alfabet, 2, 3); ?>.</p>

Het tweede argument bepaalt vanaf welke positie de karakters weergegeven worden. Een optioneel derde argument bepaalt hoeveel karakters er in totaal weergegeven worden.

Positie vinden van een substring

Met strpos() kunnen we de positie bepalen van een substring uit een string. De functie geeft de eerste plaats weer waar het opgegeven argument voorkomt:

<?phpfunction opsporen($gezocht) { $verdachten = 'Jan, Piet, Joris en Corneel'; $pos = strpos($verdachten, $gezocht); if ($pos === false) { print "$gezocht is niet op de lijst van verdachten ($verdachten) gevonden."; } else { print "$gezocht is op positie $pos op de lijst van verdachten ($verdachten) gevonden.";

89 | P a g i n a

Page 100: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

}}?><p><?php opsporen("Jan"); ?><br /><?php opsporen("Dany"); ?></p>

Als de string niet gevonden wordt, wordt er een false weergegeven. Als er een derde argument opgegeven wordt ($pos =strpos($verdachten, $gezocht, 10);), bepaalt deze vanaf welke plaats er gezocht wordt.

Met strrpos() wordt er gezocht naar de laatste keer dat de gezochte substring voorkomt.

Nog meer uitfilteren

Met strstr() en stristr() gaan we op zoek naar een substring in een string, en worden de resterende tekens weergegeven:

<?php $email = "[email protected]"; ?><p>Het e-mailadres <?php print $email; ?> heeft als domein <?php print strstr($email, '@'); ?>,<br />en als gebruiker <?php print strstr($email, '@', true); ?>.</p>

Als de substring niet gevonden wordt, wordt er een false weergegeven.

Vanaf PHP versie 5.3.0 kun je met het derde argument true de tekens voor de gevonden substring weergeven.

Met stristr() wordt er gezocht zonder rekening te houden met hoofdletters.

Tekens en substrings vervangen

Soms is het nuttig om een aantal karakters of een volledige substring te vervangen.

Vervangen van substrings op basis van positie

Met substr_replace vervangen we een aantal tekens in een string:

<?php $leerkracht = 'PHP wordt gegeven door Tim Broeckaert.'; ?><p>Tekstonderdelen vervangen:<br />Originele tekst: <?php print $leerkracht; ?><br />Volledige tekst vervangen: <?php print substr_replace($leerkracht, 'Dany Pinoy.', 0); ?><br />Tekst aan het begin toevoegen: <?php print substr_replace($leerkracht, 'JavaScript wordt gegeven door Dany Pinoy. ', 0, 0); ?><br />Naam leerkracht vervangen: <?php print substr_replace($leerkracht, 'Dany Pinoy', 23, 14); ?><br />Einde van de tekst vervangen: <?php print substr_replace($leerkracht, 'Dany Pinoy en is een onderdeel van Webdesign', -15, -1); ?><br />Voornaam verwijderen: <?php print substr_replace($leerkracht, '', 23, 4); ?></p>

Het derde argument geeft op, vanaf welke positie er moet vervangen worden. Een negatieve positie begint af te tellen vanaf het einde van de string.

Als er een vierde argument wordt opgegeven, zal deze het aantal te vervangen tekens bepalen. Het aantal -1 vervangt alle tekens tot het einde van de string.

Vervangen van substrings op basis van tekst

Met str_replace() zoeken we naar een substring en vervangen we deze door een nieuwe.

<?php $spreuk = "Zoals het klokje thuis tikt, tikt het nergens.";$klinkers = array("a", "e", "i", "o", "u");$voeding = "Eet elke dag fruit, groenten en vezels.";

90 | P a g i n a

Page 101: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

$gezond = array("fruit", "groenten", "vezels");$lekker = array("pizza", "friet", "roomijs");?><p>Tekst vervangen:<br />Originele spreuk: <?php print $spreuk; ?><br />Werkwoord vervangen: <?php print str_replace("tikt", "roffelt", $spreuk); ?><br /><?php str_replace("tikt", "roffelt", $spreuk, $aantal); ?>Het werkwoord werd <?php print $aantal; ?> keer vervangen<br />Zonder klinkers: <?php print str_replace($klinkers, "", $spreuk); ?><br />Originele uitspraak: <?php print $voeding; ?><br />Aangepaste uitspraak: <?php print str_replace($gezond, $lekker, $voeding); ?></p>

Recursieve functie

Een recursieve functie is een functie die zichzelf aanroept.

Een voorbeeldje van een recursieve functie is deze:

<?phpfunction faculteit( $n ) { if ($n == 0 || $n== 1) { // stoppen indien $n == 0 of $n == 1 return 1; } else { // De volgende regel bevat de recursieve oproep return ( $n * faculteit($n-1)); }}?><p>De faculteit van 5 is <?php print faculteit(5); ?>.</p>

Bij de aanroep van deze functie wordt er eerst gecontroleerd of het getal nul of 1 is. Indien dit zo is, wordt de berekening afgebroken.

Indien het getal niet nul of 1 is, wordt de berekening $n * faculteit($n -1) berekend. M.a.w. De functie faculteit wordt gebruikt vanuit de functie faculteit (recursie).

Deze bewerking gaat door tot de waarde in $n 1 wordt, waardoor de functie faculteit wordt verlaten en waarde 1 wordt teruggeven aan de oproepende bewerking (eveneens in de functie faculteit). M.a.w. de weg wordt in omgekeerde volgorde terug afgelopen ($n stijgt daarbij terug naar de oorspronkelijke waarde).

Met andere woorden de faculteit van 5 bereken is eigenlijk 5 * 4 * 3 * 1.

Let op bij recursieve functies, dat je deze wel weer moet kunnen verlaten.

Oefeningen

Het project van deze cursus: Webshop

Sla al de functies die je in deze oefeningen maakt op in een apart bestand (functies.php) die je importeert in de pagina's waar je de functies gebruikt.

Prijzen netjes weergeven

Schrijf de functie prijsWeergeven($prijs) waarin de prijs met twee cijfers na de komma wordt weergegeven.

Gebruik deze functie bij het weergeven van de prijzen in de webshop.

Prijs van een cursus opzoeken

Bij het inschrijven voor een cursus moet de prijs automatisch in het formulier ingevuld worden.91 | P a g i n a

Page 102: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Zorg dat de pagina inschrijven.php zowel het script model.php (met de prijzen van de cursussen opgeslagen in arrays) als het script functies.php importeert.

Daar de gebruikte categorie ($cat) reeds in het script model.php wordt opgevraagd, mag je de regel met dezelfde functie in de pagina inschrijven.php uitschakelen of verwijderen:

// $cat = $_GET['cat']; // opgenomen in model.php

De functie om de prijs van een cursus op te zoeken wordt:

function prijsCursus($cursus, $items) { ..............($items as $item) { // elke item onderzoeken .....($item['naam'] == $cursus) { prijsWeergeven($item['prijs']); ......; // de prijs is gevonden, de functie wordt verlaten. } }}

Gebruik de functie prijsCursus in het formulier:

<input type="text" name="prijs" id="prijs" readonly="readonly" value="<?php prijsCursus($cursus, $items); ?>" />

Datum weergeven

Maak een functie (datumWeergeven()) die de huidige datum in de vorm dag maand jaar (voorbeeld: 7 april 2012) weergeeft.

Gebruik deze functie om rechts in de Kop 1 op de pagina index.php de huidige datum weer te geven:

<h1>SNT Webshop Informatica (<?php print $cat ?>)<span style="float:right; font-size:medium" ><?php datumWeergeven(); ?></span></h1>

Gebruik deze functie om op de pagina inschrijven.php de datum in het formulier in te vullen.

Ingevulde datum controleren

De functie datumControle($datum) controleert of een datum bestaat en dus correct is:

function datumControle($datum, $url) { ..............(LC_ALL, 'nl_BE'); $tijdstip = strptime($datum, "%e %B %Y"); if(! checkdate($tijdstip['tm_mon'], $tijdstip['tm_mday'], $tijdstip['tm_year'] + ........) || $tijdstip['tm_year'] < 0) { header("Location: $url"); exit; }}

Daarbij gebruiken we de functie header om bij een foutieve datum de browser naar een andere pagina (URL) te sturen. Deze functie werkt alleen als er nog geen HTML-code aangemaakt werd.

Op de pagina inschrijven_verwerken.php zorg je dat de functies in het script functies.php gebruikt kunnen worden.

Na het opvragen van de formuliergegevens plaats je de controle van de datum:

// controle formuliergegevens..............($datum, "inschrijven.php?cursus=" . urlencode($cursus) . "&datumstyle=" . urlencode("background-color:#ffcccc") . "&cat=" . $cat . "&cursus=" . $cursus);

92 | P a g i n a

Page 103: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

De doorgegeven URL bestaat uit de pagina inschrijven.php (formulier opnieuw invullen) met een extra GET argument waarmee we de fout (met een CSS stijl) kunnen markeren.

Op de pagina inschrijven.php vraag je de doorgegeven datumstyle op met:

$datumstyle = $_GET['........................'];

Deze stijl pas je dan toe in de aangepaste regel:

<input type="text" name="datum" id="datum" value="<?php datumWeergeven(); ?>" style="<?php print ....................; ?>" />

Ingevulde e-mailadres controleren

Schrijf een functie om een e-mailadres op de volgende eigenschappen te controleren.

• Een e-mailadres bevat een @.

• Een e-mailadres bevat een punt.

• In een e-mailadres staat de @ steeds voor de punt.

Indien het e-mailadres niet geldig is, moet de browser het formulier met het gemarkeerde foutief ingevulde e-mailveld tonen.

Koppen

Schrijf in een nieuwe PHP-pagina een functie waarmee je een HTML-kop maakt.

De HTML-code voor een kop heeft de volgende vorm:

<h1 style="color: #000000;">HTML-code schrijven met PHP.</h1>

Waarbij h1 de tag is voor een Kop 1 (h2 dus voor een Kop 2, enz.). Eindigt met </h1>.

Waarbij #000000 de zwarte tekstkleur bepaalt (#ff0000 is rood, #00ff00 is groen en #0000ff is blauw).

Waarbij 'HTML-code schrijven met PHP.' de tekst van de kop is.

Laat de gebruiker via een formulier zelf kiezen welke kop (1-6), kleur (zwart, rood, groen of blauw) en tekst hij wil zien.

Alle kopformaten weergeven

Maak in een nieuwe PHP-pagina een functie die bij elke aanroep een kop met een hoger cijfer aanmaakt. De variabele met het kopcijfer wordt in de functie bijgehouden en is enkel in deze functie bruikbaar.

M.a.w. In de body tag plaats je zesmaal de regel

<?php kop(); ?>

en krijg je het volgende resultaat:

93 | P a g i n a

Page 104: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Zinnen beginnen met een hoofdletter

Schrijf in een nieuwe PHP-pagina een functie waarmee je elke zin van een tekst voorziet van een hoofdletter.

Zet daarbij de tekst om naar een array van zinnen. Een zin wordt van de volgende zin gescheiden door een punt gevolgd door een spatie.

Geef daarna elke zin een beginhoofdletter.

Stop deze aangepaste zin in een array met de aangepaste zinnen.

Maak van de array met aanpaste zinnen een tekst waarbij de zinnen gescheiden worden door een punt en een spatie.

Daar de oorspronkelijke tekst moet worden aangepast, werkt je met referentievariabele.

Als voorbeeld:

$tekst = "deze tekst bevat geen beginhoofdletters. deze worden door een PHP functie automatisch aangemaakt. deze correctie wordt in 99% van de gevallen gewaardeerd.";

wordt in de browser weergegeven als:

Horeca

Schrijf in een nieuwe PHP-pagina een functie om het aantal weken tussen twee datums te berekenen. Rond het resultaat af naar het dichtstbijgelegen geheel getal.

Gebruik de functie om het aantal weken tussen 1 april en 1 november van dit jaar te berekenen.

Gebruik het resultaat in de volgende zin (punten = het resultaat):

Het seizoen in de horeca bestaat uit ..... weken hard werken.

Jubileum

Schrijf in een nieuwe PHP-pagina een functie om een datum in het Nederlands volledig weer te geven.

Schrijf een functie om een leeftijd te berekenen.

Gebruik deze functies om het volgende resultaat te bereiken:

94 | P a g i n a

Page 105: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Factuur opmaken

Gebruik een nieuwe PHP-pagina om facturen op te maken. Deze pagina bevat de volgende eigenschappen:

• De factuur bestaat uit een dynamische tabel waarbij de gebruiker zelf het aantal te factureren artikels kan opgeven. Standaard bevat de factuur 5 artikels.

• De datums worden door één functie weergegeven.

• De vervaldag wordt berekend door 30 dagen bij de datum te tellen.

• Het factuurnummer wordt samengesteld aan de hand van het tijdstip waarop de factuur wordt opgemaakt:

• jaar – 1900

• maand met 2 cijfers (00-12)

• dag van de maand met twee cijfers (01-31)

• uur met twee cijfers (00-23)

• minuten met twee cijfers (00-59)

• De kolommen met de omschrijvingen, aantallen, eenheidsprijzen en de btw worden door de gebruiker ingevuld.

• De volgende velden worden door PHP-code berekend:

• Het Bedrag exclusief wordt per artikel met de formule aantal * eenheidsprijs berekend.

• Het Btw bedrag wordt per artikel met de formule Bedrag exclusief * Btw / 100 berekend.

• Het Totaal inclusief wordt per artikel met de formule Bedrag exclusief + Btw bedrag berekend.

• In de onderste rij bereken je de totalen van de volgende kolommen:

• Bedrag exclusief

• Btw bedrag

• Totaal inclusief

• Zorg dat alle bedragen en prijzen met twee cijfers na de komma worden weergegeven.

• Plaats alle functies in het externe script factuurfuncties.php.

• Plaats alle PHP code om het formuliergegevens op te halen en om de berekeningen te maken in het externe script factuurmodel.php.

95 | P a g i n a

Page 106: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Analyse van e-mailadressen

Maak een nieuwe PHP-pagina om e-mailadressen te analyseren.

Zorg daarbij voor een formulier waarbij de gebruiker een e-mailadres kan opgeven.

Haal uit het opgegeven e-mail:

• De gebruikersnaam (deel voor de @).

• Het domein (deel na de @).

Schrijf een functie om een melding met het IP-adres van een domein weer te geven. Om het IP-adres van een domein op te zoeken heb je de functie gethostbyname() nodig (hoe je deze functie moet gebruiken staat op de site php.net)Indien het IP-adres niet bestaat (dus ook het domein niet) wordt de melding De domeinnaam geen.ip bestaat niet.(waarbij geen.ip het geteste domein voorstelt) weergegeven.

Gebruik dezelfde functie om het IP-adres van het domein voorafgegaan door www. te achterhalen (te testen).

Schrijf een functie om bepaalde domeinnamen te weigeren en een gepaste melding op het scherm te plaatsen. Gebruik een array om de te weigeren domeinnamen in op te slaan.

PHP en AJAXAJAX maakt het mogelijk onderdelen van een webpagina aan te passen zonder de pagina volledig te herladen.

AJAX maakt interactievere webpagina's mogelijk.

96 | P a g i n a

Page 107: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Wat is AJAX?

AJAX = Asynchronous JavaScript and XML.

AJAX is een techniek waarmee snelle dynamische webpagina's gemaakt worden.

AJAX kan gebruikt worden om interactief met een database te communiceren.

AJAX kan gebruikt worden om interactief met een XML bestand te communiceren.

AJAX zorgt voor het asynchroon aanpassen van webpagina's door achter de schermen kleine hoeveelheden gegevens met de server uit te wisselen.

Klassieke webpagina's (die geen AJAX gebruiken) moeten bij elke kleine aanpassing op een pagina de volledige pagina herladen.

Voorbeelden van AJAX toepassingen: Google Maps, Gmail, Youtube en Facebook.

AJAX werd populair in 2005 door Google, met Google Suggest.Google Suggest gebruikt AJAX in zijn zoekpagina. Bij het intypen van een zoekwoord worden de reeds ingetypte letters met behulp van JavaScript naar de server gestuurd, waarop deze een lijst met suggesties terugstuurt.

PHP scripts op de server zorgen dat de juiste informatie naar de webpagina gestuurd wordt.

Hoe werkt AJAX?

AJAX is gebaseerd op Internet Standaarden

AJAX is gebaseerd op bestaande internet standaarden en gebruikt een combinatie van:

• XMLHttpRequest objecten (om gegevens asynchroon met de server uit te wisselen)

• JavaScript/DOM (om de gegevens weer te geven of om erop te reageren)

• CSS (de gegevens op te maken)

• XML (het formaat waarin de gegevens uitgewisseld worden)

AJAX toepassingen zijn dus browser- en systeem onafhankelijk.

Internet Explorer 9 gebruikt een lokale cache, waardoor IE9 niet steeds contact opneemt met de webserver bij het vernieuwen van de pagina. M.a.w. gebruikt voor het testen van AJAX een andere browser of sluit IE9 voor elke nieuwe test eerst af.

97 | P a g i n a

Page 108: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

AJAX PHP Voorbeeld

Bij het intypen van een letter in het tekstveld wordt de functie showHint() uitgevoerd. De functie wordt geactiveerd door de onkeyup gebeurtenis (event).

De HTML-pagina hint.html:

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml">3 <head>4 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />5 <title>AJAX voorstellen</title>6 <script type="text/javascript">7 function showHint(str){8 if (str.length==0){9 document.getElementById("txtHint").innerHTML="";10 return;11 }12 if (window.XMLHttpRequest){// code voor IE7+, Firefox, Chrome,

Opera, Safari13 xmlhttp=new XMLHttpRequest();14 } else {// code voor IE6, IE515 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");16 }17 xmlhttp.onreadystatechange=function(){18 if (xmlhttp.readyState==4 && xmlhttp.status==200){19

document.getElementById("txtHint").innerHTML=xmlhttp.responseText;20 }21 }22 xmlhttp.open("GET","gethint.php?q="+str,true);23 xmlhttp.send();24 }25 </script>26 </head>27 <body>28 <p><b>Begin met het typen van een naam in het tekstveld:</b></p>29 <form>30 <p>Voornaam: <input type="text" onkeyup="showHint(this.value)"

/></p>31 </form>32 <p>Suggesties: <span id="txtHint"></span></p>33 </body>34 </html>

Indien het tekstveld leeg is (str.length==0) wordt de inhoud van de span tag met het id txtHint leeggemaakt en wordt de functie afgebroken.

Indien het tekstveld niet leeg is:

• wordt er een XMLHttpRequest object aangemaakt,

• wordt een functie aangemaakt die pas uitgevoerd wordt als de gegevens van de server komen,

• wordt een aanvraag naar een script op de server gestuurd,

• let op het argument (q) dat aan de URL werd toegevoegd (met de inhoud van het tekstveld).

Het PHP script dat door JavaScript op de HTML pagina wordt opgeroepen is gethint.php.

98 | P a g i n a

Page 109: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Het PHP script zoekt in een array met namen naar overeenkomsten en stuurt deze terug naar de browser:

1 <?php // gethint.php2 // De array met namen vullen3 $a[]="Anna";4 $a[]="Brittany";5 $a[]="Chris";6 $a[]="David";7 $a[]="Eva";8 $a[]="Frank";9 $a[]="Geert";10 $a[]="Hendrik";11 $a[]="Ilse";12 $a[]="Jan";13 $a[]="Koen";14 $a[]="Luc";15 $a[]="Nina";16 $a[]="Ophelia";17 $a[]="Petunia";18 $a[]="Amanda";19 $a[]="Ronny";20 $a[]="Cindy";21 $a[]="Dany";22 $a[]="Eve";23 $a[]="Evita";24 $a[]="Sunniva";25 $a[]="Theo";26 $a[]="Unni";27 $a[]="Violet";28 $a[]="Liza";29 $a[]="Elizabeth";30 $a[]="Ellen";31 $a[]="Willem";32 $a[]="Vicky";33 $a[]="Pol";34 $a[]="Tom";35 $a[]="Hawa";36 // het argument van de URL ophalen37 $q=$_GET["q"];38 // de suggesties opzoeken als de lengte van q > 039 if (strlen($q) > 0){40 $hint="";41 for($i=0; $i < count($a); $i++){42 if (strtolower($q) ==

strtolower(substr($a[$i],0,strlen($q)))){43 if ($hint == ""){44 $hint=$a[$i];45 } else {46 $hint=$hint." , ".$a[$i];47 }48 }49 }50 }51 52 // Geef als antwoord "Geen suggesties" als er geen gevonden zijn53 // of geef de gevonden suggesties door54 if ($hint == ""){55 $antwoord="Geen suggesties";

99 | P a g i n a

Page 110: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

56 } else {57 $antwoord=$hint;58 }59 // antwoord weergeven60 print $antwoord;61 ?>

Als er tekst door het JavaScript wordt doorgegeven (strlen($q) > 0):

• wordt er gezocht naar namen waarvan het begin overeenkomt met de ingetypte tekens,

• als er geen overeenkomsten zijn wordt de tekst “Geen suggesties” teruggestuurd,

• indien er één of meer namen gevonden werden, worden deze teruggestuurd,

• de teruggezonden namen worden uiteindelijk weergegeven in de browser.

AJAX Database voorbeeld

In ons volgende voorbeeld worden database gegevens met behulp van AJAX in de browser weergeven.

De MySQL Database

We gebruiken de volgende database tabel:

De HTML pagina

Bij het selecteren van een gebruiker wordt de functie showUser uitgevoerd. M.a.w. de functie wordt door de gebeurtenis onchange gestart.

De HTML pagina database.html:

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml">3 <head>4 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />5 <title>Ajax Database</title>6 <script type="text/javascript">7 function showUser(str){8 if (str==""){9 document.getElementById("txtHint").innerHTML="";10 return;11 }12 if (window.XMLHttpRequest) {// code voor IE7+, Firefox, Chrome,

Opera, Safari13 xmlhttp=new XMLHttpRequest();14 } else {// code voor IE6, IE515 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");16 }17 xmlhttp.onreadystatechange=function(){

100 | P a g i n a

Page 111: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

18 if (xmlhttp.readyState==4 && xmlhttp.status==200){19

document.getElementById("txtHint").innerHTML=xmlhttp.responseText;20 }21 }22 xmlhttp.open("GET","getuser.php?q="+str,true);23 xmlhttp.send();24 }25 </script>26 </head>27 <body>28 <form>29 <select name="users" onchange="showUser(this.value)">30 <option value="">Selecteer een persoon:</option>31 <option value="1">Peter Degroot</option>32 <option value="2">Leo Degroot</option>33 <option value="3">Jan VanZwam</option>34 <option value="4">Guido Deboek</option>35 </select>36 </form>37 <p id="txtHint"><b>Informatie over de persoon wordt hier

weergegeven.</b></p>38 </body>39 </html>

De showUser functie

• controleert of er een persoon geselecteerd is,

• maakt een XMLHttpRequest object aan,

• maakt een functie aan die pas uitgevoerd wordt als de gegevens van de server komen,

• stuurt een aanvraag naar een script op de server,

• let op het argument (q) dat aan de URL werd toegevoegd (met de inhoud van de selectie).

Het PHP script

Het PHP script getuser.php laat een query uitvoeren door de MySQL database en plaatst het resultaat in een HTML tabel:

1 <?php // getuser.php2 $q=$_GET["q"];3 $verbinding = mysql_connect('localhost', 'pc01', 'snt+456') or

die('Kon geen verbinding maken: ' . mysql_error());4 mysql_select_db("database01", $verbinding) or die('Kon de database

niet openen: ' . mysql_error());5 $sql="SELECT * FROM ajax_demo WHERE id = '".$q."'";6 $records = mysql_query($sql) or die('Query mislukt: ' .

mysql_error());7 print "<table border='1'>8 <tr>9 <th>Voornaam</th>10 <th>Naam</th>11 <th>Leeftijd</th>12 <th>Woonplaats</th>13 <th>Beroep</th>14 </tr>";15 while($record = mysql_fetch_array($records)){16 print "<tr>";

101 | P a g i n a

Page 112: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

17 print "<td>" . $record['voornaam'] . "</td>";18 print "<td>" . $record['naam'] . "</td>";19 print "<td>" . $record['leeftijd'] . "</td>";20 print "<td>" . $record['woonplaats'] . "</td>";21 print "<td>" . $record['beroep'] . "</td>";22 print "</tr>";23 }24 print "</table>";25 mysql_close($verbinding);26 ?>

Het PHP script reageert als volgt op de JavaScript aanvraag:

• PHP maakt een verbinding met de MySQL server,

• de persoon wordt in de database opgezocht,

• er wordt een HTML tabel met de gevonden gegevens aangemaakt,

• de HTML tabel wordt naar het JavaScript in de browser gestuurd.

AJAX en XML

Het volgende voorbeeld toont hoe je met AJAX informatie uit een XML bestand kunt weergeven.

Het XML bestand

Het XML bestand cd_ cataloog.xml met de gegevens:

1 <?xml version="1.0" encoding="utf-8"?>2 <Cataloog>3 <CD>4 <Titel>Empire Burlesque</Titel>5 <Artiest>Bob Dylan</Artiest>6 <Land>USA</Land>7 <Platenmaatschappij>Columbia</Platenmaatschappij>8 <Prijs>10.90</Prijs>9 <Jaar>1985</Jaar>10 </CD>11 <CD>12 <Titel>Hide your heart</Titel>13 <Artiest>Bonnie Tyler</Artiest>14 <Land>UK</Land>15 <Platenmaatschappij>CBS Records</Platenmaatschappij>16 <Prijs>9.90</Prijs>17 <Jaar>1988</Jaar>18 </CD>19 <CD>20 <Titel>Greatest Hits</Titel>21 <Artiest>Dolly Parton</Artiest>22 <Land>USA</Land>23 <Platenmaatschappij>RCA</Platenmaatschappij>24 <Prijs>9.90</Prijs>25 <Jaar>1982</Jaar>26 </CD>27 </Cataloog>

Een XML bestand wordt zoals HTML opgebouwd met tags (<.....></.......>). De namen van de tags mag je wel zelf kiezen (let op: een geopende tag moet steeds een overeenkomende sluitende tag hebben).

102 | P a g i n a

Page 113: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

In ons voorbeeld bestaat ons XML bestand uit een Root element (Cataloog) die alle andere elementen bevat.

Het Root element Cataloog bevat drie CD elementen.

Elke CD element bevat op zijn beurt zes elementen (Titel, Artiest, Land, Platenmaatschappij, Prijs en Jaar).

Een XML bestand is dus ideaal om gestructureerde gegevens in op te slaan.

De HTML pagina

Bij het selecteren van een artiest wordt de functie showCD uitgevoerd. M.a.w. de functie wordt door de gebeurtenis onchange gestart.

De HTML pagina xml.html:

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml">3 <head>4 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />5 <title>AJAX XML</title>6 <script type="text/javascript">7 function showCD(str){8 if (str==""){9 document.getElementById("txtHint").innerHTML="";10 return;11 }12 if (window.XMLHttpRequest){// code voor IE7+, Firefox, Chrome,

Opera, Safari13 xmlhttp=new XMLHttpRequest();14 } else {// code voor IE6, IE515 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");16 }17 xmlhttp.onreadystatechange=function(){18 if (xmlhttp.readyState==4 && xmlhttp.status==200){19

document.getElementById("txtHint").innerHTML=xmlhttp.responseText;20 }21 }22 xmlhttp.open("GET","getcd.php?q="+str,true);23 xmlhttp.send();24 }25 </script>26 </head>27 <body>28 <form>29 Selecteer een CD:30 <select name="cds" onchange="showCD(this.value)">31 <option value="">Selecteer een artiest:</option>32 <option value="Bob Dylan">Bob Dylan</option>33 <option value="Bonnie Tyler">Bonnie Tyler</option>34 <option value="Dolly Parton">Dolly Parton</option>35 </select>36 </form>37 <p id="txtHint"><b>De CD informatie verschijnt hier...</b></p>38 </body>39 </html>

De functie showCD

103 | P a g i n a

Page 114: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

• controleert of er een artiest geselecteerd is,

• maakt een XMLHttpRequest object aan,

• maakt een functie aan die pas uitgevoerd wordt als de gegevens van de server komen,

• stuurt een aanvraag naar een script op de server,

• let op het argument (q) dat aan de URL werd toegevoegd (met de inhoud van de selectie).

Het PHP script

Het PHP script getcd.php opent het XML bestand, zoekt naar de aangevraagde artiest en stuurt een antwoord in HTML code naar het JavaScript in de browser:

1 <?php2 $q=$_GET["q"];3 $xmlDoc = new DOMDocument();4 $xmlDoc->load("cd_cataloog.xml");5 $cds = $xmlDoc->getElementsByTagName('CD'); // opzoeken CD tags6 for ($cd = 0; $cd <= $cds->length-1; $cd++){ // alle CD tags

doorlopen7 if ($cds->item($cd)->nodeType == 1){ // enkel de betekenisvolle

elementen onderzoeken8 $artiesten = $cds->item($cd)-

>getElementsByTagName('Artiest'); // alle tags Artiesten in de CD opzoeken

9 for ($artiest = 0; $artiest <= $artiesten->length-1; $artiest++){ // alle Artiesten tags doorlopen

10 if ($artiesten->item($artiest)->nodeType == 1){ // enkel de betekenisvolle elementen onderzoeken

11 if($artiesten->item($artiest)->nodeValue == $q){ // Artiest is de opgegeven artiest

12 // Titel van de CD met de opgegeven artiest weergeven

13 $titels = $cds->item($cd)->getElementsByTagName('Titel');

14 for ($titel = 0; $titel <= $titels->length-1; $titel++){

15 if ($titels->item($titel)->nodeType == 1){16 print "<b>" . $titels->item($titel)-

>nodeName . ":</b> ";17 print $titels->item($titel)->nodeValue;18 print "<br />";19 }20 }21 // Artiest van de CD met de opgegeven artiest

weergeven22 print "<b>" . $artiesten->item($artiest)-

>nodeName . ":</b> ";23 print $artiesten->item($artiest)->nodeValue;24 print "<br />";25 // Land van de CD met de opgegeven artiest

weergeven26 $landen = $cds->item($cd)-

>getElementsByTagName('Land');27 for ($land = 0; $land <= $landen->length-1;

$land++){28 if ($landen->item($land)->nodeType == 1){

104 | P a g i n a

Page 115: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

29 print "<b>" . $landen->item($land)->nodeName . ":</b> ";

30 print $landen->item($land)->nodeValue;31 print "<br />";32 }33 }34 // Platenmaatschappij van de CD met de opgegeven

artiest weergeven35 $platenmaatschappijen = $cds->item($cd)-

>getElementsByTagName('Platenmaatschappij');36 for ($platenmaatschappij = 0;

$platenmaatschappij <= $platenmaatschappijen->length-1; $platenmaatschappij++){

37 if ($platenmaatschappijen->item($platenmaatschappij)->nodeType == 1){

38 print "<b>" . $platenmaatschappijen->item($platenmaatschappij)->nodeName . ":</b> ";

39 print $platenmaatschappijen->item($platenmaatschappij)->nodeValue;

40 print "<br />";41 }42 }43 // Prijs van de CD met de opgegeven artiest

weergeven44 $prijzen = $cds->item($cd)-

>getElementsByTagName('Prijs');45 for ($prijs = 0; $prijs <= $prijzen->length-1;

$prijs++){46 if ($prijzen->item($prijs)->nodeType == 1){47 print "<b>" . $prijzen->item($prijs)-

>nodeName . ":</b> ";48 print $prijzen->item($prijs)->nodeValue;49 print "<br />";50 }51 }52 // Jaar van de CD met de opgegeven artiest

weergeven53 $jaren = $cds->item($cd)-

>getElementsByTagName('Jaar');54 for ($jaar = 0; $jaar <= $jaren->length-1;

$jaar++){55 if ($jaren->item($jaar)->nodeType == 1){56 print "<b>" . $jaren->item($jaar)-

>nodeName . ":</b> ";57 print $jaren->item($jaar)->nodeValue;58 print "<br />";59 }60 } 61 }62 }63 }64 }65 }66 ?>

Bij een CD aanvraag vanuit JavaScript naar het PHP script:

• wordt een XML DOM object aangemaakt,

• wordt op alle CD's naar alle <Artiest> elementen met de opgegeven naam gezocht,

105 | P a g i n a

Page 116: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

• wordt de gevonden informatie in HTML vorm naar de browser gestuurd.

Opiniepeiling met resultaten

De HTML pagina

Bij het maken van een keuze wordt de functie getVote uitgevoerd. De functie wordt actief bij het klikken op een keuze (onclick gebeurtenis).

De HTML pagina peiling.html:

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml">3 <head>4 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />5 <title>Opiniepeiling</title>6 <script type="text/javascript">7 function getVote(int){8 if (window.XMLHttpRequest){// code voor IE7+, Firefox, Chrome,

Opera, Safari9 xmlhttp=new XMLHttpRequest();10 } else {// code voor IE6, IE511 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");12 }13 xmlhttp.onreadystatechange=function(){14 if (xmlhttp.readyState==4 && xmlhttp.status==200){15

document.getElementById("poll").innerHTML=xmlhttp.responseText;16 }17 }18 xmlhttp.open("GET","poll_vote.php?vote="+int,true);19 xmlhttp.send();20 }21 </script>22 </head>23 <body>24 <div id="poll">25 <h3>Ga je in de toekomst de interessante combinatie PHP en AJAX

gebruiken?</h3>26 <form>27 Ja:28 <input type="radio" name="vote" value="0"

onclick="getVote(this.value)" />29 <br />Neen:30 <input type="radio" name="vote" value="1"

onclick="getVote(this.value)" />31 </form>32 </div>33 </body>34 </html>

De getVote functie:

• maakt een XMLHttpRequest object aan,

• maakt een functie aan die pas uitgevoerd wordt als de gegevens van de server komen,

• stuurt een aanvraag naar een script op de server,

106 | P a g i n a

Page 117: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

• let op het argument (vote) dat aan de URL werd toegevoegd (met de inhoud van de keuze).

Het PHP script

Het PHP script poll_vote.php:

1 <?php2 $vote = $_REQUEST['vote'];3 //openen resultaten vorige stemmem4 $bestandsnaam = "poll_results.txt";5 $inhoud = file($bestandsnaam) or die("Kon het bestand $bestandsnaam

niet openen.");6 //plaats de resultaten in een array7 $array = explode("||", $inhoud[0]);8 $ja = $array[0];9 $neen = $array[1];10 if ($vote == 0){11 $ja = $ja + 1;12 }13 if ($vote == 1){14 $neen = $neen + 1;15 }16 //voeg de stem toe aan het bestand met de resultaten17 $stemresultaten = $ja."||".$neen;18 $fp = fopen($bestandsnaam,"w");19 fputs($fp,$stemresultaten);20 fclose($fp);21 ?>22 <h2>Resultaat:</h2>23 <table>24 <tr>25 <td>Ja:</td>26 <td>27 <span style="display: inline-block; width:<?php print

100*round($ja/($neen+$ja),2); ?>px; height:20px; background-color:#afa"></span>

28 <?php print 100*round($ja/($neen+$ja),2); ?>%29 </td>30 </tr>31 <tr>32 <td>Neen:</td>33 <td>34 <span style="display: inline-block; width:<?php print

100*round($neen/($neen+$ja),2); ?>px; height:20px; background-color:#faa"></span>

35 <?php print 100*round($neen/($neen+$ja),2); ?>%36 </td>37 </tr>38 </table>

Na het ontvangen van de JavaScript aanvraag

• wordt het bestand poll_results.txt geopend,

• de resultaten worden in variabelen geplaatst,

• de nieuwe stem wordt aan de resultaten toegevoegd,

• de aangepaste resultaten worden in het bestand poll_results.txt opgeslagen,

107 | P a g i n a

Page 118: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

• er wordt een grafische HTML voorstelling van de resultaten aangemaakt en doorgestuurd.

Het tekstbestand

Het tekstbestand poll_results.txt bevat de resultaten van de stemmen.

Deze worden op de volgende manier opgeslagen:

1 0||0

Het eerste getal bevat het aantal ja stemmen, het tweede getal het aantal neen stemmen.

Opmerking: Zorg dat de webserver het tekstbestand kan aanpassen. Geef niet iedereen toegang, enkel de webserver (PHP).

Oefeningen

Het project van deze cursus: Webshop

De verschillende categorieën gaan we via AJAX uit een XML bestand halen.

Maak het nieuwe XML bestand categorieen.xml aan:

1 <?xml version="1.0" encoding="utf-8"?>2 <categorieen>3 <categorie>Webdesign</categorie>4 <categorie>Kantoor</categorie>5 ...............Multimedia.............6 <categorie>Programmeren</categorie>7 ...............

Om AJAX te kunnen gebruiken heeft de pagina index.php in de head sectie een JavaScript functie nodig:

<script type="text/javascript">var xmlhttp = new Array(); // meerdere oproepen tegelijk behandelenfunction ajax(url, id){ if (window.XMLHttpRequest){// code voor recente browsers xmlhttp[id]=new XMLHttpRequest(); } else {// code voor IE6, IE5 xmlhttp[id]=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp[id].onreadystatechange=function(){ if (xmlhttp[id].readyState==4 && xmlhttp[id].status==200){ document.getElementById(id).innerHTML=xmlhttp[id].responseText; } } xmlhttp[id].open("GET",url,true); xmlhttp[id].send();}</script>

Vervang het weergeven van de categorie in de Kop 1 door een span tag met het ID categorie_in_titel, deze kan dan met JavaScript ingevuld worden.

<h1>SNT Webshop Informatica (<span id="categorie_in_titel"></span>)<span style="float:right; font-size:medium" ><?php datumWeergeven(); ?></span></h1>

Vervang het weergeven van de categorieën door een AJAX aanroep:

<p id="categorieen"></p>

108 | P a g i n a

Page 119: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

<script type="text/javascript">ajax("categorieen.php","categorieen");</script>

Maak het nieuwe PHP script voor het doorsturen van de AJAX HTML-code:

1 <?php2 $xmlDoc = new DOMDocument();3 $xmlDoc->load("categorieen.xml");4 $categorieen = $xmlDoc->getElementsByTagName('categorie'); //

opzoeken ................. tags5 for ($categorie = 0; $categorie <= ..............; $categorie++): ?>6 <?php if ($categorieen->item($categorie)->nodeType == 1): ?>7 <span style="color:#00F; text-decoration:underline;

cursor:pointer" onclick="8 ajax('cursussen.php?cat=<?php print $categorieen-

>item($categorie)->nodeValue; ?>','cursussen'); 9 document.getElementById('categorie_in_titel').innerHTML='<?

php print $categorieen->item($categorie)->nodeValue; ?>';">10 <?php print $categorieen->item($categorie)->nodeValue; ?

></span>11 <?php if($categorie != $categorieen->length-1): ?>12 | 13 <?php .............. ?>14 <?php .............. ?>15 <?php .............. ?>

Ook de cursussen per categorie gaan we via AJAX en XML weergeven.

Maak voor de cursussen Webdesign het nieuw XML bestand Webdesign.xml:

1 <?xml version="1.0" encoding="utf-8"?>2 <cursussen>3 <cursus>4 <Naam>Dreamweaver Deel 1</Naam>5 <Omschrijving>Basis Webdesign</Omschrijving>6 <Prijs>77.00</Prijs>7 </cursus>8 <cursus>9 <Naam>Dreamweaver Deel 2</Naam>10 <Omschrijving>Gevorderde Webdesign</Omschrijving>11 <Prijs>77.00</Prijs>12 </cursus>13 <cursus>14 <Naam>JavaScript</Naam>15 <Omschrijving>Programmeren in de browser</Omschrijving>16 <Prijs>77.00</Prijs>17 </cursus>18 <cursus>19 <Naam>PHP</Naam>20 <Omschrijving>Programmeren op de server</Omschrijving>21 <Prijs>77.00</Prijs>22 </cursus>23 <cursus>24 <Naam>Dreamweaver Eindwerk</Naam>25 <Omschrijving>Webdesign in de praktijk</Omschrijving>26 <Prijs>77.00</Prijs>27 </cursus>28 </cursussen>

Vervang op de pagina .................... het weergeven van de cursussen door een AJAX aanroep:

109 | P a g i n a

Page 120: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

<div id="cursussen"></div><script type="text/javascript">ajax("cursussen.php?cat=<?php print $cat; ?>","cursussen");document.getElementById("categorie_in_titel").innerHTML="<?php print $cat; ?>";</script>

Maak het nieuwe PHP script voor het doorsturen van de AJAX HTML-code:

1 <?php require 'functies.php'; // voor de functie prijsWeergeven() ?>2 <table border="0">3 <tr>4 <th>Cursus</th>5 <th>Omschrijving</th>6 <th>Prijs</th>7 <th>Inschrijven</th>8 </tr>9 <?php10 $cat=$_GET["cat"];11 $xmlDoc = new DOMDocument();12 $xmlDoc->load("$cat.xml");13 $cursussen = $xmlDoc->getElementsByTagName('.........'); // opzoeken

cursus tags14 for ($cursus = 0; $cursus <= .......................; $cursus++): ?>15 <tr>16 <td><?php 17 $namen = $cursussen->item($cursus)->...................('Naam');18 for ($naam = 0; $naam <= $namen->length-1; $naam++){19 if ($namen->item($naam)->nodeType == 1){20 $cursusnaam = $namen->item($naam)->nodeValue;21 print $cursusnaam;22 }23 }24 ?></td>25 <td><?php 26 $omschrijvingen = $cursussen->item($cursus)->..................;27 for ($omschrijving = 0; $omschrijving <= ....; $omschrijving++){28 if ($omschrijvingen->item($omschrijving)->nodeType == 1){29 print $omschrijvingen->item($omschrijving)->...........;30 }31 }32 ?></td>33 <td>&#8364; <?php 34 $prijzen = $cursussen->item($cursus)->................('Prijs');35 for ($prijs = 0; $prijs <= $prijzen->length-1; $prijs++){36 if ($prijzen->item($prijs)->nodeType == 1){37 print prijsWeergeven($prijzen->item($prijs)->nodeValue);38 }39 }40 ?></td>41 <td><a href="inschrijven.php?cursus=<?php print

urlencode($cursusnaam); ?>&cat=<?php print $cat; ?>">Inschrijven</a></td>

42 </tr>43 <?php endfor; ?>44 </table>

Om een gegeven (eigenschap) van een bepaalde cursus uit een XML bestand te halen voeg je de volgende functie in het PHP script functies.php toe:

110 | P a g i n a

Page 121: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

function cursusEigenschap($cat, $cursusnaam, $eigenschap) { $xmlDoc = new DOMDocument(); $xmlDoc->load("$cat.xml"); $cursussen = $xmlDoc->....................; // opzoeken cursus tags for ($cursus = 0; $cursus <= $cursussen->length-1; $cursus++){ $namen = $cursussen->item($cursus)->..........................; for ($naam = 0; $naam <= $namen->length-1; $naam++){ if ($namen->item($naam)->nodeType == 1){ if ($cursusnaam == $namen->item($naam)->nodeValue){ switch($eigenschap){ case "Omschrijving": $omschrijvingen = $cursussen->item($cursus)->getElementsByTagName('Omschrijving'); for ($omschrijving = 0; $omschrijving <= $omschrijvingen->length-1; $omschrijving++){ if ($omschrijvingen->item($omschrijving)->nodeType == 1){ return $omschrijvingen->item($omschrijving)->nodeValue; } } break; case "Prijs": // schrijf zelf de regels voor prijs ... ... ... ... ... ... ... } } } } }}

Aangezien we nu elke eigenschap van een cursus kunnen opvragen wordt de functie prijsCursus() overbodig. Verwijder deze functie.

De functie prijsCursus() wordt enkel gebruikt in de PHP pagina inschrijven.php. Vervang de regel met de functie prijsCursus() door de nieuwe functie:

<input type="text" name="prijs" id="prijs" readonly="readonly" value="<?php cursusEigenschap($cat, $cursus, "Prijs"); ?>" />

Werk de webshop af door voor alle categorieën een XML bestand met cursussen te maken.

111 | P a g i n a

Page 122: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Ruim de overbodig geworden code in het PHP script model.php op. Doe dit voorzichtig en test grondig.

LiveSearch

Bij het intypen van een letter moeten er suggesties komen met te bezoeken koppelingen (hyperlinks).

Maak daarvoor een XML bestand aan waarin je alle te bezoeken koppelingen opslaat, elke koppeling heeft een titel en een URL.

Titel URL

Webdesign http://webdesign.pindanet.be/

Stedelijke Nijverheids- en Taalleergangen Brugge http://snt.be/

Linux http://linux.pindanet.be/

Dokeos http://www.snt-brugge.be/dokeos/Maak een HTML pagina met een formulier met een tekstveld. Dit tekstveld voert na het typen van een teken een JavaScript functie uit waarmee via AJAX een PHP script op de webserver wordt gestart. De door het PHP script aangemaakte HTML code wordt door de JavaScript functie in het HTML element met het ID livesearch geplaatst.

Onder het tekstveld plaats je een lege div-tag met het id livesearch<div id="livesearch"></div>

Schrijf een PHP script waarmee in de titels van het XML bestand gezocht wordt naar de reeds ingetypte tekens. De gevonden resultaten worden als HTML koppelingen (hyperlinks) naar de browser doorgestuurd. Indien geen resultaten gevonden werden wordt de melding Geen suggesties naar de browser doorgestuurd.<a href="http://linux.pindanet.be" target="_blank">Linux</a>

PHP SessiesAlgemeen

We kunnen gegevens doorsturen tussen verschillende pagina's door gebruik te maken van de $_POST- en de $_GET-variabele. Het is echter behoorlijk omslachtig om bepaalde gegevens constant op deze manier door te sturen. Het zou handiger zijn mochten we een aantal gegevens kunnen opslaan in een variabele die altijd toegankelijk is gedurende het bezoek aan de website.

112 | P a g i n a

Page 123: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Hiervoor kunnen we gebruik maken van sessies.

Een andere mogelijkheid is, om bepaalde zaken te bewaren tussen de verschillende bezoeken van de website in. Denken we bijvoorbeeld aan de taalkeuze, de gebruikersnaam, ...Hiervoor kunnen we gebruik maken van cookies. Dit zijn kleine bestandjes die opgeslagen worden op de harde schijf van de gebruiker.

Voorbeelden

We lezen een gebruikersnaam in via een formulier. Deze naam moet op elke die bezocht wordt, worden weergegeven. Ook wordt het aantal bezoeken bijgehouden gedurende deze sessie:

Op de pagina gebruikersnaam.html wordt de gebruikersnaam ingelezen:

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml">3 <head>4 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />5 <title>Gebruikersnaam</title>6 </head>7 <body>8 <form id="form1" name="form1" method="post"

action="gebruikersnaam1.php">9 <label for="gebruikersnaam">Gebruikersnaam:</label>10 <input type="text" name="gebruikersnaam" id="gebruikersnaam" />11 <input type="submit" name="button" id="button"

value="Verzenden" />12 </form>13 </body>14 </html>

De gebruikersnaam wordt bewaard in een sessie:

1 <?php2 session_start();3 $gebruikersnaam = $_POST['gebruikersnaam'];4 $_SESSION ['gebruikersnaam'] = $gebruikersnaam;5 ?>6 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">7 <html xmlns="http://www.w3.org/1999/xhtml">8 <head>9 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />10 <title>Gebruikersnaam opslaan</title>11 </head>12 <body>13 <p>Welkom <?php print $gebruikersnaam; ?></p>14 <p><a href="gebruikersnaam2.php">Naar de volgende pagina</a></p>15 </body>16 </html>

Het aantal bezoeken wordt telkens verhoogd:

1 <?php2 session_start();3 $gebruikersnaam = $_SESSION['gebruikersnaam'];4 $bezoeken = ++$_SESSION['bezoeken'];

113 | P a g i n a

Page 124: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

5 ?>6 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">7 <html xmlns="http://www.w3.org/1999/xhtml">8 <head>9 <meta http-equiv="Content-Type" content="text/html; charset=utf-

8" />10 <title>Gebruikersnaam opvragen en bezoeken tellen</title>11 </head>12 <body>13 <p><?php print $gebruikersnaam; ?> bezocht deze pagina al <?php

print $bezoeken; ?> keer.</p>14 <p><a href="gebruikersnaam2.php">Deze pagina nog een keer

bezoeken.</a></p>15 </body>16 </html>

Werking

Sessies maken gebruik van twee gegevens:

• De sessie-variabele • De sessie-id

De variabelen zelf worden bewaard op de server en niet op de computer van de gebruiker. Op die manier is er geen misbruik van de gegevens mogelijk en blijf je onafhankelijk van de browser van de gebruiker. Een sessie loopt, zolang de gebruiker met zijn browser een bepaalde website bezoekt. Keert de gebruiker nadien, zonder de browser af te sluiten en binnen een bepaalde tijd, terug naar deze website, wordt de sessie verder gezet. Sluit de gebruiker de browser af, dan wordt ook de sessie afgesloten. Bij sommige browsers is dit echter niet het geval, en blijft een sessie bestaan, zolang de sessietijd niet overschreden werd, onafhankelijk van het sluiten van de browser of niet.

De variabelen zelf worden wel nog een tijdje op de server bewaard, omdat de server niet kan weten dat de gebruiker zijn browser heeft afgesloten. Deze tijd wordt bepaald in het php.ini-bestand door de session.gc_maxlifetime-instelling. Deze staat standaard op 1440 seconden of 24 minuten. Dit betekent dat er, om een sessie in stand te houden, niet meer dan 24 minuten inactiviteit mag zijn.

Er bestaat echter wel een mogelijkheid om deze sessie toch expliciet te stoppen en daarmee alle variabelen op de server te wissen.

De gegevens worden op de server geïdentificeerd door de sessie-ID. Deze ID wordt telkens doorgegeven aan de server, als de bezoeker gebruik maakt van sessies. Als de ID nog niet bestaat, wordt deze aangemaakt als een uniek nummer. Omdat de ID telkens moet doorgegeven worden aan de server bij het versturen van gegevens wordt deze ID opgeslagen op de computer in de vorm van een cookie.

Het enige wat dus over gestuurd wordt is de sessie-ID. De gegevens worden enkel op de server bewaart en de ID is als het ware de sleutel tot deze gegevens.

Hou er dus wel rekening mee, dat als je gebruik wilt maken van sessies, dat de gebruiker cookies moet toestaan.

Werken met sessies

Het werken met sessies is behoorlijk eenvoudig. PHP bevat namelijk een uitgebreide verwerking van sessies. Het werken zal voornamelijk uit 3 stappen bestaan:

• opstarten van een sessie • het gebruik van de sessie • het stoppen van de sessie

114 | P a g i n a

Page 125: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Opstarten van een sessie

Het opstarten gebeurt door eenvoudig de functie session_start() op te roepen.

Bij het opstarten van deze sessie, wordt er eerst gecontroleerd of er al een sessie voor deze gebruiker bestaat. Daarvoor wordt er gekeken of er een cookie op de pc van de bezoeker staat die aan de juiste omschrijving voldoet (correcte session-id). Indien dit niet zo is, wordt er op de server ruimte voorzien voor het opslaan van de gebruikte sessie-variabelen en wordt er een cookie gestuurd naar de browser met daarin de waarde van de sessie-ID. Deze ID is een nummer bestaande uit 32 hexadecimale cijfers, vb: 6bf5ejk2lmviflr41e5dtiquv1.

Als er wel al een sessie loopt, wordt er geen nieuwe opgestart, maar wordt de cookie uitgelezen. Aan de hand van deze cookie weet de server welke variabelen hij moet gebruiken in het script.

Doordat de session_start() iets terugstuurt naar de browser in de HTTP-headers, moet session_start() opgeroepen worden vóór er iets van output naar de browser gestuurd wordt.

Doe je dit niet dan zal je script niet werken.

De ID van de huidige sessie kun je terugvinden door de functie session_id() op te roepen.

Gebruik van de sessie variabelen

Nadat je de session_start() opgeroepen hebt, kun je gebruik maken van de variabele $_SESSION[]. Deze array-variabele kan gebruikt worden om elk type gegevens in op te slaan, inclusief andere arrays.

Vergeet je de functie session_start() op te roepen in het begin van je script dan gaan de eventuele wijzigingen in de $_SESSION[]-variabele verloren zodra het script eindigt.

Sessies verwijderen

In sommige omstandigheden wil je alle of slechts een aantal sessievariabelen verwijderen. Denk bijvoorbeeld aan foutafhandelingen in een formulier, of het afmelden bij een bepaalde pagina.

Gedeeltelijk verwijderen van sessievariabelen

Om één sessievariabele te verwijderen tijdens de uitvoer van een script, kun je gebruik maken van de standaardfunctie unset(). Deze functie zorgt ervoor dat de opgeroepen variabele verwijderd wordt:

Vergeet vooral niet om op te geven welke waarde je wilt verwijderen uit je $_SESSION[]-variabele. Geef je deze niet op, dan wordt je volledige $_SESSION-variabele verwijdert.

De volledige sessie verwijderen

We zouden ook unset($_SESSION) kunnen gebruiken om een volledige sessie te beëindigen. Meestal wordt hiervoor echter meestal de functie session_destroy() gebruikt, omdat de volledige $_SESSION[] verwijdert wordt. Deze session_destroy() wordt meestal gebruikt bij afmeld-pagina's.

<?phpsession_start();session_destroy(); header("location: login.php");?>

Vergeet niet om de session_destroy te laten voorafgaan door een session_start()!

Oefeningen

Het project van deze cursus: Webshop

We gaan onze Webshop uitbreiden met een winkelwagen vol met cursussen.

115 | P a g i n a

Page 126: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Aangezien we de sessie variabelen op alle pagina's gaan gebruiken, starten we het gebruik van sessies in het script functies.php (dit script wordt in het begin van alle pagina's uitgevoerd).

session_..................

Meerdere cursussen

In plaats van rechtstreeks naar een inschrijfpagina te gaan, gaan we via een pagina die de gegevens aan de winkelwagen toevoegt en terug springt naar de pagina waar onze cursussen staan.

De koppeling in het script ................... wordt nu:

<td><a href="winkelwagen.php?cursus=<?php print urlencode($cursusnaam); ?>&cat=<?php print $cat; ?>">Toevoegen</a></td>

Uit dit fragment blijkt dat we springen naar het script ......................... en we als argumenten de cursus én de categorie meegeven.

Pas de de bijhorende kolomtitel van de tabel aan naar:

<th>Winkelwagen</th>

Cursussen aan de winkelwagen toevoegen

De doorgestuurde gegevens bevinden zich in $_GET-variabele.

Het script om een cursus aan de sessie variabelen toe te voegen wordt:

1 <?php2 require 'functies.php';3 $categorie = $_GET['cat'];4 $cursus = $_GET['cursus'];5 $_SESSION['winkelwagen'][] = array ( 'categorie' => $categorie,

'cursus' => $cursus);6 header("location: index.php?cat=$categorie");7 ?>

De sessie variabele winkelwagen is dus een array met cursussen.

Elke cursus in de sessie variabele winkelwagen is op zijn beurt een array met de categorie en de naam van de cursus.

De sessie variabele winkelwagen is dus een meervoudige array.

Uiteindelijk gebruiken we de header()-functie om terug te springen naar de pagina index.php. Deze header kun je enkel en alleen aanroepen, als er nog geen output naar de browser verstuurd werd. Let er dus op dat er geen spaties (of nieuwe regels) buiten de php-code staan. Ook niet in het door winkelwagen.php opgeroepen functies.php script.

Het winkelmandje weergeven

Daarvoor gebruiken we een op de PHP pagina index.php onder de cursussen de volgende AJAX aanroep:

<div id="winkelwagen"></div><script type="text/javascript">ajax("winkelwagenweergeven.php?cat=<?php print $cat; ?>","..........");</script>

Het PHP script om de winkelwagen via AJAX weer te geven wordt dan:

1 <?php // winkelwagenweergeven.php2 ................. 'functies.php';3 $cat = $_GET['cat'];

116 | P a g i n a

Page 127: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

4 ?>5 <h2>Winkelwagen</h2>6 <?php if (is_array($_SESSION['winkelwagen'])): ?>7 <table border="0">8 <tr>9 <th>Cursus</th>10 <th>Omschrijving</th>11 <th>Categorie</th>12 <th align="right">Prijs</th>13 </tr>14 <?php ...............($_SESSION['winkelwagen'] as $cursus): ?>15 <tr> // een rij per cursus16 <td><?php print $cursus['cursus']; ?></td>17 <td><?php print cursusEigenschap($cursus['categorie'],

$cursus['cursus'], 'Omschrijving'); ?></td>18 <td><?php print $cursus['categorie']; ?></td>19 <td align="right"><?php $prijs =

cursusEigenschap(.................. , ................. , 'Prijs');20 $teBetalen += $prijs;21 print prijsWeergeven($prijs); ?></td>22 </tr>23 <?php endforeach; ?>24 <tr>25 <td align="center"><a

href="inschrijven.php">Inschrijven</a></td>26 <td align="center"><a href="winkelwagenwissen.php?cat=<?

php .........................; ?>">Winkelwagen wissen</a></td>27 <th align="right">Totaal:</th>28 <td align="right"><?php print

prijsWeergeven($teBetalen); ?></td>29 </tr>30 </table>31 <?php ...... ?>32 <p>De winkelwagen is leeg.</p>33 <?php ...... ?>

De winkelwagen leegmaken

Dit kunnen we door de sessie-variabele te verwijderen waarin de winkelwagen bijgehouden wordt.

Het PHP script .......................................... wordt:

1 <?php2 session_start();3 unset($_SESSION['winkelwagen']);4 $categorie = $_GET['cat'];5 header("....................................................");6 ?>

Op het laatste springen we dan terug naar onze index-pagina.

117 | P a g i n a

Page 128: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Weergeven van de winkelwagen bij de inschrijving

Ook in inschrijving.php willen we de gekozen cursussen netjes weergeven. Daarvoor passen we het PHP script .............................. voor de weergave van de winkelwagen als volgt aan:

De Kop 2 (h2) mag weergegeven worden als de GET variabele weergave niet de waarde inschrijven bevat.

Als de GET variabele weergave de waarde inschrijven bevat, wordt als Kop 2 de tekst “U wenst zich in te schrijven voor:” weergegeven.

Ook de koppelingen (hyperlinks) in de onderste rij naar inschrijven.php en winkelwagenwissen.php mogen enkel weeggegeven worden als de GET variabele weergave de waarde inschrijven bevat.

De PHP pagina .................................................... om in te schrijven pas je als volgt aan:

Voeg de JavaScript code voor AJAX toe aan de pagina.

Zorg dat de winkelwagen onder de Kop 1 (h1) wordt weergegeven.

Pas de Kop 1 aan naar:<h1>Inschrijvingsformulier</h1>

Om de prijs automatisch in het formulier in te vullen, pas je volgende zaken aan:

Pas het PHP script winkelwagenweergeven.php aan zodat de cel waarin de te betalen prijs staat het id tebetalen krijgt

<td align="right" id="tebetalen"><?php print prijsWeergeven($teBetalen); ?></td>

Voeg in de PHP pagina inschrijven.php juist na de JavaScript regel waarmee de ontvangen HTML code op het scherm wordt geplaatst de regel:

document.getElementById("prijs").value = document.getElementById("tebetalen").innerHTML;

118 | P a g i n a

Page 129: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Weergeven van de winkelwagen bij het verwerken van de inschrijving

Bij het doorsturen van de verschillende e-mails moet de winkelwagen weergegeven worden.

Pas het PHP script voor het weergeven van de winkelwagen als volgt aan:

De Kop 2 (h2) mag niet weergegeven worden als de GET variabele weergave de inhoud email bevat.

De koppelingen (hyperlinks) in de onderste rij naar inschrijven.php en winkelwagenwissen.php mogen enkel weeggegeven worden als de GET variabele leeg is.

Pas de PHP pagina met de verwerking van de inschrijving als volgt aan:

Met de volgende regels PHP code wordt de weergave van een winkelwagen in een string opgeslagen:

ob_start(); // vang de uitvoer van een PHP script op$_GET['weergave'] = "email"; // zet gewenste GET variabeleinclude "winkelwagenweergeven.php"; // Voer het externe PHP script uit$winkelwagen = ob_get_contents(); // plaats de ontvangen uitvoer van het externe PHP script in een stringob_end_clean(); // stop het opvangen van de uitvoer

Daar zowel de PHP pagina inschrijven_verwerken.php als het PHP script winkelwagenweergeven.php het PHP script functies aanroept, krijgen we een conflict (2 maal aanroepen zorgt voor een fout). Pas de aanroep in het PHP script winkelwagenweergeven.php als volgt aan:

require_once 'functies.php'; // enkel laden indien nog niet aanwezig

Pas het bericht naar de administratie als volgt aan:

$berichtAdministratie = <<<eod<p>Beste,</p>$voornaam $naam wenst zich in te schrijven voor:$winkelwagen<pre>$formuliergegevens</pre>eod;

Pas het bericht naar de cursist op een gelijkaardige manier aan.

Daar de winkelwagen in een HTML tabel wordt weergegeven, moeten de e-mails in HTML verzonden worden. Pas het verzenden van de email naar de cursist als volgt aan:

119 | P a g i n a

Page 130: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

$header = "FROM: " . EMAIL_ADMINISTRATIE . "\r\nMIME-Version: 1.0\r\nContent-type: text/html; charset=utf-8";mail($email, "Inschrijving", $berichtCursist, $header);

Pas op een gelijkaardige manier het verzenden van de e-mail naar de administratie aan.

Om de HTML weergave van de e-mails te zien, moet je in de Opties bij de Weergavevoorkeuren de optie HTML-versie standaard tonen activeren. Vergeet de aanpassing niet te versturen (knop).

Zorg dat na het versturen van de e-mails de winkelwagen wordt leeggemaakt.

Categorie bijhouden

Nu houden we de categorie bij door deze telkens via GET aan de PHP pagina's door te geven.

Pas de webshop aan zodat je de categorie met behulp van een sessie variabele bijhoudt.

Webshop afwerken

Bij het online testen blijkt bij het toevoegen van cursussen aan de winkelwagen de volledige pagina te herladen, en dit kost tijd.

Met AJAX kan dit sneller:

In het PHP script verantwoordelijk voor het toevoegen van cursussen (winkelwagen.php) schakel je de regel verantwoordelijke voor het herladen van de PHP pagina index.php uit.

In het PHP script verantwoordelijk voor het weergeven van de cursussen (cursussen.php) pas je cel met de koppeling (hyperlink) aan voor AJAX:

<td><span style="color:#00F; text-decoration:underline; cursor:pointer" onclick="ajax('winkelwagen.php?cursus=<?php print urlencode($cursusnaam); ?>&cat=<?php print $cat; ?>','winkelwagen'); ">Toevoegen</span> </td> <td><span style="color:#00F; text-decoration:underline; cursor:pointer" onclick="ajax('winkelwagen.php?cursus=<?php print urlencode($cursusnaam); ?>&cat=<?php print $cat; ?>','winkelwagen'); ">Toevoegen</span> </td>

Na het aanpassen van de winkelwagen moet deze nog worden weergegeven. Dit gebeurt na het ontvangen van de HTML code van winkelwagen.php (niets) in de JavaScript functie op de pagina index.php. Na het weergeven van de ontvangen HTML code voeg je de volgende functionaliteit toe:

if (url.search("winkelwagen.php") == 0){ajax("winkelwagenweergeven.php?cat=<?php print

$cat; ?>","winkelwagen");}

Waarschuwing

Bij de ontwikkeling van een echte Webshop komt nog veel meer kijken. M.a.w. de webshop uit deze cursus diende enkel om de theorie in te oefenen en is zeker niet veilig genoeg om op het Internet als een actieve webshop gebruikt te worden. Om PHP scripts te beveiligen lees je best ook het aanvullende hoofdstuk i.v.m. beveiliging.

Aanmelden

Maak een PHP pagina waarop een gebruiker zijn voornaam en naam moet opgegeven om zichzelf aan te melden.

120 | P a g i n a

Page 131: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Controleer met behulp van een PHP pagina of de voornaam en naam overeenkomen met een lijst van toegelaten personen.

Indien de gebruiker niet voorkomt in de lijst met toegelaten personen, moet aanmeldpagina terug verschijnen. Indien de gebruiker wel in de lijst opgenomen is, wordt de inhoud van de PHP pagina getoond en worden de gegevens in een sessie variabele opgeslagen.

Een derde pagina, doet een controle of de gebruiker aangemeld is of niet. Als deze niet correct is aangemeld, moet hij teruggestuurd worden naar de aanmeldpagina. Als hij wel correct is aangemeld, krijgt hij een aangepaste pagina te zien.

Geef bij het opgeven van een verkeerde voornaam of naam een foutmelding weer.

Maak ook een pagina waar je je kan afmelden (sessie vernietigen).

PHP beveiligingSql-injectie en xss: de beste verdediging

Het is je misschien opgevallen dat er de laatste tijd in de media nogal vaak over datalekken wordt gesproken. De meeste beveiligingslekken hebben één ding gemeen: ze worden allemaal veroorzaakt door sql-injectie.

Sql-injectie is een van de aanvalsmethoden die een hacker kan gebruiken als gebruikersinvoer op een website niet met voldoende zorg wordt behandeld. Ook cross site scripting wordt daardoor veroorzaakt. Deze problemen zijn al jaren bekend, maar toch blijken er keer op keer websites kwetsbaar voor te zijn.

Dat het een groot probleem is, blijkt ook uit de top-10 van beveiligingsrisico's die het Open Web Application Security Project opstelde. Injecties, waaronder die van sql, staan op de eerste plaats.

Veel ontwikkelaars lijken dus niet of niet goed genoeg te weten wat sql-injectie is en hoe het kan worden voorkomen. Wat zijn deze problemen, hoe worden ze veroorzaakt en hoe kunnen ze worden voorkomen?

We richten ons vooral op de talen PHP en MySQL, hoewel het probleem ook bij andere programmeertalen en databasesoftware speelt. PHP en MySQL treffen we echter het meest aan bij datalekken waarbij sql-injectie een rol speelt.

Om uit te leggen wat sql-injectie is, is enige kennis van programmeertalen nodig. Programmeertalen maken gebruik van strings - simpel gezegd: een verzameling karakters in een bepaalde volgorde. Strings die veranderd kunnen worden, worden variabelen genoemd.

Veel ontwikkelaars maken gebruik van variabele strings om database-opdrachten samen te stellen. Daardoor kan zo'n opdracht dynamisch worden aangepast , bijvoorbeeld als een gebruiker een bepaalde pagina wil opvragen. Voor een inlogsysteem waarbij gebruikersnaam en wachtwoord moeten worden gecontroleerd, zou je bijvoorbeeld de volgende serie opdrachten kunnen gebruiken:

121 | P a g i n a

Page 132: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Een normale gebruiker vult gewoon zijn gebruikersnaam en wachtwoord in om in te loggen. In de eerste twee statements wordt uitgelezen wat deze gebruiker heeft ingevoerd. In de derde opdracht (die hier voor de leesbaarheid op twee regels staat) wordt, aan de hand van de invoer, een string met een sql-opdracht samengesteld. De laatste twee opdrachten voeren deze query uit en controleren of de invoer het gewenste resultaat oplevert.

Een kwaadwillende gebruiker doet het anders. Stel dat die kwaadwillende gebruiker wil inloggen met de username 'Joost', dan hoeft hij in het loginveld enkel Joost' -- in te voeren om MySQL om de tuin te leiden. Dat is een sql-injectie.

Het invoerveld $username is namelijk bedoeld voor pure data, maar door de apostrof toe te voegen, worden de twee koppeltekens door MySQL geïnterpreteerd als een deel van de opdracht, om precies te zijn: "dit is het einde van de opdracht; negeer de rest van de regel." Het gedeelte van de opdracht waarin wordt gecontroleerd of het wachtwoord bij deze user correct is opgegeven, wordt zo overgeslagen. Als we aannemen dat er maar één username 'Joost' is - en dat wordt vrijwel altijd door de database afgedwongen - bevestigt de laatste opdracht uit het codeblok altijd dat naam en wachtwoord bij elkaar horen. Het wachtwoord is dan echter niet daadwerkelijk gecontroleerd.

Er kunnen natuurlijk ook andere opdrachten aan de query worden toegevoegd. Via sql-injectie kunnen zo complete databases worden geplunderd of gemanipuleerd. Dat is geen theoretisch probleem: het gebeurt dagelijks. Het misbruiken van sql-injectie is simpeler dan op het eerste gezicht lijkt, want er zijn kant-en-klare tools die het zware werk doen.

Bij die tools zijn het invoeren van een url en een paar drukken op de knop voldoende: de software gaat dan op zoek naar kwetsbaarheden en, indien aanwezig, slurpt deze desgewenst de hele database leeg. De effectiviteit verschilt van geval tot geval, maar over het algemeen geldt: als een website lek is, is het gebruiken van deze software kinderlijk eenvoudig.

122 | P a g i n a

Page 133: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

Cross site scripting

Cross site scripting - vaak afgekort tot xss - is een vergelijkbaar probleem, dat opduikt wanneer user-input wordt verwerkt in de html-output. Een simpel voorbeeld is bij slecht gebouwde zoekmachines te zien. Als een gebruiker daar <script>alert('hoi');</script> als zoekterm invoert, wordt er niet op die term gezocht, maar wordt het javascript uitgevoerd: er verschijnt een pop-up.

Een kwaadwillende kan een url zo opstellen, dat een argeloze gebruiker die erop klikt, ongewild een script laat uitvoeren. Dat script heeft dan toegang tot alle gegevens waar die gebruiker toegang toe heeft. Zo kunnen bijvoorbeeld cookies worden gestolen. Soms kunnen ook variabelen worden gebruikt die aan andere gebruikers worden getoond. Als een forum bijvoorbeeld niet goed is beveiligd, kan een kwaadwillende een script in een posting opnemen, maar ook bijvoorbeeld in zijn username.

Xss kan ook worden misbruikt om beveiligingsproblemen in browsers te misbruiken, bijvoorbeeld door een Flash- of javascript-kwetsbaarheid te injecteren. Vooral input die aan andere gebruikers wordt getoond is daarvoor gevoelig.

Vertrouw nooit een gebruiker

"Het probleem is dat het al bij de start misgaat", zei HP-beveiligingsonderzoeker Alexander Hoole op de RSA Conference, een beveiligingsconferentie die eind februari in San Francisco van start ging. Hoewel sql-injectie vrij eenvoudig te voorkomen is, ontbreekt bij programmeurs toch vaak de benodigde kennis: "In leerboeken staat het al fout."

mysql_real_escape_string

De belangrijkste les is: wantrouw alle data die van de gebruiker afkomstig is. Het beste is om altijd aan te nemen dat een gebruiker te kwader trouw is - de kans dat een van de bezoekers dat ook daadwerkelijk ís, is gezien het grote aantal datalekken redelijk groot.

Om te voorkomen dat MySQL-opdrachten in een variabele worden verstopt, kan in PHP de functie mysql_real_escape_string worden gebruikt. Die zorgt ervoor dat bepaalde karakters, waarmee het onderscheid tussen data en MySQL-code worden gemaakt, onschadelijk worden gemaakt. Dit noemt men 'escaping': voor een teken als een apostrof wordt dan een backslash geplaatst, zodat dat teken door MySQL als data wordt gezien, en niet als deel van de query.

Deze opdracht zou voldoende moeten zijn om sql-injecties af te vangen. Het is van belang mysql_real_escape_string op het allerlaatste moment toe te passen: zo wordt voorkomen dat andere, latere bewerkingen nog onverwachte en mogelijk schadelijke resultaten opleveren.

htmlspecialchars

Een vergelijkbare functie is er in php voor het bewerken van user-input voordat deze in html wordt getoond: met htmlspecialchars worden karakters als '<', '>' en aanhalingstekens vervangen door html-entiteiten, zodat ze door de browser niet als onderdeel van de html-code worden verwerkt. Dit geldt voor alle input die van gebruikers afkomt en niet alleen voor invoervelden die zichtbaar zijn voor de gebruiker. Xss-scripts zijn hiermee effectief tegen te gaan.

Maar uiteindelijk is bescherming tegen kwaadaardige code, hoe noodzakelijk ook, niet genoeg. De website Just-Eat.nl, waar mensen eten kunnen laten thuisbezorgen, liet het bedrag dat mensen moesten betalen door de browser van de gebruiker uitrekenen. Vervolgens werd bedrag dat naar de server gestuurd in een verborgen html-invoer-veld. 'Onzichtbaar' is echter niet hetzelfde als 'niet aan te passen': gebruikers konden het bedrag zelf veranderen en

123 | P a g i n a

Page 134: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

hoefden bijvoorbeeld maar een paar cent voor een complete maaltijd te betalen. Just-Eat.nl vertrouwde erop dat de data van de gebruiker correct was - en dat is dus altijd fout.

Voorbereiding

Sql-query's kunnen ook eerst aan de server worden aangeboden om later pas van variabelen te voorzien; dat worden 'prepared statements' genoemd. Hiermee zorg je er voor dat de server precies weet welke variabelen op welke plek moeten staan, waarna de server op die plaatsen zelf de goede escaping en transformaties kan toepassen. Daarnaast zorgt dit bij herhaaldelijk gebruik van dezelfde query's voor prestatiewinst, omdat een deel van het werk van de databaseserver niet opnieuw hoeft te gebeuren.

In het geval van ons loginscript zou de sql-query er dan zo uitzien:

Ook kun je de user-input onderwerpen aan bepaalde criteria. Als van een gebruiker een numerieke waarde wordt verwacht, bijvoorbeeld een id, controleer dan of de variabele inderdaad een getal is dat aan de eisen voldoet. Zo nee, dan is er waarschijnlijk wat aan de hand. Hiervoor kunnen bijvoorbeeld regular expressions worden gebruikt. Daarbij is whitelisting effectiever dan blacklisting: sta dus alleen bepaalde waarden toe, in plaats van dat je bepaalde waardes uitsluit.

Je eigen code testen kan ook veel problemen voorkomen. Gebruik bijvoorbeeld sqlmap om kwetsbaarheden te ontdekken. Om sql-injectie te voorkomen kan verder object-relational mapping worden gebruikt; onder php is dat bijvoorbeeld mogelijk met het Doctrine-framework. Ook andere ontwikkelframeworks bieden soms ingebouwde bescherming tegen sql-injectie, zoals bijvoorbeeld CodeIgniter. Voor Java is er het Hibernate-framework tegen sql-injectie en Apache Wicket tegen cross site scripting.

Het gebruik van mysql_real_escape_string, prepared statements en datatyping zorgt er alleen voor dat een gebruiker geen sql-query's kan injecteren; ze controleren niet of een ogenschijnlijk legitiem verzoek wel mag worden uitgevoerd. Als een gebruiker toegang heeft tot pagina.php?id=1, wil dat nog niet zeggen of hij ook pagina.php?id=2 zou moeten kunnen bezoeken. Zoals gezegd: er moet niet alleen op de technische geldigheid van een query worden gelet, maar ook op de inhoudelijke geldigheid.

Security through obscurity

Wat sowieso níet aan te raden is, is security through obscurity. Als je website bepaalde functionaliteit ondersteunt, is die functionaliteit per definitie kwetsbaar en moet je erop anticiperen dat deze uiteindelijk aangevallen zal worden.

Zo is het van belang om de database-account die voor een bepaalde transactie wordt gebruikt, niet te veel rechten toe te kennen. Voor het uitlezen van een nieuwsbericht is geen root-toegang tot de gehele database nodig, maar voldoet read-only toegang tot een deel van de database. Mocht er dan alsnog ergens een lek in de website zitten, dan zijn de gevolgen in elk geval beperkt.

Ook is het aan te raden om informatie alleen in een vanaf het web toegankelijke databaseserver op te slaan als dat strikt noodzakelijk is. Webwereld schreef enige tijd geleden over een vliegschool die zijn complete klantenadministratie op een webserver bijhield, waardoor talloze persoonsgegevens - van naw-gegevens tot BKR-noteringen - toegankelijk waren. Er is echter nauwelijks een reden te bedenken om zulke gegevens op een webserver op te slaan.

Tot slot

Uiteraard zijn er nog meer beveiligingsproblemen waarbij input van anderen een rol speelt en waarbij input eveneens gevalideerd moet worden. Zo is het uitwisselen van gegevens via

124 | P a g i n a

Page 135: PHPU gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat

bijvoorbeeld jsonp of xml-feeds een beveiligingsrisico: je moet jezelf er grondig van verzekeren dat de servers waarmee je communiceert, wel veilig zijn.

Ook zijn in dit artikel geen methoden behandeld om sql-injectie en cross site scripting in andere programmeertalen tegen te gaan. In andere talen spelen dezelfde problemen, maar zijn de gevolgen en de oplossingen soms heel verschillend. Zo is sql-injectie in ASP.NET wel een bestaand probleem, maar zijn er andere manieren om het af te vangen, bijvoorbeeld door het gebruik van Linq.

Voor de gemiddelde programmeur die echter even een PHP/MySQL-website in elkaar wil flansen - en daar zijn er nogal wat van - mag de les duidelijk zijn: wantrouw de gegevens die van de gebruiker afkomstig zijn, wees selectief met wat je in je database opslaat en hou rekening met het ergste. Een paranoïde programmeur heeft bijna altijd gelijk.

125 | P a g i n a