1 PHP Leerkracht: Dany Pinoy door zaterdag 8 december 202 Versie: September 202 Website:2 3 U gaat akkoord met... Deze cursus wordt u aangeboden door ...
zaterdag 8 december 2012 Versie: September 2012 Website: http://webdesign.pindanet.be
U gaat akkoord met ... Deze cursus wordt u aangeboden door de Vrienden van de SNT, vzw, in samenwerking met de auteur(s). Als u deze cursus volgt, betekent dit dat u akkoord gaat met het volgende:
De auteur(s) van deze cursus heeft (hebben) alles in het werk gesteld om een juiste werkwijze voor te stellen en eventuele bijhorende oefenprogramma's zowel geprint of digitaal in staat van goede werking en virusvrij te houden.
Geen enkel geheel of gedeelte van software aanwezig op de SNT-schoolcomputers mag in enige vorm of op enige wijze worden gekopieerd of opgeslagen naar/op enig welke gegevensdrager zonder uitdrukkelijke voorafgaande toestemming van de onderwijzende SNT-informaticaleerkracht bevoegd voor deze cursus.
Geen enkel geheel of gedeelte van software mag in enige vorm of op enige wijze worden gekopieerd of opgeslagen naar/op enig welke gegevensdrager van de SNT-schoolcomputers zonder uitdrukkelijke voorafgaande toestemming van de onderwijzende SNTinformaticaleerkracht bevoegd voor deze cursus. Het gebruik van de SNT-internet toegang wordt uitsluitend toegelaten met betrekking tot de theorie of oefeningen van voorliggende cursus en enkel zoals door de leerkracht aangegeven en afgebakend. Enkel legale internet downloads/uploads die gebeuren op vraag van de leerkracht in het kader van deze lessen horend bij deze cursus zijn toegelaten. Meervoudig internetmisbruik leidt tot uitsluiting.
De vzw, het Centrum voor Volwassenenonderwijs Stedelijke Nijverheids- en Taalleergangen, de auteur(s), de Inrichtende Macht, in casu Stad Brugge, zijn geenszins aansprakelijk in geval de gebruiker van deze cursus en/of eventueel bijhorend oefenmateriaal schade zou lijden aan zijn computerapparatuur of programmatuur die voortvloeit uit enige fout die in het aangeboden materiaal zou kunnen voorkomen.
Alle rechten voorbehouden. Niets uit deze uitgave mag verveelvoudigd, opgeslagen in een geautomatiseerd gegevensbestand of openbaar worden gemaakt in enige vorm of op enige wijze, hetzij elektronisch, mechanisch, door fotokopieën, opnamen of enige andere manier, zonder voorafgaande schriftelijk toestemming van de uitgever en auteur. De enige uitzondering die hierop bestaat is dat eventuele programma's en door de gebruiker in te typen voorbeelden mogen worden ingevoerd, opgeslagen en uitgevoerd op een computersysteem, zolang deze voor privé-doeleinden worden gebruikt, en niet bestemd zijn voor reproductie of publicatie.
Evaluaties aan de SNT Voor de evaluatie van uw leervorderingen gebruikt SNT een systeem van “Permanente Evaluatie”. Permanente Evaluatie betekent dat u punten “verdient” gedurende het semester, terwijl u een oefening maakt tijdens de les of op het leerplatform. Concreet betekent dit dat “het eindexamen” wordt vervangen door één of meerdere taken tijdens de lesweken. Tijdens een permanent evaluatiemoment controleert de leerkracht of u de leerstof voldoende beheerst en krijgt u een score toegewezen (0 tem 3).
Scorewijzer scorewijzer schaal [3210] 3 – AA: heel sterke prestatie 2 – A: sterke prestatie, streefniveau 1 – B: middelmatig prestatie 0 – C: te zwakke prestatie, leerdoelen niet bereikt Op het einde van het semester wordt de totale gemiddelde score berekend en via een transformatieschaal omgezet naar een percentage.
Transformatietabel Bovenste getal is de gemiddelde behaalde score volgens de scorewijzer. Onderste getal is de gemiddelde score getransformeerd naar een percentage op 100.
U behaalde Meer dan 70% 70% Meer dan 50% en minder dan 70% Minder dan 50%
heel sterke prestatie sterke prestatie, streefniveau middelmatige prestatie te zwakke prestatie, leerdoelen niet bereikt
Indien u nog vragen hebt, aarzel niet om contact op te nemen met uw SNT-leerkracht.
Inhoud PHP ORIENTATIE........................................................................................................1 Wat is PHP? ...........................................................................................................................1 Scripting- en programmeertalen ................................................................................................1 Client- en ServerSide ..............................................................................................................2 Zijn er alternatieven? ..............................................................................................................2 Wat zijn webservers? ...............................................................................................................2 Algemeen ...........................................................................................................................2 IIS ..................................................................................................................................... 3 Apache ...............................................................................................................................3 Meerdere servers naast elkaar ...............................................................................................3 PHP-module ...........................................................................................................................3 RDBMS .................................................................................................................................. 4 Xampp .................................................................................................................................. 4 Waarom PHP? .........................................................................................................................4 Open source pakketten ......................................................................................................5
PHP KENNISMAKING...................................................................................................5 Virtuele webserver...................................................................................................................5 Een eerste scriptje ..................................................................................................................5 Het tikwerk .........................................................................................................................5 De broncode .......................................................................................................................5 Wat is dat allemaal? .............................................................................................................6 De editor .........................................................................................................................6 De extensie ......................................................................................................................6 Plaats van het PHP-script ...................................................................................................6 Het MVC-model ................................................................................................................6 De openingstags ...............................................................................................................6 Het eerste commando .......................................................................................................7 Afsluiten van de regel ........................................................................................................7 Het testen van het script ....................................................................................................7 De broncode van de HTML-pagina .......................................................................................8 Wat is er nu allemaal gebeurd... .............................................................................................8 Een aantal mogelijke problemen ............................................................................................8 Pagina niet toegankelijk .....................................................................................................8 Downloaden van de pagina .................................................................................................8 Blanco pagina wordt weergeven ..........................................................................................8 Parse Error ......................................................................................................................8 Onverwachte uitvoer .........................................................................................................9 Iets uitgebreider .....................................................................................................................9 Nog wat tikwerk ..................................................................................................................9 Hoe loopt dit nu? ................................................................................................................10 Commentaar ..................................................................................................................10 Variabelen .........................................................................................................................10 Termen ................................................................................................................................11 Oefeningen.....................................................................................................................................12
Vraag en antwoord .............................................................................................................12 Juist of fout en verklaar? .....................................................................................................12 Haal de foute variabelen er uit: ............................................................................................12 Maak een script .................................................................................................................12
PHP OPERATOREN.....................................................................................................13 Algemeen .............................................................................................................................13 Voorbeelden .........................................................................................................................13 Gemiddelde berekenen van 2 getallen ...................................................................................13 2 stukken tekst aan elkaar kleven .........................................................................................13 De restbepaling van een rekeningnummer .............................................................................14 Binaire wiskunde ................................................................................................................14 Soorten operatoren ...............................................................................................................14 Toekenningsoperator ..........................................................................................................14
PHP VARIABELEN......................................................................................................20 Algemeen............................................................................................................................. 20 Voorbeelden..........................................................................................................................20 Wijzigingen inhoud..............................................................................................................20 Gegevens die niet veranderen...............................................................................................21 Controle correcte gegevens..................................................................................................21 Naamgeving..........................................................................................................................21 Gebruik van dubbele en enkele aanhalingstekens........................................................................22 Concatenatie......................................................................................................................23 Meer escapen.....................................................................................................................23 Nieuwe regels .......................................................................................................................23 Heredoc................................................................................................................................ 23 Verwarrende variabelen..........................................................................................................24 Verschillende types.................................................................................................................24 Voorbeelden ......................................................................................................................24 Boolean ............................................................................................................................24 Integer..............................................................................................................................25 Float................................................................................................................................. 25 Strings.............................................................................................................................. 25 NULL................................................................................................................................. 25 Arrays............................................................................................................................... 25 Objecten............................................................................................................................26 Resources..........................................................................................................................26 Omzetten van type of casting...................................................................................................26 Zelf omzetten.....................................................................................................................26 Automatische conversie van types.........................................................................................26 Controleren van het type.........................................................................................................27 Gelijkheid............................................................................................................................. 27 Testen van variabelen.............................................................................................................28 Constanten...........................................................................................................................29 Oefeningen.....................................................................................................................................30
Haal de fouten er uit ...........................................................................................................30 Het project van deze cursus: Webshop...................................................................................30 Ronde-tijden......................................................................................................................31 Ronde-tijden in een tabel ....................................................................................................31 Types ............................................................................................................................... 32 Constanten .......................................................................................................................32 Don Quichot.......................................................................................................................33 Punten.............................................................................................................................. 33 Samengestelde woorden......................................................................................................33
PHP FORMULIERVERWERKING..................................................................................34 Algemeen .............................................................................................................................34 Voorbeelden..........................................................................................................................34 Werking van HTTP: GET en POST.............................................................................................35 Volgen van een hyperlink.....................................................................................................36 Formulieren........................................................................................................................36 Formulieren...........................................................................................................................37 Formulieren maken.............................................................................................................37 Input-tags .........................................................................................................................39 Verwerken van de formulieren.................................................................................................39
Verwerken van URL's..............................................................................................................40 Opletten met URL's ............................................................................................................41 Textarea's en nieuwe regels.....................................................................................................41 oefeningen.....................................................................................................................................41
Het project van deze cursus: Webshop...................................................................................41 Enquête.............................................................................................................................47 Zoeken..............................................................................................................................48
PHP EVALUATIES EN LUSSEN....................................................................................50 Algemeen .............................................................................................................................50 Voorbeelden..........................................................................................................................50 Voorbeeld 1........................................................................................................................50 Voorbeeld 2........................................................................................................................51 Evaluaties.............................................................................................................................52 If ... else............................................................................................................................52 Verschillende testen in één statement.................................................................................53 Switch-statement................................................................................................................53 Lussen.................................................................................................................................. 54 While................................................................................................................................ 54 Do...while..........................................................................................................................54 For.................................................................................................................................... 55 HTML code binnen while, for en if structuren...........................................................................55 Oefeningen.....................................................................................................................................56
Het project van deze cursus: Webshop...................................................................................56 Opsplitsen voor MVC ...........................................................................................................57 Getallen afdrukken while......................................................................................................58 Getallen afdrukken for.........................................................................................................58 Getallen afdrukken en verwoorden.........................................................................................58 Dynamische tabel ...............................................................................................................59 Dynamische tabel met alternerende rijen................................................................................59 Dynamische tabel met alternerende rijen en tabelopties...........................................................59
PHP ARRAYS.............................................................................................................60 Algemeen............................................................................................................................. 60 Voorbeeld............................................................................................................................. 60 Vullen van arrays...................................................................................................................62 Array().............................................................................................................................. 62 Vierkante haakjes [ ]...........................................................................................................63 Opvragen van de gegevens......................................................................................................64 Gemengde arrays...................................................................................................................64 Array leegmaken....................................................................................................................65 Array-gerelateerde functies.....................................................................................................65 Afdrukken van array-inhoud.................................................................................................65 Sorteren van arrays.............................................................................................................65 Tellen van het aantal elementen in een array..........................................................................66 Strings omzetten naar arrays en omgekeerd...........................................................................67 Minimum en maximum waarden zoeken.................................................................................67 Gegevens zoeken in een array..............................................................................................67 Arrays doorlopen....................................................................................................................68 Voorgedefinieerde arrays.........................................................................................................68 $_SESSION, $_POST, $_GET en $_REQUEST..........................................................................68 $_SERVER..........................................................................................................................68 $_COOKIE..........................................................................................................................68 $_FILES.............................................................................................................................69 $GLOBALS.........................................................................................................................69 Oefeningen.....................................................................................................................................69
Het project van deze cursus: Webshop...................................................................................69 Opslaan van de gegevens in arrays ....................................................................................69 Doorlopen van de gegevens ..............................................................................................69 Meerdere categorieën ......................................................................................................70 Speelkaarten .....................................................................................................................72 10 willekeurige speelkaarten trekken.....................................................................................72 10 willekeurige speelkaarten grafisch weergeven.....................................................................72 Bezoeker bepaalt aantal te trekken speelkaarten.....................................................................72 HTML en arrays...................................................................................................................72
PHP FUNCTIES..........................................................................................................73 Algemeen............................................................................................................................. 73 Voorbeelden..........................................................................................................................73 Opzoeken functie................................................................................................................73 Gemiddelde berekenen........................................................................................................73 Opbouw van functies..............................................................................................................74 Voorbeeld 1........................................................................................................................74 Voorbeeld 2........................................................................................................................75 Nog functies..........................................................................................................................76 Eigen functies........................................................................................................................76 Hoe zit dit in mekaar?..........................................................................................................76 Variabelen en functies.............................................................................................................77 Lokale en globale variabelen.................................................................................................77 Lokale variabelen.............................................................................................................77 Globale variabelen............................................................................................................77 Variabelen doorgeven via verwijzing (referentie)......................................................................78 Statische variabelen............................................................................................................78 Argument met een standaardwaarde......................................................................................78 Aantal argumenten opvragen................................................................................................79 Recycleren van functies...........................................................................................................79 Specifieke functies voor getallen...............................................................................................81 Integers en floats ...............................................................................................................81 Werken met getallen........................................................................................................82 Specifieke functies voor datums...............................................................................................83 Huidige tijd........................................................................................................................83 Datums weergeven .............................................................................................................84 Zelf tijden samenstellen.......................................................................................................85 Tekst omzetten naar een tijdstip...........................................................................................85 Microseconden ...................................................................................................................86 Controleren van datums ......................................................................................................86 Opletten met datums ..........................................................................................................86 Specifieke functies voor strings................................................................................................87 Lengte van een string..........................................................................................................87 Opmaak van tekst...............................................................................................................87 Sprintf() en printf()..........................................................................................................87 Hoofdletters en kleine letters................................................................................................88 Vergelijken van strings........................................................................................................88 Zoeken van substrings.........................................................................................................89 Uitfilteren van een substring..............................................................................................89 Positie vinden van een substring........................................................................................89 Nog meer uitfilteren............................................................................................................90 Tekens en substrings vervangen............................................................................................90 Vervangen van substrings op basis van positie........................................................................90 Vervangen van substrings op basis van tekst..........................................................................90 Recursieve functie..................................................................................................................91 Oefeningen.....................................................................................................................................91
Het project van deze cursus: Webshop...................................................................................91 Prijzen netjes weergeven .................................................................................................91 Prijs van een cursus opzoeken...........................................................................................91 Datum weergeven ...........................................................................................................92 Ingevulde datum controleren.............................................................................................92 Ingevulde e-mailadres controleren......................................................................................93 Koppen..............................................................................................................................93 Alle kopformaten weergeven.................................................................................................93 Zinnen beginnen met een hoofdletter.....................................................................................94 Horeca ............................................................................................................................. 94 Jubileum............................................................................................................................94 Factuur opmaken................................................................................................................95 Analyse van e-mailadressen .................................................................................................96
PHP EN AJAX.............................................................................................................96 Wat is AJAX?......................................................................................................................97 Hoe werkt AJAX?....................................................................................................................97 AJAX is gebaseerd op Internet Standaarden...............................................................................97
AJAX PHP Voorbeeld...............................................................................................................98 AJAX Database voorbeeld......................................................................................................100 De MySQL Database..........................................................................................................100 De HTML pagina................................................................................................................100 Het PHP script...................................................................................................................101 AJAX en XML........................................................................................................................102 Het XML bestand...............................................................................................................102 De HTML pagina................................................................................................................103 Het PHP script...................................................................................................................104 Opiniepeiling met resultaten...................................................................................................106 De HTML pagina................................................................................................................106 Het PHP script...................................................................................................................107 Het tekstbestand...............................................................................................................108 Oefeningen...................................................................................................................................108
Het project van deze cursus: Webshop.................................................................................108 LiveSearch.......................................................................................................................112
PHP SESSIES...........................................................................................................112 Algemeen ...........................................................................................................................112 Voorbeelden .......................................................................................................................113 Werking .............................................................................................................................114 Werken met sessies .............................................................................................................114 Opstarten van een sessie ...................................................................................................115 Gebruik van de sessie variabelen.........................................................................................115 Sessies verwijderen ..........................................................................................................115 Gedeeltelijk verwijderen van sessievariabelen ....................................................................115 De volledige sessie verwijderen .......................................................................................115 Oefeningen...................................................................................................................................115
Het project van deze cursus: Webshop.................................................................................115 Meerdere cursussen........................................................................................................116 Cursussen aan de winkelwagen toevoegen ........................................................................116 Het winkelmandje weergeven...........................................................................................116 De winkelwagen leegmaken.............................................................................................117 Weergeven van de winkelwagen bij de inschrijving..............................................................118 Weergeven van de winkelwagen bij het verwerken van de inschrijving...................................119 Categorie bijhouden........................................................................................................120 Webshop afwerken.........................................................................................................120 Waarschuwing...............................................................................................................120 Aanmelden.......................................................................................................................120
PHP BEVEILIGING...................................................................................................121 Sql-injectie en xss: de beste verdediging.................................................................................121 Cross site scripting............................................................................................................123 Vertrouw nooit een gebruiker..............................................................................................123 Voorbereiding...................................................................................................................124 Tot slot............................................................................................................................... 124
PHP Orientatie Wat is PHP? PHP staat voor PHP: Hypertext Preprocessor en is een scriptingtaal voor dynamische webpagina's. Een dynamische webpagina is een pagina waarvan de inhoud verandert. Je kan PHP ook gebruiken om pagina's te beveiligen. Een aantal voorbeelden: • • • • • •
weblogs webwinkels gastenboeken fotoboeken menukaarten begroetingen naargelang het tijdstip
PHP zorgt voor HTML-code en dus niet voor browser-output (hetgeen de modale bezoeker ziet). Het is van groot belang om dit te onthouden. We zijn dus genoodzaakt om HTML te kennen. Een aantal van bovenstaande zaken kunnen we ook bereiken door gebruik te maken van JavaScript. Helaas werken JS niet op alle browsers. Meestal omdat een gebruiker deze uitgeschakeld heeft uit veiligheidsoverwegingen. Daarom mogen we voor beveiligde pagina's niet uitgaan van een beveiliging door JS. PHP kan niet uitgeschakeld worden door de gebruiker, omdat deze draait op de server in niet bij de eindgebruiker. Dit betekent ook een grotere flexibiliteit voor de programmeur, omdat deze enkel rekening moet houden met de beperkingen van de server en niet met die van elke potentiële bezoeker. Ook kun je met JS geen (of moeilijk) connectie maken met een database. PHP wordt ook gebruikt voor populaire webtoepassingen zoals: • • • • •
Drupal Joomla PHPBB Dokeos ...
Scripting- en programmeertalen PHP wordt een scripting-taal genoemd. Dit is een verschil met een “echte” programmeertaal. Bij een programmeertaal vertrekken we vanaf een broncode, maar voor we deze kunnen uitvoeren, moet deze eerst gecompileerd worden (bij een Windows-computerprogramma, maken we hier een .exe van, en wordt deze gebundeld met een aantal dll-bestanden). Dit heeft als voordeel dat de uitvoer van het programma heel snel kan lopen. Het nadeel is echter, dat bij elke wijziging van de broncode, het programma opnieuw moet gecompileerd worden. Bij grote programma's kan dit soms oplopen tot ettelijke uren . Bij een scriptingtaal, wordt de broncode niet gecompileerd, maar wordt “geparsed” (omgezet) bij het uitvoeren van het programma. Dit heeft als nadeel dat het uitvoeren trager loopt dan een gecompileerd programma. Maar bij de meeste programma's de gemaakt worden voor het web zal dit van geen invloed zijn, omdat deze programma's meestal heel beperkt zijn (als we dit vergelijken met stand-alone programma's). Ook wordt een webprogramma bijna altijd onderverdeeld in verschillende pagina's, waardoor ook deze tijd gedeeld wordt. Een andere grote invloed op onze webprogramma's is de overdracht van het internet zelf. De uitvoer van het programma is bijna altijd sneller dan de overdracht van het internet, waardoor ook hier weer de vertraging niet opvalt.
1|Pagina
Client- en ServerSide We spreken over een ClientSide-scriptingtaal als deze uitgevoerd wordt door de browser van de bezoeker. De uitvoer van het script gebeurt op de client. Dit heeft als nadeel dat we afhankelijk zijn van de browser van de bezoeker, en aangezien deze op verschillende manieren kan ingesteld zijn, moeten we bij het gebruiken van ClientSide-scriptingtalen hier ook rekening mee houden. Een clientSide-scriptingtaal is bijvoorbeeld JavaScript. ServerSide-scriptingtalen worden op de server uitgevoerd, waarna de uitvoer naar de browser van de bezoeker gestuurd wordt in de vorm van HTML. Dit heeft als voordeel dat we enkel rekening moeten houden met de beperkingen van de server. Bijkomend voordeel is bijvoorbeeld, dat we wachtwoorden nooit zullen oversturen via het internet. Ook is de doorgestuurde informatie soms minder groot bij ServerSide dan bij ClientSide. Bij een database-query, moeten we enkel de nodige gegevens doorsturen, terwijl bij een CS, alle gegevens moeten doorgestuurd worden, waarna de JS zal bepalen welke gegevens er moeten weergegeven worden. Het grote voordeel van CS daarentegen, is dat er wel controle kan uitgevoerd worden op bijvoorbeeld een aantal invoervelden, nog voor deze doorgestuurd worden naar de server. Maar aangezien we hier niet kunnen op rekenen, moeten we altijd via een SS-taal ook nog de gegevens controleren. In recentere web-programmeermethoden zoals Ajax, wordt er een combinatie van beide soorten talen gebruikt, waardoor een gebruiker meer het gevoel krijgt van met een standalone applicatie te werken.
Zijn er alternatieven? Natuurlijk. Het grootste alternatief is ASP (Active Server Pages) van Microsoft. Andere veelgebruikte scriptingtalen zijn JSP (Java Server Pages) en CFM (ColdFusion). Alles hangt uiteindelijk af van welke webserver we gebruiken. Om ASP te kunnen gebruiken moeten we IIS op de server installeren. JSP heeft Sun Java Server nodig en CFM de ColdFusion-server van Adobe. PHP draait daarentegen op elke webserver, maar wordt meestal gebruikt in combinatie met de Apache-webserver. Verder hangen de verschillende alternatieven ook samen met een “grote” programeertaal. Zo leunt ASP dicht aan bij Visual Basic (ook van Microsoft), JSP tegen Java en PHP tegen C. Programmeurs die deze talen kennen zullen dan ook sneller kiezen voor één van de serverscriptingtalen die het dichtst er tegenaan leunt. Een aantal andere overwegingen om voor PHP te kiezen kunnen zijn: • • • • •
meestal goedkopere hosting voor Linux/Apache-servers dan voor Microsoft/IIS-server; heel eenvoudige koppeling naar de gratis database-server MySQL; vlotte ondersteuning op het internet door een grote gemeenschap van gebruikers; scripts werken heel snel; ...
Wat zijn webservers? Algemeen Iedereen is bekend met de webbrowser, in de meeste gevallen Microsofts Internet Explorer, Mozilla Firefox of Chrome. Andere webbrowsers zijn Opera of Lynx (een zuivere tekstbrowser, vaak gebruikt door slechtzienden). Deze webbrowser heeft de bezoeker nodig om een webpagina te kunnen opvragen. Deze webpagina's bevinden zich altijd op een server. Op deze server staat een toepassing geïnstalleerd die, bij aanvraag, een webpagina teruglevert: de webserver. Deze heeft dus als enige bedoeling de juiste webpagina aan de juiste bezoeker terug te geven. De meest populaire webservers zijn hierboven al aangehaald: •
IIS (Internet Information Server / Services) 2|Pagina
• • •
Apache nginx (klein en snel, BSD licentie) google (gebaseerd op linux, GWS)
De 2 meest gebruikte zijn echter IIS en Apache.
IIS Deze server werd gemaakt door Microsoft en draait dus ook enkel op de besturingssystemen van deze fabrikant. Het systeem wordt vooral gekenmerkt door een hoeveelheid aan bugs, en wordt dan ook minder aangeraden als webserver. Het hoge aantal wordt verklaard door de agressieve marketing-politiek van Microsoft. Het grote voordeel van IIS is wel dat het, naast de webserver, ook beschikt over een ingebouwde FTP- en NNTP-server. Alle PHP-programma's uit deze cursus zouden in principe moeten werken op een IIS-server. Maar het kan altijd zijn dat er eentje struikelt over deze webserver, waardoor je een workaround zult moeten bedenken. IIS heeft een marktaandeel van 14,46% of 84 288 985 webservers (op januari 2012) . IIS-servers is de server die het traagst reageert bij een aanvraag van een webpagina.
Apache Apache is een open-source server die draait op alle Unix-achtige systemen, Microsoftbesturingssystemen, Novells Netware en IBM OS/400. Door het Open-source karakter worden fouten sneller gevonden én gedicht. Door gebruik te maken van verschillende modules is het mogelijk om de functionaliteit van Apache serieus uit te breiden. Het "nadeel" van Apache zou kunnen zijn, dat je het niet kunt installeren vanaf de originele Windows-cd's, maar apart moet downloaden van het internet. Een tweede mogelijk nadeel is dat het niet beschikt over een FTP-server, maar je aangewezen bent op een extern programma hiervoor, waar er (Open Source-)alternatieven genoeg voor zijn. Apache bezit een marktaandeel van 64,91% of 378 267 399 webservers (op januari 2012). In deze cursus zullen we gebruik maken van de Apache-webserver.
Meerdere servers naast elkaar In theorie is het mogelijk om de verschillende webservers op 1 toestel te draaien hebben. Maar dit wordt niet aangeraden, omdat volgens de overeenkomsten van het IANA, een webserver standaard poort 80 krijgt toegewezen. Als een server een aanvraag binnenkrijgt, moet hij deze duidelijk weten voor welk van de webservers deze nu bedoelt is. Let er dus goed voor op dat je niet toevallig al IIS staan hebt als je Apache bij installeert. Let op met Skype, ook deze heeft een ingebouwde webserver die op poort 80 draait. De eenvoudigste manier is om Skype uit te schakelen als je Apache gebruikt.
PHP-module Als we gebruik willen maken van Apache, moeten we duidelijk maken dat deze PHP-pagina's moet kunnen verwerken. Aangezien Apache dit niet zelfstandig kan, moeten we gebruik maken van een externe module: de PHP-module of PHP-parser. Ook deze moeten we apart downloaden, installeren en configureren. Op dit ogenblik is de te downloaden stabiele versie 5.3.8. Op heel veel servers zul je echter nog versie 4.x tegenkomen, maar hier zullen we niet langer meer bij stilstaan, omdat deze niet meer ondersteund wordt door PHP zelf. Je kan best aan je hosting-bedrijf vragen om de servers om te schakelen naar versie 5.x. Ondertussen is versie 6 ook op komst. Maar er is nog geen exacte release-datum bekend. 3|Pagina
De PHP-modules zijn verkrijgbaar voor zowel Linux-systemen als Windows-systemen. Als wij ontwikkelen, zal dit echter meestal gebeuren op een Windows-systeem, waarna we het geheel zullen op een Linux-server plaatsen. Helaas hebben de Windows-systemen enkele beperkingen die we in de Linux-versies niet hebben, die alles te maken hebben met de opbouw van het Microsoft-besturingssysteem. Deze tekortkomingen worden ook vermeld in de PHP-documentiatie.
RDBMS Een Relational DataBase Management System is een systeem dat verschillende databases beheert. Een database is op zijn beurt een systeem dat gegevens bijhoudt. Vergelijk het met een uitgebreide spreadsheet, waar je kan op filteren, combineren, gegevens toevoegen, wissen, wijzigen, ... Het meest bekende desktop-systeem voor een RDBMS is Microsoft Access. Helaas is dit weinig schaalbaar (kan geen grote databases aan), is het duur, ... Andere mogelijkheden zijn Microsoft SQL-server , PostgreSQL , Oracle , MySQL , ... Wij maken gebruik van MySQL omdat PHP een heel uitgebreide ondersteuning heeft voor deze database. Het grote voordeel is ook dat MySQL zo goed als gratis te gebruiken is. Let wel op er zijn een paar regels: • • •
MySQL is gratis als het gebruikt wordt voor niet-commerciële toepassingen; MySQL is gratis als het als aparte module geleverd wordt voor commerciële toepassingen; MySQL is NIET gratis als deze gebundeld wordt met de applicatie én het een commerciële applicatie betreft.
Ondertussen is MySQL overgenomen door Oracle. Ondersteuning is dan ook via dit bedrijf te verkrijgen, of op de vele gratis fora. Een alternatief die ook heel vaak gebruikt wordt is PostgreSQL. Deze sql-server is altijd gratis en kan ook heel snelle verwerkingen op extreem grote databases uitvoeren. Deze komt echter niet verder aan bod in deze cursus.
Xampp Omdat we in deze cursus een webserver, een PHP-module en een RDBMS nodig zullen hebben, moeten we deze allen installeren. Dit kan behoorlijk omslachtig en ingewikkeld zijn. Gelukkig hebben de Apache friends deze drie programma's gebundeld als 1 geheel, waardoor er aan configuratie niets meer te doen is. Het geheel wordt gedownload, uitgepakt, en is klaar voor gebruik. Hou er echter rekening mee, dat xampp niet geschikt is als productie-server, wegens te onveilig, maar ideaal is als ontwikkel-omgeving. Naast de bovenstaande programma's biedt xampp ook nog de mogelijkheid om een mailserver, een ftp-server, ... te draaien. Voor meer uitleg over xampp zelf, zie internet. Naast Xampp zijn er op het internet nog andere mogelijkheden te vinden zoals EasyPHP , of je kan alles zelf manueel installeren, wat natuurlijk omslachtiger is, maar wel stabieler zal draaien.
Waarom PHP? PHP is uitgegroeid tot een volwaardige taal die kan concurreren met de anderen. Het zelfs uitgegroeid tot een taal die te gebruiken is voor zowel command-line gebruik , als voor het programmeren van echte desktop-applicaties . Een bijkomend voordeel is dat alle tools die we nodig hebben gratis van het internet te downloaden zijn.
4|Pagina
Open source pakketten Naast het zelf schrijven van webpagina's, maken ook heel wat Open source-pakketten gebruik van PHP. Hieronder vallen een aantal heel bekende namen: • • • • • • • • •
Drupal: CMS Joomla: CMS Wordpress: CMS Dokeos: ELO Chamilo: ELO Magento: CMS PHPBB: Forum MediaWiki: Wiki ...
PHP Kennismaking Virtuele webserver Op de site linux.pindanet.be staat een gratis te gebruiken virtuele webserver. Raadpleeg de informatie op de betreffende pagina om deze webserver te installeren op Windows, Linux of Mac OS X systemen.
Een eerste scriptje Het tikwerk Sla alle scripts op in een oefenmap in Documenten. Maak eventueel submappen aan per hoofdstuk en geef je scripts een duidelijke naam. We vallen meteen met de deur in huis en starten Dreamweaver op. Tik in Dreamweaver de volgende code zonder nummering over:
1
2 3 4 <meta http-equiv="Content-Type" content="text/html; charset=utf8" /> 5 Kennismaking 6 7 8 9 10 Maak in je oefenmap een nieuwe map “kennismaking” aan en sla dit bestand op als hallo.php. Publiceer de site. Open je browser en tik in de adresbalk: http://ip-adres/pc01/kennismaking/hallo.php en aanschouw het resultaat.
De broncode Bekijk ook eens de broncode van dit script:
Wat is dat allemaal? De editor We hebben gebruik gemaakt van Dreamweaver. MS Word of Wordpad slaan niet alleen de zuivere tekst op, maar ook de opmaak van je documenten. Je kan echter ook gratis, opensource editors zoals Notepad ++, Aptana, enz. gebruiken. Een volledig pakket die volledig op php-scripting gericht is, is Zend-studio van Zend, de makers van PHP. Deze editor is niet gratis, maar je kan wel een proefversie downloaden om die 30 dagen te gebruiken. In ruil voor een betaalbare som krijg je een heel handige editor die je helpt via: • • • •
codehighlighting aanvullen van functies aanvullen van variabelen ...
De extensie Elk document waarin er PHP-code voorkomt moet de extentie .php krijgen. Doen we dit niet dan weet de webserver niet dat hij deze documenten moet doorsturen naar de PHP-parser (zie ook verder).
Plaats van het PHP-script We zullen onze PHP-code altijd ergens tussen de HTML-code moeten plaatsen. Naargelang de bedoeling kan dit overal staan: • • •
vóór alle HTML-code ná alle HTML-code tussen de HTML-code
Meestal komt er niet veel PHP-code meer na de HTML. Er staat wel bijna altijd PHP-code voor of tussen de HTML. Door PHP vóór je HTML te plaatsen, kun je bijvoorbeeld de titel van je HTML-pagina aanpassen of bepalen welke css-opmaak er geladen moet worden. Of kun je de afmetingen van een foto opvragen om die afmetingen te gebruiken in JavaScript om de browser-grootte aan te passen.
Het MVC-model In dit model wordt gebruik gemaakt van gescheiden pagina's voor weergave en controllerlogica. We zullen dit zoveel mogelijk in deze cursus toepassen. Hierdoor blijft het eindresultaat veel overzichtelijker.
De openingstags Om aan te geven dat we PHP zullen gebruiken, moeten we altijd de openingstags voor PHP plaatsen, op die manier weet de PHP-parser dat hij alles hiertussen moet verwerken. Vergeten we deze tags te plaatsen, dan wordt alles als zuivere HTML beschouwd, en dus letterlijk weergegeven, let daarvoor dus op. De standaard openingstags (en sluittags) zijn: . Deze mogen aan het begin van de regels staan, aan het begin en het einde, tussenin, ... waar je maar wilt en deze nodig hebt. 6|Pagina
Het overschakelen tussen HTML-mode en PHP-mode wordt ook wel “uittreden” genoemd.
Het eerste commando We spreken bij PHP over functies en language constructs. Beide zorgen ze ervoor dat er “iets” gebeurd. Dit iets is afhankelijk van de functie of de language construct. Functies zijn miniprogramma's die bepaalde bewerkingen uitvoeren. Een functie geeft altijd een bepaalde waarde terug. Later meer hierover. Een language construct wordt voornamelijk gebruikt om gegevens naar de browser te sturen, en geeft geen waarde terug. In het gebruik speelt het niet veel rol of we met een functie dan wel een language construct werken. De print hoort echter in de categorie language constructs en stuurt hetgeen na de print staat door als HTML. De meeste functies nemen de argumenten aan tussen haakjes ( ). Doordat we met tekst (strings) werken, moet deze tussen enkele ( ' ) of dubbele ( " ) aanhalingstekens staan. We kunnen dus het volgende schrijven: • • • •
Er zijn een aantal verschillen, die later aan bod komen. Het wordt echter aangeraden om language-constructs niet tussen ronde haakjes te plaatsen.
Afsluiten van de regel In onze gewone taal sluiten we elke zin af met een punt. Als we PHP-scripts schrijven, doen we dit door gebruik te maken van een puntkomma (;). In sommige gevallen moet (mag) je deze niet gebruiken, maar later daar meer over. De puntkomma moet er echter staan omdat we al onze PHP-code ook achter elkaar mogen schrijven, maar onze parser moet natuurlijk telkens weten wat er een nieuwe opdracht is. Vergelijk bijvoorbeeld eens onderstaande voorbeelden:
"zin "zin "zin "zin
1
/>"; />"; />"; />";
"; print "zin 2 "; print "zin 3 "; print "zin 4 "; ?> Beide voorbeelden zullen dezelfde uitvoer hebben, maar het eerste voorbeeld is wel duidelijker leesbaar.
Het testen van het script Als je je script wilt testen, lukt dit niet door het te openen via de Verkenner, maar ben je verplicht om dit te doen door het script te publiceren en te openen via een internetbrowser naar keuze. In de adresbalk begin je altijd met http://ip-adres/pc01/. Dit is jouw eigen virtuele webserver. Alles wat er na komt zijn de submappen. Let er op: in je Verkenner wordt er gebruik gemaakt van de “\” (backslash), in je browser ven de “/” (gewone slash). 7|Pagina
De broncode van de HTML-pagina Zoals je ziet, staat er in de broncode van onze HTML-pagina geen letter PHP-code meer. Deze is allemaal omgezet naar HTML-code. Als je later op zoek gaat naar fouten, moet je ook niet kijken in je browser-uitvoer, maar in de broncode van je HTML-document.
Wat is er nu allemaal gebeurd... bij het opvragen van de pagina script01.php ? Toen je de pagina opgevraagd hebt via je webbrowser, heeft deze de aanvraag doorgestuurd naar de webserver (die nu toevallig op jouw pc staat). De webserver ziet dat de gevraagde pagina de extensie .php heeft. In het configuratiebestand van de webserver staat beschreven, dat .php-bestanden moeten doorgestuurd worden naar de PHP-parser. Deze parser zal op zijn beurt de pagina overlopen, en overal kijken waar er PHP-openingstags staan. Alles wat tussen deze tags staat wordt door de parser verwerkt, en de parser maakt er op zijn beurt HTML-code van. Als de parser op het einde van het document komt, stuurt hij de “nieuwe” HTML-pagina door naar de webserver. De webserver verstuurt deze pagina naar de browser, en de bezoeker ziet nu een webpagina. De bezoeker zal dus, zelfs als hij naar de bron kijkt, enkel zuivere HTML zien. Hierdoor speelt het dus ook geen enkele rol welke browser de bezoeker gebruikt aangezien er zuivere html doorgestuurd wordt. Dit in tegenstelling tot javascript of andere client-sideprogrammeertalen.
Een aantal mogelijke problemen Het kan nu zijn, dat dit bovenstaande script niet wil uitvoeren, dat je een melding krijgt dat de pagina niet toegankelijk is, of dat er gevraagd wordt om de pagina te downloaden. Misschien krijg je een compleet andere pagina te zien. We zullen de mogelijkheden eens overlopen.
Pagina niet toegankelijk Dit is omdat je webserver niet opgestart is. Controleer om deze te starten, en herlees desnoods de handleiding om te zien of je niets verkeerd gedaan hebt. Controleer ook of er misschien geen 2de webserver actief is.
Downloaden van de pagina De webserver weet niet wat hij met de extensie moet aanvangen, en vraagt daarom om deze te downloaden op de eigen computer (waar het in ons geval eigenlijk al staat). Controleer of je de PHP-parser wel geïnstalleerd hebt.
Blanco pagina wordt weergeven Er zit waarschijnlijk een fout in je code, herzie je code op typfouten (syntaxisfouten). Dit heeft meestal te maken met een instelling die ervoor zorgt dat je fouten niet ziet. Dit is uit veiligheidsoverwegingen. De instelling waarover het gaat is error_reporting. Zie het configuratiebestand voor meer uitleg. Als deze niet ingesteld is, krijg je volgende:
Parse Error Er zit een fout in je code op de regel die aangegeven wordt. Hou er wel rekening mee dat de fout ook kan zitten op een plaats vóór de aangegeven plaats, soms 10-tallen regels hoger. De parser duidt ook duidelijk aan welke fout het is. Misschien heb je een puntkomma vergeten? Of de sluittags? Controleer alle mogelijkheden, je zal zeker voorbeelden genoeg zien. Het gebruik van een goede editor zal je kans op parse errors al verkleinen. Fouten kun je op een webserver zonder ingeschakelde PHP-foutmeldingen met behulp van het volgende script toch opsporen: 8|Pagina
1 2 3 4 5
Dit script schakelt de foutmeldingen in voor het script fout.php. Een voorbeeld:
1
2 3 4 <meta http-equiv="Content-Type" content="text/html; charset=utf8" /> 5 Fouten opsporen 6 7 8 9 10 Onverwachte uitvoer Er worden geen foutmeldingen weergegeven, en je krijgt een HTML-pagina te zien, echter niet hetgeen je verwacht. Waarschijnlijk heb je een verkeerde operator gebruikt, of 2 namen van variabelen door elkaar gehaald, of een structuur op de verkeerde plaats beëindigt. Dit zijn logische fouten en je parser kan je hier niet op wijzen, aangezien je structureel niets verkeerd doet.
Iets uitgebreider Nog wat tikwerk We zullen het eerste script wat uitbreiden:
Tik dit zonder nummering over in een nieuw document, sla op onder de naam titel.php, publiceer en vraag de pagina opnieuw op in je webbrowser (http://192.168.1.2/pc01/kennismaking/titel.php) en aanschouw opnieuw het resultaat. 9|Pagina
9 10 Hoe loopt dit nu? Commentaar In je script wordt er bij het uitvoeren geen rekening gehouden met commentaar. Dit heeft dus geen invloed op de snelheid van het parsen, of op de grootte van het uiteindelijke HTMLbestand. Ook wordt de commentaar niet doorgestuurd naar de browser van de bezoeker en dus niet getoond in de broncode. In dit stukje zien we dat er gebruik is gemaakt van 3 soorten commentaar: 1. lange commentaar of c-style: Deze begint met een combinatie slash-asterisk (/*) en eindigt met de combinatie asterisk-slash (*/). Deze soort commentaar kan over verschillende lijnen lopen, en wordt gebruikt voor het gebruik van langere commentaar. 2. korte commentaar of c++-style: Deze begint met een dubbele slash (//) en eindigt op het einde van de regel. Deze wordt gebruikt om kortere commentaar in te voegen. Je kan echter gerust de dubbele slash gebruiken om verschillende regels onder elkaar van commentaar te voorzien. Vergeet alleen niet om elke regel met een nieuwe // te beginnen. Hou er rekening mee dat je de afsluit-puntkomma van je code niet nà de commentaar zet. 3. Perl- of shell style: Deze laatste methode wordt niet echt courant gebruikt maar heeft het zelfde effect als de korte commentaar (//) maar de dubbele slash wordt vervangen door een hash-teken(#).
Variabelen In dit script hebben we voor het eerste gebruik gemaakt van variabelen. Variabelen zijn een plaatsje in het geheugen van de server waar we een naam aan toe kennen. In dit stukje geheugen kunnen we tijdelijk gegevens stockeren. Deze gegevens kunnen veranderlijk zijn. Vandaar de naam. In dit geval hebben we aan de variabele $titel de string-waarde "ons tweede script" toegekend. Bij het uitvoeren van de printfunctie wordt de variabele $titel dan vervangen door de eigenlijke inhoud er van. Variabelen beginnen in PHP altijd met een dollarteken ($), het eerstvolgende teken van de variabele moet een letter of een underscore (_) zijn, geen cijfer. Voor de volgende tekens kun je cijfers, letters en underscores gebruiken. Verder moet je er rekening mee houden dat variabelen hoofdlettergevoelig zijn, zo is $titel niet gelijk aan $Titel of aan $TITEL, maar zijn dit drie verschillende variabelen. Een aantal geldige variabelen: • • • • • • •
$naam $vNaam $WeerTeGevenTekst $cijfer1 $Cijfer2 $_andere $kinJL123 10 | P a g i n a
Sommige variabelen zijn duidelijker dan andere. Het is aan te raden om altijd voor duidelijke namen te kiezen. De mogelijke gebruikte karakters zijn dus: cijfers (behalve als eerste karakter) letters elk ASCII-karakter gaande van 127 tot 255 (zie hiervoor ASCII-tabellen)
• • •
Aan variabelen kunnen verschillende types toegekend worden. In dit voorbeeld is gebruik gemaakt van strings (opeenvolging van 1 of meerdere willekeurige karakters), maar we kunnen ook integers (gehele getallen), floats (kommagetallen), booleaanse waarden (true of false) of arrays (verzameling) gebruiken (http://be.php.net/manual/en/language.types.php). In PHP is een variabele niet gebonden aan 1 type zoals in de meeste andere programmeertalen, maar kan deze variabele de ene keer een string en de volgende keer een integer bevatten:
"; print $variabele; //geeft weer: Dit is een string of tekenreeks $variabele = 4; print $variabele; //geeft weer: 4 ?>
2 3 4 5 6 7 8 9 10 11 12 13 14 15
Als we floats willen gebruiken in PHP, moet je er rekening mee houden, dat je als scheiding tussen de eenheden en de decimalen gebruik moet maken van een punt en niet van een komma, zoals wij gewend zijn. Elke opdracht uit ons script wordt ook een expressie genoemd. Elke expressie wordt afgesloten met een punt-komma. Deze expressies kunnen zowel het uitvoeren van functies, toekenningen, bewerkingen als een combinatie van beide zijn.
Termen Hier volgt een kort overzicht van de verschillende termen die we in deze cursus (en bij PHP en andere programmeertalen in het algemeen) zullen gebruiken. Hier worden ze heel kort behandeld, later komen ze uitgebreider aan bod: •
•
• • • •
Types: een gegeven is altijd van een bepaald type. De voornaamste types zijn string, integer, float, boolean of array. Het is ook mogelijk om een bepaald gegeven te dwingen een ander type aan te nemen. Variabele: een stukje geheugen waar een naam aan toegekend wordt, en waar een gegeven kan in bewaard worden. Een variabele begint altijd met een dollarteken ($) gevolgd door de naam van de variabele. Constante: een stukje geheugen die, eenmaal geïnitialiseerd, NIET meer van waarde kan veranderen. Een constante kan van hetzelfde type zijn als een variabele. Expressie: alles wat je schrijft in PHP is een expressie. Daarmee wordt er bedoelt dat er iets uitgevoerd wordt. Commentaar is dus GEEN expressie. Voorbeeld: $b = 5; Operatoren: een operator zorgt er voor dat je bewerkingen kunt uitvoeren met gegevens, je kan ze optellen, samenvoegen, toekennen, vermenigvuldigen, ... Controlestructuren: om een andere uitvoer van je script te krijgen, kun je gebruik maken van controle structuren. Deze zorgen ervoor dat er iets uitgevoerd wordt, als er 11 | P a g i n a
•
aan bepaalde voorwaarden voldaan wordt, of net niet. Een andere soort, zijn structuren die ervoor zorgen dat een aantal expressies een aantal keer uitgevoerd kan worden. De bekendste structuren zijn: if/else, while, do...while, for, ... Functie: een miniprogramma dat één of meerdere bewerkingen op gegevens kan uitvoeren. Geeft altijd een waarde terug aan het hoofdscript, waar we niet noodzakelijk iets mee moeten doen. Er zijn duizenden voorgedefinieerde functies, maar je kunt ze ook zelf maken.
Deze termen zullen allen uitgebreider aan bod komen doorheen de cursus.
Oefeningen Vraag en antwoord 1. 2. 3. 4.
Welke extentie moet een script hebben om juist door de PHP-parser herkend te worden: Wat heb je nodig om je eigen scripts te testen: Waarom is MS Word niet geschikt als editor om scripts te maken? Op welke plaatsen in je PHP-script kun je PHP-code plaatsen?
Juist of fout en verklaar? 1. Kladblok is een betere PHP-editor dan Dreamweaver: 2. Ik kan mijn PHP-scripts (locatie in het bestandssysteem) zetten waar ik wil: 3. De PHP-code wordt rechtstreeks door de webserver gelezen en omgezet:
Haal de foute variabelen er uit: En vertel er bij wat er fout is. • • • • • • • • • • • •
Maak een script Maak een script waarin je volgende gegevens opslaat in een variabele en deze daarna op de pagina worden weergegeven: •
voornaam
•
naam
•
straat
•
huisnummer
•
postcode
•
gemeente
•
email
•
cursus
12 | P a g i n a
PHP Operatoren Algemeen Operatoren worden gebruikt om bepaalde zaken uit te voeren. De meest gekende – en gebruikte – zullen deze zijn om getallen op te tellen, om strings aan elkaar te plakken, ... Andere operatoren worden gebruikt om gegevens met elkaar te vergelijken, foutmeldingen uit te schakelen, enz. Er zijn operatoren om te werken met verschillende types van gegevens. De ene operator heeft ook voorang op de andere.
Voorbeelden Gemiddelde berekenen van 2 getallen Om het gemiddelde van 2 getallen te berekenen maken we gebruik van eenvoudige basiswiskunde: •
Tel de 2 getallen op en deel het resultaat door 2,
Wat is er gebeurd? We tellen de getallen 2 en 10 bij elkaar op (+), en kennen dit toe (=) aan $som. $som delen we (/) door 2 en kennen het resultaat toe (=) aan $gemiddelde. Uiteindelijk drukken we dit gemiddelde af. In dit voorbeeld maken we gebruik van wiskundige operatoren en toekenningsoperatoren. In de praktijk zullen de getallen 2 en 10 ook aan een variabele toegekend worden.
2 stukken tekst aan elkaar kleven Stel dat we 2 stukjes tekst hebben. Deze tekst willen we toekennen aan 1 variabele. Dit kunnen we als volgt oplossen:
14 15 16 17 18 19
13 | P a g i n a
We maken naast de toekenningsoperator (=) gebruik van een string-operator: de concatenatie, met het punt (.)
De restbepaling van een rekeningnummer Als we een rekeningnummer hebben, zijn de laatste 2 cijfers altijd een controlenummer. Dit controlenummer is altijd de rest van de deling van de eerste 10 cijfers van het rekeningnummer door 97. Ter verduidelijking: • • • • • •
Rekeningnummer: 159 6357412 88 Laatste 2 cijfers: 88 Deling van eerste 10 cijfers door 97 Enkel het gehele getal: 16457292 De vermenigvuldiging van het gehele getal met 97 Het verschil tussen dit getal en de eerste 10 cijfers van het rekeningnummer
Een eenvoudiger manier om dit te berekenen is de restdeling of modulus:
20 21 22 23 24
Met de modulus-operator bekomen we het restgedeelte van de deling van 2 getallen.
Binaire wiskunde Je moet de logische AND-vergelijking maken tussen 2 binaire getallen. Dit kunnen we oplossen met:
25 26 27 28 29 30
De binaire and-operator (&) en or-operator (|) maken standaard deel uit van de mogelijke operatoren.
Soorten operatoren Toekenningsoperator Dit is de meest voorkomende operator die gebruikt worden om een bepaalde waarde toe te kennen aan een variabele:
32 33 34 35 36 37 38 39 40 41
14 | P a g i n a
De toekenningsoperator kan ook gebruikt worden in combinatie met andere wiskundige of string-operatoren. Zie verder.
Stringoperatoren Er bestaat hier maar 1 van, nml de "." die 2 strings samenvoegt:
42 43 44 45 46 47
Rekenkundige operatoren Standaard operatoren Dit zijn de meest eenvoudige operatoren. Ze worden gebruikt zoals in de gewone basiswiskunde: Naam
Resultaat
-$a
Negatie
Tegengestelde van $a
$a + $b
Optelling
Som van $a en $b
$a - $b
Verschil
Verschil tussen $a en $b
$a * $b
Vermenigvuldiging
Vermenigvuldiging van $a en $b
$a / $b
Deling
Deling van $a en $b
$a % $b Modulus Voorbeelden:
Rest van deling van $a en $b
48 49 50 51 52 53 54
Hou er rekening mee dat het delen van 2 getallen, zelfs van 2 integers, als resultaat een float geeft. Naast de standaard rekenkundige operatoren zijn er ook nog een aantal wiskundige functies die gebuikt kunnen worden.
Optel- en aftrekoperatoren Dit is een uitbreiding van de gewone rekenkundige operatoren. Ze zijn er om het optellen en aftrekken eenvoudiger te maken: Naam
Resultaat
++$a
Pre-increment
Tel 1 op bij $a, en geeft $a daarna weer
$a++
Post-increment
Geeft $a weer, en telt er daarna 1 bij op
--$a
Pre-decrement
Trekt 1 af van $a, en geeft dan $a weer
$a-Post-decrement Een aantal voorbeelden:
Geeft $a weer, en trekt er daarna 1 van af
56
57 $a = 5; 58 print "Eerst weergeven: " . $a++ . ", daarna 1 bijtellen: "; //geeft 5 weer, er wordt 1 bij $a opgeteld 59 print $a; //geeft 6 weer 60 print " en 1 bijtellen en weergeven: " . ++$a; //telt 1 op bij $a, geeft daarna 7 weer 61 ?>
Binaire wiskunde Deze heb je minder nodig, maar soms is het nodig om met binaire getallen te werken. Let wel op dat deze niet gelijk zijn aan logische operatoren: Naam
Resultaat
$a & $b
And
Bits die in zowel $a als in $b op “1” staan worden “1”
$a | $b
Or
Bits die in $a en / of in $b op “1” staan worden “1”
$a ^ $b
Xor
Bits die in $a óf in $b op “1” staan worden “1”, niet als ze beide op “1” staan
~ $a
Not
Bits worden geïnverteerd
$a << $b
Schuift de bits van $a het aantal stappen dat door $b Shift left wordt aangegeven, op naar links – elke stap betekend vermenigvuldigen met 2
Schuift de bits van $a het aantal stappen dat door $b wordt aangegeven, op naar rechts – elke stap betekend delen door 2 Hierbij kan volgend eenvoudig tabelletje helpen: $a >> $b
Gecombineerde operatoren We kunnen ook gecombineerde operatoren gebruiken, dit zijn operatoren die een toekenning uitvoeren, en tegelijkertijd een wiskundige of stringoperator toepassen:
70 71 72 73 74 75 76 77 78
Bovenstaande zal er voor zorgen dat: • • •
de waarde 3 toegekend wordt aan de variabele $a dat de variabele $a zal verhoogd worden met 4 (+=) de strings "Bewerking " en "tijdens toekenning: " zullen toegekend worden aan respectievelijk $tekst en $tweedeStuk. Hierna wordt de variabele $tweedeStuk bij de variabele $tekst gevoegd, zodat $tekst de string "Bewerking tijdens toekenning: " bevat.
Vergelijkingsoperatoren Deze operatoren, niet te verwarren met toewijzingsoperatoren, hebben we voornamelijk nodig als we verschillende gegevens met elkaar willen vergelijken. Denk hierbij aan het evalueren van gegevens binnen een if-structuur: Operator
Naam
Resultaat
$a == $b
Equal
Waar als $a gelijk is aan $b
$a === $b
Identical
Waar als $a gelijk is aan $b én van het zelfde type
$a != $b
Not equal
Waar als $a niet gelijk is aan $b
$a <> $b
Not equal
Waar als $a niet gelijk is aan $b
$a !== $b
Not identical
Waar als $a niet gelijk is aan $b of ze zijn van een verschillend type
$a < $b
Less than
Waar als $a kleiner is dan $b
$a > $b
Greater than
Waar als $a groter is dan $b
$a <= $b
Less than or equal to
Waar als $a kleiner of gelijk is aan $b
$a >= $b
Greater than or Waar als $a groter of gelijk is aan $b equal to
Voorbeeldjes:
79 80 81 82 83
Logische operatoren Deze logische operatoren gebruiken we voornamelijk bij het evalueren van 2 statements bij bijvoorbeeld een if-structuur. 17 | P a g i n a
Operator
Naam
Resultaat
$a and $b
And
Waar als $a en $b waar zijn
$a or $b
Or
Waar als $a of $b waar zijn
$a xor $b
Xor
Waar als $a of $b waar zijn, maar niet beide
Not
Waar als $a niet waar is
And
Waar als $a en $b waar zijn
! $a $a && $b
$a || $b Or Waar als $a of $b waar zijn Er worden voor "and" en "or" verschillende operatoren gebruikt, dit heeft te maken met de voorrang ervan, zie verder. Voorbeeld:
"; } $b = FALSE; if ($a or $b){ print "3 or FALSE is waar "; } if ($a and $b){ print "3 and FALSE is waar "; } $a = "3"; $b = "0"; if (($a >= 0) AND ($b != 0)){ print "Het quotiënt is " . ($a / $b); } ?>
Foutcontrole-operatoren PHP kent maar 1 dergelijke operator: @ Als deze operator voorafgaat aan een expressie, worden eventuele foutmeldingen onderdrukt, en gaat het programma verder met uitvoeren. Voorbeeldje: /* BEDOELDE FOUT */ $my_file = @file ('niet_bestaand_bestand') or die ("er is een fout opgetreden”); Indien voorgaande code niet zou voorafgegaan worden door de @, zou je telkens een standaardfoutmelding krijgen. De gewone foutmelding wordt altijd opgeslagen in de variabele $php_errormsg.
Array-operatoren Operator
Naam
Resultaat
$a + $b
Union
Vereniging van $a en $b.
$a == $b
Equality
Waar als $a en $b dezelfde elementen bevatten
$a === $b Identity
Waar als $a en $b dezelfde elementen bevatten, in dezelfde volgorde
$a != $b
Inequality
Waar als $a niet gelijk is aan $b
$a <> $b
Inequality
Waar als $a niet gelijk is aan $b
$a !== $b Non-identity Waar als $a niet identiek is aan $b 18 | P a g i n a
Met de +-operator worden de elementen van de rechtse array toegevoegd aan die van de linkse, waarbij dubbele indexes NIET overschreven worden.
Voorrang van operatoren Niet alle operatoren hebben dezelfde voorrang zo is bijvoorbeeld 2 + 3 * 4 = 14, en niet gelijk aan 20. We kunnen de voorrang wijzigen door gebruik te maken van haakjes: (2 + 3) * 4 = 20. Volgende tabel geeft de voorrang weer van de operatoren, waarbij de bovenste voorrang hebben op degene er onder: Associativiteit
links , Associativiteit betekend de manier waarop de gegevens geëvalueerd worden. Linkse associativiteit wil zeggen dat de gegevens van links naar rechts bekeken worden.
Oefeningen Script Bepaal de waarde van $x, uit het hoofd. Neem daarna de scripts over en kijk wat de uitkomst is:
PHP Variabelen Algemeen Zoals eerder aangehaald, worden variabelen beschouwd als een naam die gebruikt wordt om tijdelijk gegevens in op te slaan. In feite wordt er in het werkgeheugen van de server een stukje geheugen gereserveerd waar je een waarde in kan plaatsen. Dit werkgeheugen wordt dan aangeduid door de variabele. In tegenstelling tot de meeste andere programmeertalen, moet je bij PHP de variabelen niet op voorhand declareren vóór je ze kunt gebruiken én kunnen ze binnen 1 script verschillende types bevatten. Naast variabelen kun je ook gebruik maken van constanten, die een vaste waarde blijven behouden in je script.
Voorbeelden Wijzigingen inhoud Als we werken met gegevens, dan zullen deze altijd verschillend zijn van situatie tot situatie. Willen we bijvoorbeeld berekenen wat het netto-jaarloon is van de bezoeker, dan vragen we hem naar zijn maand-loon, en vermenigvuldigen we dit met 12. Aangezien het loon van elke bezoeker verschillend zal zijn zullen ook de gegevens waarmee we werken altijd verschillend zijn.
Wat er wel vast ligt, dat is het aantal maanden. Dit veranderd niet in ons script, maar stel dat het er toch ooit van komt, dan kan het handig zijn om dit snel aan te passen. Het aantal maanden kunnen we dan vast definiëren in een constante.
Gegevens die niet veranderen Willen we bijvoorbeeld een euro-calculator maken, om van Euro om te rekenen naar de oude geliefde Belgische Frank, dan blijft de wisselkoers van de Euro tegenover de BF vast. Tenzij dit op een bepaalde dag zou veranderen:
14 15 16 17 18 19
In Belgische frank
Controle correcte gegevens Vooraleer we dit loon willen weergeven, zullen we eerst een test doen. Het resultaat van de test bepaalt hoe we het loon weergeven:
20 21 22 23 24 25 26 27
Afgerond jaarloon in Belgische frank
Naamgeving Namen van variabelen beginnen ALTIJD met een dollarteken ($), gevolgd door 1 van volgende karakters: • • •
letters; karakters met een ASCII-waarde tussen de 128 en de 255 (die meestal speciale karakters zijn zoals é, ô, ñ, µ, ...), deze reeks wordt echter (bijna) nooit gebruikt; underscores.
Als derde karakter en volgende mag je 1 van volgende gebruiken: 21 | P a g i n a
• • • •
letters; karakters met een ASCII-waarde tussen de 127 en de 255; underscores; cijfers.
Hou er dus rekening mee dat cijfers nooit net na het dollarteken mogen komen. Ook punten, koppeltekens en spaties zijn niet toegestaan, op geen enkele plaats. Maak vooral gebruik van duidelijke namen, met een betekenis. Een variabele als $_inmö98 mag dan wel ge(we)ldig zijn, duidelijk is ze zeker niet. Maak daarom bijvoorbeeld gebruik van onderstaande voorbeelden: $prijs $PrijsMetBTW $prijsMetBtw $prijs_zonder_btw Voor namen die bestaan uit meerdere woorden, wordt de voorkeur gegeven aan het derde voorbeeld, waarbij de eerste letter een kleine letter is en vervolgens de eerste letter van elk woord een hoofdletter. Hou er ook rekening mee dat hoofdletters en kleine letters wel degelijk een verschil maken in PHP. Zo is er een verschil tussen $VOORNAAM, $voornaam en $VoorNaam!
Gebruik van dubbele en enkele aanhalingstekens Bij het gebruik van de print- en echo-functies, moeten we rekening houden met het verschill tussen dubbele en enkele aanhalingstekens:
28 29 30 31 32
Bij het gebruik van echo heb je hetzelfde. Bij het gebruik van dubbele aanhalingstekens, wordt de inhoud van de variabele weergegeven, bij het gebruik van enkele aanhalingstekens, wordt de naam van de variabele weergegeven. De inhoud tussen de enkele aanhalingstekens wordt dus niet geparsed. Voor de rest is het gelijk welke soort we gebruiken, als je er maar voor zorgt dat je je toekenning afsluit met hetzelfde soort, als degene waarmee je begonnen bent. Soms lijkt het eenvoudiger om over te springen tussen de 2. Als je bijvoorbeeld dubbele aanhalingstekens wilt gebruiken in je string, dan kun je de string beginnen en afsluiten met enkele aanhalingstekens: Dit kan bijvoorbeeld handig zijn om parameters op te geven voor HTML-code:
34 En toen zei hij: "De kat bijt, maar de hond blaft."'; ?> Wat als je nu binnen in je string beide wilt gebruiken? Dan zullen we gebruik moeten maken van escapetekens:
35 En toen zei hij: \"De kat bijt, maar de hond blaft.\""; ?> Zo kunnen we onbeperkt gebruik maken van enkele en dubbele aanhalingstekens. 22 | P a g i n a
Deze manier wordt ook meer gebruikt dan het mixen van enkele en dubbele tekens. Voornamelijk omdat je code veel consistenter blijft.
Concatenatie In het volgende hoofdstuk zullen we ook de concatenatie-operator zien. Dit is gewoon het aan elkaar kleven van 2 verschillende strings. We kunnen dit ook gebruiken om een letterlijke string tussen enkele aanhalingstekens en een variabele aan elkaar te kleven. Dit doen we door middel van de punt-operator (.). Een voorbeeldje:
36 Meer escapen Naast het escapeteken voor de dubbele aanhalingsteken bestaan er nog een aantal: Te bereiken teken
Gebruikte escapecode
"
\"
'
\'
\
\\
Tabulator
\t
Nieuwe regel
\n
Carriage return \r Hou er wel rekening mee dat deze karakters weergegeven worden in de HTML-code maar dat bij het verwerken van de HTML-code door de browser, er met deze geen rekening gehouden wordt. Deze worden wel vaak gebruikt om de broncode duidelijker te houden:
37
"; 39 print "Deze regel staat in de broncode .......................... \n"; 40 print "En deze regel staat in de broncode ......................."; 41 ?>
Nieuwe regels In PHP kun je ook nieuwe regels opnemen in je variabele.
42 43 44 45 46
Heredoc Om langere stukken tekst toe te kennen aan een variabele, kunnen we ook de heredoc-syntax gebruiken. Om een heredoc te gebruiken, beginnen we de string met <<<, gevolgd door een unieke code, die zelf gekozen wordt. De heredoc wordt afgesloten door exact dezelfde unieke code te herhalen, maar moet beginnen op de eerste kolom van de regel. De afsluitcode mag enkel bestaan uit letters, cijfers en underscores. De heredoc-syntax gedraagt zich net als de dubbele aanhalingstekens, maar als je dubbele aanhalingstekens gebruikt, binnen de toekenning, moeten deze NIET ge-escaped worden:
47 48 49 50
$bon 23 | P a g i n a
51 EOD; 52 print $tekst; 53 ?>
Verwarrende variabelen In sommige gevallen zul je een waarde, die in een variabele bewaard wordt, direct aan een volgend stuk tekst willen plakken. Dit komt omdat de parser de variabele $breedteInMeter00 niet kent, en er dus gewoon een lege string plaatst. Om dit probleem op te lossen kunnen we de variabele tussen accolades plaatsen:
54 De parser weet zo precies waar de variabele begint en eindigt. Bij onduidelijke variabelen moet je deze altijd tussen accolades plaatsen. Als je de accolades wilt weergeven zul je deze moeten escapen (enkel de eerste vervangen door \{). Bij het gebruik van accolades zonder variabelen, moet je deze niet escapen. Als je een afkeer hebt van accolades kun je het ook oplossen als volgt: print "Breedte in centimeter: " . $breedteInMeter . "00"; Toch verdient het gebruik van accolades de voorkeur, omdat dit, weeral, leesbaarder blijft.
Verschillende types Een variabele kan één van volgende types zijn: • • • • • • • •
Boolean Integer Float of double String Array Object Resource NULL
Voorbeelden Code
Waarde van de variabele
$var_int = 6;
Het gehele getal 6
$var_float = 10.5;
Het kommagetal 10,5
$var_float_2 = 1.5e3;
Het getal 1500
$var_string = "dit is een string"; Een tekst met de opgegeven waarde $var_array = array (1,2,3,4);
Een verzameling met de elementen 1,2,3,4
$var_null = null;
Een lege variabele
$var_bool = true;
Een geldige waarde 24 | P a g i n a
Boolean Een boolean kan slechts 2 waarden aannemen: TRUE of FALSE. Bij het omzetten van een variabele naar een boolean zijn alle volgende FALSE, alle andere komen overeen met een TRUE: • • • • • •
integere waarde 0 float waarde 0.0 lege string "" of een string met als waarde "0" array zonder enig element object zonder enig element NULL
Booleans worden gebruikt voor het testen van bepaalde zaken. Deze tests worden gebruikt om na te gaan of bepaalde zaken moeten uitgevoerd worden. Een voorbeeld: als iemand nog niet ingelogd is, moet hij een aanmeldingsscherm krijgen, en als hij wel aangemeld is, moet hij begroet worden met zijn persoonlijke naam.
Integer Dit zijn eenvoudige gehele getallen, positief of negatief. De minimum- en maximumwaarden zijn afhankelijk van het besturingssysteem en de processor van de server, maar gaan minstens van -2 miljard tot +2 miljard (-231/2 tot +231/2). Heb je een 64-bits-cpu dan gaat dit bereik veel verder. Je kan gebruik maken van decimale, octale en hexadecimale getallen. Om aan te duiden dat je met octale getallen werkt, laat je het getal voorafgaan door een 0 (nul) (voorbeeld: 034) en om met hex-getallen te werken laat je het getal voorafgaan door een 0x (nul-x) (voorbeeld: 0x1A). Als je een integer opgeeft die groter of kleiner is dan de minimum- of maximumwaarden wordt deze automatisch omgezet naar een float.
Float In PHP wordt de term float gebruikt om aan te geven dat we met een kommagetal werken, positief of negatief. Er wordt gebruik gemaakt van 64 bits om het getal in op te slaan, hierdoor krijgen we getallen gaande van -264/2 tot +264/2. Hou er rekening mee dat floating point getallen, door de afronding, niet gebruikt mogen worden om te vergelijken. 0.7 kan opgeslagen worden als 0.7000000001, maar ook als 0.699999999999. Vertrouw dus nooit vergelijkingen tussen floats. Floats worden ook soms als reals of doubles aangeduid.
Strings Een string (tekenreeks) is eenvoudigweg een reeks karakters. Strings hebben geen echte grens, en worden alleen beperkt door de instellingen van het php.ini-bestand. Strings kunnen aan een variabele worden toegewezen door het gebruik van zowel dubbele, als enkele aanhalingstekens of door gebruik te maken van de speciale heredoc-syntax. Deze laatste wordt vaak gebruikt bij lange stukken tekst. Ook 1 enkel karakter wordt gezien als een string.
NULL Null-types kunnen slechts 1 waarde bevatten, namelijk de waarde NULL. Deze speciale waarde betekent eigenlijk “niets” of “inhoudloos”. Ze wordt vaak gebruikt om de inhoud van een variabele te vernietigen.
25 | P a g i n a
Arrays Dit is een gemengd type die gegevens van verschillende types kan bevatten. Over arrays zien we later meer.
Objecten Objecten zijn een verzameling van gegevens (zoals array's) maar bevatten ook acties of methodes.
Resources Dit type is bedoeld om een verwijzing naar een bestand of een database-koppeling te bevatten. We komen deze later in deze cursus nog tegen.
Omzetten van type of casting Zelf omzetten In sommige gevallen is het nodig om zelf het type van een variabele aan te passen naar een ander type. Dit doen we door de naam van de variabele (of een letterlijke waarde) te laten voorafgaan door het type dat we wensen:
58 De mogelijkheden zijn: • • • • • • •
(integer) of (int) (bool) of (boolean) (float), (double) of (real) (string) (array) (object) (unset)
unset wordt meestal gebruikt als functie. Meer hierover later.
Automatische conversie van types Zelf omzetten is in de meeste gevallen zelfs niet nodig. PHP zal zelf het nodige type bepalen en dit zo nodig aanpassen als dit nodig blijkt te zijn:
59
\"100\" + 15.0 = " . $var = "100" + 15.0; //$var is een float (115.0) 62 print " 18 . \" meter\" = " . $var = 18 . " meter"; //$var is een string ("18 meter") 63 print " 18 + \" meter\" = " . $var = 18 + " meter"; //$var is een integer (18) 64 print " \"7 zotten zwemmen\" + 3 = " . $var = "7 zotten zwemmen" + 3; //$var is een integer (10) Ook verandert het type van de variabele naar gelang de bewerkingen die er op uitgevoerd worden:
65 $var = "1"; //$var is een string 66 print " \"1\" + 3 = " . $var = $var + 3; //$var wordt een integer 67 print " \$var / 3 = " . $var = $var / 3; //$var wordt een float 26 | P a g i n a
68 ?>
Bij het omzetten kun je het resultaat bepalen met onderstaande tabel: (int)$var (bool)$var (string)$var (float)$var NULL
0
False
True
1
True
'1'
1
False
0
False
'0'
0
0
0
False
'0'
0
3.8
3
True
'3.8'
3.8
'0'
0
False
'0'
0
10
10
True
'10'
10
'18 meter'
18
True
'18 meter'
18
True
'testbericht'
0
'testbericht' 0
0
Controleren van het type Doordat een variabele elk type kan zijn, kan het handig zijn om te weten welk type precies. Hiervoor hebben we een aantal mogelijke functies: boolean is_int(mixed variabele) boolean is_float(mixed variabele) boolean is_string(mixed variabele) boolean is_array(mixed variabele) Deze functie omschrijving lees je als volgt: boolean is_array(mixed variabele) • • •
boolean --> het type van het resultaat dat weergegeven wordt door de functie is_array --> de naam van de functie mixed variabele --> het type de parameter(s) die aan de functie doorgegeven worden
Deze functies leveren een TRUE op, als de aangeleverde variabele van het aangegeven type is, respectievelijk integer, float, string en array. Deze TRUE kan gebruikt worden om een test uit te voeren:
69 var_dump() is een functie die rechtstreeks het type afdrukt, gettype() levert een string op, en moeten we laten weergeven met de print-functie:
75 76 77 78 79
Om in een script te testen van welk type een variabele is, moet je gebruik maken van de is_*()-functies en niet van de gettype()-functie omdat de gettype()-functie soms onverwachte resultaten kan opleveren. Zo leveren sommige PHP-versies de naam float voor een kommagetal, terwijl andere real gebruiken. 27 | P a g i n a
Gelijkheid Voor het toekennen van een waarde aan een variabele hebben we het gelijkheidssteken gebruikt. Stel dat we 2 variabelen willen vergelijken: "; $var1 = 3; $var2 = 4; if ($var1 = $var2){ print "\$var1 en \$var2 zijn gelijk. "; } ?> Dit zal niet het verwachte resultaat opleveren, want in de vergelijking, wordt aan $var1, de waarde van $var2 toegekend, waardoor tussen de haakjes gewoon een toekenning komt te staan, en deze levert altijd de waarde TRUE op. Op het scherm zullen we dus verkrijgen dat "$var1 en $var2 zijn gelijk.". Om een vergelijking uit te voeren moeten we hiervoor een ander symbool gebruiken: de dubbele gelijkheidstekens (==).
80 81 82 83 84 85
"; $var1 = 3; $var2 = 4; if ($var1 == $var2){ print "3 en 4 zijn gelijk. "; } ?>
Deze melding zal niet afgedrukt worden, omdat we gebruik maken van de juiste vergelijkingsoperatoren. Op een gelijkaardige manier kunnen we ook de ongelijkheid testen:
86 87 88 89 90
"; } ?>
We kunnen bijvoorbeeld ook het volgende testen:
91 92 93 94 95
"; } ?>
Deze vergelijking zal waar zijn, maar toch zijn $var1 en $var2 niet helemaal gelijk. De eerste is namelijk een string, de tweede een integer. Om ook de types te controleren gebruiken we driedubbele gelijkheidstekens (===).
96 97 98 99 100 101 102
"; } if ($var1 !== $var2){ print "\"10\" en 10 zijn niet identiek. "; } ?>
Deze zal dus op ons scherm ""10" en 10 zijn niet identiek." afdrukken.
Testen van variabelen Soms kan het nuttig zijn, om te controleren of een bepaalde variabele al bestaat of niet, of als er al een waarde is aan toegekend. Dit doen we met: 28 | P a g i n a
boolean isset(mixed var); boolean empty(mixed var); Met isset() controleren we of een variabelen al aangemaakt is of niet, en levert een TRUE op als deze bestaat. empty() controleert of de waarde gelijk is aan 0, FALSE, NULL of een lege string en levert een TRUE op als dit zo is. Voorbeeld:
"; //drukt niets af } $var = 0; if (isset($var)) { print "0 bestaat. "; //drukt wel af } if (empty($var)) { print "0 is leeg. "; //drukt wel af } $var = "test"; if (isset($var)) { print "test bestaat. "; //drukt wel af } if (empty($var)) { print "test is leeg. "; //drukt niet af } ?>
Een variabele wordt altijd vernietigd op het einde van elk script, maar soms kan het nuttig, aangenaam, veilig, leuk zijn om deze toch manueel te vernietigen met: unset (mixed var) Voorbeelden:
"; //drukt af } unset($fout); if (isset($fout)) { print "Na het uitvoeren van unset. "; //drukt niets af } $var = 10; if ($var > 12) { $fout = true; } if (isset($fout)) { print "De variabele is groter dan 12!"; } ?>
Constanten Deze zijn heel goed te vergelijken met variabelen, maar met dit verschil dat de inhoud ervan niet kan gewijzigd worden gedurende de uitvoering van het script. Ook de toewijzing is iets anders, we gebruiken hiervoor namelijk het kernwoord define: 29 | P a g i n a
140 141 142 143
Ook moeten we deze niet laten voorafgaan door het dollarteken en meestal gebruikt men hoofdletters voor constanten, hoewel dit niet verplicht is. Naast eigen constanten zijn er ook een aantal voorgedefinieerde constanten zoals PHP_VERSION en PHP_OS. Een overzicht van de voorgedefinieerde constanten vindt je op http://php.net/manual/en/language.constants.predefined.php.
Oefeningen Haal de fouten er uit $var 2 = 13; print "Dit is een variabele: $var 2' //drukt iets af; if "$var 2 = 12" print "de variabele $var 2 is gelijk aan 12"
Het project van deze cursus: Webshop Voor de gegevens in de pagina's zullen we variabelen gebruiken. Hierdoor wordt het onderhoud van de pagina's een stuk eenvoudiger. Je moet niet telkens in de code gaan opzoeken waar het item zich bevindt. Een volgend voordeel is dat we onze code veel eenvoudiger kunnen maken. Én dat we ook flexibeler kunnen werken met de bron van onze gegevens én het aantal gegevens. Maak in Dreamweaver in uw oefensite een map aan voor de Webshop (vb: webshop). Maak de PHP pagina met de naam index.php met de volgende inhoud aan:
Je hebt nu een HTML pagina waarin er telkens naar de php-mode overgegaan wordt. Als de parser deze pagina binnenkrijgt, dan gaat hij eerst op zoek naar alle php-tags en zal hetgeen er tussen staat, uitvoeren en omvormen naar zuivere HTML. De browser die deze pagina opvraagt, zal in de broncode enkel nog HTML code zien staan.
Ronde-tijden Maak een programma dat uit drie ronde-tijden van bijvoorbeeld schaatsen de totale tijd en het gemiddelde uitrekent en afdrukt. Dat zou je kunnen aanpakken door als volgt te beginnen: $ronde_1=46; $ronde_2=43; $ronde_3=52; en dan na het maken van een sommetje het volgende af te drukken: Totale tijd over 3 ronden is 141 seconden Het gemiddelde was 47 seconden
Ronde-tijden in een tabel Pas het vorige script aan zodat de ronde-tijden in een tabel staan.
31 | P a g i n a
De HTML broncode voor een tabel ziet er als volgt uit:
Het resultaat van het script ziet er zo uit:
Ronde
1
2
3
Nederland
Types Maak een tabel waarbij de eerste kolom de letterlijke waarde van de variabele $var bevat. In de tweede kolom bepaal je met behulp van PHP het type van $var. In de derde kolom geef je met behulp van PHP de inhoud van $var weer. Vul aan de hand van dit script onderstaande tabel in. $var
Constanten Maak een script, waarmee je aan de hand van de voorgedefinieerde constanten, de naam van het script kan afdrukken, welke PHP-versie je gebruikt en welk OS je gebruikt. Het resultaat: Dit script (/srv/www/htdocs/pc01/variabelen/constanten.php) wordt uitgevoerd op PHP versie 5.3.5 onder Linux.
32 | P a g i n a
Don Quichot Maak een script waarin je drie variabelen van het type string definieert. Maak gebruik van de heredoc-syntax. Deze variabelen plaats helemaal bovenaan (nog voor de start van de HTML code). Geef de volledige tekst weer. Neem als 1ste variabele de tekst: Door het lezen van te veel ridderromans is de hidalgo Don Quichot zijn verstand kwijtgeraakt. Denkend dat hij zelf een ridder is, verlaat hij zijn huis en begint een dwaaltocht over de wegen en het platteland van Spanje, op zoek naar avonturen. Als doel heeft hij voor ogen het rechtzetten van alle soorten onrecht, om door deze goede daden beroemd te worden. De 2de variabele wordt: Op zijn trektocht wordt Don Quichot vergezeld door zijn buurman en dienaar Sancho Panza. Sancho is een kleine boer, analfabeet maar niet dom, en heeft eten en drinken als zijn belangrijkste interesses. Hoewel Sancho weet dat z'n meester niet helemaal goed bij z'n hoofd is, volgt hij hem, want zijn zwakheid voor de aardse geneugten maakt dat hij gelooft in de grote beloning die Don Quichot hem in het vooruitzicht stelt. De 3de variabele wordt: Dat Don Quichot behoorlijk in de war is blijkt als hij herbergen aanziet voor kastelen, windmolens voor reuzen, een hoertje voor een prinses, een kudde schapen voor een leger... Maar zijn waanideeën stuiten steevast op de nuchterheid, de voorzichtigheid, en de spreekwoorden van Sancho. Deze botsing tussen de ideale en fictieve wereld van Don Quichot en de echte en biologische wereld van Sancho is een hoofdthema van het boek, en meteen ook de bron van een groot deel van zijn humor.
Punten Maak een tabel waarin de resultaten van leerlingen worden bijgehouden. Zowel de namen als de resultaten van de leerlingen worden in variabelen bijgehouden. Deze variabelen plaats je helemaal bovenaan (nog voor de start van de HTML code). Bereken in de twee laatste kolommen het totaal en het behaalde percentage. Het percentage moet als integer weergegeven worden. Het resultaat wordt:
Samengestelde woorden Maak een script waarmee je woorden kunt samenstellen aan de hand van basiswoorden in variabelen. Het script begint met het definiëren van de variabelen. Daarna plaats je met behulp van de heredoc-syntax en de variabelen de volledige htmlcode tussen de body tags samen.
De rest van de code vul je zelf aan. Het resultaat wordt:
PHP Formulierverwerking Algemeen Het leuke aan PHP is dat we gebruik kunnen maken van dynamische pagina's. Dit zijn pagina's waarvan de inhoud bepaald wordt door een keuze of invoer van de gebruiker. Zo kun je een bezoeker vragen om zijn naam op te geven, waarna de bezoeker op de volgende pagina('s) wordt aangesproken met zijn eigen naam. Om de bezoeker zijn naam te vragen hebben we nood aan een invoermethode. In webpagina’s maken we daarom gebruik van formulieren. Deze zijn ook de basis voor het verwerken van mailings, beveiligde webpagina’s, weblogs, ... We kunnen met 2 verschillende pagina's werken: 1 met het formulier zelf er op (zuiver HTML, eventueel gemengd met PHP, die we kunnen gebruiken om foutmeldingen weer te geven) en 1 waarin er met de gegevens gewerkt wordt. Een andere manier om gegevens te versturen, is door een parameter in de url te verwerken.
Voorbeelden Je wilt een pagina maken, waarin er gevraagd wordt naar de naam van de gebruiker, deze naam wordt op de volgende pagina gebruikt voor een vriendelijke groet. Het formulier formulier.html:
1
2 3 4 <meta http-equiv="Content-Type" content="text/html; charset=utf8" /> 5 POST formulier 6 7 8 34 | P a g i n a
Klik op uw favoriete achtergrondkleur: Geel, Groen, Cyaan.
De kleurcode van de achtergondkleur is #.
Werking van HTTP: GET en POST Het HTTP-protocol is in principe heel eenvoudig: de browser verstuurt een verzoek naar de webserver (request) en de server antwoord hierop door een antwoord (response) terug te sturen. Elke request wordt gevolgd door een response. Je kan dit het best vergelijken met een gewone conversatie tussen 2 mensen. Het HTTP-antwoord bevat het HTML-document of de afbeelding of de melding dat de gevraagde pagina niet kon gevonden worden (op voorwaarde dat de server actief is natuurlijk). 35 | P a g i n a
De request van een pagina kan op verschillende manieren (methods), waarvan deze 2 het meest voorkomen: •
•
GET: de standaardmanier waarop gegevens, zoals webpagina-aanvragen, naar de server gestuurd worden. Door het toevoegen van extra parameters aan de URL, kunnen we bijkomende opties meegeven voor de volgende pagina. POST: deze manier verstuurd gegevens, niet in de URL maar in de body van de HTTPaanvraag. Deze manier wordt het meest gebruikt voor documenten en formulieren.
Volgen van een hyperlink Als je op een link klikt op een een webpagina, wordt er altijd gebruik gemaakt van de GETmethode: Klik hier Je kunt de link ook uitbreiden met één of meerdere extra parameters: Alles weergeven Dit onderdeel weergeven Je laat namelijk de naam van de link volgen door een vraagteken en de naam van de parameter met een toekenning via een gelijkheidsteken. Als je gebruik maakt van meerdere parameters, voeg je deze samen met een ampersand (&).
Formulieren Bij formulieren kunnen we kiezen om ofwel de POST-methode, ofwel de GET-methode te gebruiken. De keuze zal afhangen van een aantal factoren. Oorspronkelijk werd GET gebruikt voor acties die geen wijzigingen teweeg brengen op de server, zoals het zoeken in een database naar iets, terwijl POST werd gebruikt voor acties die wel wijzigingen doorvoeren op de server, zoals het toevoegen van een nieuw element, of verwijderen van een bestaand element in een database. Maar uiteindelijk kunnen we beide methoden gebruiken om gegevens te verzenden. Het voor- en/of nadeel van GET is dat alle parameters meegestuurd worden in de URL. Hierdoor kan gevoelige informatie zichtbaar worden voor anderen (bijvoorbeeld bij het opvragen van de URL in de geschiedenis van de browser). Anderzijds kan dit ook gebruikt worden, om een URL in de favorieten op te slaan, inclusief de parameters. Hou er ook rekening mee dat de GET-methode er voor kan zorgen, dat je URL behoorlijk lang wordt en uiteindelijk zelfs de maximum lengte voor URL's overschrijdt. Volgende regels worden aangenomen voor het versturen van formulieren: •
•
Gebruik POST als minstens één van onderstaande regels waar is: • het resultaat heeft blijvende werking aan de serverkant (vb: toevoegen of wissen van gegevens uit een database); • data die geproduceerd wordt door het formulier, zal resulteren in een te lange URL bij het gebruik van GET (meer dan 1024 karakters); • de overgestuurde data bevat enig ander type dan standaard ASCII-karakters. Gebruik GET als alle onderstaande regels van toepassing zijn: • de manier van verzenden gaat NIET via een formulier; • de aanvraag wordt gebruikt om gegevens op te halen; • het resultaat van de aanvraag heeft geen blijvende invloed op de webserver; • de uiteindelijke URL bestaat in totaal uit minder dan 1024 karakters.
We zullen dus in bijna alle gevallen de POST-methode gebruiken om gegevens via formulieren te versturen.
36 | P a g i n a
Formulieren Formulieren maken Aangezien we allemaal HTML kennen, zal het maken van formulieren heel kort nog eens herhaald worden. Een formulier in HTML begint altijd met de
38 | P a g i n a
Input-tags Er zijn dus 3 veelgebruikte tags om gegevens in te voeren: • • •
input select textarea
Bij de input hebben we een aantal types die het soort veld bepalen: • •
• •
•
text: wordt gebruikt voor gewone tekst; password: wordt vooral gebruikt om wachtwoorden in te geven, de ingetikte tekst wordt weergegeven als sterretjes / bolletjes (afhankelijk van de browser); radio: keuzerondjes; checkbox: selectievakjes, mogelijkheid om aan of uit te vinken; hidden: de gebruiker kan deze niet wijzigen, dit is handig om extra gegevens mee te sturen. Verborgen velden worden niet in de browser weergegeven (wel in de HTML-code).
Inputs van het type ‘button’ bestaan ook, maar die worden vooral gebruikt in combinatie met JavaScript. Bij select geven we de mogelijkheden weer tussen