cursus php - users.telenet.beusers.telenet.be/moonwalker/Php/php_mct.pdf · 3 De structuur van...

Post on 07-Mar-2018

218 views 0 download

Transcript of cursus php - users.telenet.beusers.telenet.be/moonwalker/Php/php_mct.pdf · 3 De structuur van...

Cursus PHP

Karel de Grote Hogeschool Antwerpen Christel Cabus

1.Inleiding PHP. ...............................................................................................................................1 1.1 Definitie van CGI....................................................................................................................1 1.2 Wat is PHP..............................................................................................................................1 1.3 Hoe PHP is ontstaan................................................................................................................1 1.4 Kenmerken van PHP...............................................................................................................2

1.4.1 Vereisten. ..........................................................................................................................2 1.4.2 Vertrouwde syntax............................................................................................................2 1.4.3 Mogelijkheden. .................................................................................................................3

1.5 PHP op je website. ..................................................................................................................3 2. Installeren en configureren van PHP............................................................................................5

2.1 Inleiding. .................................................................................................................................5 2.2 Installeren op een Linux-server. .............................................................................................5 2.3 Installeren op een Windows 2000-server................................................................................7 2.4 Configureren. ..........................................................................................................................7

3. Syntax en controle structuren van PHP........................................................................................8 3.1 Variabelen. ..............................................................................................................................8

3.1.1 Typen variabelen. .............................................................................................................8 3.1.2 Initialisatie van variabelen................................................................................................8 3.1.3 Enkele voorbeelden. .........................................................................................................8 3.1.4 Strings koppelen. ..............................................................................................................9 3.1.5 Vooraf gedefinieerde variabelen. ...................................................................................10

3.2 Constanten.............................................................................................................................10 3.3 Operatoren.............................................................................................................................11

3.3.1 Rekenkundige operatoren. ..............................................................................................11 3.3.2 Vergelijkingsoperatoren. ................................................................................................11 3.3.3 Logische operatoren. ......................................................................................................11

3.4 Commentaar. .........................................................................................................................12 3.5 Controle structuren................................................................................................................12

3.5.1 If-lussen. .........................................................................................................................12 3.5.2 Verkorte if-notatie. .........................................................................................................12 3.5.3 ELSEIF notatie. ..............................................................................................................13 3.5.4 While-lussen. ..................................................................................................................13 3.5.5 Do…While-lussen. .........................................................................................................14 3.5.6 For-lussen. ......................................................................................................................14 3.5.7 Switch. ............................................................................................................................15 3.5.8 Break...............................................................................................................................15 3.5.9 Continue..........................................................................................................................16

3.6. Een project opsplitsen. .........................................................................................................17 3.6.1 Require() en include().....................................................................................................17 3.6.2 Gebruikersgedefinieerde functies. ..................................................................................17 3.6.3 Lokale variabelen. ..........................................................................................................18

3.7 Embedded. ............................................................................................................................19 4. Array’s en arrayfuncties. ............................................................................................................21

4.1 Wat zij’n array’s. ..................................................................................................................21 4.2 Gegevens inlezen in een array. .............................................................................................21 4.3 Meerdimensionale array’s.....................................................................................................23 4.4 Gegevens uit een array uitlezen. ...........................................................................................23

4.5 Sorteerfuncties. .....................................................................................................................24 5. Strings.........................................................................................................................................26

5.1 Stringfuncties. .......................................................................................................................26 5.2 Invoer via een form. ..............................................................................................................28

5.2.1 Whitespace......................................................................................................................28 5.2.2 Speciale karakters ...........................................................................................................28 5.2.3 HTML-tags. ....................................................................................................................29

5.3 Reguliere expressies..............................................................................................................30 5.3.1 Een eenvoudig patroon definiëren. .................................................................................30 5.3.2 Functies voor reguliere expressies..................................................................................31

6. Communicatie tussen browser en server. ...................................................................................33 6.1 Hoe gebeurt de uitwisseling..................................................................................................33

6.1.1Hypertext Transfer Protocol. ...........................................................................................33 6.1.2 Vraag aan de server. .......................................................................................................33 6.1.3 Headers. ..........................................................................................................................33 6.1.4 Content-type. ..................................................................................................................33 6.1.5 De uiteindelijke pagina. ..................................................................................................34

6.2 Eenvoudig voorbeeld. ...........................................................................................................34 6.3 Array’s en forms. ..................................................................................................................35 6.4. Cookies. ...............................................................................................................................37

6.4.1 Wat zijn cookies?............................................................................................................37 6.4.2 Cookies maken en eruit lezen.........................................................................................37 6.4.3 Voorbeeld. ......................................................................................................................38 6.4.4 Parameters aan een cookie toevoegen. ...........................................................................39

6.5 HTTP-headers verzenden......................................................................................................40 6.5.1 Header-functie. ...............................................................................................................40 6.5.2 Omleiding door location.................................................................................................40 6.5.3 HTTP-authenticatie. .......................................................................................................41

6.6 Connection handling. ............................................................................................................42 7.Bestanden gebruiken. ..................................................................................................................43

7.1 Uploaden van bestanden. ......................................................................................................43 7.2 Openen en sluiten van een bestand. ......................................................................................44 7.3 Lezen en schrijven. ...............................................................................................................45 7.4 Bestanden en direct access....................................................................................................46 7.5 Data klaarmaken voor opslag................................................................................................46 7.6 Een directory aanmaken........................................................................................................46

8. Sessions in PHP..........................................................................................................................49 8.1 Wat is een session. ................................................................................................................49 8.2 Hoe sessies werken in PHP...................................................................................................49

8.2.1 PHP bewust maken van een sessie. ................................................................................49 8.2.2 Variabelen registreren in sessies.....................................................................................49

9. MySQL.......................................................................................................................................52 9.1 Inleiding. ...............................................................................................................................52 9.2 SQL. ......................................................................................................................................53 9.3 Persistente Database connecties............................................................................................53 9.4 PHP en MySQL ....................................................................................................................54

9.4.1 Openen, sluiten en database kiezen ................................................................................54

9.4.2 Tabellen aanmaken. ........................................................................................................56 9.4.3 Gegevens in een databank inlezen..................................................................................58 9.4.4 Gegevens ophalen uit een database. ...............................................................................59 9.4.5 Gegevens wijzigen in een database. ...............................................................................61 9.4.6 Opvragen van de tabellen in de database........................................................................62 9.4.7 Opvragen van de velden die in een tabel staan...............................................................62

10. Voorbeeld met datum en tijdfuncties. ......................................................................................64 10.1 Datum en tijd bepalen. ........................................................................................................64 10.2 Kalender. .............................................................................................................................65

1

1.Inleiding PHP.

1.1 Definitie van CGI. CGI staat voor Common Gateway Interface. Programma's, ook wel gateway of CGI-scripts genoemd, die bestaan uit een set instructies geschreven in bijv. C of Perl. Programma’s die de verzoeken van een browser verwerken, een programma uitvoeren en de resultaten terugsturen in HTML, zodat ze in de browser getoond kunnen worden. Gateway scripts worden vaak gebruikt om interactiviteit aan een webpagina toe te voegen in de vorm van formulieren, het zenden van een query naar een database, het verkrijgen van toegang via een wachtwoord, enz.

1.2 Wat is PHP. PHP is een scriptingtaal die wat syntax betreft gebaseerd is op C, Java en Perl. PHP is een programmeertaal om snel dynamische webpagina's te ontwikkelen. De mogelijkheden van PHP waren oorspronkelijk vrij beperkt maar door de grote populariteit van PHP is daar vrij snel verandering in gekomen. PHP is gegroeid tot één van de grotere scriptingtalen die er bestaan en is één van de concurrenten van andere scriptingtalen. Verder is PHP een open source project, wat wil zeggen dat iedereen die het wil er toevoegingen en aanpassingen aan kan maken om aan zijn eisen te voldoen. PHP was oorspronkelijk de afkorting van ‘Personal Home Page’. Nu staat de naam PHP voor “PHP Hypertext Preprocessor”. PHP is de taal, hypertext slaat op de HTML code waarin het ingebakken kan worden en “preprocessor” slaat op het feit dat de php-code uitgevoerd wordt voor hij doorgestuurd wordt naar de browser.

1.3 Hoe PHP is ontstaan. Een eerste versie werd op het einde van 1994 door Rasmus Lerdorf geschreven. Deze versie bevatte enkele basisfuncties die hij veel nodig had. In het begin ging het alleen maar om een kleine parser en enkele utilities die onder de naam “Personal Home Page Tools’ ook door anderen vrij konden worden gebruikt. PHP werd interessanter toen in 1995 de parser opnieuw werd geschreven en onder de naam PHP/FI werd verdeeld. De toevoeging ‘FI’ is slechts een afkorting voor nog een mogelijkheid die in PHP was ondergebracht:’Form interpreter’. Hiermee kunnen HTML-formulieren worden gebruikt. In 1997 werd er een team rondom Lerdorf gevormd en PHP werd steeds complexer en professioneler. Het aantal installaties steeg en leidde ertoe, dat PHP van een kleine toepassing voor freaks tot een serieus te nemen alternatief voor andere, ook commerciële oplossingen, groeide. De nieuwe parser werd PHP 3.0 gedoopt en werd gepatched waar nodig. Er waren grote veranderingen tussen versie 2 en versie 3, zeker wat de syntax betreft. De nieuwe syntaxregels werden overgedragen naar versie 4, die ongeveer begin 2000 stabiel was. De grote verandering van versie 3 naar 4 was de parser die volledig herschreven werd en “Zend” gedoopt werd. Deze nieuwe parser is veel sneller en stabieler in vergelijking met versie 3.

2

1.4 Kenmerken van PHP.

1.4.1 Vereisten. PHP is een server-site scripting taal, dit blijkt uit de volgende figuur. PHP-pagina's stellen bijzonder weinig eisen aan de browser indien PHP-pagina’s bezocht worden. Aangezien er normaal geen interactie van de browser verwacht wordt, kan zelfs een heel simpele tekstmode-browser gebruikt worden. Ook aan de server kant is de belasting eerder laag. De PHP-parser is volledig herschreven voor versie 4 en er werd rekening gehouden met de belasting van het onderliggende systeem. Wanneer we een kleine server nodig hebben die slechts af en toe enkele pagina's moet verwerken, dan hebben we genoeg aan een lichte machine. Wanneer we een drukbezochte server hebben die per minuut verschillende pagina's moet parsen, dan moet er gekozen worden voor een machine met veel RAM. Een krachtige processor is hier minder van belang.

1.4.2 Vertrouwde syntax. PHP heeft een syntax die vergelijkbaar is met verschillende hogere programmeertalen. Wanneer je gewoon bent in C, C++ of Java te werken zal je heel snel de overgang kunnen maken aangezien de verschillen miniem zijn. De syntax is eigenlijk een samenvoeging van de syntax van PERL en C. Declaraties van variabelen zijn ook niet nodig, net als in Perl.

Webserver Machine verzoek HTML

Bestandssysteem

page.PHP(server-side script)

Scripting machine

Web server

Back-end Servers (database,mail,…)

Machine gebuiker Weergave in browser

http verzoek page.PHP HTML-pagina

internet

3

De structuur van classes, syntax en groeperingen zijn overgenomen van de syntax van C en aanverwante talen. Hier volgt een voorbeeldje. hoofdstuk1/voorbeeld1.php

<?php echo "Welkom in deze cursus!!!"; ?>

1.4.3 Mogelijkheden. PHP heeft door de jaren heen heel veel uitbereidingen gekend. Zo kunnen we heel gemakkelijk gebruik maken van bijvoorbeeld XML, databases en grafische files, doordat de verschillende bibliotheken verwerkt werden in PHP. Wanneer je iets specifieks wenst, kan je ook vrij gemakkelijk een nieuwe library toevoegen aan PHP, zodat je, je eigen functies kan oproepen in een dynamische webpagina. Door de jaren heen zijn er ook heel veel gebruikersgroepen ontstaan op het Internet. Veel van deze gebruikersgroepen hebben ook extra aanvullingen gemaakt voor PHP en deze vrijgegeven voor publiek gebruik. Op het Internet vind je een uitgebreide manual waar alle PHP-functies verklaard worden (www.php.net).

1.5 PHP op je website. Binnen je HTML pagina moet je aangeven wanneer je gaat beginnen met PHP en wanneer een stukje PHP gedeelte ophoudt. Een PHP-script begin je met <?php en eindig je met ?> Om binnen een PHP-script iets te kunnen weergeven gebruik je de functie “echo” of “print”. Elke PHP instructie wordt net als bij C afgesloten met het teken; Je eerste PHP script zou er als volgt uit kunnen zien: hoofdstuk1/voorbeeld2.php

<HTML> <BODY bgcolor=”#999999” text=”#FFFFFF"> <H1> <? echo ("Mijn eerste stukje PHP"); ?> </H1> </BODY> </HTML>

Het zou ook anders kunnen maar erg duidelijk is deze embedded HTML niet.

4

hoofdstuk1/voorbeeld3.php

<? echo "<HTML>\n <BODY bgcolor=\"#999999\" text=\"#FFFFFF\">\n <H1>\n"; echo "Mijn eerste stukje PHP"; echo "</H1>\n </BODY>\n </HTML>\n"; ?>

5

2. Installeren en configureren van PHP.

2.1 Inleiding. Het is enkel de bedoeling je in dit hoofdstuk een idee te geven over de installatie van PHP verloopt. Veel PHP-gebruikers zullen nooit hoeven te leren hoe PHP op een server wordt geïnstalleerd en geconfigureerd. Mocht je besluiten deze weg te volgen, dan zal je merken dat dit zo moeilijk nog niet is. Het voordeel bij het maken van een eigen PHP-installatie is de garantie dat je de versie van PHP ter beschikking hebt waar je voorkeur naar uitgaat en dat deze precies de gewenste mogelijkheden zal ondersteunen. Er zijn twee vragen die je moet beantwoorden voordat je kunt beginnen met het installeren. Ten eerste: met welk besturingssysteem zal de server werken? Ten tweede: welke webservertoepassing zal je gebruiken? We zullen in dit hoofdstuk laten zien hoe je PHP onder een variant van UNIX (Linux) en op een Windows-server installeert. Wat betreft de webserver zelf, Apache is verreweg de meest gebruikte toepassing voor UNIX-servers, terwijl je op Windows-machines waarschijnlijk Apache of IIS (Internet Information Server) zult gebruiken. Er zijn afgezien van deze twee vragen nog andere overwegingen, zoals: welke database(s) er ondersteund moeten worden, of er met XML moet kunnen worden gewerkt, ... Deze mogelijkheden moeten allemaal overwogen worden voordat je begint met de installatie. De handleiding van PHP (en dan vooral de online versie van de handleiding) bespreekt het installeren op een redelijk gedetailleerde manier. We zullen hier de basis van het installeren op een Linux- of een Windows 2000-machine bespreken, wat voor de meeste gebruikers zou moeten voldoen.

2.2 Installeren op een Linux-server. De populariteit van het besturingssysteem Linux is in de afgelopen jaren sterk toegenomen, vooral voor gebruik als een webserver. Dit besturingssysteem heeft het grote voordeel gratis en uitermate stabiel te zijn. Het opzetten van een Linux-machine is tegenwoordig echt niet meer een dergelijk groot probleem als het dat vroeger was. Je moet het root-wachtwoord kennen en toegang op root-niveau hebben om iets op een Linux- server te kunnen installeren.

Apache en PHP installeren: 1. Haal de meest actuele en stabiele versies van Apache en PHP op naar een gedeelde

directory, zoals /usr/local/ Je vindt de bestanden voor Apache op http://www.apache.org.

2. Gebruik de volgende regels om de bestanden te unzippen, als deze de extensie gz hebben gunzip php-4.0.4pl1.tar.gz gunzip apache_1.3.14.tar.gz De versies bij jouw installatie kunnen wel verschillen.

3. Pak de bestanden uit: tar -xvf php-4.0.4pl1.tar tar -xvf apache_1.3.14.tar

6

Deze commando’s zullen daardoor van één enkele, ingepakte versie worden omgezet in een map die alle specifieke bestanden bevat.

4. Ga naar de zojuist gemaakte map voor Apache en voer de configuratie uit cd ../apache_1.3.14 ./configure -prefix=/www

5. Ga naar de map voor PHP en voer de configuratie daarvoor uit. cd ../php-4.0.4pl1 ./configure -with-apache=../apache_1.3.14 -enable-track-vars Afhankelijk van de kenmerken die je PHP wil laten ondersteunen moet je andere configuratieparameters gebruiken. Elke configuratieopdracht van het type -with vereist dat je de directory opgeeft waar dat specifieke item in kan worden gevonden. We willen in dit voorbeeld dat PHP met Apache zal werken en we geven daarom op waar de map voor Apache te vinden is. De optie -enable-track-vars is nodig om het PHP mogelijk te maken op de juiste manier met HTML-formulieren te kunnen werken.

6. Maak en installeer PHP make make install Deze twee regels code installeren de geconfigureerde PHP, zodat deze door Apache kan worden gebruikt.

7. Ga terug naar de directory voor Apache, voer de configuratie daarvoor uit en maak en installeer deze daarna. cd ../apache_1.3.14 ./configure -activate-module=rc/modules/php4/libphp4.a make make install Je hebt Apache nu geconfigureerd, gemaakt en geïnstalleerd en Apache is daarna klaar voor gebruik.

8. Kopieer het bestand php.ini naar zijn nieuwe plaats. cp /usr/local/php-4.0.4pl1/php.ini-dist /usr/local/lib/php.ini Het bestand php.ini bepaalt hoe PHP werkt. Dit bestand wordt onder de naam php.ini-dist bij het pakket geleverd. Het bestand moet naar het juiste directory gekopieerd worden en de naam ervan moet in php.ini veranderd worden, voordat Apache het kan gebruiken.

9. Start Apache. bin/apachect1 start Apache moet, net als elke andere toepassing, uitgevoerd worden om te kunnen werken. Deze regel zal de webserver starten, mits je je in de map voor Apache bevindt.

10. Probeer of Apache en PHP beide werken door met je webbrowser naar de juiste URL te gaan. Is de server online.dan kan je naar de URL ervan gaan. Is de machine niet online, dan moet je http://localhost/ gebruiken, of een aan de machine toegekend IP-adres.

7

2.3 Installeren op een Windows 2000-server. Je kunt PHP installeren onder Windows 95, 98, Me, NT,2000 of XP. Let er alleen op de juiste bestanden op te halen van de websites van PHP en Apache. Er zijn zelfs specifieke Windows PHP-bestanden beschikbaar die de installatie makkelijker maken.

Apache en PHP installeren: 1. Haal de meest actuele en stabiele versies van PHP en Apache op. 2. Unzip PHP naar een logische map (zoals C:\php). Je zult een zip-hulpprogramma nodig

hebben voor het unzippen van het opgehaalde pakket. 3. Installeer Apache door de installatietoepassing uit te voeren. 4. Kopieer het bestand php.ini-dist vanuit de PHP-map naar de juiste systeemmap (met

andere woorden, C:\windows). Sla het bestand op als php.ini. 5. Start de Apache-server.

De Apache-server kan het gemakkelijkst worden gestart via het menu Start. 6. Probeer met je webbrowser uit of Apache en PHP werken.

Je kunt Apache het makkelijkst uitproberen door http://localhost/ in het venster van je webbrowser te typen.

Een vrij interessante en gemakkelijke manier om Apache, PHP en MySQL te installeren onder windows vindt je op de site http://www.easyphp.org/. Het is ook de ideale manier om zelf PHP-script’s al of niet gespekt van MySQL uit te proberen.

2.4 Configureren. Het is weliswaar het beste PHP meteen tijdens de installatie te configureren, maar er zijn wel enkele parameters die ook later nog gewijzigd kunnen worden. Het bestand php.ini, dat je tijdens de installatie naar de juiste directory hebt gekopieerd, bevat een aantal parameters die bepalen hoe PHP moet worden uitgevoerd. Je kunt wijzigingen uitvoeren door deze parameters te bewerken en je webservertoepassing daarna opnieuw te starten. Mocht je ooit tegen problemen aanlopen, dan kan je het originele bestand php.ini altijd weer herstellen door het bij het originele pakket geleverde bestand php.ini-dist te kopiëren. Moet PHP databases ondersteunen, ter plekke afbeeldingen kunnen genereren, encrypt() kunnen gebruiken enzovoort, dan zal je andere bibliotheken en pakketten moeten ophalen en deze voor PHP beschikbaar moeten maken door hun locatie tijdens de installatie op te geven, of door het bestand php.ini later te wijzigen. Zie het bestand php.ini of de handleiding van PHP voor meer informatie over dit onderwerp.

8

3. Syntax en controle structuren van PHP.

3.1 Variabelen.

3.1.1 Typen variabelen. PHP ondersteunt de volgende 5 typen variabelen:

• Integer: kan gehele waarde opnemen. • Double: kan een reële waarde opnemen. • String: kan tussen 0 en 32768 tekens opnemen. • Array: neemt een- en multidimensionale, geïndexeerde of associatieve arrays op. • Object: neemt de instantie van een klasse met eigenschappen en methoden op.

In tegenstelling tot C of Java wordt het type van de variabele niet concreet door de programmeur gedeclareerd, maar wordt door PHP uit de context bepaald. Dit lijkt op het variabelen gebruik in Perl. Wanneer je een bepaald type nodig hebt dan kan je met de functie settype() een expliciete type convertering uitvoeren.

3.1.2 Initialisatie van variabelen. Variabelen kan je overal en altijd initialiseren. Je moet ze niet aan het begin van een script declareren. Dit heeft als nadeel dat je al gebruikte variabelen gewoon kan hergebruiken. Variabelen in PHP worden altijd aangeduid met een dollarteken in het begin van de naam van de variabele. Een variabele moet altijd een unieke naam hebben. De namen van variabelen zijn ook hier hoofdlettergevoelig, zoals in C en JAVA..

3.1.3 Enkele voorbeelden. hoofdstuk3/voorbeeld1.php

<?php $een_variabele=" graden Fahrenheit"; $CELSIUS = 21; $celsius = 21; $fahrenheit=((9.0/5)*$celsius)+32; echo $celsius; echo " graden Celsius is "; echo " : "; echo $fahrenheit; echo $een_variabele; ?>

9

In dit voorbeeld zie je hoe je een string en enkele gehele en reële getallen kan toekennen aan een variabele. Met behulp van het commando echo kan je de inhoud van de variabelen zichtbaar maken in de browser. Er wordt door PHP zelf beslist welk type er gebruikt wordt. De casting lijkt automatisch te gebeuren. hoofdstuk3/voorbeeld2.php

<?php $fahrenheit = 3; echo $fahrenheit . " - "; $fahrenheit = "Fahrenheit"; echo $fahrenheit . " - "; $fahrenheit = 89.5; echo $fahrenheit ; ?>

Bovenstaand stukje code toont aan dat je gemakkelijk variabelen kan hergebruiken. In C of Java was dit onmogelijk geweest, omdat je een variabele onmogelijk een geheel getal, een string en een reëel getal tegelijk kan laten zijn. In dit voorbeeld is het dubbele “echo" commando vervangen door één commando. De tekst wordt met de concatenatie-operator (puntoperator) aan elkaar gekleefd.

3.1.4 Strings koppelen. In het vorige voorbeeld werd de puntoperator opgenomen. De functie van deze operator is het “aan elkaar plakken" van strings. Verwar deze operator niet met het decimale punt. Je onderscheidt ze van elkaar door er spaties omheen te zetten. hoofdstuk3/voorbeeld3.php

<?php echo ("5" . "5" . " "); // prints 45 echo (5 . 5 . " "); // prints 45 echo (5.5); // prints 4.5 (decimal point) ?>

10

3.1.5 Vooraf gedefinieerde variabelen. De vooraf gedefinieerde variabelen vind je terug door de functie phpinfo() te gebruiken. Deze functie geeft je een tabel met informatie over de specifieke installatie van PHP op de server en geeft je ook een tabel met vooraf gedefinieerde variabelen. hoofdstuk3/voorbeeld4.php

<HTML> <HEAD> <TITLE>Test PHP Script</TITLE> </HEAD> <BODY> <?PHP phpinfo(); ?> </BODY> </HTML>

3.2 Constanten. In PHP kan je constanten definiëren. Constanten onderscheiden zich van variabelen, doordat ze maar een keer kunnen worden geïnitialiseerd. Daarna kunnen ze slechts worden gelezen. Constanten worden met de functies define() gedefinieerd. Constanten worden zonder een $-teken geschreven. hoofdstuk3/voorbeeld5.php

<HTML> <HEAD> <TITLE>Constanten</TITLE> </HEAD> <BODY> <?PHP define("CONSTANT","Een constante."); echo CONSTANT; echo "<BR>"; define ("CONSTANT","test"); echo CONSTANT; ?> </BODY> </HTML>

11

3.3 Operatoren.

3.3.1 Rekenkundige operatoren. operator verklaring - conversie van teken + optelling - aftrekking * vermenigvuldiging / deling % rest bij een gehele deling.

3.3.2 Vergelijkingsoperatoren. operator betekenis == is gelijk aan < kleiner dan > groter dan <= is kleiner dan of gelijk aan >= is groter dan of gelijk aan != verschillend van <> verschillend van

3.3.3 Logische operatoren. De logische operatoren combineren twee of meerdere statements. In onderstaande tabel zie je hoe ze genoteerd worden. operator operatornaam && logische and and logische and || logische or or logische or xor exclusieve or ! not Er zijn twee AND en OR operatoren omwille van de prioriteit.

12

3.4 Commentaar. Een hash (#) of twee forward slashes zorgt ervoor dat de rest van een lijn als commentaar wordt beschouwd. Om volledige blokken in commentaar om te zetten gebruik je /* en */. Het is onmogelijk is om blokken commentaar te nesten. hoofdstuk3/voorbeeld6.php

<?php /* Een hele blok commentaar kan tussen deze tekens geplaatst worden*/ //Slechts 1 lijn commentaar. echo "Hallo!"; #commentaar bij deze instructie. # Nog een lijn commentaar. ?>

3.5 Controle structuren.

3.5.1 If-lussen. De if-structuur zorgt ervoor dat er een stukje code kan uitgevoerd worden wanneer er aan bepaalde condities is voldaan. hoofdstuk3/voorbeeld7.php

<?php $a=1; if ($a == 0) { $print = "a is 0"; } else { $print = "a is verschillend van 0"; } echo $print; ?>

3.5.2 Verkorte if-notatie. De verkorte if-notatie ziet er als volgt uit:

condition ? true-statement : false-statement. Eerst wordt de conditie geëvalueerd en als deze waarde true (respectievelijk false) oplevert, wordt de waarde van het true-statement (respectievelijk false-statement) teruggegeven.

13

hoofdstuk3/voorbeeld8.php

<?php $a=1; $print = $a == 0 ? "a is 0" : "a is verschillend van 0"; echo $print; ?>

Bovenstaande code geeft precies dezelfde werking als het stukje dat uitgelegd werd bij de if-structuur.

3.5.3 ELSEIF notatie. ELSEIF is een combinatie van ELSE en IF. ELSEIF wordt net als ELSE pas uitgevoerd, wanneer de operator van de IF-aanwijzing fout is. ELSEIF staat toe om een verdere operator zoals bij IF uit te voeren. Is deze operator juist, dan worden de navolgende aanwijzingen uitgevoerd. hoofdstuk3/voorbeeld9.php

<?php $a=0;$b=1; if ($a>$b) { echo " A is groter dan B";} elseif ($a==$b) { echo " A is even groot dan B";} else { echo " A is kleiner dan B";} ?>

3.5.4 While-lussen. WHILE-lussen zijn de gemakkelijkste herhalingsopdrachten die PHP kent. Onderstaand voorbeeld toont de nummers 1 tot 10 in de browser. hoofdstuk3/voorbeeld10.php

<?php $teller = 1; while ( $teller <= 10 ) { echo $teller . " - "; $teller++; } ?>

While-lussen worden veel gebruikt bij het onderzoeken van array's en databaseresultaten, omdat je niet weet hoeveel resultaten er precies teruggegeven worden.

14

Syntax: while(conditie){commando's}

Zolang aan de conditie voldaan wordt, worden de commando’s herhaald. Blokken code worden geplaatst tussen {}. Blokken kan je gebruiken om bepaalde commando's te groeperen. Een blok (samengesteld of compound statement) wordt gemaakt zoals in C of Java. Dit betekent dat je het blok opent met { en het sluiten met }.

3.5.5 Do…While-lussen. Syntax:

do {commando's} while(conditie) De conditie wordt aan het einde van de lus gecontroleerd. Deze lus wordt minstens 1 keer doorlopen. hoofdstuk3/voorbeeld11.php

<?php $teller = 11; do { echo $teller . " - "; $teller++; } while ( $teller <= 10 ); ?>

3.5.6 For-lussen. Syntax: for (expr1; expr2; expr3) statement Wanneer je vooraf weet hoeveel keer iets herhaald wordt, kan je best een for-lus gebruiken. Het volgende voorbeeld print de tafels van vermenigvuldiging uit: hoofdstuk3/voorbeeld12.php <?php

for($i=0 ; $i<=10; $i++) { for($j=1; $j<=10; $j++) { echo $i * $j; if($j==10) echo "<br>" ; else echo " - "; } } ?>

15

Wanneer je hier een professionele oplossing zou moeten maken kan je hier tabellen gebruiken om de opmaak wat beter te verzorgen. hoofdstuk3/voorbeeld13.php

<?php // Create a table. print ("<TABLE BORDER=1 WIDTH=\"75%\" CELLSPACING=2 CELLPADDING=2 ALIGN=CENTER>\n"); for($i=1 ; $i<=10; $i++){ print ("<TR ALIGN=CENTER VALIGN=TOP>\n"); for($j=1; $j<=10; $j++) { $product=$i * $j; print ("<TD ALIGN=CENTER VALIGN=TOP>$product</TD>\n"); } } ?>

3.5.7 Switch. Een SWITCH-statement is met een aantal IF-statements met dezelfde operator vergelijkbaar. Wanneer je een variabele met heel veel mogelijke waarden wilt vergelijken kan je het switch-statement gebruiken. In andere programmeertalen wordt dit ook soms aangeduid als “case". hoofdstuk3/voorbeeld14.php

<?php $i=2; switch ($i) { case 0: print "i is gelijk aan 0"; break; case 1: print "i is gelijk aan 1"; break; case 2: print "i is gelijk aan 2"; break; } ?>

3.5.8 Break. Het BREAK-commando beëindigt een lus en zet de uitvoering na de lus verder. Het volgende voorbeeld onderbreekt de lus wanneer in de array $arr[] de string “stop” wordt bereikt.

16

hoofdstuk3/voorbeeld15.php

<?php $i = 0; $arr=array("hallo","wereld","stop","test"); while($i < 10) { if ($arr[$i]=="stop" ) break; echo $arr[$i] . "<br>"; $i++; } echo "Hier gaat het verder!" ?>

3.5.9 Continue. Het CONTINUE-commando springt naar het begin van de actuele lus. Het volgende voorbeeld slaat ieder tweede array-element over. hoofdstuk3/voorbeeld16.php

<?php $i = -1; $arr=array("hallo","wereld","stop","test","succes","einde"); while($i++ < 10) { if ($i%2 ) continue; echo $arr[$i] . "<br>"; } ?>

17

3.6. Een project opsplitsen.

3.6.1 Require() en include(). Door middel van de functies “require(filenaam)" en “include(filenaam)" kan je een bestand op de desbetreffende plaats in je code invoegen. Er is een verschil tussen require en include. Require zal altijd vervangen worden door de inhoud van het bestand dat de functie als argument heeft. Wanneer een PHP-script uitgevoerd wordt gaat PHP eerst op zoek naar alle require-statements, en gaat die onmiddellijk vervangen door het bestand dat erin vermeld staat. Include echter gaat enkel invoegen als “include" uitgevoerd wordt. Wanneer deze dus door een if-constructie wordt voorafgegaan, en de conditie wordt niet voldaan, dan gaat dit bestand niet gelezen en ingevoegd worden. Include kan je gebruiken om een bepaalde module in te voegen wanneer die aanwezig is, of om een bepaald bestand meerdere keer te includen in een for-lus. De bestandnaam kan dan bijvoorbeeld gewijzigd worden. Wanneer je een bestand met include invoegt verlaat de parser de PHP mode in het begin van het bestand. Je moet dus terug de PHP mode starten met de open-tag <?php en deze afsluiten met ?>. Een bestand wordt ook aanzien als een volledig blok commando's. Wanneer we die dus na een if-constructie zetten, moeten we (ondanks het feit dat de include slechts 1 commando is) toch gebruik maken van { en }. hoofdstuk3/voorbeeld17.php

<?php /* Dit is fout. */ /* Dit is correct. */ if ($voorwaarde) { include($bestand); } else { include($andere_bestand); } ?>

3.6.2 Gebruikersgedefinieerde functies. Wanneer je een stukje programma meermaals nodig hebt dan kan je dit in een aparte functie coderen. Deze functie kan je dan net als andere ingebouwde php-functies gaan gebruiken doorheen je project.

18

hoofdstuk3/voorbeeld18.php

<?php function faculteit($getal){ // deze functie berekent (op een brute manier) de // macht van een getal en geeft deze terug... $result = 1; for($i = 0; $i < $getal; $i++) $result = $result * $getal; // teruggeven van een waarde return $result; } $waarde = 5; echo "Het getal is: " . $waarde . "<br>"; $uitkomst = faculteit($waarde); echo "De faculteit is: " . $uitkomst . "<br>"; ?>

De functie berekent de faculteit van een getal. De faculteit wordt in de functie berekend in de variabele $result, en deze wordt met “return" teruggegeven aan het oproepende programma. Bij de meeste programmeertalen bevat de main-functie het hoofdprogramma en begint hier de uitvoer van je code. In PHP begint de uitvoer echter aan het begin van het bestand. Dit is een logisch gevolg van het feit dat je PHP-code gewoon tussen HTML code kan invoegen.

3.6.3 Lokale variabelen. Wanneer je een variabele declareert in een stukje code en je wilt daarna in een functie ervan gebruik maken, moeten je aan de functie meedelen dat je de variabele bedoelt die globaal bestaat (buiten de functie). Wanneer je dit niet doet gaat de functie hiervoor een nieuwe variabele aanmaken. hoofdstuk3/voorbeeld19.php

<?php $getal = 7; function een(){ echo "In de functie een(): ". $getal . "<br>"; } function twee(){

19

global $getal; echo "In de functie twee(): ". $getal . "<br>"; } echo $getal . "<br>"; een(); twee(); ?>

In het voorbeeld zal de functie een() geen waarde uitschrijven voor $getal. De functie twee() zal dat echter wel doen.

3.7 Embedded. PHP wordt vaak gemixt met HTML om een mooiere lay-out te bekomen. Het voorbeeld van de tafels van vermenigvuldiging wordt hernomen. hoofdstuk3/voorbeeld20.php

<html> <head> <title> De tafels van vermenigvuldiging </title> </head> <body bgcolor="#CCCCCC"> <?php function vermenigvuldig($getal1, $getal2){ return $getal1 * $getal2; } ?> <h1>Vermengvuldigen</h1> <table width="90%" border=1> <?php // de tabel uitschrijven echo "<tr align=\"center\" bgcolor=\"white\">" ; // de rij beginnen for($i=1; $i<=10; $i++) echo "<td>" . $i . "</td>"; echo "</tr>"; // de rij beëindigen for($i=1 ; $i<=10; $i++){ echo "<tr align=\"center\">"; // de rij beginnen for($j=1; $j<=10; $j++) echo "<td>" . vermenigvuldig($i,$j) . "</td>"; echo "</tr>"; // de rij beëindigen }

20

?> </table> </body> </html>

Je ziet dat er twee stukken php-code in HTML werden ingevoerd. De functies die gebruikt worden moeten ook niet in hetzelfde blok zitten als de aanroep van de functies. Dit maakt het mogelijk om veel functies vooraf te declareren. Dit wordt dan meerstal bekomen met enkele require()-statements.

21

4. Array’s en arrayfuncties.

4.1 Wat zij’n array’s. PHP-array’s zijn associatieve array’s. Het ‘associatieve’ deel betekent dat array’s de waarden van elementen opslaan in associatie met sleutelwaarden, in plaats van de volgorde te gebruiken van een strikt lineaire index. Heb je ooit geprogrammeerd in C, C++, dan heb je gewerkt met vectorarray’s. In een vectorarray moeten alle elementen die deze bevat van hetzelfde type zijn en meestal moet de compiler van de taal vooraf weten hoeveel elementen van dat type kunnen voorkomen. Double my_array[100]; // This is C, not PHP PHP-array’s kunnen sleutels van een willekeurig type gebruiken, waaronder stringsleutels. $my_array[1]=1; $my_array[“orange”]=2; $my_array[3]=3;

4.2 Gegevens inlezen in een array. Wanneer je in PHP een array wilt gebruiken, hoef je deze niet te declareren maar mag je de array gewoon initialiseren. Een voorbeeldje van de initialisatie en het gebruik van array’s. hoofdstuk4/voorbeeld1.php

<?php $waarde[1] = 1; $waarde[2] = 1.5; $waarde[3] = 2; $waarde[4] = 2.5; $waarde[5] = 3; $waarde[6] = 3.5; for($i=1 ; $i<=6; $i++) echo $waarde[$i] . "<BR>"; ?>

Je kunt een array echter op een andere manier opvullen. Door gewoon waarden aan de array toe te kennen zonder een index op te geven, wordt de volgende beschikbare index genomen en wordt op die plaats in de array de nieuwe data opgeslagen. Je kunt als het ware achter aan de array nieuwe data toevoegen.

22

hoofdstuk4/voorbeeld2.php

<?php $waarde[1] = 1; $waarde[] = 1.5; $waarde[] = 2; $waarde[] = 2.5; $waarde[] = 3; $waarde[] = 3.5; for($i=1 ; $i<=5; $i++) echo $waarde[$i] . "<BR>"; ?>

Je kunt ook de functie array() gebruiken om een array op te vullen. Deze functie is vooral handig om kleine array’s met vaste waarden op te vullen. hoofdstuk4/voorbeeld3.php

<?php $vector = array(1,2,3,4,5,6,7,8,9,10); for ($i=0;$i<=5;$i++) {echo "vector[$i] <br>";} ?>

Je moet echter geen numerieke indexen aanhouden. In PHP mag de index eender wat zijn. Indexen met reële getallen zijn eerder onbruikbaar, maar wanneer je merkt dat je gemakkelijk strings kan gebruiken als index, worden de mogelijkheden een stuk groter. Let er echter wel op dat de indexen case-sensitive zijn. hoofdstuk4/voorbeeld4.php

<?php $score["Chris Vervoort"]=17; $score["Tom Snelders"]=16; $score["Jef Jaspers"]=5; echo "-". $score["Chris Vervoort"] . "<BR>"; echo "-". $score["tom Snelders"] . "<BR>";//case-sensitive! echo "-". $score["Jef Jaspers"] ."<BR>"; ?>

23

4.3 Meerdimensionale array’s. Meerdimensionale array’s zijn ook mogelijk. De declaratie valt zoals altijd weg en je moet gewoon de waarden toekennen met de correcte indexen. Je kunt terug strings gebruiken als index. De toevoeging door geen index op te geven is ook mogelijk. hoofdstuk4/voorbeeld5.php

<?php $punten["Chris Vervoort"][0] = 18; $punten["Chris Vervoort"][] = 12; $punten["Chris Vervoort"][] = 15; $punten["Jef Jaspers"][] = 12; $punten["Jef Jaspers"][] = 3; $punten["Jef Jaspers"][] = 15; echo $punten["Chris Vervoort"][0] . "<br>"; echo $punten["Jef Jaspers"][2] . "<br>"; ?>

4.4 Gegevens uit een array uitlezen. In de vorige voorbeelden heb je telkens de inhoud via vaste indexen uit de array gehaald. Je kunt met behulp van een lus een bepaalde array aflopen, maar dan mag je geen strings gebruiken als index. Met behulp van de functie count() kan je onderzoeken hoeveel indexen er al in gebruik zijn. Je kunt dan enkel maar hopen dat deze indexen sequentieel ingevuld zijn. hoofdstuk4/voorbeeld6.php

<?php $vector[] = 10; $vector[] = 11; $vector[] = 12; $vector[] = 13; $vector[] = 14; for($i=0; $i < count($vector); $i++) { echo "$vector[$i] <BR>"; } ?>

24

4.5 Sorteerfuncties. Er bestaan veel verschillende sorteerfuncties die op een array toepasbaar zijn. De meest gebruikte zijn sort() en asort(). Sort gaat de elementen rangschikken, maar de indexen veranderen niet mee. Asort gaat ook de indexen verplaatsen. hoofdstuk4/voorbeeld7.php

<?php $taal["a"] = "Frans"; $taal["b"] = "Nederlands"; $taal["c"] = "Engels"; $taal["d"] = "Duits"; asort($taal); reset($taal); while(list($index, $naam)=each($taal)){ echo "$index = $naam <br>"; } sort($taal); reset($taal); while(list($index, $naam)=each($taal)){ echo "$index = $naam <br>"; } ?>

De functie shuffle() (die maar beschikbaar is vanaf php3.0.8 en php4.0b4!) doet precies wat de naam zegt. De functie zorgt ervoor dat de array op een willekeurige manier wordt “geschud”. hoofdstuk4/voorbeeld8.php

<html> <head> <title>Kaarten schudden</title> </head> <body bgcolor="#CCCCCC"> <h1>Kaarten schudden!!!</h1> <?php $kaarten = array("Heer","Boer","Dame","Aas"); srand(time()); shuffle($kaarten); for($i=0; $i<4;$i++){ echo $kaarten[$i] . "<BR>"; } ?> </body>

25

Er bestaan tal van functies die op array’s toepasbaar zijn. Meer informatie vindt je in de manual van PHP(php.net).

26

5. Strings.

5.1 Stringfuncties. Wie vertrouwd is met C/C++ zal heel wat vertrouwde functies terugvinden. Je kunt met strlen() de lengte van een string bepalen.

Functie prototype: int strlen ( string str);

Je kunt een lange string omzetten in verschillende lijnen door er overal \n tussen te voegen met de functie wordwrap(). Deze functie neemt als parameters de string en de lengte van een lijn. De derde parameter bepaalt de meegegeven break-string. Dit is bijvoorbeeld handig om overal de <BR>-tag in te voegen.

Functie prototype: string wordwrap ( string str [, int width [, string break

[, int cut]]]); Meer informatie kan je terugvinden in de manual van PHP. hoofdstuk5/voorbeeld1.php

<?php $text = "Een heel lang woooooooooooord."; $lengte=strlen($text); echo "lengte:" . $lengte . "<BR>"; $nieuw = wordwrap($text, 8, "<br>", 1); echo "$nieuw\n"; ?>

Om strings te vergelijken kan je ofwel de gewone vergelijkingsoperator gebruiken, ofwel de functie strcmp() die dezelfde syntax volgt als de functies onder C/C++. Ook strncmp() bestaat onder PHP. Deze functie wordt gebruikt om de eerste n karakters bitsgewijs te gaan vergelijken.

Functie prototypes: int strcmp ( string str1, string str2); int strncmp ( string str1, string str2, int len);

Om strings een bepaalde lengte te geven kan je str_pad() gebruiken, die een string kan aanvullen aan beide zijden met een gegeven string. Dit is echter een functie uit PHP 4.0.

Functie prototype: string str_pad ( string input, int pad_length [, string pad_string

[, int pad_type]]);

27

hoofdstuk5/voorbeeld2.php

<?php $input = "Alien"; print str_pad($input, 10); // "Alien " print "<br>"; print str_pad($input, 10, "-=", STR_PAD_LEFT); // "-=-=-Alien" print "<br>"; print str_pad($input, 10, "_", STR_PAD_BOTH); // "__Alien___" ?>

Om de waarde te kennen dat bij een bepaalde ASCII-karakter hoort kan je de functie chr() gebruiken.

Functie prototype: string chr ( int ascii);

Wat hoofdlettergebruik betreft is PHP ook goed voorzien. Zo kan je de string in hoofdletters omzetten met strtoupper() en naar kleine letters met strtolower(). De functie ucfirst() gaat het eerste karakter in een string omzetten naar een hoofdletter (handig bij zinnen), en ucwords() gaat ieder woord voorzien van een hoofdletter.

Functie prototypes: string strtoupper ( string string); string strtolower ( string str); string ucfirst ( string str); string ucwords ( string str);

hoofdstuk5/voorbeeld3.php

<?php $beginstring = "een zin die het hoofdletter gebruik illustreert"; echo strtolower($beginstring) . "<BR>"; echo strtoupper($beginstring) . "<BR>"; echo ucfirst($beginstring) . "<BR>"; echo ucwords($beginstring) . "<BR>"; ?>

Stukjes uit strings selecteren gebeurt met de functie substr().

Functie prototype: string substr ( string string, int start [, int length]);

28

hoofdstuk5/voorbeeld4.php

<?php echo substr ("Een stukje van de string", 4, 4) . "<BR>"; echo substr ("Een stukje van de string", 0, 10); ?>

Er bestaan nog veel andere functies om strings te verwerken, maar het is onmogelijk om al deze functies hier te bespreken. Alle functies kan je vinden in de manual van PHP, onder de sectie “String functions”.

5.2 Invoer via een form. Data die je uit een formulier leest is meestal niet zomaar te vertrouwen. De gebruiker kan ongewenste karakters in het formulier ingevuld hebben. Daarom kan je deze data eerst best bewerken.

5.2.1 Whitespace. Spaties, tabs of newlines voor of acheraan de string kan je uit de string verwijderen. Met de functies trim(), ltrim() en rtrim() kan je de spaties aan beide zijden verwijderen, of enkel aan de linker- of rechterkant.

Functie prototypes: string trim ( string str [, string charlist]);

string ltrim ( string str [, string charlist]); string rtrim ( string str [, string charlist]);

hoofdstuk5/voorbeeld5.php

<?php $text = " tekst "; echo "-".$text."-<br>"; $trimmed = trim($text); echo "-".$trimmed."-<br>"; ?>

5.2.2 Speciale karakters Je moet ervoor zorgen dat je functies nooit mislopen door een eigenaardige invoer van de gebruiker. Hiervoor bestaan de functies quotemeta() en addslashes().

29

Addslashes geeft een string weer met backslashes voor karakters die moeten worden gequote in database queries etc. Deze karakters zijn single quote ('), double quote ("), backslash (\) en NUL (de NULL byte). Je kunt het effect van addslashes() omkeren door de functie stripslashes() te gebruiken.

Functie prototype: string addslashes ( string str);

hoofdstuk5/voorbeeld6.php

<?php $text = " '''''tekst "; echo "-".$text."-<br>"; $slashes = addslashes($text); echo "-".$slashes."-<br>"; ?>

5.2.3 HTML-tags. Indien de ingeven data later terug in een html-document moet verschijnen dan mogen er geen html-tags in voorkomen, aangezien deze geïnterpreteerd worden door de browser. De functies htmlspecialchars() en htmlentities() kunnen speciale-html tekens omzetten naar de juiste html-constructies.

Functie prototypes: string htmlspecialchars ( string string [, int quote_style

[, string charset]]); string htmlentities ( string string [, int quote_style

[, string charset]]); quote_style geeft aan wat er moet gebeuren met enkele en dubbele quotes (default enkel dubbel quotes). hoofdstuk5/voorbeeld7.php

<html> <head> <title>Htmlspecialchars</title> </head> <body> <h2>geef &lt; u&gt; -tag in en een stukje tekst en &lt; /u&gt; -tag</h2>

30

<form method="GET" action="<?php echo $PHP_SELF ?>"> <input name="invoer"> <input type="submit" value="Ok!"> </form> <?php echo "Zonder: ". $invoer ."<BR>"; echo "Met: " . htmlspecialchars($invoer) ."<BR>"; ?> </body> </html>

5.3 Reguliere expressies. Reguliere expressies worden in unix commando’s vaak gebruikt. Je kunt een reguliere expressie best voorstellen als een uitgebreid systeem voor het met elkaar vergelijken van karakterpatronen. Je schrijft eerste het patroon en je past dat patroon daarna met een van de ingebouwde functies van PHP op een tekenreeks toe. Algemeen kan je aannemen dat een reguliere expressie een beschrijving geeft van hoe een string eruit moet zien. Hiermee kan je bijvoorbeeld emailadressen controleren op hun geldigheid.

5.3.1 Een eenvoudig patroon definiëren. PHP heeft een aantal regels voor het maken van een patroon. Je kunt deze regels gescheiden of in combinatie gebruiken, wat je patroon heel eenvoudig of heel ingewikkeld kan maken. Litterals: Het eerste soort teken dat je zult gebruiken voor het definiëren van patronen is een letterlijke waarde of litteral. Het patroon”a” zal overeenkomen met de letter a en het patroon “ab” met de string ab. Litterals maken het mogelijk om overeenkomsten tussen exacte combinaties te vinden. Metatekens: Metatekens zijn speciale symbolen die een betekenis hebben die verdergaat dan hun letterlijke waarde. Het metateken punt(.) betekent elk willekeurig teken. Wanneer je de litteral punt (.) wil voorstellen doe je dit door er een \ voor te zetten. De volgende tabel verklaart de meeste metatekens.

Teken Komt overeen met . elk willekeurig teken

^a begint met a a* nul of meer a’s a$ eindigt op a a+ minstens een a a? nul of een a

31

Teken Komt overeen met \n nieuwe regel \t tab \ ontsnappingsteken

(ab) de groep ab a|b a of b

a{2} aa a(1,} a, aa, aaa enzovoort

a{1,3} a, aa en aaa [a-z] willekeurige kleine letter [A-Z] willekeurige hoofdletter [0-9] willekeurig cijfer

5.3.2 Functies voor reguliere expressies. PHP heeft verschillende functies die werken met reguliere expressies. De bekendste zijn ereg() en eregi(). Deze functies gaan een string controleren op haar geldigheid volgens een gegeven regular expression. Optioneel kan je nog stukken van de regular expression opslaan in een array. De functie ereg() maakt verschil tussen hoofd- en kleine letters in de patronen, terwijl eregi() daar geen verschil tussen maakt. De functies ereg_replace() en eregi_replace() gaan regular expressions vervangen door een andere string. De replace functies werken gelijklopend. De volledige syntax van deze functies zijn te vinden onder het hoofdstuk Regular Expression Functions in de PHP manual. Een voorbeeld ter verduidelijking. hoofdstuk5/voorbeeld8.php

<html> <head> <title>Regexp</title> </head> <body> <h1>Email-adressen controleren</h1> <form method="GET" action="<?php echo $PHP_SELF?>"> Mailadres: <input name="mailadres"> <input type="submit" value="controleren"> </form> <?php if(isset($mailadres)) { $mailadres = trim($mailadres); echo "Het mailadres $mailadres is "; $patroon=".+@.+\..+"; if(eregi($patroon,$mailadres)){ echo "correct!";

32

}else{ echo "foutief!"; } } ?> </body> </html>

Verklaring reguliere expressie in het voorbeeld. Dit is het patroon dat met een geldig emailadres overeen zal komen. Dit voorbeeld werd zeer eenvoudig gehouden. De eerste stap in het patroon zegt dat een emailadres met minstens een teken moet beginnen (.+). Daarna volgt het teken @, dat altijd in een emailadres moet voorkomen. Ten derde staat het patroon erop dat er altijd nog minstens een teken moet volgen. Ten vierde moet een emailadres altijd een punt bevatten. De tekenreeks moet daarna met minstens nog een teken worden afgesloten (kan niet op een punt eindigen).

33

6. Communicatie tussen browser en server.

6.1 Hoe gebeurt de uitwisseling.

6.1.1Hypertext Transfer Protocol. Het HyperText Transfer Protocol (HTP) is de taal waarin webservers en webbrowsers met elkaar communiceren. Elke keer dat je een website bezoekt, begin je een conversatie via Internet in HTTP (of een variant, zoals het beveiligde protocol HTTPS). De meeste weggebruikers hoeven zich niet bezig te houden met de details van HTTP, en zelfs de meeste webprogrammeurs niet. HTTP is maar een medium dat verzoeken verzendt aan je PHP-script en je HTML-antwoorden voor weergave terugstuurt naar de gebruiker.

In dit hoofdstuk kijken we naar enkele technieken die afhankelijk zijn van andere gedeelten van deze interactie tussen server en cliënt, zoals de opslag van client-side informatie in cookies op de machine van de gebruiker of het expliciete gebruik van HTTP-headers voor zaken als gebruikersidentificatie. De PHP-functies die directe HTTP-interactie implementeren zijn in werkelijkheid bijzonder eenvoudig.

6.1.2 Vraag aan de server. De browser stuurt naar de server een aanvraag. In de aanvraag staat de URL van de gewenste pagina en cookies die de browser bewaard heeft. De server gaat dit bestand opzoeken op zijn harde schijf. Dan gaat hij aan de hand van de extensie bepalen wat voor een file het is. Wanneer er nog bijkomende handelingen moeten gedaan worden gebeurd dit eerst (een php-file moet nog uitgevoerd worden). In deze vraag kan de informatie in een form ofwel in de URL zitten, ofwel in de aanvraag. Dit hangt af van de methode die gebruikt werd. Je hebt twee keuzes GET of POST. Het verschil tussen GET en POST is hoe de informatie van het formulier naar de verwerkende script wordt doorgegeven. De methode GET zal alle verzamelde informatie mee versturen als een onderdeel van de URL. De methode POST zal de informatie onzichtbaar voor de gebruiker versturen

6.1.3 Headers. Wanneer een pagina doorgestuurd moet worden naar de browser wordt eerst een header samengesteld. Deze header bevat informatie over de soort file die de browser gaat krijgen, cookies die gezet en verwijderd moet worden en extra informatie wanneer de file op een andere plaats moet gezocht worden. Er kunnen nog andere zaken gezet worden zoals de vraag om de pagina niet te cachen.

6.1.4 Content-type. Na de header kan er nog een vermelding komen van de inhoud van de file. Meestal wordt dit gebruikt om de inhoud toch nog te veranderen. Wanneer een browser dit tegenkomt moet hij zich hieraan houden. Dit zijn echter enkel vastgelegde regels, iets waar niemand zich moet aan houden.

34

6.1.5 De uiteindelijke pagina. De pagina wordt doorgestuurd in zijn uiteindelijke vorm. Wanneer je een PHP script hebt opgevraagd wordt de uitvoer van het script en de HTML-code die tussen het script staat (of omgekeerd) doorgestuurd.

6.2 Eenvoudig voorbeeld. Een veelgebruikte manier om informatie van een gebruiker te vragen is via een html-formulier. Dit voorbeeld vraagt naar een aantal gegevens en wanneer je op de “verzendknop” drukt worden deze gegevens weergegeven op een volgende pagina. Wanneer je een formulier gebruikt in een HTML-document, wordt wanneer je de verzendknop indrukt de inhoud van het formulier genomen, en verwerkt in de aanvraag die in de parameter action staat van het formulier. Een kort voorbeeldje van een formulier in een html document. hoofdstuk6/voorbeeld1.htm (vraag)

<HTML> <HEAD> <TITLE>HTML Form</TITLE> </HEAD> <BODY> <FORM ACTION="voorbeeld1.php"> First Name <INPUT TYPE=TEXT NAME="FirstName" SIZE=20><BR> Last Name <INPUT TYPE=TEXT NAME="LastName" SIZE=40><BR> E-mail Address <INPUT TYPE=TEXT NAME="Email" SIZE=60><BR> Comments <TEXTAREA NAME="Comments" ROWS=5 COLS=40></TEXTAREA><BR> <INPUT TYPE=SUBMIT NAME="SUBMIT" VALUE="Submit!"> </FORM> </BODY> </HTML>

Je ziet dat in het voorbeeld de file voorbeeld1.php opgeroepen wordt wanneer je op de “verzend”-knop drukt. De parameters die van de gebruiker gevraagd worden via inputvelden van het formulier gaan dan meegegeven worden aan het PHP-script. In het opgeroepen PHP-script worden de parameters globale variabelen met dezelfde naam als de naam in het formulier. hoofdstuk6/voorbeeld1.php (antwoord)

<HTML> <HEAD> <TITLE>Form Results</TITLE> </HEAD> <BODY> <?php print ("Your first name is $FirstName.<BR>\n");

35

print ("Your last name is $LastName.<BR>\n"); print ("Your E-mail address is $Email.<BR>\n"); print ("This is what you had to say:<BR>\n $Comments<BR>\n"); ?> </BODY> </HTML>

6.3 Array’s en forms. Indien je in een formulier niet op voorhand weet hoeveel invulvelden je nodig hebt, kan je array’s gebruiken om dit probleem op te lossen. Door telkens een gelijke naam gevolgd door [] in te geven bij name= veld in de input-tag, kan je ervoor zorgen dat de variabelen die doorgegeven worden aan het PHP-script al in een array zitten. hoofdstuk6/hoeveel.htm

<html> <head> <title>Aantal studenten</title> </head> <body bgcolor="#FFFFFF"> <form method="GET" action="invullen.php"> Geef het aantal personen in : <input name="aantal" size="5"><br> <input type="submit" value="Ok, verdergaan"> </form> </body> </html>

hoofdstuk6/invullen.php

<html> <head> <title>Namen van studenten</title> </head> <body bgcolor="#FFFFFF"> <form method="GET" action="done.php"> <table align="center" border="1" cellspacing="0" cellpadding="4"> <tr> <th>Id</th> <th>Voornaam</th> <th>Familienaam</th>

36

</tr> <?php // een standaardwaarde zetten... if (!isset($aantal)) $aantal = 1; for($i=0; $i < $aantal; $i++) { echo "<tr>\n"; echo "<td align=\"right\">". ($i + 1) . "</td>\n"; echo "<td align=\"center\">"; echo "<input name=\"voornaam[]\">"; echo "</td>\n"; echo "<td align=\"center\">"; echo "<input name=\"familienaam[]\">"; echo "</td>\n"; echo "</tr>\n"; } ?> </table> <input type="submit" value="Ok, ingevuld"> </form> </body> </html>

hoofdstuk6/done.php

<html> <head> <title>Ok, tis in orde</title> </head> <body> <?php for($i=0; $i < count($voornaam); $i++) { if(isset($voornaam[$i]) && isset($familienaam[$i]) ){ $safe_voornaam = htmlentities(trim($voornaam[$i])); $safe_familienaam = htmlentities(trim($familienaam[$i])); //namen afdrukken echo "Hallo " . $safe_voornaam . " " . $safe_familienaam; echo " je werd ingevoerd<br>\n"; } } ?> </body> </html>

37

6.4. Cookies.

6.4.1 Wat zijn cookies? Cookies behoren tot de slechtst begrepen aspecten van werken met het Internet. Cookies worden gezien als de oorzaak voor allerlei problemen: van het verspreiden van virussen tot het verzenden van persoonlijke informatie zonder toestemming van de betrokkene. Cookies zijn kleine tekstbestanden die door een webserver op een vaste schijf van de cliëntcomputer worden geplaatst. Het gegeven dat een webserver naar de vaste schijf van een gebruiker kan schrijven, maakt gebruikers wantrouwig tegenover cookies.

6.4.2 Cookies maken en eruit lezen. Cookies worden verstuurd met de functie setcookie():

Functie prototype: int setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])

Voorbeeld: setcookie(“naam”,”waarde”); Deze regel code zal een cookie met de naam “naam” en de waarde “waarde” naar de browser versturen. Je kunt meerdere cookies naar de browser versturen door de functie setcookie() herhaaldelijk te gebruiken. De protocollen van het web beperken je echter tot het versturen van maximaal 20 cookies van dezelfde server naar dezelfde gebruiker. Wil je een cookie ophalen dan moet je naar de naam van de cookie refereren zoals naar een variabele. Je kunt bijvoorbeeld de waarde van de met de regel setcookie(“gebruikersnaam”,”Bert”); ophalen met de veranderlijke $gebruikersnaam. Het belangrijkste wat je over cookies moet weten, is dat ze voor welke andere informatie dan ook vanaf de server naar de client moeten worden gestuurd. Mocht de server proberen een cookie naar de browser te versturen nadat deze al HTML-code heeft ontvangen, dan zal dat tot een foutmelding leiden en de cookie zal niet verstuurd worden. Dit is een van de meest voorkomende, aan cookies gerelateerde fouten.

Daarom is in het voorbeeld (voorbeeld2.php) de commentaar die aangeeft waar het voorbeeld te vinden is pas geschreven na de php-code die de cookie aanmaakt. Indien je de commentaar toch vooraan zou zetten in de code krijg je de volgende foutmelding.

38

Een cookie verwijderen is doodeenvoudig. Roep simpelweg de functie setcookie () aan, zonder tweede argument dat de waarde opgeeft. Deze aanroep plaatst geen lege string als de waarde van de cookie, maar verwijdert de cookie.

6.4.3 Voorbeeld. In dit voorbeeld wordt het volgende bewerkstelligd. Indien het formulier wordt gezonden dan zal PHP twee cookies versturen één met de waarde van de achtergrondkleur en één met de waarde van de tekstkleur. Het script zal daarna de actuele waarden (BGColor $TextColor ) vervangen door de nieuw ingestelde waarden ($NewBGColor en $NewTextColor) hoofdstuk7/voorbeeld2.php

<?php if ($BeenSubmitted) { setcookie("BGColor", "$NewBGColor"); setcookie("TextColor", "$NewTextColor"); $BGColor = $NewBGColor; $TextColor = $NewTextColor; } else { if (!$BGColor) { $BGColor = "WHITE"; } if (!$TextColor) { $TextColor = "BLACK"; } } ?> <!-- hoofdstuk6/voorbeeld2.php --> <HEAD> <TITLE>User Customization</TITLE>

39

</HEAD> <?php print ("<BODY BGCOLOR=$BGColor TEXT=$TextColor>\n"); ?> Currently your page looks like this! <form method="GET" action="<?php echo $PHP_SELF?>"> Select a new background color: <SELECT NAME="NewBGColor"> <OPTION VALUE=WHITE>WHITE</OPTION> <OPTION VALUE=BLACK>BLACK</OPTION> <OPTION VALUE=BLUE>BLUE</OPTION> <OPTION VALUE=RED>RED</OPTION> <OPTION VALUE=GREEN>GREEN</OPTION> </SELECT> Select a new text color: <SELECT NAME="NewTextColor"> <OPTION VALUE=WHITE>WHITE</OPTION> <OPTION VALUE=BLACK>BLACK</OPTION> <OPTION VALUE=BLUE>BLUE</OPTION> <OPTION VALUE=RED>RED</OPTION> <OPTION VALUE=GREEN>GREEN</OPTION> </SELECT> <INPUT TYPE=HIDDEN NAME=BeenSubmitted VALUE=TRUE> <INPUT TYPE=SUBMIT NAME="SUBMIT" VALUE="Submit!"> </FORM> </BODY> </HTML>

6.4.4 Parameters aan een cookie toevoegen. Er zijn nog andere parameters die je aan de functie setcookie() kan toevoegen de vier andere parameters zijn bedoeld voor de beperking van de functie setcookie().

setcookie(“naam”,”waarde”,”verloopdatum”,”pad”,”domein”,”veilig’); Met het argument verloopdatum kan ingesteld worden hoe lang een cookie zal bestaan. Wordt dit argument niet opgegeven, dan zal de cookie functioneel blijven tot de gebruiker de browser afsluit. De verlooptijd wordt gewoonlijk ingesteld door een bepaald aantal minuten of uren bij de actuele tijd op te tellen. De volgende regel code zal de verlooptijd van de cookie instellen op een uur na het actuele tijdstip. setcookie(“naam”,”waarde”,time() + “3600”); De argumenten pad en domein worden gebruikt om een cookie tot op een specifieke map binnen een website of tot een specifiek domein te beperken. De waarde veilig bepaalt dat een cookie alleen over een veilige HTTPS-verbinding mag worden verstuurd. Een “1” geeft aan dat er een veilige verbinding moet worden gebruikt een “0” geeft aan dat er geen veilige verbinding vereist is. setcookie(“naam”,”waarde”,time()+”3600”,””,””,”1”);

40

6.5 HTTP-headers verzenden.

6.5.1 Header-functie. PHP biedt de functie header(), die je kunt gebruiken voor het verzenden van ruwe data, willekeurige HTTP-headers. Je zou deze functie kunnen gebruiken om je eigen cookiefuncties te creëren, maar ook om te profiteren van wat voor header-gecontroleerde functionaliteit dan ook.

De syntaxis van header() had niet eenvoudiger kunnen zijn: de functie neemt één enkele string als argument aan, en die string is de header die moet worden verzonden.

Functie prototype: int header (string string);

6.5.2 Omleiding door location.

Een nuttig type HTTP-header is "Location; ", die dienst kan doen als redirector ('omleider'). Plaats simpelweg een volledig syntactisch correcte URL achter de string "Location:", en de browser zal opnieuw beginnen met het nieuwe adres. Een voorbeeld: hoofdstuk6/voorbeeld3.php

<?php if (IsSet($gender) && ($gender == "female")) { header("Location: http://www.iwt.kdg.be/secret.php"); exit; } <HTML> <HEAD> <TITLE>Omleiding</TITLE> </HEAD> </HTML> <BODY> <H3>Welcome!</H3> <p>We verwelkomen je op deze pagina</p> </BODY> </HTML>

Als je de URL voor deze pagina opgeeft krijg je onderaan de rendering van de HTML te zien. Anderzijds word je naar een totaal andere pagina omgeleid als je het juiste argument door middel van een form invoegt.

De type omleiding kan handig zijn als je de structuur van je website voorwaardelijk wilt doen vertakken, zonder dat je de gebruiker daartoe expliciete keuzes uit hyperlinks wilt geven.

41

6.5.3 HTTP-authenticatie.

Een ander nuttig gebruik van HTTP is de browser de gebruiker te laten vragen om een gebruikersnaam en wachtwoord, met behulp van een pop-up-venster. Dit bekom je met de HTTP-header WWW-Authenticate, zoals in het volgende voorbeeld:

hoofdstuk6/voorbeeld4.php

<?php $the_right_user = 'user'; // example only! not recommended $the_right_password = 'password'; // example only! if(!isset($PHP_AUTH_USER)) { Header("WWW-Authenticate: Basic realm=\"PHP cursus\""); Header("HTTP/l.O 401 Unauthorized"); echo "Canceled by user\n"; exit; } else { if (($PHP_AUTH_USER == $the_right_user) && ($PHP_AUTH_PW ==$the_right_password )) //see caution below print("The realm is yours<BR>"); else print("We don't need your kind<BR>"); } ?>

Als je dit script voor het eerst bezoekt, krijgen je een pop-up-venster te zien. Als de gebruiker zijn gegevens invoert in het venster, wordt het script automatisch opnieuw aangeroepen met de nieuwe variabelen $PHP_AUTH_USER (ingesteld op de gebruikerstring), $PHP_AUTH_PASSWD (ingesteld op de wachtwoordstring) en $PHP_AUTH TYPE (dat ingesteld is op 'Basic' tot het moment dat PHP daadwerkelijk andere types http authenticatie zal ondersteunen). Het nut hiervan is dat deze variabelen bij elk verzoek van de browser opnieuw worden ingesteld en je niets hoeft toe te voegen aan je scripts om ze door te laten geven - één verificatie van de identiteit per sessie volstaat al. Ook hier mag geen commentaar voor de php-code geplaatst worden.

42

6.6 Connection handling. Intern in PHP wordt de connectie status bijgehouden. Er zijn 3 statussen mogelijk:

0 - NORMAL 1 - ABORTED 2 - TIMEOUT

Als een PHP script normaal draait is de NORMAL status actief. Zogauw een gebruiker de HTTP connectie sluit is de ABORTED status actief. Dit gebeurt meestal als de gebruiker op de STOP knop klikt. Als de door PHP bijgehouden tijdlimiet (zie set_time_limit()) overschreden word, is de TIMEOUT status actief. Je kunt er voor kiezen jouw script te beëindigen wanneer een gebruiker de connectie met de server sluit, echter is het soms handig om een script door te laten lopen, zelfs als er geen browser is om de output te ontvangen. Standaard wordt echter jouw script gestopt wanneer de gebruiker de connectie sluit. Dit gedrag kan gewijzigd worden met het ignore_user_abort directief in php.ini of met het corresponderende php_ignore_user_abort directief in apache.conf of het makkelijkst met de ignore_user_abort() functie. Als je PHP niet vertelt het sluiten van een connectie te negeren zal je script gestopt worden zogauw dit gebeurd. Er is een uitzondering, als je een shutdown functie hebt geregistreerd met de register_shutdown_function() functie zal PHP zogauw hij ontdekt dat er geen connectie meer is, proberen deze shutdown functie aan te roepen. Deze functie wordt echter ook aangeroepen als je script op een normale manier eindigt. Als je alleen actie wilt ondernemen als de gebruiker de connectie sluit kun je gebruik maken van de connection_aborted() functie. Deze functie geeft TRUE als de connectie gesloten is. Je script kan ook beëindigd worden door de ingebouwde script timer. De standaard time-out is 30 seconden. Dit kan veranderd worden met het max_execution_time directief in php.ini of met het corresponderende php_max_execution_time directief in Apache.conf of met de set_time_limit() functie. Als de toegestane tijd wordt overschreden wordt het script beëindigd en net zoals in het geval dat de gebruiker de connectie sluit word er een shutdown functie aangeroepen mits deze geregistreerd is. In deze shutdown functie kun je controleren of een time-out de oorzaak is van het aanroepen van de shutdown function. Dit doe je met de connection_timeout() functie. Deze functie geeft TRUE als een time-out de oorzaak was. Een ding om te onthouden is dat de ABORTED status en de TIMEOUT status allebei actief kunnen zijn op hetzelfde moment. Dit is pas mogelijk als je PHP verteld om zgn. 'user aborts' (gebruikt sluit connectie) te negeren. PHP zal merken dat de gebruiker de connectie gesloten heeft maar het script blijft draaien. Als de tijdslimiet bereikt word, wordt het script beëindigd en de shutdown functie aangeroepen. Je zult merken dat als dit het geval is zowel connection_timeout() als connection_aborted() TRUE geven. Je kunt deze statussen met 1 functie controleren, namelijk connection_status(). Deze functie geeft een bitveld met de huidig actieve statussen. Dus als beide statussen actief zijn zou het 3 geven.

43

7.Bestanden gebruiken.

7.1 Uploaden van bestanden. Vaak is het noodzakelijk dat de client een bestand kan doorsturen naar de server. Denk bijvoorbeeld maar aan het doorsturen van een pasfoto naar de server. Onder PHP kan je heel gemakkelijk bestanden uploaden. Je moet wel GET i.p.v POST gebruiken. Twee wijzigingen in het standaard HTML-formulier worden gemaakt als we de gebruiker de optie willen bieden om een bestand te uploaden. De eerste form-regel moet de code ENCTYPE=”multipart/form-data” omvatten, hierdoor meld je aan HTML dat deze niet alleen gegevens maar ook een bestand moet verwachten. Ten tweede moet je het noodzakelijke veld maken met het element <INPUT TYPE=FILE NAME=NAAM>. De code INPUT TYPE=FILE in een formulier maakt het de gebruiker mogelijk een bestand op de computer van de gebruiker op te geven, dat dan naar de server zal worden geüpload. De server zal het bestand in een tijdelijke directory plaatsen. Je kunt dit bestand in een permanente plaats opslaan met de functie copy(). De functie unlink() verwijdert het tijdelijke bestand.

Functie prototypes: int copy ( string source, string dest); int unlink ( string filename);

Een voorbeeld ter verduidelijking. hoofdstuk7/voorbeeld1.php

<HTML> <HEAD> <TITLE>Handling File Uploads</TITLE> </HEAD> <BODY> <?php /* This next conditional determines whether or not to handle the form, depending upon whether or not $File exists. */ if ($File) { print ("File name: $File_name<P>\n"); print ("File size: $File_size<P>\n"); if (copy ($File, "users/$File_name")) { print ("Your file was successfully uploaded!<P>\n"); } else { print ("Your file could not be copied.<P>\n"); } unlink ($File); } print ("Upload a file to the server:\n");

44

print ("<FORM ACTION=\"FileUpload.php\" METHOD=POST ENCTYPE=\"multipart/form-data\">\n"); print ("File <INPUT TYPE=FILE NAME=\"File\" SIZE=20><BR>\n"); print ("<INPUT TYPE=SUBMIT NAME=\"SUBMIT\" VALUE=\"Submit!\"></FORM>\n"); ?> </BODY> </HTML>

7.2 Openen en sluiten van een bestand. Wanneer je een bestand wenst te openen gebruik je de functie fopen().

Functie prototype: int fopen ( string filename, string mode

[, int use_include_path]);

Het eerste argument is de naam van het bestand (mag ook een http- of ftp-URL zijn). Het tweede argument is de mode waarin het bestand moet geopend worden. Wil je alleen lezen, dan gebruik je de mode “r”. Wanneer je alleen wenst te schrijven naar een file, dan gebruik je ofwel “w”, ofwel “a”. Bij de mode “w” wordt het bestand eerst nog gewist. Wanneer je wilt lezen en schrijven gebruik je “r+”. De functie fopen(filenaam, mode) geeft je een file-handler terug. Dit is een integer die je in alle andere file-operaties zal moeten meegeven. Om het bestand te sluiten gebruik je de functie fclose(filehandler). Een bestand kan ook geopend worden door de functie file(). Deze functie heeft slechts 1 argument, een filenaam. Deze file wordt geopend en wordt als een array teruggegeven aan het PHP-script. Bij het gebruik van deze functie kan je niet naar het bestand schrijven. Functie prototypes: bool fclose ( int fp); array file ( string filename [, int use_include_path]); Een voorbeeld van het gebruik van file: de inhoud van een file wordt in een array ingelezen en lijn per lijn afgedrukt. hoofdstuk7/voorbeeld2.php

<?php // get a web page into an array and print it out $fcontents = file ("voorbeeld3.html"); while (list ($line_num, $line) = each ($fcontents)) { echo "<b>Line $line_num:</b>; ", htmlspecialchars ($line), "<br>\n"; } ?>

45

Dit geeft het volgende resultaat in de browser.

7.3 Lezen en schrijven. Wanneer je een bestand geopend hebt met fopen(), kan je op verschillende manieren lezen uit dit bestand. Ofwel lees je karakter per karakter met fgetc(file-handler). Deze functie leest het volgende karakter in het bestand, en geeft het terug als een string. Wanneer je echter meerdere karakters ineens wilt lezen, moet je de functie fread(handler, size) gebruiken. Er worden precies ’size’ aantal karakters gelezen, ofwel wordt gestopt aan het einde van het bestand. Een veel betere functie, die een volledige lijn per keer kan lezen is fgets(filehandler, size). Er wordt gelezen tot er een newline of het einde van het bestand gevonden wordt. Een laatste functie om een bestand te lezen is fpassthru(file-handler). Deze functie gaat de volledige file lezen en doorgeven aan de browser. Let er wel op dat er niets meer geparsed wordt! Wanneer je wilt schrijven kan je de functies fputs(filehandler, string[, lengte]) of fwrite(filehandler, string[, lengte]) gebruiken. De beide functies werken identiek. Wanneer er geen lengte gegeven is, dan wordt de volledige string geschreven naar de file. Meer informatie vindt je in de manual van PHP in het hoofdstuk over “Filesystem functions”. Het volgende voorbeeld verhoogt de teller die in de file “counter.dat” staat. hoofdstuk7/voorbeeld3.php

<html> <body bgcolor="#999999" text="#000000"> <?php $count=0; $filename = "counter.dat"; if(file_exists($filename)) { $file = fopen("$filename", "r");

46

$count = fgets($file, 50); fclose($file); } $count = $count + 1; $file = fopen("$filename", "w"); fputs($file,$count,50); fclose($file); echo "<h1>U bent bezoeker nummer $count </h1>\n"; ?> </body> </html>

7.4 Bestanden en direct access. Om binnen bestanden te navigeren bestaan er verschillende functies. rewind(filehandle) is de simpelste functie onder deze functies. De interne file-pointer wordt teruggezet naar het begin van het bestand. fseek(filehandle, offset) gaat de interne pointer op een welbepaalde plaats zetten. De parameter offset is de positie vanaf het begin van het bestand. Wanneer je een bepaalde positie wilt weten, moeten je ftell(filehandle) gebruiken. Deze functie geeft de huidige positie in een file weer. Let erop dat fseek een waarde -1 teruggeeft bij een fout, en anders 0! Dit is strijdig met alle andere PHP-functies. Een laatste handige functie is feof(filehandle). Deze functie geeft een boolean terug die weergeeft of het einde van het bestand al dan niet bereikt is. Deze functie wordt meestal gebruikt in een while-lus om bestanden volledig in te lezen.

7.5 Data klaarmaken voor opslag. Een goede manier om te werken met files is het gebruik van file() om te lezen en fputs() om te schrijven. file() geeft het bestand in een array terug. Elk element van de array komt overeen met een regel uit het bestand, met het newline teken er nog aan. De functies serialize() en unserialize() zijn handig om data klaar te maken voor opslag. Serialize() geeft een string terug die een byte-stream representatie bevat die overal kan worden opgeslagen. Dit is nuttig om PHP waarden op te slaan of door te geven zonder hun type en structuur te verliezen.

7.6 Een directory aanmaken. Het weten hoe je uit bestanden op de server leest en ernaar schrijft, is alleen maar een onderdeel van het proces van het opslaan van gegevens. Waarschijnlijk wil je ook tegelijkertijd gebruik maken van directory’s. Al je webpagina’s zullen standaard in een specifieke directory staan (www of html) Je kunt meer directory’s binnen deze directory maken voor het opslaan van gegevens of afbeeldingen. Dit door gebruik te maken van de functie mkdir().

47

Het eerste argument is het pad van de directory. De tweede parameter bepaald de toegangsrechten van de directory volgens het UNIX-principe (in de vorm van een nul gevolgd door 3 cijfers). Je kunt ook testen of een directory bestaat door de functie is_dir().

Functie prototypes:

int mkdir ( string pathname, int mode); bool is_dir ( string filename);

In het volgende voorbeeld wordt zowel het maken van een directory als het schrijven naar een bestand geïllustreerd. hoofdstuk7/voorbeeld4.html

<HTML> <HEAD> <TITLE>Registration Form</TITLE> </HEAD> <BODY> <FORM ACTION="voorbeeld4.php" METHOD=POST> Username <INPUT TYPE=TEXT NAME="Username" SIZE=15><BR> <INPUT TYPE=SUBMIT NAME="SUBMIT" VALUE="Submit!"> </FORM> </BODY> </HTML>

hoofdstuk7/voorbeeld4.php

<?php function WriteToFile ($Username) { $TheFile = "users.txt"; $Open = fopen ($TheFile, "a"); if ($Open) { $Directory = "users\\" . $Username; // windows // $Directory = "users/" . $Username; // unix fwrite ($Open, "$Username\t$Directory\n"); fclose ($Open); if (!is_dir("users")) mkdir ("users"); if (!is_dir($Directory)){ if (!(mkdir ($Directory,”0777”))) { return FALSE; } } } else return FALSE;

48

print ("Your request was successfully processed!<BR>\n"); } // End of WriteToFile Function. ?> <HTML> <HEAD> <TITLE>Using Directories</TITLE> </HEAD> <BODY> <?php if ($Username) { WriteToFile ($Username); } else { print ("Please enter a Username!\n"); } ?> </BODY> </HTML>

49

8. Sessions in PHP.

8.1 Wat is een session. De webserver reageert onafhankelijk op iedere afzonderlijke aanvraag en is niet in staat de afzonderlijke requests aan elkaar te koppelen, zelfs niet als alle requests worden geregistreerd. Sessions maken het mogelijk om variabelen te gebruiken binnen een hele website. Op het moment dat een bezoeker een site bezoekt kan je een sessie id opvragen. Een dergelijk id is een uniek nummer. Het unieke nummer komt te vervallen op het moment dat de bezoeker de browser zal afsluiten. Je kunt met sessions werken via een session cookie of via de session_id in de url.

8.2 Hoe sessies werken in PHP. Goede sessieondersteuning neemt twee zaken waar:

• sessiecontrole:controleren of twee afzonderlijke script aanroepen behoren tot eenzelfde gebruikerssessie

• sessieopslag: opslag van de informatie die te maken heeft met die sessie Sessie controle met PHP functioneert door middel van een combinatie van “ verborgen variabelen” en “cookies”. De sessiefuncties werken echter op een abstracter niveau. Als je versie van PHP 4 correct geconfigureerd is voor sessies, zou het mogelijk moeten zijn gebruik te maken van de geboden functies zonder je zorgen te maken over de methode die daarbij wordt gebruikt.

8.2.1 PHP bewust maken van een sessie. Eerst wordt een pagina gekoppeld aan een sessie. Dit door middel van de functie session_start(). Het effect van session_start() hangt af van de aanwezigheid van een eerdere sessie-identifier. Als een identifier wordt gevonden, worden de waarden van variabelen van een eerder geregistreerde sessie opgehaald en worden deze toegewezen variabelen omgezet in normale variabelen op paginaniveau. Als een eerdere pagina in een sessie bijvoorbeeld de variabele $username heeft geregistreerd (session_register('username')) en deze de waarde “Ikke” heeft toegewezen, doet het script daar zijn voordeel mee door simpelweg session_start() aan te roepen. Alleen als PHP geen eerdere sessie-identifier kan vinden, start de aanroep van session_start daadwerkelijk een nieuwe sessie. Het belangrijkste effect hiervan is dat een nieuwe unieke identifier wordt gecreëerd, die vervolgens kan worden gebruikt om variabelen te registreren.

8.2.2 Variabelen registreren in sessies. Het aanroepen van session_start() verzorgt het ‘importeren’ van variabelen uit de sessiecontext naar het huidige script. De volgende stap is het ‘exporteren’ van variabelen, zodat de informatie kan worden gebruikt door toekomstige pagina’s in dezelfde sessie. Dit gebeurt door middel van de functie session_register(). Het importeren is een eenmalige gelegenheid maar bij exporteren moet je elke te registreren veranderlijke afzonderlijk benoemen.

50

session_start(); $username=’Ikke’; $pagecount=1; session_register('pagecount'); session_register('username');

Het is nuttig om de registratie van een sessievariabele te beschouwen als een ‘super-globale’ declaratie. Variabelen die binnen functiedefinities voorkomen hebben een reikwijdte die lokaal is voor de functie, tenzij ze globaal zijn gedeclareerd. Op dezelfde manier hebben reguliere globale variabelen een reikwijdte van een enkele pagina tenzij ze geregistreerd zijn als (superglobale) sessievariabelen. De inhoud van de sessievariabelen wordt standaard opgeslagen in speciale bestanden op de server, in één bestand per sessie-ID. In de PHP-manual vind je tal van session-functies die kunnen gebruikt worden. Een voorbeeld ter illustratie. In dit voorbeeld wordt de naam van de gebruiker en het aantal maal dat de pagina bezocht werd geregistreerd. hoofdstuk8/session1.php

<?php session_start(); session_register('pagecount'); session_register('username'); if (IsSet($pagecount)) $pagecount++; else $pagecount = 1; $pagecount_limit = 5; ?> <HTML><HEAD><TITLE>Session testing page</TITLE> </HEAD><BODY> <H3>Session testing</H3> <p>Your session ID is <?php print(session_id());?><BR> PHP needs to know it but you probably don't.<BR> <?php if (IsSet($posted_username)) $username = $posted_username; if (IsSet($username)) { print("<P>We know your name! It's $username<BR>"); } ?> <P>You have visited <?php print($pagecount);?> page(s) this session.<BR> <?php if ($pagecount == 1) print("You must have just arrived!<BR>"); ?> You are only allowed <?php print($pagecount_limit);?> pages per session.<BR> <P>This is a link to <A HREF="<?php echo $PHP_SELF;?>">this very page</A>.<BR>

51

Following it will increase the number of pages<BR> you have visited in your session, but won't do much else. <P>Here is a form you can use to tell us your name <BR> <P><FORM METHOD=POST ACTION="<?php echo $PHP_SELF;?>" > My name is: <INPUT TYPE=TEXT SIZE=20 NAME=posted_username><BR> <INPUT TYPE=SUBMIT NAME=SUBMIT VALUE="Remember me!"> </FORM> </BODY></HTML> <?php if ($pagecount >= $pagecount_limit) session_destroy(); ?>

Deze code geeft een volgend resultaat.

52

9. MySQL

9.1 Inleiding. MySQL is een Open Source project en is snel en goed. De database is geschreven volgens een client/server architectuur en is beschikbaar voor verschillende platformen. Bij veel verschillende hosting-providers is MySQL de enige beschikbare database. De omschakeling naar andere databasesystemen zou gemakkelijk moeten zijn. Wanneer data veel moet gemanipuleerd worden, dan is de oplossing met files heel moeilijk. Je moet zelf allerlei functies gaan voorzien om de data te lezen en weg te schrijven of om in de data te gaan zoeken volgens bepaalde zoekcriteria. Wanneer je dan gaat denken aan de prijslijsten van een groot bedrijf, wordt het gebruik te traag en omslachtig en veel te foutgevoelig. Databases doen de opslag voor jou. PHP heeft ook ondersteuning voor databases. Je kunt ongeveer alle handelingen uitvoeren die nodig zijn, gaande van opzoeken van data, tot het maken of het verwijderen van een volledige database. Een ander voordeel is de schrijfrechten van de files. Wanneer je plain files gebruikt moeten deze files of directories schrijfbaar zijn voor de webserver, of voor iedereen. Een database wordt meestal gebruikt via een TCP/IP-connectie of een socket op de locale machine. De database-server doet alle handelingen, zodat de files slechts eigendom en schrijfbaar moeten zijn voor de database-server en niet voor iedereen. De meeste relationele Database Management Systemen (RDBMS) implementeren onder andere SQL (Structured Query Language), een taal om relationele gegevensbank te definiëren en te gebruiken. SQL bevat mogelijkheden om relatieschema’s te declareren (Create Table), om vragen aan een gegevensbank te stellen (Select) en om de toestand van het gegevensbanksysteem te wijzigen (Insert, Update, Delete). SQL ontstond in het begin van de jaren 70 onder de naam SEQUEL (Structured English Query Language) in het IBM Research Laboratory in San Jose. Eind jaren 70 werd de naam gewijzigd in SQL, door velen nog als sequel uitgesproken. Er zijn vele versies van SQL. De eerste standaarddefinitie werd in 1986 door het ANSI (American National Standards Institute ) en in 1987 door het ISO (International Standard Organization) gepubliceerd en heet SQL86. Bijna alle commerciële databanken hebben hun eigen uitbreidingen van SQL86 gedefinieerd. In dit hoofdstuk wordt het deel van SQL beschreven dat door MySQL ondersteund wordt. MySQL is een werkelijke multi-user, multi-threaded SQL database server. MySQL was oorspronkelijk ontwikkeld voor TcX, omdat ze een SQL server nodig hadden die met zeer grote databases overweg kon. TcX gebruikt het nu sinds 1996 met databases met ongeveer 100 Gigabytes aan kritieke informatie. In de volgende figuur staat de communicatie tussen gebruiker en eigenlijk database via de MySQLserver geïllustreerd.

53

9.2 SQL. Wanneer je databases gaat gebruiken, kan je terugvallen op een standaard. Deze standaard kreeg de naam “SQL”. SQL is eigelijk een soort van taal waarmee je de database kan opbouwen en ondervragen. Je kunt deze taal opsplitsen in 2 delen, namelijk het deel dat je gebruikt voor de opbouw van een database en een deel dat je gebruikt voor het bewerken van de data in de database. Meestal ga je slechts enkele keren de eerste soort commando’s gebruiken, terwijl de tweede soort heel frequent gebruikt worden. De eerste soort wordt Data Definition Language (DDL) genoemd, de tweede krijgt de naam Data Manipulation Language (DML).

9.3 Persistente Database connecties Persistente connecties zijn connecties naar SQL servers die niet gesloten worden zogauw je script beëindigd wordt. Zogauw een persistente connectie wordt aangevraagd kijkt PHP of er al een identieke connectie is (die open gebleven is nadat hij eerder geopend is) en als deze bestaat word die connectie gebruikt. Bestaat er nog geen vrij identieke connectie dan wordt er een nieuwe connectie gelegd. Een 'identieke' connectie is een connectie die geopend was naar dezelfde host, met dezelfde username en password. Er zijn 3 manieren waarop je web server PHP kunt gebruiken om pagina's te genereren. De eerste manier is om PHP te gebruiken als een CGI "wrapper". Als je PHP op deze manier gebruikt word een instantie van de PHP interpreter aangemaakt en vernietigd voor iedere PHP pagina die wordt opgevraagd. Omdat het na iedere aanvraag vernietigd word, worden middelen die PHP gebruikt heeft (zoals een connectie naar een database server) vrijgegeven (gesloten). In dit geval heeft het geen zin om persistente connecties te gebruiken -- ze blijven simpelweg niet bestaan. De tweede, en meest populaire, manier is PHP te gebruiken als een module in een multiprocess web server, op dit moment alleen Apache. Een multiprocess webserver heeft standaard 1 process (de parent) welke een partij andere process (child processen) coördineert. Deze child processen nemen zorg voor het verwerken van aanvragen. Als een aanvraag binnenkomt word deze doorgegeven aan een child process dat op dat moment niets te doen heeft. Dat betekent dat als dezelfde gebruiker een nieuwe aanvraag stuurt deze door een ander child process afgehandeld kan worden. Wat een persistente connectie voor je doet in deze context is dat een child process slechts een connectie maakt naar een SQL server bij het eerste script dat een dergelijk connectie vereist. Als een andere pagina daarna ook een dergelijke connectie nodig heeft dan kan de connectie die al eerder gelegd was opnieuw gebruikt worden. De laatste methode is om PHP te gebruiken als een plug-in in een multithreaded web server. Op dit moment is dit slechts theoretisch -- PHP werkt nog niet als een plugin voor een multithreaded web server. Er wordt vooruitgang geboekt op de ontwikkeling voor support voor ISAPI, WSAPI

54

en NSAPI (onder Windows) welke allemaal mogelijk maken dat PHP gebruikt wordt als een plug-in op multithreaded servers zoals Netscape FastTrack, Microsofts Internet Information Server (IIS) en O'Reilly's WebSite Pro. Zogauw dit compleet is zal het gedrag van PHP in deze context overeen komen met het gedrag van PHP in een multiprocess model, wat hierboven beschreven is. Als persistente connecties geen extra functionaliteit geven, waar zijn ze dan goed voor? Het antwoord is erg simpel -- betere performance. Persistente connecties zijn goed als de overhead om een connectie naar je SQL server te leggen groot is. Of die overhead daadwerkelijk groot is hangt af van veel factoren. Zoals, wat voor database is het, draait de server op dezelfde machine als de webserver. Hoe druk de server het met de database het heeft. Uiteindelijk als deze overhead inderdaad groot is, zijn persistente connecties een goede hulp. Ze zorgen ervoor dat het child process zolang het process leeft slechts 1x een connectie naar de SQL server legt, in plaats van iedere keer dat het child process een connectie legt zogauw het een script verwerkt dat een dergelijk connectie vereist. Dit betekent dat ieder child process is eigen connectie heeft naar de SQL server. Bijvoorbeeld, als je 20 verschillende child processen hebt dat een script verwerkt dat een persistente connectie legt, dan zou je 20 verschillende connecties hebben naar de SQL server. Een van elk childprocess. Onthoudt wel dat dit zijn nadelen kan hebben als je een database server gebruikt met een limiet op het aantal connecties. Als je database een limiet van 16 gelijke connecties heeft, en in laten we zeggen dat we een drukke server hebben, 17 child processes proberen een connectie te leggen, zal er een hierin falen. Als je scripts bugs hebben welke niet de connectie sluiten kan een database met slechts 32 connecties snel "verdrinken". Zoek door de database documentatie naar informatie over het sluiten van verlaten of niet-gebruikte connecties. Een belangrijke samenvatting. Persistente connectie zijn ontwikkeld om in principe hetzelfde te werken als standaard connecties. Dat betekent dat je altijd de mogelijk hebt om persistente connecties te vervangen met niet-persistente connecties, zonder dat het gedrag van je script wijzigt. Het kan (en zal waarschijnlijk) de effectiviteit van je script verbeteren, maar het zal nooit het gedrag veranderen.

9.4 PHP en MySQL Een standaardscript dat een database gebruikt gaat meestal eerst een connectie leggen met de database, daarna de inhoud van een script verwerken en dan wordt de database aangepast of aangevuld. Uiteindelijk wordt de connectie terug afgesloten. We zullen dan ook enkel functies bekijken om deze taken uit te voeren.

9.4.1 Openen, sluiten en database kiezen Om een connectie te leggen met de database gebruiken je de functie mysql_connect() of mysql_pconnect(). De parameters zijn bij beide functies gelijk. De p staat bij de tweede functie voor persistent. syntax van mysql_connect():

resource mysql_connect(string hostname [:port] [:/path_to_socket], string [username], string [password]);

resource mysql_pconnect(string hostname [:port] [:/path_to_socket], string [username], string [password]);

55

Zoals je ziet heb je telkens een hostname nodig met wie je een verbinding wilt maken. Normaal gebeurt dit via een TCP/IP connectie. Wanneer de PHP-webserver en de MySQL database op dezelfde machine draaien kan PHP communiceren met de MySQL server via de socket. Meestal is de eerste parameter “localhost”. De tweede en de derde parameter spreken voor zich. Wanneer je een verbinding maakt met de database moet je normaal een username en een passwoord opgeven. Ook in een PHP-script is dat niet anders. Let erop dat het passwoord in plain-text in de file komt te staan, wat dus eigenlijk onveilig is. Let erop dat andere gebruikers op je systeem de file kunnen komen lezen. Een echte oplossing voor dit probleem bestaat er niet, tenzij je op de een of andere manier de file die de passwoorden bevat eigendom kan maken van de webserver-user. De return-waarde van de beide functies is een resource (link-integer), een uniek getal dat de connectie met de database weergeeft. Meestal moet dit getal ook bijgehouden worden en gebruikt worden in de volgende database-oproepen. Wanneer de connectie niet gelukt is krijg je een “false” waarde terug, dus kan je de volledige verbindingsconstructie in een if-constructie inpassen. Let erop dat je perfect twee of meerdere connecties met –al dan niet– verschillende databases kan openen in een script. Het verschil tussen mysql_connect() en mysql_pconnect() is miniem. Wanneer je PHP als een module draait en mysql_pconnect() gebruiken gaat de connectie bij het afsluiten of bij het beëindigen van de het script niet gesloten worden. De module houdt de verbinding open. Wanneer er later een ander script uitgevoerd wordt dat probeert een verbinding te leggen via mysql_pconnect() of mysql_connect() met dezelfde parameter-waarden gaat de al geopende (en bewaarde) connectie gebruikt worden. Dit bespaart de overhead die ontstaat bij het openen en sluiten van connecties. Wanneer de connectie toch lang genoeg niet gebruikt wordt, gaat PHP de connectie uiteindelijk toch sluiten. Mysql_pconnect() moet dus gebruikt worden bij sites die binnen een korte tijdspanne regelmatig een connectie leggen naar een bepaalde database met dezelfde username en password. Drukbezochte sites die veel dynamische pagina’s bevatten kunnen dus beter mysql_pconnect() gebruiken. Sites waar er maar enkele hits in een dag komen kunnen echter beter mysql_connect() gebruiken. Om een connectie af te sluiten kan je de functie mysql_close() gebruiken. syntax van mysql_connect():

bool mysql_close ( [resource link_identifier]); De enige parameter die nodig is, is de resource die je verkregen hebt hij het openen van de connectie. Wanneer je geen parameter meegeeft wordt de laatst geopende connectie afgesloten. Mysql_close() geeft een “true” terug wanneer de afsluiting gelukt is, of een “false” wanneer mysql_close() de connectie niet kon sluiten. Mysql_close() zal nooit een connectie sluiten die met mysql_pconnect() geopend is, maar zal in dat geval wel een “true” teruggeven. Wanneer je een connectie hebt geopend (met mysql_connect() of mysql_pconnect()) moet je de correcte database selecteren. Dit gebeurt met de functie mysql_select_db(). syntax van mysql_connect(): bool mysql_select_db ( string database_name

[, resource link_identifier]);

56

De twee parameters zijn de naam van de database en de resource. Je krijgt ofwel een “true” of een “false” terug naargelang het succes van de functie. hoofdstuk9/CreateDatabase.php

<HTML> <HEAD> <TITLE>Creating a Database</TITLE> </HEAD> <BODY> <?php // Set the variables for the database access: $Host = "localhost"; $User = "user"; $Password = "password"; $DBName = "NewDatabase"; $Link = mysql_connect ($Host, $User, $Password); if (mysql_create_db ($DBName, $Link)) {

print ("The database, $DBName, was successfully created!<BR>\n");

} else { print ("The database, $DBName, could not be created!<BR>\n");

} mysql_close ($Link); ?> </BODY> </HTML>

9.4.2 Tabellen aanmaken. Is de databank eenmaal gemaakt, dan kan je beginnen er individuele tabellen in te maken. Een databank kan uit meerdere tabellen bestaan, die allemaal eigen rijen en kolommen hebben. Databanken komen aan bod in het vervolg van je opleiding. Voor de eenvoud houden we het voorlopig bij een databank met één tabel. Het proces van het uitvoeren van een databankopdracht omvat het schrijven van een SQL-opdracht en deze dan uitvoeren in de database met mysql_db_query() syntax van mysql_db_query():

resource mysql_db_query ( string database, string query [, resource link_identifier]);

De juiste opdracht voor het maken van een tabel ziet er als volgt uit

$Query= “CREATE table TABELNAAM (kolom1,kolom2,…)”; De kolommen worden van elkaar gescheiden door komma’s. Voor elke kolom wordt eerst de kolomnaam opgegeven en dan het kolomtype. Veel voorkomende types zijn TEXT en INT.

57

Het wordt ten zeerste aanbevolen een kolom die als een primary key fungeert (een kolom waarmee aan elke rij gerefereerd wordt) als de eerste kolom te gebruiken (zie voorbeeld). Een eenvoudige opdracht zou er dan zo kunnen uitzien: $Query=”CREATE table Nieuwetabel (id INT PRIMARY KEY, informatie TEXT)”; De primary key van een tabel is een speciale kolom die unieke waarden bevat waarmee naar de rijen van een tabel kan worden verwezen. De databank gebruikt deze kolom als een index waarmee snel door de tabel kan worden genavigeerd. Een tabel kan altijd maar één primary key hebben. Dit is meestal een kolom met integers waarvan de waarde automatisch wordt vermeerderd. De eerste rij zal de sleutel 1 hebben. Meer informatie vindt je op www.MySQL.com. hoofdstuk9/CreateTable.php

<HTML> <HEAD> <TITLE>Creating a Table</TITLE> </HEAD> <BODY> <?php // Set the variables for the database access: $Host = "localhost"; $User = "user"; $Password = "password"; $DBName = "NewDatabase"; $TableName = "Feedback"; $Link = mysql_connect ($Host, $User, $Password); $Query = "CREATE table $TableName (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, FirstName TEXT, LastName TEXT, EmailAddress TEXT, Comments TEXT)"; if (mysql_db_query ($DBName, $Query, $Link)) { print ("The tabel was successfully created!<BR>\n"); } else { print ("The table already exist!<BR>\n"); } mysql_close ($Link); ?> </BODY> </HTML>

58

9.4.3 Gegevens in een databank inlezen. De gemaakte tabel zal gegevens van gebruikers in een database opslaan. In de vorige paragraaf werd een tabel gemaakt die uit 5 kolommen bestaat. Het proces van het toevoegen van informatie aan een tabel lijkt op dat van het maken van de tabel wat betreft de gebruikte functie. De SQL-opdracht zelf zal er anders uitzien

$Query=”INSERT into $Tabelnaam values(‘waarde1’,’waarde2’,…)”; mysql_db_query ($DBName, $Query, $Link)

De gegevens worden ingevuld door middel van een HTML-formulier. hoofdstuk9/form.html

<HTML> <HEAD> <TITLE>HTML Form</TITLE> </HEAD> <BODY> <FORM ACTION="HandleForm.php" METHOD=POST> First Name <INPUT TYPE=TEXT NAME="Array[FirstName]" SIZE=20><BR> Last Name <INPUT TYPE=TEXT NAME="Array[LastName]" SIZE=40><BR> E-mail Address <INPUT TYPE=TEXT NAME="Array[Email]" SIZE=60><BR> Comments <TEXTAREA NAME="Array[Comments]" ROWS=5 COLS=40></TEXTAREA><BR> <INPUT TYPE=SUBMIT NAME="SUBMIT" VALUE="Submit!"> </FORM> </BODY> </HTML>

Het ingevulde formulier wordt in de databank weggeschreven. hoofdstuk9/HandleForm.php

<HTML> <HEAD> <TITLE>Inserting Data into a Database</TITLE> </HEAD> <BODY> <?php /* This page receives and handles the data generated by "form.html". */ // Trim the incoming data. $Array["FirstName"] = trim ($Array["FirstName"]); $Array["LastName"] = trim ($Array["LastName"]); $Array["Email"] = trim ($Array["Email"]); $Array["Comments"] = trim ($Array["Comments"]); // Set the variables for the database access:

59

$Host = "localhost"; $User = "user"; $Password = "password"; $DBName = "NewDatabase"; $TableName = "Feedback"; $Link = mysql_connect ($Host, $User, $Password); $Query = "INSERT into $TableName values ('0', '$Array[FirstName]', '$Array[LastName]', '$Array[Email]', '$Array[Comments]')"; print ("The query is:<BR>$Query<P>\n"); if (mysql_db_query ($DBName, $Query, $Link)) { print ("The query was successfully executed!<BR>\n"); } else { print ("The query could not be executed!<BR>\n"); } mysql_close ($Link); ?> </BODY> </HTML>

De functie trim() zorgt er voor dat alle overbodige spaties uit de array worden verwijderd.

9.4.4 Gegevens ophalen uit een database. Ophalen van gegevens uit een database gebeurt terug door de functie mysql_query(). De eenvoudigste opdracht voor het ophalen van gegevens vanuit een tabel is:

$Query=”SELECT * from $TabelNaam”; Het karakter “*” is een joker en betekent alles. Je zou de opdracht uit het voorbeeld ook kunnen beperken door de query:

SELECT Voornaam, Commentaar from $TabelNaam Een andere manier waarop je een zoekopdracht kan beperken bestaat eruit een beperking op te leggen. SELECT * from $TabelNaam where (Voornaam=”Sandra”) Het voornaamste verschil tussen het ophalen van gegevens uit een databank, in tegenstelling tot het invoegen van gegevens in een databank, is dat je op een andere manier met de SQL-opdracht moet werken. Het meest interessante is de resultaten van een zoekopdracht aan een variabele toe te kennen.

$Result= mysql_db_query($DBNaam,$Query,$Verbinding); Aan deze variabele is nu het resultaat van de zoekopdracht toegekend. Wil je toegang tot meer rijen opgehaalde informatie krijgen, dan moet je de variabele $Resultaat in een lus gebruiken.

While ($Rij=mysql_db_query ($Result)) {statements;}

60

De opdracht zal telkens als de lus doorlopen wordt een volgende rij informatie ophalen (en in $Resultaat opslaan). Er zal telkens als de lus doorlopen wordt een volgende rij informatie uit het (in $Resultaat opgeslagen) resultaat van de zoekopdracht aan een array met de naam $Rij worden toegekend. hoofdstuk9/RetrieveData.php

<HTML> <HEAD> <TITLE>Retrieving Data from a Database</TITLE> </HEAD> <BODY> <?php // Set the variables for the database access: $Host = "localhost"; $User = "user"; $Password = "password"; $DBName = "NewDatabase"; $TableName = "Feedback"; $Link = mysql_connect ($Host, $User, $Password); $Query = "SELECT * from $TableName"; $Result = mysql_db_query ($DBName, $Query, $Link); // Create a table. print ("<TABLE BORDER=1 WIDTH=\"75%\" CELLSPACING=2 CELLPADDING=2 ALIGN=CENTER>\n"); print ("<TR ALIGN=CENTER VALIGN=TOP>\n"); print ("<TD ALIGN=CENTER VALIGN=TOP>Name</TD>\n"); print ("<TD ALIGN=CENTER VALIGN=TOP>Email Address</TD>\n"); print ("<TD ALIGN=CENTER VALIGN=TOP>Comments</TD>\n"); print ("</TR>\n"); // Fetch the results from the database. while ($Row = mysql_fetch_array ($Result)) { print ("<TR ALIGN=CENTER VALIGN=TOP>\n"); print ("<TD ALIGN=CENTER VALIGN=TOP>$Row[FirstName] $Row[LastName]</TD>\n"); print ("<TD ALIGN=CENTER VALIGN=TOP>$Row[EmailAddress]</TD>\n"); print ("<TD ALIGN=CENTER VALIGN=TOP>$Row[Comments]</TD>\n"); print ("</TR>\n"); } mysql_close ($Link); print ("</TABLE>\n"); ?> </BODY> </HTML>

61

9.4.5 Gegevens wijzigen in een database. Wijzigen van gegevens uit een database gebeurt terug door de functie mysql_query(). De eenvoudigste opdracht voor het wijzigen van gegevens vanuit een tabel is:

UPDATE tabel_naam SET kol_naam1=expr1, kol_naam=expr2, [WHERE where_definitie]

Een where_definitie ziet er weer net zo uit als bij het SELECT-statement. hoofdstuk9/ModifyData.php

<HTML> <HEAD> <TITLE>Modify Data in a Database</TITLE> </HEAD> <BODY> <?php // Set the variables for the database access: $Host = "localhost"; $User = "user"; $Password = "password"; $DBName = "NewDatabase"; $TableName = "Feedback"; $Link = mysql_connect ($Host, $User, $Password); $Query = "UPDATE $TableName SET Comments='----' WHERE LastName='Peeters'"; print ("The query is:<BR>$Query<P>\n"); if (mysql_db_query ($DBName, $Query, $Link)) { print ("The query was successfully executed!<BR>\n"); } else { print ("The query could not be executed!<BR>\n"); } mysql_close ($Link); ?> </BODY> </HTML>

Je kunt nagaan of het wijzigen doorgevoerd werden door de file RetrieveData.php te runnen

62

9.4.6 Opvragen van de tabellen in de database. Afhankelijk van de rechten die de gebruiker heeft kan hij/zij toegang hebben tot meerdere tabellen. Deze tabellen zijn op te vragen met de functie myssql-list-tables(). syntax van mysql_list_tables():

resource mysql_list_tables ( string database [, resource link_identifier]);

hoofdstuk9/ViewTables.php

<TITLE>Witch tables</TITLE> </HEAD> <BODY> <?php // Set the variables for the database access: $Host = "localhost"; $User = "user"; $Password = "password"; $DBName = "NewDatabase"; $Link = mysql_connect ($Host, $User, $Password); //Name of the database $tables = mysql_list_tables( $DBName); //Loop to view the tables. $i=0; while ($i < mysql_num_rows($tables)) {$t_name[$i] = mysql_tablename ($tables, $i); echo $t_name[$i]. "<br>"; $i++;} ?>

9.4.7 Opvragen van de velden die in een tabel staan. Elke MySQL tabel zal verschillende velden bevatten, om deze velden op te halen pas je de functie mysql_list_fields() toe. syntax van mysql_list_fields():

resource mysql_list_fields ( string database_name, string table_name [, resource link_identifier]);

63

hoofdstuk9/ViewFields.php

<HTML> <TITLE>Fields in table</TITLE> </HEAD> <BODY> <?php // Set the variables for the database access: $Host = "localhost"; $User = "user"; $Password = "password"; $DBName = "NewDatabase"; $TableName = "Feedback"; $Link = mysql_connect ($Host, $User, $Password);

//Databese name and table name $fields = mysql_listfields( $DBName,$TableName ); //How many fields. $field_num = mysql_num_fields($fields); $i=0; echo $field_num . " veld(en) gevonden<br>\n"; echo "<table width=\"90%\" border=1><tr><td>"; echo "Naam</td><td>VeldType</td><td>Lengte</td><td>Vlag</td></tr>"; while ($i < $field_num){ $type = mysql_field_type ($fields, $i); $name = mysql_field_name ($fields, $i); $len = mysql_field_len ($fields, $i); $flags = mysql_field_flags ($fields, $i); echo "<tr><td>"; echo $name. "</td><td>".$type. "</td><td>".$len. "</td><td>".$flags. "</td></tr>"; $i++; } echo "</table>"; ?>

64

10. Voorbeeld met datum en tijdfuncties.

10.1 Datum en tijd bepalen. De functie mktime() kan een tijdstempel leveren voor een willekeurige datum en tijd.

Functie prototype: int mktime ( int hour, int minute, int second, int month, int day,

int year [, int is_dst]); De code $Tijdstempel=mktime(12,30,0,12,27,1997); zou dus het aantal seconden vanaf het tijdvak tot aan 12:30 op 27 december 1997 aan $Tijdstempel toekennen. Dit getal zou dan aan de functie date() kunnen worden doorgegeven date(“D”,$Tijdstempel);. Wat ’Sat’ zou opleveren.

Functie prototype: string date ( string format [, int timestamp]);

De volgende karakters worden herkend in de formaatstring van de functie date(). • a - "am" or "pm" • A - "AM" or "PM" • B - Swatch Internet time • d - day of the month, 2 digits with leading zeros; i.e. "01" to "31" • D - day of the week, textual, 3 letters; e.g. "Fri" • F - month, textual, long; e.g. "January" • g - hour, 12-hour format without leading zeros; i.e. "1" to "12" • G - hour, 24-hour format without leading zeros; i.e. "0" to "23" • h - hour, 12-hour format; i.e. "01" to "12" • H - hour, 24-hour format; i.e. "00" to "23" • i - minutes; i.e. "00" to "59" • I (capital i) - "1" if Daylight Savings Time, "0" otherwise. • j - day of the month without leading zeros; i.e. "1" to "31" • l (lowercase 'L') - day of the week, textual, long; e.g. "Friday" • L - boolean for whether it is a leap year; i.e. "0" or "1" • m - month; i.e. "01" to "12" • M - month, textual, 3 letters; e.g. "Jan" • n - month without leading zeros; i.e. "1" to "12" • - Difference to Greenwich time in hours; e.g. "+0200" • r - RFC 822 formatted date; e.g. "Thu, 21 Dec 2000 16:01:07 +0200" (added in PHP

4.0.4) • s - seconds; i.e. "00" to "59" • S - English ordinal suffix for the day of the month, 2 characters; i.e. "st", "nd", "rd" or

"th" • t - number of days in the given month; i.e. "28" to "31" • T - Timezone setting of this machine; e.g. "EST" or "MDT" • U - seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) • w - day of the week, numeric, i.e. "0" (Sunday) to "6" (Saturday)

65

• W - ISO-8601 week number of year, weeks starting on Monday (added in PHP 4.1.0) • Y - year, 4 digits; e.g. "1999" • y - year, 2 digits; e.g. "99" • z - day of the year; i.e. "0" to "365" • Z - timezone offset in seconds (i.e. "-43200" to "43200"). The offset for timezones west of

UTC is always negative, and for those east of UTC is always positive.

10.2 Kalender. De volgende code geeft de kalender van de maand maart van het jaar 2003. Hoofdstuk10/my_kalender.php

<HTML> <HEAD> <TITLE> Kalender</TITLE> </HEAD> <BODY> <?php // Kalender van een bepaalde maand. print ("<center>"); //input $Timestamp = mktime (0, 0, 0, 02, 1, 2003); $datum = date ("Y-m-d",$Timestamp); //verander FORMAAT "Y-m-d" niet! //Naam van de maand $maanden= array(januari,februari,maart,april,mei,juni,juli,augustus,

september,oktober,november,december); //dagen van de maand $daymonth = array(31,28,31,30,31,30,31,31,30,31,30,31); //ontrafel dag maand jaar $datumupp = explode ("-",$datum); $years= $datumupp[0]; $months = $datumupp[1]; $days = $datumupp[2]; //Schrikkeljaar if (((($years % 4) == 0) and (($years % 100) <> 0)) or (($years % 400) == 0)){ $daymonth[1] = 29; } //Tabel maken print ("<table cellspacing='1' cellpadding='1' border='1' bgcolor='#FFFFFF'>\n"); print ("<tr>\n"); print ("<td bgcolor='lavender' colspan='7'><center><b>" . $years ."<br>".$maanden[$months-1] . "</b></center></td>\n");

66

print ("</tr>\n"); print ("<tr>\n"); //Dagen van de week print ("<td width='50' bgcolor='lavender'><center><b>Ma</b></center></td>"); print ("<td width='50' bgcolor='lavender'><center><b>Din&nbsp;&nbsp;</b></center></td>"); print ("<td width='50' bgcolor='lavender'><center><b>Woe</b></center></td>"); print ("<td width='50' bgcolor='lavender'><center><b>Don</b></center></td>"); print ("<td width='50' bgcolor='lavender'><center><b>Vrij</b></center></td>"); print ("<td width='50' bgcolor='lavender'><center><b>Za</b></center></td>"); print ("<td width='50' bgcolor='lavender'><center><b>Zon</b></center></td>"); print ("</tr>"); //Eerste dag van de maand $startdag = date ("D", mktime (0,0,0,$months,1,$years)); //geef $starta a waarde die corspondeert met $startdag if ($startdag == "Mon") $starta = 0; if ($startdag == "Tue") $starta = 1; if ($startdag == "Wed") $starta = 2; if ($startdag == "Thu") $starta = 3; if ($startdag == "Fri") $starta = 4; if ($startdag == "Sat") $starta = 5; if ($startdag == "Sun") $starta = 6; //aantal dagen in de maand $daysmonth = ($daymonth[$months-1]); print ("<tr>"); // maak lege cellen voor de eerste dag for ($x = 1; $x <= $starta; $x++) print("<td></td>\n"); //vul de dagnummers in for ($i = $x; $i <= $daysmonth+$starta; $i++) { $dagnummer = $i-$x+1; $dagb = "<b>$dagnummer</b>"; for ($z = 1; $z <= $daysmonth; $z++) {

67

print ("<td ><center>" .$dagb. "</center></td>\n"); break; } //eventueel nieuwe rij if ($i % 7 == 0) { if ($i == $daysmonth) print("</tr>\n"); else print ("<tr>"); } } print ("</tr>"); print ("</table>"); print ("</center>"); ?> </BODY> </HTML>