atica inform PHP & MySQL

Vergelijkbare documenten
Inhoudsopgave Disclaimer... 3 Voorwoord... 4 Inleiding... 5 Het downloaden van XAMPP... 7 Het installeren van XAMPP... 8 Joomla installeren op

Test Joomla op je PC 1

Formulieren maken met Dreamweaver CS 4/CS 5

van PSD naar JavaScript

Inhoudsopgave... 1 Disclaimer... 3 Voorwoord... 3 Inleiding... 5 Het downloaden van XAMPP... 7 Het installeren van XAMPP... 8 Joomla installeren op

De tag aan het begin van het PHPscript is "<?php" aan het einde van het PHPscript gebruik je "?>".

Over PHP. PHP en MySQL. 1.1 Inleiding. In dit hoofdstuk maak je kennis met PHP. Hoe werkt deze

Je gaat leren programmeren en een spel bouwen met de programmeertaal Python. Websites zoals YouTube en Instagram zijn gebouwd met Python.

USB Webserver installatie en gebruik

Een formulier ontwerpen

Je gaat leren programmeren in Ruby. En daarna in Ruby een spelletje maken. Websites zoals Twitch en Twitter gemaakt zijn met behulp van Ruby?

Variabelen en statements in ActionScript

Les W-04: Een introductie in PHP

In dit hoofdstuk maak je kennis met PHP. Hoe werkt deze. programmeertaal? En hoe is het ontstaan? Ook leer je welke editors

Formulieren maken met Dreamweaver CS 4

BEGINNER JAVA Inhoudsopgave

Koppeling met een database

Quick Guide VivianCMS

En hoe gaan ze dit allemaal terugvinden?

Web building gevorderden: CSS & JavaScript. Karel Nijs 2008/11

Handleiding bij de Booktest Generator

Een database gebruiken

Fuel. Handleiding voor installatie en gebruik

Handleiding Websitebeheer

Werken op afstand via internet

Installeren van het programma:

Dynamische websites met PHP (basis) Karel Nijs 2010/09

Revisie Surf naar

Programmeren voor het web met PHP

Verbinden met FTP server

De Kleine WordPress Handleiding

Achtergrond en lettertype Opmaak Achtergrond Opmaak Achtergrond Afbeelding in achtergrond

Een quiz plaatsen op je website

Op de Virtual Appliance is MySQL voorgeïnstalleerd. MySQL is momenteel de meest gebruikte database op het internet.

16. Web Station. In dit hoofdstuk komen de volgende onderwerpen aan bod:

Quick Guide VivianCMS

Inhoudsopgave Voorwoord 11 Nieuwsbrief 11 Introductie Visual Steps 12 Wat heeft u nodig? 12 Uw voorkennis 13 Hoe werkt u met dit boek?

Handleiding installeren en wijzigen handtekening

Inhoudsopgave. versie 0.8

Handleiding: Whitelabel Customersite

Uitleg: In de bovenstaande oefening zie je in het eerste blokje een LEES en een SCHRIJF opdracht. Dit is nog lesstof uit het tweede trimester.

Handleiding ZKM Online. Versie 2.1

Formulier maken en opvangen met php

Automatisering voor Financiële Dienstverleners. Werken met Queries en Merge Documenten. For more information visit our website at

Drupal lokale installatie op Windows 7.

Cursus Onderwijs en ICT. bloggen met Wordpress

OSCOMMERCE INSTALLATIE

- Plan Zo kun je een. website bouwen!

Internet Explorer 7 (IE7)

Handleiding bij WSM MailformGenerator

Inloggen: Opbouw site: Een handleiding/introductie voor de nieuwe site van Fotoclub VPR.

opgericht 1 augustus 1932 Handleiding Artikel plaatsen

9. MYSQL. Daarin zien we het administratie paneel van mysql.

Handleiding Wordpress

Handleiding Resultaatmeetsysteem en Mezzedo

Handleiding Magento - Asperion

icafe Project Joeri Verdeyen Stefaan De Spiegeleer Ben Naim Tanfous

Stap 1 Je eigen website maken Stap 2 Je template invullen Stap 3 Wat kunnen we met de inhoud?... 19

Xampp Web Development omgeving opzetten onder Windows.

Zorgmail handleiding. Inhoud

ChainWise digitaal factureren

Handleiding CMS VOORKANT

In het CMS is het mogelijk om formulieren aan te maken. Voorafgaand een belangrijke tip:

Downloaden beveiligingscertificaat BRON Voor Windows XP en eerdere versies van Windows

Mappen en bestanden. In dit hoofdstuk leert u het volgende:

HANDLEIDING PROGRAMMEREN IN PASCAL (LAZARUS)

TeD Tekst en Design. Basisinformatie voor gebruik van het cms Made Simple

Leerlingenhandleiding Beginnen met FlexBase

Handleiding Mezzedo.nl

Rodin installatiehandleiding (vanaf versie 2.1.xxx.x)

Online aanvragen - Gebruikershandleiding. Online aanvragen Gebruikershandleiding

Hoe moet je een prachtige presentatie maken?

Hoe stel ik mijn favorieten en wachtwoorden veilig met LastPass en Xmarks?

Javascript oefenblad 1

Met deze module heeft u de mogelijkheid om gemakkelijk, snel en efficiënt uw documenten als naslag in Unit 4 Multivers te koppelen.

11. Website controleren

Studio Visual Steps Een website aanpassen via Avanquest webhosting

Handleiding: MRJ Online Back-up versie 1.0

XAMPP Web Development omgeving opzetten onder Windows.

8.13 Windows Hulp op afstand

Ik zal je nu stap voor stap laten zien hoe je je product op je website als betaalde download kunt aanbieden.

CrashPlan PROe installatie handleiding. Versie Mac-Up! - CrashPlan PROe Installatie Handleiding - 1

HANDLEIDING DMS Plugin Installatie, configuratie & werking

ideal Betaal Formulier (Ondersteund o.a. ideal, MisterCash, Direct E-Banking en Credit Card)

Downloaden beveiligingscertificaat BRON Voor Windows versies vanaf Windows Vista

GEBRUIKERSHANDLEIDING Content Management Systeem. Gebruikershandleiding RelaxWeb CMS

Les 9: formulier controle met javascript.

LES 11: VAN LOKAAL NAAR ONLINE. Lesoverzicht: Aan de slag Domeinnaam Web hosting FTP gegevens FTP programma s Database exporteren Samenvatting

Een spoedcursus python

IMAP-handleiding Bookinto

Basishandleiding WordPress

Transcriptie:

informatica PHP & MySQL

Op dit lesmateriaal is een Creative Commons licentie van toepassing. 2010 Remie Woudt remie.woudt@gmail.com 2013 François Vonk (XAMP vervangen door USB Webserver, minor edits)

Inhoudsopgave 1Wat is PHP?...4 1.1Wat heb je nodig?...5 1.2het eerste script...5 1.3voorwaarden...8 1.4herhalingen...9 1.5even terug naar HTML...12 1.6gegevens opslaan...15 1.7GET of POST...20 2PHP met database...26 2.1gegevens lezen...28 2.2gegevens toevoegen...29 2.3gegevens wijzigen...30 2.4foutmeldingen...31 2.5een CRUD voorbeeld...31

1 Wat is PHP? Voor we die vraag kunnen beantwoorden is het goed eerst iets te vertellen over hoe het internet eigenlijk in elkaar zit. Als je op het internet surft maak je (meestal) gebruik van een browser. Dat kan Internet Explorer zijn maar ook Firefox, Opera en er zijn er nog wel een aantal. Met een browser kun je webpagi - na's opvragen die ergens op het internet staan. De plaats waar ze staan noemen we een server of beter, webserver. De browser wordt dan de client genoemd. Zo ontstaan een zogenaamd client-server systeem waarbij de webpagina's op de server staan en de client steeds verzoeken indient bij de server om pagina's te laten zien. Een webserver zorgt er dus voor dat er, verzoeken van verschillende clients (browsers dus), webpagina's naar die clients worden verzonden zodat ze daar getoond kunnen worden. Om dat allemaal goed te laten verlopen maakt men gebruik van een protocol, namelijk het HTTP protocol. En dat is weer een afkorting (voor HyperText Transfer Protocol) dat je vaak boven in de adresbalk in de browser hebt zien staan. Tot nu toe maakten we pagina's die we ook zo wel in de browser konden bekijken. Daar hadden we niet eens een server voor nodig. Maar wil je het via het internet ook aan anderen laten zien dan zul je dus moeten zorgen dat je jouw pagina s op een webserver zet. En dan een webserver die uiteraard met het internet is verbonden. Soms heb je meer dan een server nodig. Bijvoorbeeld als de inhoud van de pagina steeds wij - zigt. Zoals bij een internetwinkel. De gegevens in die winkel zijn niet iedere keer hetzelfde als je daar een pagina opvraagt. Dus kun je ook niet een webpagina maken waarin die gegevens er als gewone tekst in komt te staan. Je hebt dan behoefte aan een manier om de pagina's steeds met andere informatie naar de browser te sturen. En dat is wat we met PHP kunnen doen. PHP werkt op een webserver en maakt daar de HTML-pagina s. Maar het bijzondere is dat PHP iedere keer als zo'n pagina wordt opgevraagd hem dan opnieuw maakt. Als je een PHP pagina opvraagt zal de webserver eerst kijken welke PHP code in die pagina staat. Aan de hand daarvan wordt HTMLcode gegenereerd en dat wordt dan naar de browser gestuurd. Uit WikiPedia: PHP is een scripttaal, die bedoeld is om op webservers dynamische webpagina's te creëren. PHP is in 1994 ontworpen door Rasmus Lerdorf, een senior software engineer bij IBM. Aanvankelijk stonden de letters PHP voor Personal Home Page (de volledige naam van de software was Personal Home Page/Forms Interpreter, PHP/FI). Sinds PHP 3.0 is de betekenis een recursief acroniem geworden: "PHP: HypertextPreprocessor". Deze naam geeft aan waar de taal meestal voor gebruikt wordt: informatie verwerken tot hypertext (meestal HTML en XHTML). Het grote verschil tussen het gebruik van PHP en JavaScript kun je zien als je van de webpagina de bron bekijkt. Bij JavaScript zie je dan HTML met daarin de JavaScript code. Bij PHP zie je alleen maar 4 1Wat is PHP?

HTML. Met PHP kun je dus jouw code geheim houden. PHP is overigens, net als JavaScript, een scripttaal. Zo noemt men een taal die niet eerst gecompileerd (omgezet) hoeft te worden tot een uitvoerbaar bestand. De code wordt gewoon regel voor regel, zoals jij dat ingetypt hebt, rechtstreeks door de server uitgevoerd. We noemen PHP een server sided programmeertaal. Een taal dus die zijn werk doet op de server. Dit in tegenstelling tot JavaScript dat zijn werk doet in de browser en om die reden een client sided programmeertaal wordt genoemd. Naast PHP zijn er vergelijkbare oplossingen. Zo heeft Microsoft Active Server Pages (ASP met als opvolger ASP.NET). Van Sun Microsystems is Java Server Pages (JSP), gebaseerd op Java en beschikbaar voor veel webservers. 1.1 Wat heb je nodig? Om met PHP te kunnen werken hebben we een webserver nodig. We moeten dan de bestanden die we maken op die webserver plaatsen en daarna via een browser de pagina opvragen. Vaak is een webserver ook nog eens een aparte computer. Maar we kunnen ook een webserver op onze eigen computer installeren en er op die manier mee werken. Het klinkt allemaal wel wat ingewikkelder dan het is want er zijn veel kant en klare oplossingen op internet te vinden. De zogenaamde WAMP pakketten (Windows, Apache, MySQL en PHP) kun je in z n geheel downloaden en installeren. Tegenwoordig zijn er ook oplossingen die vanaf een USB stick draaien. Dit is handig want dan hoef je niks op je PC te installeren. We gaan voor deze module weer gebruik maken van USB Webserver. Om goed te kunnen werken is het daarom weer noodzakelijk dat je zelf een USB stick hebt en die elke les meeneemt. Als je je kennis over USB Webserver op wilt halen dan kun je kijken hoe je USB Webserver op je USB stick krijgt en hoe het werkt in het document USB Webserver installatie en gebruik dat je vindt in Moodle. Als je weer weet hoe USB Webserver werkt kunnen we gaan programmeren. Bij USB Webserver is het handig, maar niet noodzakelijk, om het hoofdbestand van je webomgeving index.php te noemen. Dit is namelijk het bestand dat standaard wordt geladen door Apache. In deze module ga je echter werken met bestandsnamen die het opdrachtnummer in zich hebben om de opdrachten zo gemakkelijk uit elkaar te houden. We plaatsen alle bestanden in de root van USB Webserver zoals uitgelegd in de installatie- en gebruikershandleiding in Moodle. De PHP-bestanden maken we weer met behulp van Notepad++. 1.2 het eerste script Laten we beginnen met een eenvoudig script waarmee je kunt bepalen of het zomer- of wintertijd is. Opdracht 1 Maak een bestand met de naam opdracht1.php en sla dit bestand op in de map waar de websitebestanden moeten staan (in de root dus). Typ in dat bestand de volgende code: <title>zomertijd</title> <?php

//Tijdzone instellen date_default_timezone_set('europe/amsterdam'); //Controleer zomertijd if(date('i') == 1) { echo "Het is zomertijd"; else { echo "Het is wintertijd"; Bewaar het bestand, start een browser en typ in het url veld: http://localhost:8080/opdracht1.php Als het goed gegaan is krijg je nu de melding of het zomer- dan wel wintertijd is. Werkt dit niet, controleer dan eerst of Apache wel klaar is in het USB Webserver console! Aan het bovenstaande voorbeeld zie je dat het in eerste instantie heel veel lijkt op een HTML pagina. Het PHP gedeelte staat tussen <?php en. In dat gedeelte wordt eerst de tijdzone ingesteld. De zomertijd/wintertijd omschakeling verschilt namelijk per tijdzone. Daarna wordt er gebruik gemaakt van de standaard date functie. Als (if) date('i') een 1 geeft is het zomertijd, anders is het wintertijd. Dit is typisch hoe een functie werkt. Je vraagt de functie iets en hij geeft iets terug als resultaat. Nu zul je je misschien afvragen: 'Maar hoe weet ik dan wat dat resultaat moet zijn?' Kijk maar eens bij de datefunctie op http://nl.php.net/manual/en/function.date.php. Dat zie je ook dat de date-functie nog veel meer mogelijkheden heeft die je op kunt vragen. Je ziet dat met de opdracht echo iets op het scherm geplaatst wordt. echo gaan we nog veel vaker gebruiken omdat we er binnen PHP heel veel mee kunnen doen. Maar dat komt later aan de orde. Opdracht 2 Maak een nieuw bestand, geef het de naam opdracht2.php en zet er de volgende code in: <title>begroeting</title> <?php //Tijdzone instellen date_default_timezone_set('europe/amsterdam'); echo '<p>'; $uur = date('h'); if($uur >= 0 && $uur < 6){ echo "Goedenacht meneer/mevrouw, "; elseif($uur >= 6 && $uur < 12){ echo "Goedemorgen meneer/mevrouw, "; elseif($uur >= 12 && $uur < 18){ echo "Goedemiddag meneer/mevrouw, "; 6 1.2het eerste script

elseif($uur >= 18 && $uur < 24){ echo "Goedenavond meneer/mevrouw, "; ; echo "het is nu $uur uur."; echo '</p>'; Bewaar het bestand, start een browser en typ in het url veld: http://localhost:8080/opdracht2.php Hier gebruiken we opnieuw de date-functie. Nu halen we daaruit het uur van dit moment in de vorm van een getal. Die plaatsen we in de variabele $uur en daarvan maken we gebruik in de if en de echo regels. Bekijk het resultaat van opdracht 2 op verschillende tijdstippen van de dag! Opdracht 3 Sla opdracht2.php op onder de naam opdracht3.php en verander in opdracht3.php de regel: echo "het is nu $uur uur."; in echo "<br> het is nu $uur uur."; en leg uit wat het effect is. Opdracht 4 Kijk opnieuw naar http://nl.php.net/manual/en/function.date.php. In de vorige opdracht hebben we weer de date functie gebruikt. Wat zou er gebeurd zijn als we in plaats van date('h') gebruik hadden gemaakt van date('g')? Nog even wat uitleg. Met $uur wordt een variabele aangegeven. In PHP beginnen alle variabelen met het dollar teken. In een variabele kun je een gegeven opslaan. In het bovenstaande voorbeeld wordt in $uur het getal dat het uur van de dag voorstelt opgeslagen. Bij opdracht 2 en opdracht 3 heb je gemerkt dat je HTML code in de PHP code mag stoppen. We deden dat met echo '<p>'; maar ook met echo "<br> het is nu $uur uur.";. Met echo wordt zo n regel naar de browser gestuurd en die beschouwt het als HTML. Wanneer je tekst met daarin een variabele door middel van echo naar de browser stuurt moet je de dubbele aanhalingstekens gebruiken ("). Gebruik je de enkele aanhalingstekens dan controleert PHP niet of er zich in de tekst ook variabelen bevinden. In dat geval wordt $uur dus gewoon als $uur afgedrukt. Opdracht 5 Zoek op met welke date-functie je de minuten op kunt vragen. Verander dan opdracht2.php dusdanig dat je het aantal minuten ook in een variabele krijgt en de tijd nu als volgt op het scherm komt: het is nu 18:48 uur. Opdracht 6 Als je de pagina van opdracht 5 bekijkt en je klikt met je rechtermuisknop op die pagina en kiest voor Bron weergeven, wat zie je dan? Zie je ook PHP code? Hoofdstuk 1Wat is PHP? 7

1.3 voorwaarden In opdracht 1 maakten we al gebruik van if en else. Aan de if opdracht zit een voorwaarde verbonden. Het programma kan als het ware uit twee dingen kiezen. Het ene als de voorwaarde waar is, het andere als de voorwaarde niet waar is. Dat gaat met het if statement als volgt: if (voorwaarde) { doe iets als de voorwaarde waar is; else { doe iets als de voorwaarde niet waar is; Dit zal je bekend voorkomen. Je hebt dat immers bij JavaScript al gehad! Alleen is de syntax hier een klein beetje anders. Opdracht 7 a. Wat bedoelen we met syntax? b. Wat is het verschil in de syntax tussen de if opdracht in JavaScript en die in PHP? Zoals je ziet staat de voorwaarde tussen haakjes en de opdrachten die daarna komen staan tussen accolades. Dat laatste hoeft niet als de voorwaarde maar één regel lang is maar maak er toch maar een gewoonte van. Het is wel zo duidelijk. Als de voorwaarde niet waar is kom je bij het deel na else. Je zou dan opnieuw een voorwaarde kunnen stellen door in plaats van else de opdracht elseif te gebruiken. We hebben dat gebruikt in opdracht 2. Je ziet in opdracht 2 ook het gebruik van &&. Deze logische operator kwam ook al voor in hoofdstuk 6 van het html-deel. Daarmee worden twee voorwaarden met elkaar gecombineerd door middel van de EN-functie of, zoals die meestal wordt aangeduid: de AND-functie. Bij deze voorwaarde: ($uur >= 0 && $uur < 6) betekent het dus dat als aan beide voorwaarden voldaan is, ($uur groter of gelijk is aan 0 EN $uur is kleiner dan 6), het programma vervolgd wordt met het gedeelte na deze beide voorwaarden. Naast de && kennen we ook de voor de OF-functie (de OR-functie) en de! voor de NIETfunctie (de NOT-functie). Opdracht 8 Leg uit waarom een voorwaarde als: ($uur >= 0 $uur < 6) geen zinvolle betekenis heeft. Een andere manier om voorwaarden in jouw code in te bouwen is met het gebruik van het switch-statement. Wanneer je meer dan drie elseif s in je code hebt staan is het vaak handiger en overzichtelijker om met switch te gaan werken. Kijk naar de volgende code om te zien hoe je met switch het probleem van opdracht 2 te lijf kunt gaan: <?php //Tijdzone instellen date_default_timezone_set('europe/amsterdam'); echo '<p>'; $uur = date('h'); switch ($uur) { case ($uur >= 0 && $uur < 6): echo "Goedenacht meneer/mevrouw, "; break; case ($uur >= 6 && $uur < 12): 8 1.3voorwaarden

echo "Goedemorgen meneer/mevrouw, "; break; case ($uur >= 12 && $uur < 18): echo "Goedemiddag meneer/mevrouw, "; break; default: echo "Goedenavond meneer/mevrouw, "; break; echo "het is nu $uur uur."; echo '</p>'; Zo is de code toch nog wat overzichtelijker nietwaar? Opdracht 9 Met $maand = date('m') wordt er in de variabele $maand een getal geplaatst, afhankelijk van welke maand het op dit moment is. Dat getal zal dus een getal zijn uit de reeks van 1 t/m 12. Maak een PHP bestand, noem dit opdracht9.php, en plaats daar code in waarmee je met behulp van switch het getal omzet naar de maand in woorden. Zorg daarna dat de juiste maand op het scherm wordt afgedrukt. Om je even op weg te helpen: switch ($maand) { case 1: echo "januari"; break; case 2: echo "februari"; break; enz. Bestudeer nu verder de date() functie in PHP en zorg ervoor dat de volledige datum op Nederlandse wijze op het scherm komt te staan dus in de vorm van 30 september 2009 (maar dan met de huidige datum). 1.4 herhalingen Naast de voorwaarden met if of switch kennen we in PHP ook de herhalingen. Je wilt bijvoorbeeld een berekening een aantal keren herhalen. Of je wilt een tekstbestand regel voor regel lezen. Bij herhalingen kennen we while, do-while en for(). Allereerst een eenvoudig voorbeeld met while. Opdracht 10 Maak een nieuw bestand, geef het de naam opdracht10.php en zet er de volgende code in: <title>tot 3 tellen</title> <?php Hoofdstuk 1Wat is PHP? 9

echo "Ik kan tot drie tellen!"; echo "<p>"; $teller = 1; while ($teller <= 3) { echo "$teller <br>"; $teller++; echo "</p>"; Maak van dit programma (het PHP gedeelte) ook een PSD. Als je dat niet lukt, lees dan de ver - klaring hieronder en probeer het alsnog. Test het programma en probeer de werking van iedere regel te begrijpen. Hier de verklaring: $teller is een variabele die in het begin de waarde 1 krijgt. while ($teller <= 3) betekent: Doe, zolang $teller kleiner of gelijk is aan 3, de code die daarna tussen de accolades staat. echo "$teller <br>"; Met deze regel wordt de waarde van $teller afgedrukt. $teller++; Tel bij $teller 1 bij op. Met while stel je dus een voorwaarde en zolang daar aan voldaan wordt, wordt de code tussen de accolades uitgevoerd. while gebruik je als je die voorwaarde vooraf wilt stellen. Maar het is ook mogelijk de voorwaarde achteraf te stellen. In dat geval maak je gebruik van do-while. In de volgende opdracht gaan we dat uittesten. Opdracht 11 Maak een nieuw bestand, geef het de naam opdracht11.php en zet er de volgende code in: <title>while</title> <?php echo "<p>dit is de do-while<br>"; $teller = 5; do { echo "De teller is $teller <br>"; $teller--; while ($teller >= 6); echo "Deze telt dus wel omdat de while pas na<br>"; echo "het afdrukken van de teller staat!</p>"; echo "<hr><br><p>en dit is de while<br>"; $teller = 5; while ($teller >= 6) { echo "De teller is $teller <br>"; $teller--; ; echo "Maar deze telt niet mee omdat de while voor "; echo "het afdrukken van de teller staat.<br>"; 10 1.4herhalingen

echo "Daarom loopt hij dus niet door de while loop.</p>"; Maak van dit programma (het PHP gedeelte) ook een PSD. Met het PSD en de uitleg van de vorige opdracht moet dat nu wel lukken. Het verschil tussen while en do-while wordt pas zichtbaar wanneer de bewering die achter while staat meteen al onwaar is. Tenslotte de for lus. Deze is wat ingewikkelder omdat er in één opdracht zoveel informatie zit. De algemene uitdrukking is: for (begin; voorwaarde; opdracht) { hier kan aanvullende code komen die steeds opnieuw uitgevoerd wordt zolang de lus loopt. Je mag alle delen tussen de haakjes weg laten maar de ; s moeten blijven staan! for wordt vooral gebruikt om een aantal keren een stukje code te doorlopen. Maar het wordt het best duidelijk gemaakt aan de hand van een voorbeeld: Opdracht 12 Maak een nieuw bestand, geef het de naam opdracht12.php en zet er de volgende code in: <title>tafel van 7</title> <?php for ($teller = 1; $teller <= 10; $teller++) { $antwoord = $teller * 7; echo "$teller x 7 = $antwoord <br>"; ; Test de code en probeer deze regel voor regel te begrijpen. Het belangrijkste is hier uiteraard de for regel. In die regel beginnen we met: $teller = 1. Dat is de beginwaarde waarmee we gaan werken. Met het tweede gedeelte: $teller <= 10 geven we aan dat we net zo lang doorgaan als deze voorwaarde waar is. Tenslotte hebben we op die regel nog $teller++ waarmee we aangeven dat bij iedere keer dat we deze lus doorlopen, er steeds bij $teller één wordt bijgeteld. Herinner je je het volgende nog? Waar dient de * voor? Als je het niet meer weet, kijk dan in hoofdstuk 6 van Programmeren in HTML, CSS en JavaScript. Soms wil je dat een lus pas stopt nadat aan een bepaalde voorwaarde is voldaan. Dat kun je in de for lus zelf uiteraard doen, in het deel tussen de haakjes. Maar soms is die voorwaarde complexer en stoppen we dat in de code van de lus. We kunnen dan gebruik maken van de break opdracht. Zo zouden we de bovenstaande code ook als volgt hebben kunnen schrijven: Hoofdstuk 1Wat is PHP? 11

<?php for ($teller = 1;; $teller++) { if ($teller > 10) { break; $antwoord = $teller * 7; echo "$teller x 7 = $antwoord <br>"; ; Zoals je ziet wordt de code er zo niet echt overzichtelijker op. Daarom ook een waarschuwing: gebruik break alleen als je de code voor het einde van de lus echt niet in het deel tussen haakjes kwijt kunt. In dit voorbeeld is het dus echt onzinnig om break te gebruiken. Opdracht 13 Misschien heb je wel in de gaten dat de for lus erg veel lijkt op de while lus. Maak een nieuw bestand, geef het de naam opdracht13.php en zorg dat hij hetzelfde doet als opdracht 12. Maar doe het nu met een while lus. 1.5 even terug naar HTML We gaan weer even terug naar HTML. We hebben daar destijds een formulier gebruikt met behulp van de codes: <form name="mijnform"> Met PHP kunt je echter de gegevens uit zo n formulier ook terug naar de webserver sturen en ze daarna in een ander formulier weer laten gebruiken. Dat doen we via de het action attribuut van het formulier. We geven daarmee aan waar de gegevens van dat formulier naar toe gestuurd moeten worden als we op de submit knop klikken. Daarnaast moeten we aangeven met welke methode we de gegevens door willen zenden. We hebben daarbij de keuze uit get en post. In het volgende voorbeeld gebruiken we get. Opdracht 14 Maak een programma met de naam opdracht14.php met daarin de volgende code: <title>kies je kleur!</title> <h1>welkom op deze pagina!</h1> <h2>zoek zelf een kleur uit voor je pagina<br> Je kunt kiezen uit de volgende kleuren:</h2> <form name="kleur" method="get" action="achtergrond.php"> <select name="kleuren"> <option value="red" selected="selected">rood</option> <option value="blue">blauw</option> <option value="yellow">geel</option> <option value="green">groen</option> <option value="brown">bruin</option> <option value="indianred">indisch rood</option> 12 1.5even terug naar HTML

<option value="lightcoral">licht koraalrood</option> <option value="salmon">zalmroze</option> <option value="darksalmon">zalmrood</option> <option value="orangered">oranjerood</option> <option value="firebrick">vuursteen</option> <option value="darkred">donkerrood</option> <option value="greenyellow">groengeel</option> <option value="chartreuse">limoen</option> <option value="lightcyan">cyaan</option> <option value="aqua">aqua</option> <option value="darkblue">donkerblauw</option> </select> <br> <input type="submit" name="submit" value="doen"> </form> Maak nu ook een programma aan met de naam achtergrond.php met de volgende code: <title>achtergrondkleuren</title> <body bgcolor="<?php echo $_GET["kleuren"]; "> <h1>zie hier, jouw favoriete kleur!!!</h1> <h3><a href="opdracht14.php">opnieuw</a></h3> Als je het bovenstaande test en je ziet een nieuwe pagina starten als je een achtergrondkleur kiest en op de knop doen geklikt hebt, dan heb je vast ook al een redelijk idee wat er in deze programma s gebeurt. Eerst het programma opdracht14.php. Daarbinnen zie je met de regel: <form name="kleur" method="get" action="achtergrond.php"> een formulier gedefinieerd met de naam kleur. De methode is get en de actie die moet worden ondernomen is achtergrond.php. De methode get zorgt voor het verzenden van de gegevens naar de pagina die achter action staat, dus in dit geval naar achtergrond.php. Maar dat verzenden gebeurt pas als er op de submit knop geklikt wordt. Die submit knop wordt aangemaakt met de regel: <input type="submit" name="submit" value="doen"> En wat wordt er nu eigenlijk overgestuurd naar dat andere formulier? Dat kunnen alle waarden van de variabelen zijn die voorkomen in form name="kleur". Immers dat form heeft als actie de koppeling met achtergrond.php. In dit form gaat het om de variabele kleuren. Deze variabele wordt gevuld als de gebruiker een kleur selecteerd, dus in het selectieveld een keuze maken. Het selectieveld met al zijn opties is het deel dat begint met: <select name="kleuren"> <option value="red" selected="selected">rood</option> <option value="blue">blauw</option> enz. Hoofdstuk 1Wat is PHP? 13

en eindigt met </select>. Met een selectieveld kunnen we vooraf vastgelegde keuzes aanklikken in een soort van pulldown menu. De keuzes die we hier willen laten zien, staan in de option regels. Die opties hebben allemaal een waarde die is vastgelegd achter value en deze waarde komt tijdens het selecteren in de variabele kleuren van het selectieveld terecht. En wat gebeurt er in achtergrond.php? Wanneer we in de pagina achtergrond.php met $_GET["kleuren"] de inhoud van de select-variabele met de naam kleuren weer opvragen krijgen we de geselecteerde kleur en zoals je in deze regel ziet: <body bgcolor="<?php echo $_GET["kleuren"]; "> kunnen we in de html-code een stukje PHP invoegen door het tussen <?php en te zetten. (Om het een beetje eenvoudig te houden gebruiken we hier de opmaakcode bgcolor in de HTML code. Dat is niet zo mooi want zoals je eerder gezien hebt willen we graag de opmaakcodes in een apart CSS bestand vastleggen.) Tenslotte wordt er een link terug naar opdracht14.php gegeven zodat we opnieuw een keuze kunnen maken. Opdracht 15 Kijk naar de bron van de pagina achtergrond.php en schrijf op hoe de regel <body bgcolor="<?php echo $_GET["kleuren"]; "> er daarin uitziet. Belangrijk: probeer van iedere regel in de bovenstaande programma s te begrijpen waarvoor ze er staan en wat hun effect is. Bij de volgende opdrachten kom je soms stukjes tegen die niet in dit boek vermeld staan. Het is dan aan jou om het toch op te lossen met behulp van informatie van het internet. Je mag hier ook gebruik maken van HTML en JavaScript waar dat nodig is maar de functies moeten in PHP geschreven worden. Opdracht 16 Maak, met behulp van een for lus, 6 keer de bekende Hello World regel waarbij de koppen van die regels lopen van <h1> tot/met <h6>. Opdracht 17 Maak een tekstveld waarin de temperatuur ingevuld kan worden. Als het 28 graden of meer is, komt er een melding Pak de koelbox maar in, we gaan naar het strand. Als het minder dan 28 graden is, komt de melding Laten we maar gaan scrabbelen. Opdracht 18 Maak een pagina met drie tekstveldjes waarin je een naam, eventueel tussenvoegsel en achternaam invult. Als je op een submit knop drukt, wordt die naam aan elkaar geplakt. Opdracht 19 Je kunt for lussen ook binnen elkaar gebruiken. Dat noemen we nesten. Maak een programma met twee for lussen binnen elkaar dus in de vorm van: 14 1.5even terug naar HTML

for (...) {... for (...) {...... ; ; Dit programma moet de tafels van 7, 8 en 9 afdrukken. In de buitenste for lus laat je dus de teller oplopen van 7 tot 9, in de binnenste for lus laat je de tafel afdrukken. Opdracht 20 Maak een pagina met een inlognaam en een wachtwoord die een tweede pagina opent met ad - min als inlognaam en pietje als wachtwoord gebruikt wordt. Opdracht 21 Maak een zeer eenvoudige rekenmachine die twee getallen bij elkaar op kan tellen als je op een submit knop klikt. Opdracht 22 Als opdracht 21 maar nu moet hij i.p.v. optellen de beide getallen met elkaar vermenigvuldigen. Opdracht 23 Maak een programma met een lus waarbij de getallen 1 t/m 10 bij elkaar worden geteld. Opdracht 24 Maak een pagina waarop je online een pizza kunt bestellen. Er is een keuze uit pepperoni, ananas, ansjovis en broccoli op de pizza. Als je op de submit knop drukt verschijnt er een nieuwe pagina waarop staat welke pizza je hebt besteld. Gebruik radiobuttons! 1.6 gegevens opslaan In het vorige hoofdstuk hebben we al geleerd hoe we gegevens met behulp van PHP door kunnen geven naar een andere pagina. Het is ook mogelijk de gegevens op te slaan in een tekstbestand of een database. Iets wat je vaak ziet is een teller waarmee wordt bijgehouden hoe vaak een pagina is bezocht. Dat is niet een getal dat je aan een andere pagina door kunt geven want het verschijnt op de pa - gina zelf. Maar ook als je de pagina afsluit en hem later weer opent moet je de teller weer op kunnen roepen. Dus we gaan de waarde van de teller op de server opslaan en roepen die later weer op. Laten we eerst eens kijken wat we zo allemaal nodig hebben als we dit willen realiseren. Kortom, wat moeten we doen als we willen bijhouden hoe vaak iemand op die pagina is geweest. Onderstaande opsomming geeft hier een beeld van: Het aantal keren dat de pagina bezocht is, is een getal; Hoofdstuk 1Wat is PHP? 15

Dat getal willen we ergens opslaan maar dusdanig dat we het ook weer kunnen opvragen en wijzigen; We zouden het op kunnen slaan in een tekstbestand; Als dat tekstbestand al bestaat moet het geopend worden, moeten we de inhoud (het getal) uitlezen, moeten we bij dat getal 1 bijtellen en het dan weer bewaren; Als dat tekstbestand nog niet bestaat, moeten we het maken, er het getal 1 in zetten en het daarna weer opslaan; Als je een tekstbestand opent moet je het ook weer sluiten; We hebben dus een php-script nodig dat iedere keer als de pagina van de server wordt opge - vraagd, het getal in het tekstbestand opvraagt, ophoogt en weer wegschrijft. En bij het allereer - ste bezoek hoeft hij alleen maar het bestand te maken en op te slaan met het getal 1 erin. We kunnen binnen PHP gebruik maken van de zogenaamde low-level file functies. Hier een opsomming: Functie Wat doet hij Syntax fopen() Opent een bestand waarbij je in kunt stellen of dat bestand alleen gelezen mag worden of ook gewijzigd. Als het bestand geopend is kun je daar naar verwijzen dankzij de zogenaamde file-pointer. $fp = fopen("{bestandsnaam", "r+"); $fp is hier de file-pointer. Een variabele waarmee wordt onthouden om welk bestand het gaat. {bestandsnaam Hier vul je de bestandsnaam in die je wilt gebruiken of de naam van het bestand dat je wilt opvragen. "r+" is het attribuut. Het attribuut bepaald hoe het bestand geopend wordt. Zie voor een volledig overzicht tabel 2. fclose() Sluit het bestand dat hoort bij de file-pointer weer. fclose($fp); fputs() fgets() Schrijft een aantal karakters (een string) naar het bestand dat wordt aangeduid met de file-pointer Leest een aantal karakters (een string) uit het bestand dat wordt aangeduid met de file-pointer en plaatst die string in een variabele. Er wordt steeds één regel ingelezen. fputs($fp,{string); ${variabele = fgets($fp); rewind() Zorgt ervoor dat bij de volgende keer lezen van of schrijven naar het bestand aangeduid met de file-pointer, begonnen wordt aan het begin van het bestand. rewind($fp); file_ exists() Geeft een true als het bestand al bestaat, anders een false. file_exists("{bestandsnaam") Tabel 1: De file functies In de volgende tabel zie je de attributen die je bij fopen() kunt gebruiken. 16 1.6gegevens opslaan

Attribuut Betekenis "r" "r+" "w" "w+" Hiermee open je een bestand om het te lezen (read) De file-pointer staat aan het begin van het bestand. Hiermee open je een bestand om het te lezen en om er naar te schrijven. De file-pointer staat aan het begin van het bestand. Hiermee open je een bestand om te schrijven (write). Maakt het bestand aan als het nog niet bestaat. Als het wel al bestaat wordt het bestand overschreven. Hiermee open je een bestand om te lezen en te schrijven. Maakt het bestand aan als het nog niet bestaat. Als het wel al bestaat wordt het bestand overschreven. "a" Hiermee open je een bestand om te schrijven waarbij de file-pointer aan het eind van het be - stand staat (append). Als het bestand nog niet bestaat, wordt het aangemaakt. "a+" Hiermee open je een bestand om te lezen en te schrijven waarbij de file-pointer aan het eind van het bestand staat (append). Als het bestand nog niet bestaat, wordt het aangemaakt. Tabel 2: De attributen van fopen() Die tabellen mogen dan wel alle informatie geven, toepassen in de praktijk maakt het pas echt duidelijk. Dus de volgende opdracht. Opdracht 25 Maak een bestand met de naam opdracht25.php. In opdracht25.php komt de volgende code te staan: <title>bezoekersteller</title> <?php if (file_exists("teller.txt")) { $fp = fopen("teller.txt", "r+"); $teller = fgets($fp); $teller++; rewind($fp); fputs($fp, $teller); fclose($fp); else { $fp = fopen("teller.txt", "w"); $teller = "1"; fputs($fp, $teller); fclose($fp); U bent de <?php echo $teller e bezoeker van deze pagina! Hoofdstuk 1Wat is PHP? 17

Test het programma uit en bekijk het resultaat. Als het goed is zal bij iedere keer dat je de pagina weer opent of ververst de paginateller er één bij hebben geteld. Bekijk ook eens het bestand teller.txt in de map htdocs. Je zult zien dat het laatst bewaarde getal daar in staat. Wat gebeurt er in dit programma allemaal? Met behulp van de tabellen moet het mogelijk zijn de PHP regels te doorgronden. Als je het bestand teller.txt gezien hebt dan begrijp je dat we daarin onthouden hoe vaak de pagina bezocht is. De regel if (file_exists("teller.txt")) controleert of het bestand teller.txt wel bestaat. Bestaat teller.txt niet (dit is het geval als we dit programma voor de eerste keer starten) dan gaat hij naar het gedeelte achter de else maar bestaat teller.txt wel dan gaat het programma gewoon verder. Met $fp = fopen("teller.txt", "r+"); wordt het bestand teller.txt geopend. De r+ geeft aan (zie tabel 2) dat het programma geopend moet worden om het te lezen en ernaar te kunnen schrijven. $fp is de file-pointer die bijhoudt welk bestand geopend is en waar in het bestand hij aan het lezen is. De regel $teller = fgets($fp); zorgt ervoor dat er een regel van teller.txt wordt ingelezen en in de variabele $teller worden gestopt. Daarna wordt er bij de variabele $teller met de zin $teller++; één bijgeteld. Met rewind($fp); wordt de file-pointer weer aan het begin van het bestand gezet. Met de regel fputs($fp, $teller); wordt de inhoud van $teller weer teruggeschreven naar het bestand teller.txt. Dankzij $fp weet hij nog om welk bestand het gaat en om welke positie binnen dat bestand. Had je niet teruggezet dan zou de nieuwe waarde van $teller achter de al bestaande zijn geplakt. En dat is niet de bedoeling! Met fclose($fp); wordt het bestand teller.txt weer afgesloten. Opdracht 26 Verklaar de 4 regels die na de else staan op dezelfde manier als hier boven. In plaats van een getal kun je natuurlijk ook tekst opslaan. Laten we dat eens doen in de volgende opdracht. Opdracht 27 Maak een bestand met de naam opdracht27.php waarin de volgende code komt te staan: <?php if (!empty($_get)) { $naamnieuw = $_GET["naam"]; if (file_exists("naam.txt")) { $fp = fopen("naam.txt", "r"); $naam = fgets($fp); fclose($fp); $fp = fopen("naam.txt", "w+"); echo "Jouw naam is dus $naamnieuw"; if ($naamnieuw!= $naam) { 18 1.6gegevens opslaan

echo "<br>maar de vorige keer heette je nog $naam"; fputs($fp, $naamnieuw); fclose($fp); else { $fp = fopen("naam.txt", "w"); $naamnieuw = $_GET["naam"]; fputs($fp, $naamnieuw); fclose($fp); <form name="naamform" method="get" action="<?php echo $_SERVER["PHP_SELF"]"> Vertel mij jouw naam <input type="tekst" name="naam" value=""> <br> <br> <input type="submit" name="submit" value="opslaan"> </form> En getest? Werkt hij goed? Er staat niet zoveel nieuws in dit programma maar toch gebeuren er wel bijzondere dingen. Je ziet get als methode in de code staan maar toch wordt dat niet doorgegeven aan een ander stukje PHP-code. Wel zien we hier heel duidelijk dat de code uit twee gedeelten bestaat. In de head sectie staat heel veel PHP-code en in de body zien we een formulier met alleen in de action wat PHP. Kijk eerst eens naar de php-code in de head sectie. Met if (!empty($_get)) controleert het programma of er via $_GET een waarde beschikbaar is. Maar aangezien er de eerste keer nog niets ingevuld is slaat hij domweg de rest van het PHP gedeelte in de head sectie over en laat hij het formulier zien dat in de body staat. Dus dan maar eens het formulier bekijken. Daarin staat als action aangegeven: action="<?php echo $_SERVER["PHP_SELF"]" Het attribuut "PHP_SELF" wijst naar zichzelf. Dat betekent dat hij niet een ander PHP programma aanroept maar zichzelf. Beetje bijzonder natuurlijk maar als hij zichzelf opnieuw aanroept, dan is de variabele, of beter gezegd de matrix van variabelen $_GET wel gevuld en doorloopt hij dan dus het PHP gedeelte in de head sectie wel. Opdracht 28 Verklaar alle regels van opdracht 27. Weet je niet wat een bepaalde regel doet? Zoek het dan op via internet of laat zo n regel eens weg om te zien wat het resultaat ervan is. Opdracht 29 Waarom stond er in dit programma niet de regel: rewind($fp);? Hoofdstuk 1Wat is PHP? 19

Opdracht 30 Kun jij een reden bedenken waarom met deze regels fclose($fp); $fp = fopen("naam.txt", "w+"); het bestand eerst gesloten wordt en meteen daarna weer geopend? Opdracht 31 Maak nu een soortgelijk programma als in opdracht 27 maar nu met 3 invulvelden, naam, adres en woonplaats. Zorg ervoor dat het bestand waar je gegevens in worden opgeslagen niet iedere keer weer gewist wordt maar dat de gegevens steeds aan het einde van het bestand er aan toegevoegd worden. (Welk attribuut moet je dan bij fopen() gebruiken?) 1.7 GET of POST Tot nu toe hebben we steeds get gebruikt om gegevens van de ene webpagina naar de andere (of dezelfde) webpagina door te geven. Maar er is nog een andere methode, namelijk post. Misschien is het je wel al opgevallen. Als je get gebruikt verschijnen de gegevens die je met get wilt versturen in de URL van de nieuwe webpagina die je opvraagt. Dat kan heel handig zijn als je fouten aan het zoeken bent. Dan weet je tenminste wat er doorgegeven wordt. Maar het zal duidelijk zijn dat dat helemaal niet handig is om een wachtwoord door te geven. Dan wil je juist niet dat het zichtbaar is! De get variabelen worden ook opgeslagen in de logbestanden op de webserver en passeren ongecodeerd diverse routers op het internet. Gemakkelijk voor kwaadwilligen om ze te onderscheppen. Tenslotte heeft get nog een nadeel: de lengte van een de tekst die je met get doorgeeft is beperkt tot maximaal 8 KB. Om die reden heeft men een tweede methode bedacht, namelijk post. Voor onze toepassingen maakt het niet uit of we post of get gebruiken. Maar wanneer de veiligheid in het geding komt, gebruik dan post! In de volgende oefening zullen we de post methode toepassen. Opdracht 32 In deze opdracht maken we een gastenboek. Je kent ze ongetwijfeld, de websites die je de mogelijkheid geven om te reageren op iets. Allereerst maken we een gastenboek waarmee je de gegevens in een gewoon tekstbestand op slaat. Later gaan we de gegevens opslaan in een echte database. Maak een php-bestand en sla dat op onder de naam opdracht32.php. Typ daarin de volgende code: <title>gastenboek</title> <h2>gastenboek met PHP</h2> <hr> <?php echo date("d-m-y, G:i"); <hr> 20 1.7GET of POST

<br> Wat wil je gaan doen? <ul> <li><a href="gastenboekschrijven.php"> Schrijf in het gastenboek</a></li> <br> <li><a href="gastenboeklezen.php"> Lees het gastenboek</a></li> </ul> Test jouw code. Krijg je hetzelfde scherm als afbeelding 1? In dit programma gebeurt nog niet echt wat nieuws. Er zit ook nauwelijks php-code in maar het is wel weer een mooi voorbeeld van hoe je midden in jouw html-code php kunt invoegen. De menukeuze wordt hier met behulp van een ongeordende lijst gemaakt. Kijk eventueel bij de html hoofdstukken als je niet meer weet hoe die precies werkt. Afbeelding 1: Gastenboekmenu Het zal duidelijk zijn dat de links nog niet werken. Daarvoor zullen we eerst de bestanden gastenboekschrijven.php en gastenboeklezen.php moeten maken. Maak een php-bestand en sla dat op onder de naam gastenboekschrijven.php. Typ daarin de volgende code: <title>in het gastenboek schrijven</title> <form action="opslaan.php" method="post"> <p> De gegevens die u via het volgende formulier invult, worden op het gastenboek geplaatst en zullen voor iedereen zichtbaar zijn. </p> <p> Naam: <br> <input name="naam" type="text" size="40" tabindex="1"> </p> <p> E-mail: (optioneel)<br> <input name="email" type="text" size="40" tabindex="2"> </p> <p> Woonplaats: (optioneel)<br> <input name="woonplaats" type="text" size="40" Hoofdstuk 1Wat is PHP? 21

tabindex="3"> </p> <p> Uw bericht: <br> <textarea name="bericht" rows="8" cols="40" tabindex="4"> </textarea> </p> <p> <input type="submit" name="submit" value="verstuur" title="verstuur dit formulier" tabindex="5"> </p> </form> Ook dit is een bestand zonder php-code. Er is bewust voor gekozen de php-code buiten dit programma te houden. Met PHP-SELF was het wel mogelijk geweest dit in één bestand te plaatsen maar dan zou het nogal onoverzichtelijk worden. Bovendien geeft dit de mogelijkheid om later een andere manier van opslaan te kiezen, bijvoorbeeld in een database. Het betekent wel dat we straks ook nog een bestand opslaan.php moeten maken. Het allereerste nieuwe is het gebruik van method="post". Bij het bestand opslaan.php zullen we daar ook rekening mee moeten houden. Bij de input-tag zien we de size en tabindex attributen. Met size geven we aan hoe groot het invulveld moet zijn. Met tabindex geven we de volgorde aan waarmee we door het formulier willen gaan. Je weet ongetwijfeld dat je met de Tab-toets van het ene veld naar het andere kunt springen. Als je tabindex gebruikt kun je daarmee die volgorde nummeren. Tenslotte maken we hier gebruik van de textarea tag waarbij we het aantal rijen en kolommen aangeven. Experimenteer gerust met de getallen daarbij om te zien wat het effect is. En dan nu het echte opslaan! Maak een php-bestand en sla dat op onder de naam opslaan.php. Typ daarin de volgende code: <?php $bestandsnaam = "gastenboek.txt"; $datum = date("d-m-y, G:i"); // gastenboek openen of maken if (!$fp = fopen($bestandsnaam, "a+")){ echo "<h2>het lukt niet om het gastenboek te openen</h2>"; exit; // het wegschrijven van de gegevens fputs($fp, $datum); fputs($fp, "\n"); fputs($fp, $_POST["naam"]); fputs($fp, "\n"); fputs($fp, $_POST["email"]); fputs($fp, "\n"); fputs($fp, $_POST["woonplaats"]); fputs($fp, "\n"); fputs($fp, $_POST["bericht"]); fputs($fp, "\n"); fclose($fp); echo "<h2>klaar</h2>"; echo "<p>de bijdrage is opgeslagen</p>"; 22 1.7GET of POST

echo "<a href = \"opdracht32.php\">terug naar het beginscherm</a>"; Hier hebben we dan eindelijk volop php-code. Maar echt moeilijk is het niet. Laten we de belangrijkste zaken even doornemen. Allereerst wordt met $bestandsnaam = "gastenboek.txt" aangegeven in welk bestand de gegevens zullen komen. Omdat we er ook de datum bij willen hebben zoeken we die vast op met $datum = date("d-m-y, G:i"). Dan wordt de bestandsnaam geopend met het attribuut "a+". Zoek maar op wat dat attribuut doet. Vooropgesteld dat het lukt om het bestand te openen (met if (!$fp = fopen($bestandsnaam, "a+")) wordt dat gecontroleerd) krijg je daarna een aantal fputs opdrachten waarmee dan de betreffende gegevens worden weggeschreven. Met $fp (de filepointer) wordt aangegeven waarin het moet worden weggeschreven en bijgehouden op welke plaats in het bestand. Na ieder gegeven dat wordt weggeschreven volgt een fputs($fp, "\n"). Daarmee wordt de code voor een nieuwe regel (zeg maar de [Enter] toets) weggeschreven. Anders zou je al je tekst achter elkaar aan krijgen. En dat is niet de bedoeling. Tenslotte nog even de laatste zin: echo "<a href = \"opdracht32.php\">terug naar het beginscherm</a>" Alles wat na echo komt moet tussen aanhalingstekens (") staan. Maar als je daarbinnen ook nog de aanhalingstekens wilt gebruiken moet je iets doen om te voorkomen dat de computer denkt dat de echo-regel al weer afgelopen is. En dat kan door er een backslash voor te plaatsen zoals gebeurt bij \"opdracht32.php\". Als alles goed werkt dan krijg je aan het eind de melding: De bijdrage is opgeslagen. Maar kun je die ook zien? In jouw htdocs map staat nu een bestand gastenboek.txt. Als je dat opent zie je, als het goed gegaan is, dat wat je op het scherm hebt ingevuld. Maar uiteraard is het veel te lastig om zo de bijdragen in het gastenboek te lezen. We zullen nog één programma moeten maken, namelijk gastenboeklezen.php. Maak een php-bestand en sla dat op onder de naam gastenboeklezen.php, en typ daarin de volgende code: <title>het gastenboek lezen</title> <?php $bestandsnaam = "gastenboek.txt"; // aantal regels per bijdrage om in te lezen // elke bijdrage bestaat uit 5 regels $aantal_regels = 5; // teller om bij te houden hoeveel regels // zijn gelezen $teller = 0; // Aantal bijdragen wordt bijgehouden. $aantal_bijdragen = 0; // gastenboek openen om te lezen if (file_exists($bestandsnaam)){ Hoofdstuk 1Wat is PHP? 23

$fp = fopen($bestandsnaam, "r"); else{ echo "<h2>het gastenboek is nog leeg!</h2> <a href=\"gastenboekschrijven.php\"> Wees de eerste die erin schrijft!</a> "; exit; while (!feof($fp)){ $regel = fgets($fp); if (!feof($fp)){ if ($teller % $aantal_regels == 0){ // kop afdrukken $aantal_bijdragen++; echo "<hr>"; echo "<h3>bijdrage: $aantal_bijdragen</h3>"; // regel afdrukken echo "$regel <br>"; $teller++; echo "<a href=\"opdracht32.php\">terug naar de homepage</a>"; Het eerste deel zal, zeker met de commentaarregels erin, niet zo moeilijk te begrijpen zijn. Laten we naar het tweede gedeelte kijken: De while (!feof($fp)) regel start een zogenaamde loop. Je zou die kunnen vertalen met: Doe zolang (while) je nog niet (!) het eind (feof) van het bestand ($fp) hebt bereikt alles wat daarna tussen accolades staat. En tussen de accolades komen we eerst $regel = fgets($fp) tegen. Met fgets worden de regels van $fp één voor één uitgelezen en in de variabele $regel gestopt. Daarna vraagt hij opnieuw met if (!feof($fp)) of hij aan het eind van het bestand is gekomen. Met de voorgaande code-regel heeft hij immers een regel van het bestand ingelezen dus het zou kunnen dat hij daarna wel aan het eind was. Dit lijkt een beetje vreemd maar het probleem is dat als hij de laatste regel heeft ingelezen, hij nog niet weet of hij daadwerkelijk aan het eind van het bestand is gekomen. Want het inlezen van die laatste regel ging immers nog prima. Maar pas als hij probeert een regel na de laatste regel in te lezen zal de functie feof(...) een true als resultaat geven en dus is dan pas duidelijk dat het bestand helemaal gelezen is. Hier gaat het eigenlijk alleen maar om de vraag of de kop moet worden afgedrukt. In eerste instantie zal hij nog niet aan het eind van het bestand zijn dus komt hij bij de regel if ($teller % $aantal_regels == 0). Het procentteken hier is de modulus functie. Met de modulus functie wordt de rest berekend van een deling. Dus hier staat: als je $teller deelt door $aantal_regels en de rest is 0, doe dan wat er tussen de accolades staat. Daarmee zorgt hij ervoor dat er na iedere 5 regels een lijn <hr> geplaatst wordt en dat daarna het nummer van de volgende bijdrage op het scherm komt. $teller telt het aantal regels dat ingelezen is. $aantal_regels geeft aan hoeveel regels één bericht bevat. Dus als $teller een veelvoud is van 5 wordt $aantal_bijdragen met één verhoogd, wordt er een horizontale lijn getekend en wordt de volgende kopregel met het bijdragenummer op het scherm getoond. 24 1.7GET of POST

Bij de allereerste keer heeft $teller nog de waarde 0, zal de deling dus een rest van 0 opleveren en wordt de kop afgedrukt. Daarna wordt de eerste regel van het bericht afgedrukt. Met $teller++ wordt de regelteller met 1 verhoogd waarna de while loop opnieuw doorlopen wordt, alle regels worden afgedrukt en bij iedere 5de regel wordt er ook een kop afgedrukt. En dat heeft je dus een werkend gastenboek opgeleverd. Alleen één ding mis je met dit gastenboek wel. Alle bijdragen verwijderen kan eenvoudig door gastenboek.txt van jouw schijf te verwijderen maar het zou handig zijn om gewoon via dit programma ook één bijdrage uit de reeks te kunnen verwijderen. Om dat te kunnen gaan we het gastenboek later onderbrengen in een database. Opdracht 33 Probeer het programma dusdanig te wijzigen dat niet alleen de regels afgedrukt worden maar voor elke regel ook staat wat het is. Dus niet alleen: pietje@hotmail.com maar: email: pietje@hotmail.com Bijvoorbeeld zoals in afbeelding 2. Tip: je kunt strings (tekstregels) aan elkaar koppelen in PHP door er een punt tussen te zetten. Zoals: fputs($fp, "Datum: ". $datum); Afbeelding 2: Gastenboek lezen met aanduiding voor elke regel Opdracht 34 Wat gebeurt er als je in het berichtenveld op [Enter] drukt? Controleer of het wel goed werkt! Heb je een idee hoe je dat op zou kunnen lossen? Opdracht 35 Pas het gastenboek dusdanig aan dat je gebruik maakt van een apart CSS bestand waarin de opmaak geregeld wordt. In dat CSS bestand (dat voor alle bij het gastenboek gebruikte programma s moet gelden) moeten in ieder geval zaken geregeld worden als de achtergrondkleur, de link kleuren en de lettertypen. Opdracht 36 Pas het gastenboek dusdanig aan dat steeds na iedere bijdrage een horizontale lijn krijgt i.p.v. voor iedere bijdrage. Afbeelding 3: Gastenboek lezen met horizontale lijn onder de bijdrage Hoofdstuk 1Wat is PHP? 25

2 PHP met database Eén van de meest voorkomende toepassingen van PHP op een webserver is die waarbij PHP contact maakt met een database. Omdat we al gewend zijn aan het werken met XAMPP zullen we nu ook het MySQL gedeelte daarvan gaan gebruiken. En die MySQL database gaan we benaderen met behulp van PHP met de zogenaamde PDO extensie. PDO is de afkorting van PHP Data Objects. Het is gemaakt om diverse databases te kunnen be - naderen zonder al teveel aan de PHP-code te moeten veranderen. Het is als het ware wat extra software tussen PHP en de database. Laten we eerst de belangrijkste mogelijkheden ervan bekijken. Het eerste wat je moet doen om vanuit PHP met een database te kunnen werken is de verbinding naar die database tot stand te brengen. Gelukkig is dat niet zo heel erg moeilijk. Als je dan gebruik gemaakt hebt van de database moet je de verbinding ook weer sluiten. Dat gaat als volgt in een stukje PHP-code: <?php // Maken van verbinding $db = new PDO('mysql:host=localhost;port=3307;dbname=test', 'root', 'usbw'); // Dan komt hier de code waarin je gebruik maakt //van de database // Tenslotte de verbinding weer sluiten $db = NULL; Wat je in feite hier doet is een nieuwe (new) instantie (object) van de PDO klasse maakt. Bij het aanmaken ervan wordt met ('mysql:host=localhost;port=3307;dbname=test','root', 'usbw') een aantal parameters meegegeven. Het zal duidelijk zijn dat PHP hier een verbinding wil aanmaken met mysql. Met host=localhost wordt aangegeven dat het om een database gaat die op dezelfde computer draait als waar ook PHP werkt. Met port=3307 wordt aangegeven op welke poort van de computer de communicatie met de database plaats vindt. Met dbname=test wordt in MySQL verbinding gezocht met een database met de naam test. Tenslotte wordt er met 'user', 'password' een gebruikersnaam en wachtwoord meegegeven. 26 2PHP met database

Het nieuwe object wordt dan aangemaakt en er wordt in de objectvariabele $db een verwijzing naar dat object opgeslagen. De verbinding met de database kun je weer sluiten door de verwijzing in de objectvariabele $db gelijk te stellen aan NULL waarna het object niet meer bestaat. Laten we het eens met een echte database proberen en kijken wat we er dan mee kunnen. Let op: het volgende deel komt uit de module Databases & SQL. Heb je dat bewaard dan heb je de database al geïmporteerd en hoef je dat natuurlijk niet opnieuw te doen. Om goed te oefenen met SQL kunnen we natuurlijk een groot oefenbestand aanmaken. Handiger is het gebruik te maken van een reeks SQL opdrachten die in een bestand zitten. Bekijk het bestand winkel.sql (je krijgt dat van je docent of het staat in de elo) maar eens met Notepad++. Je ziet dan een aantal SQL opdrachten waarmee eerst de database wordt aangemaakt, daarna de tabellen en die worden ook met behulp van een SQL opdracht gevuld met gegevens. Een dergelijk bestand noemen we een SQL-dump. Met MySQL kun je ook zo n dump maken waarmee je dus een backup van jouw gegevens hebt. Maar nu gebruiken we het om de gegevens in MySQL te importeren. Opdracht 11 Start phpmyadmin Klik op de tab Klik op bestand kiezen en selecteer het bestand winkel.sql Klik op Start Als het goed gegaan is krijg je de melding: Import is geslaagd, 7 queries uitgevoerd. Dat betekent dat we nu de beschikking hebben over een bestand om mee te oefenen. Maar voor we aan de slag gaan is het goed nog even te kijken naar de structuur van de tabellen die we nu in de database winkel hebben. Want om goed te kunnen oefenen moet je de velden kennen. Door het bestand winkel.sql werden met de CREATE TABLE opdracht de volgende twee tabellen gemaakt: klanten klantnummer voornaam achternaam woonplaats provincie bestelde_artikelen klantnummer order_datum artikel hoeveelheid prijs In de SELECT opdrachten zullen we gebruik maken van de namen van de velden. Hoofdstuk 2PHP met database 27

Nu we de beschikking hebben over een echte database kunnen we aan de slag met SQL-opdrachten met behulp van PHP. 2.1 gegevens lezen Opdracht 37 Zorg eerst dat Apache en MySQL gestart zijn. Typ daarna de volgende code in Notepad++ of de editor die jij gebruikt en sla dit bestand op in de map htdocs. Start daarna het programma door in de browser http://localhost:8080/opdracht37.php te typen. Let op: als je een ziet betekent dat dat je de volgende regel er achteraan moet typen! <title>de klanten van de winkel</title> <?php // Maken van verbinding $db = new PDO('mysql:host=localhost;port=3307; dbname=winkel', 'root', 'usbw'); // Dan komt hier de code waarin je gebruik maakt // van de database $sql = "SELECT achternaam FROM klanten"; $resultaat = $db->query($sql); foreach($resultaat as $row) { echo $row['achternaam'].'<br>'; // Sluiten van verbinding $db = NULL; En? Zie je het lijstje namen uit de klantentabel? Dat is namelijk de bedoeling. Mocht je de lijst niet zien dan heb je misschien vergeten Apache en/of MySQL te starten? Of misschien heb jij zelf de standaard inlogcode van MySQL gewijzigd? In dat geval zul je de code daarop aan moeten passen. Eerst maar even wat uitleg van deze code. De verbinding met de database wordt met de regel: $db = new PDO('mysql:host=localhost;port=3307;dbname=winkel', 'root', 'usbw'); tot stand gebracht. Je ziet dat de database-naam winkel hier in de code staat net zoals de inlognaam root. Met de standaard installatie van XAMPP is er maar één gebruiker, namelijk root en die heeft geen wachtwoord. Dat is natuurlijk helemaal niet veilig en zul je bij een echte database nooit moeten doen maar voor ons is het prima zo. 28 2.1gegevens lezen

De verbinding is een object en wordt in de objectvariabele $db opgeslagen. $db noemen we ook wel de database-handle. Als we verderop in de code de database gaan benaderen dan doe we dat door gebruik te maken van de database-handle. Met de regel: $sql = 'SELECT achternaam FROM klanten'; wordt de query samengesteld en in de variabele $sql opgeslagen. De PDO klasse heeft twee methodes voor het uitvoeren van queries op de database, namelijk query() en exec(). query() is het eenvoudigst, die voert de query uit en geeft het resultaat terug. exec() doet dat ook maar geeft naast het resultaat ook het aantal aangepaste rijen terug. Hier gebruiken we eerst query(). De zin: $resultaat = $db->query($sql); zal nu ook wel duidelijk zijn ook al is de notatie misschien een beetje vreemd. Op deze manier wordt de query op de database die wordt aangegeven met $db uitgevoerd en het resultaat van de query wordt in $resultaat opgeslagen. Tenslotte het stukje code waarmee het resultaat op de webpagina wordt weergegeven. foreach($resultaat as $row) { echo $row['achternaam'].'<br>'; Hier wordt gebruik gemaakt van een foreach-loop. Voor iedere rij in het $resultaat wordt de achternaam naar het scherm ge echo d. Met de <br> erachter krijgen we ze keurig steeds op een nieuwe regel afgedrukt. Herinner jij je nog dat je met een punt strings aan elkaar kunt koppelen? Voor HTML staat daardoor <br> meteen achter de achternaam. Opdracht 38 Maak op dezelfde wijze een PHP programma waarmee je de artikelen en de bijbehorende prijs uit de bestelde_artikelen-tabel krijgt. (Je zult merken dat de uitvoer mogelijk niet zo mooi is. De prijs komt vlak achter de arikelnaam. Vaak wordt een dergelijke uitvoer in een tabel gepresenteerd maar met behulp van JavaScript en CSS kan het nog veel mooier. Voorlopig is dat voor ons niet van belang.) 2.2 gegevens toevoegen Opdracht 39 Op soortgelijke manier kunnen we ook een klant toevoegen. Maak een PHP programma, geef het de naam opdracht39.php en plaats er de volgende code in: <title>een klant toevoegen</title> <?php // Maken van verbinding $db = new PDO('mysql:host=localhost;port=3307; dbname=winkel', 'root', 'usbw'); // De klant toevoegen $sql = "INSERT INTO klanten (voornaam, achternaam, Hoofdstuk 2PHP met database 29

woonplaats, provincie) VALUES ('Karel', 'Doorman', 'Assen', 'Drenthe')"; $resultaat = $db->exec($sql); echo 'Aantal toegevoegde klanten: '.$resultaat; $db = NULL; Heb je met phpmyadmin gecontroleerd of de nieuwe klant is toegevoegd nadat je het bovenstaande programma gestart hebt? Dan is je misschien ook opgevallen dat het klantnummer niet ingevuld is. Oftewel dat heeft de waarde 0. Het is duidelijk dat het hier geen AUTO_INCRE- MENT veld is. Laten we dan in de volgende opdracht het klantnummer aanpassen: 2.3 gegevens wijzigen Opdracht 40 Maak een PHP programma, geef het de naam opdracht40.php en plaats er de volgende code in: <title>een klant wijzigen</title> <?php // Maken van verbinding $db = new PDO('mysql:host=localhost;port=3307; dbname=winkel', 'root', 'usbw'); // De klant wijzingen $sql = "UPDATE klanten SET klantnummer = 10500 WHERE klantnummer = 0"; $resultaat = $db->exec($sql); echo 'Aantal aangepaste rijen: '.$resultaat; $db = NULL; De code van opdracht 39 en opdracht 40 zal verder niet zo moeilijk te begrijpen zijn. Het enige echte verschil is de regel die begint met $sql. Met INSERT INTO voeg je dus een record toe aan de tabel, met UPDATE kun je een record wijzigen. Bij UPDATE moet je er uiteraard wel goed voor waken dat je het juiste record wijzigt. Meestal zal dat gebeuren op basis van het sleutelveld omdat een record daaraan uniek is te herkennen. 30 2.3gegevens wijzigen

2.4 foutmeldingen Tot nu toe hebben we niets aan foutmeldingen gedaan. Toch is het wel handig daar gebruik van te maken. PDO heeft een redelijk aantal foutmeldingen waarvan wij zelf kunnen beslissen of we ze wel of niet aan zullen zetten. We zullen daar niet al te diep op in gaan maar één is toch wel belangrijk. We willen namelijk altijd wel weten of de verbinding met de MySQL server en de database is gelukt. Dat heeft immers ook te maken met of de gebruikersnaam en het wachtwoord wel goed zijn ingetypt. Opdracht 41 Open opdracht37.php in jouw editor en sla deze opnieuw op maar nu onder de naam opdracht41.php Wijzig de regel: $db = new PDO('mysql:host=localhost;port=3307;dbname=winkel', 'root', 'usbw'); in: try { $db = new PDO('mysql:host=localhost;port=3307; dbname=winkel', 'root', 'usbw'); catch(pdoexception $e) { echo $e->getmessage(); Nu moeten we nog een fout genereren om het te testen. Schakel daarvoor de MySQL-server even uit en test dan het programma. Als het goed is krijg je nu een foutmelding met de mededeling dat hij geen verbinding kan maken met de MySQL: SQLSTATE[HY000] [2003] Can't connect to MySQL server on 'localhost' (10061) Er zijn nog veel meer mogelijkheden met foutmeldingen, je kunt ieder contact met de server daarmee controleren, maar voor ons doel is het zo voldoende. 2.5 een CRUD voorbeeld Onder CRUD wordt verstaan: Create, Retrieve, Update en Delete. Dat zijn zo ongeveer alle acties die we op een tabel of een aantal tabellen los willen laten. Tot nu toe hebben we een beetje gespeeld met de diverse SQL opdrachten maar laten we de CRUD acties met de winkel database eens helemaal uitwerken. Het handigst is dan te beginnen met een menu van waarnuit we alles kunnen doen. Opdracht 42 Maak een php bestand met de naam opdracht42menu.php en plaats daarin de code zoals hieronder: <title>klanten van de winkel</title> Hoofdstuk 2PHP met database 31

<h2>crud met de klanten</h2> <hr> <?php echo date("d-m-y, G:i"); <hr> <br> Wat wil je gaan doen? <ul> <li> <a href="opdracht42bekijken.php"> Klanten bekijken/wijzigen/verwijderen</a> </li> <br> <li> <a href="opdracht42toevoegen.php"> Klanten toevoegen</a> </li> </ul> Dat bestandje zul je ongetwijfeld nog wel herkennen van het menu van het gastenboek. Dus de code zal ook geen problemen opleveren. We zien daarin twee links en dat betekent dat we die bestanden ook aan moeten maken. Eerst het toevoegen maar. Maak een PHP-bestand met de naam opdracht42toevoegen.php aan en plaats daarin de code zoals hieronder: <title>klanten invoeren</title> <form action="opdracht42opslaan.php" method="post"> <p> Klantnummer: <br> <input name="klantnummer" type="text" size="30" tabindex="1"> </p> <p> Voornaam: <br> <input name="voornaam" type="text" size="30" tabindex="2"> </p> <p> Achternaam: <br> <input name="achternaam" type="text" size="30" tabindex="3"> </p> <p> Woonplaats: <br> <input name="woonplaats" type="text" size="30" tabindex="4"> </p> 32 2.5een CRUD voorbeeld

<p> Provincie: <br> <input name="provincie" type="text" size="30" tabindex="5"> </p> <p> <input type="submit" name="submit" value="verstuur" title="verstuur dit formulier" tabindex="6"> </p> </form> Wat je hier ziet is een gewoon HTML formulier waarvan de gegevens door middel van POST naar opdracht42opslaan.php worden verstuurd. Dus tijd om daarmee aan de slag te gaan. Maak een PHP-bestand met de naam opdracht42opslaan.php aan en plaats daarin de code zoals hieronder: <title>een klant toevoegen</title> <?php // Maken van verbinding try { $db = new PDO('mysql:host=localhost;port=3307; dbname=winkel', 'root', 'usbw'); catch(pdoexception $e) { echo $e->getmessage(); // De SQL opdracht $sql = "INSERT INTO klanten (klantnummer, voornaam, achternaam, woonplaats, provincie) VALUES ($_POST[klantnummer], '$_POST[voornaam]', '$_POST[achternaam]', '$_POST[woonplaats]', '$_POST[provincie]')"; $resultaat = $db->exec($sql); // Controle van de toegevoegde gegevens $sql = "SELECT * FROM klanten where klantnummer = $_POST[klantnummer]"; $resultaat = $db->query($sql); foreach($resultaat as $row) { echo '<p>'; echo 'Klantnummer: '.$row['klantnummer'].'<br>'; echo 'Voornaam: '.$row['voornaam'].'<br>'; echo 'Achternaam: '.$row['achternaam'].'<br>'; echo 'Woonplaats: '.$row['woonplaats'].'<br>'; echo 'Provincie: '.$row['provincie'].'<br>'; Hoofdstuk 2PHP met database 33

echo '</p>'; echo "<p>is toegevoegd!</p>"; echo "<p><form action='opdracht42menu.php' method='post'> <input type='submit' name='submit' value='terug'> </form></p>"; $db = NULL; Ook hier niet echt wat nieuws in dit deel. De SQL-opdrachten zijn hier wat uitgebreider dan eerder maar echt nieuwe zaken zitten hier niet in. De INSERT INTO opdracht werkt met de gegevens die via POST meegenomen zijn vanuit opdracht42toevoegen.php. Eenmaal toegevoegd worden de gegevens meteen weer opgevraagd zodat je kunt controleren of het toevoegen is gelukt. Dan nu het bekijken, wijzigen en verwijderen van klanten. Als je de klanten kunt bekijken is het handig meteen in dat overzicht aan te kunnen geven of je gegevens wilt wijzigen of bepaalde klanten wilt verwijderen. Vandaar dat dat in één overzicht geplaatst is. Afbeelding 4: Het klantenoverzicht met wijzig en verwijderknop Maak een PHP-bestand met de naam opdracht42bekijken.php aan en plaats daarin de code zoals hieronder: <title>het klantenoverzicht</title> <?php // Maken van verbinding try { $db = new PDO('mysql:host=localhost;port=3307; dbname=winkel', 'root', 'usbw'); catch(pdoexception $e) { echo $e->getmessage(); // De SQL opdracht $sql = 'SELECT * FROM klanten'; $resultaat = $db->query($sql); 34 2.5een CRUD voorbeeld

// De HTML-tabel opbouwen echo '<table border = 1>'; foreach($resultaat as $row) { echo '<tr>'; $nummer = $row['klantnummer']; echo '<td>'.$row['klantnummer'].'</td>'; echo '<td>'.$row['voornaam'].'</td>'; echo '<td>'.$row['achternaam'].'</td>'; echo '<td>'.$row['woonplaats'].'</td>'; echo '<td>'.$row['provincie'].'</td>'; echo "<td><form action='opdracht42wijzigen.php' method='post'> <input type='hidden' name='verstopt' value=$nummer> <input type='submit' name='wijzig' value='wijzig'> </form></td>"; echo "<td><form action='opdracht42verwijderen.php' method='post'> <input type='hidden' name='verstopt' value=$nummer> <input type='submit' name='verwijder' value='verwijder'></form></td>"; echo '</tr>'; echo '</table>'; // Sluiten van verbinding $db = NULL; Met behulp van een foreach loop worden de resultaten van de query getoond. Bijzonder hieraan is dat de gegevens in een HTML-tabel zichtbaar worden. Bovendien worden in die tabel meteen twee knoppen meegenomen. In de bijbehorende echo opdracht zie je dat iedere knop in een form zit met een eigen action. Op die manier wordt er per regel een knop toegevoegd met een actie die bij die regel hoort. Om het klantnummer mee te nemen in die action wordt deze via een hidden input aan het form toegevoegd. De actions in dit programmadeel brengen ons naar weer twee programma s. Dus aan de slag daarmee. Eerst opdracht42wijzigen.php. Maak een PHP-bestand met de naam opdracht42wijzigen.php aan en plaats daarin de code zoals hieronder: <title>klant wijzigen</title> <?php // Maken van verbinding try { $db = new PDO('mysql:host=localhost;port=3307; dbname=winkel', 'root', 'usbw'); catch(pdoexception $e) { Hoofdstuk 2PHP met database 35

echo $e->getmessage(); // De SQL opdracht // Hier wordt de klant geselecteerd om de gegevens op // te halen die je wilt wijzigen. Het klantnummer zit // in $_POST[verstopt] $sql = "SELECT * FROM klanten WHERE klantnummer = $_POST[verstopt]"; $resultaat = $db->query($sql); // De klantgegevens worden in variabelen gestopt zodat // we ze in het formulier kunnen zien foreach($resultaat as $row) { $klantnummer = $row['klantnummer']; $voornaam = $row['voornaam']; $achternaam = $row['achternaam']; $woonplaats = $row['woonplaats']; $provincie = $row['provincie']; // Sluiten van verbinding $db = NULL; echo "<form action='opdracht42wijzigdefinitief.php' method='post'> <p>klantnummer: <br> <input name='klantnummer' type='text' size='30' value=$klantnummer tabindex='1'> </p> <p>voornaam: <br> <input name='voornaam' type='text' size='30' value=$voornaam tabindex='2'> </p> <p>achternaam: <br> <input name='achternaam' type='text' size='30' value=$achternaam tabindex='3'> </p> <p>woonplaats: <br> <input name='woonplaats' type='text' size='30' value=$woonplaats tabindex='4'> </p> <p>provincie: <br> <input name='provincie' type='text' size='30' value=$provincie tabindex='5'> </p> <p><input type='submit' name='submit' value='verstuur' title='verstuur dit formulier' tabindex='6'> </p> </form>" 36 2.5een CRUD voorbeeld

Wat we hier zien is eigenlijk weer hetzelfde programmadeel als dat wat we gebruikten voor het invoeren van een nieuwe klant. Het verschil is hier dat er eerst een query gedaan wordt om de gegevens van de betreffende klant te vinden en door middel van variabelen worden die gegevens nu in het formulier geplaatst. Dit gebeurt door de value s van de invulvelden te vullen met de variabelen zoals die uit de database zijn gehaald. En ook hier zien we weer een action die ons doorstuurt naar het programma opdracht42wijzigdefinitief.php. Dat wordt dus het volgende te maken programma. Maak een PHP-bestand met de naam opdracht42wijzigdefinitief.php aan en plaats daarin de code zoals hieronder: <title>klant wijzigen</title> <?php // Maken van verbinding try { $db = new PDO('mysql:host=localhost;port=3307; dbname=winkel', 'root', 'usbw'); catch(pdoexception $e) { echo $e->getmessage(); // De update opdracht $sql = "UPDATE klanten SET voornaam = '$_POST[voornaam]', achternaam = '$_POST[achternaam]', woonplaats = '$_POST[woonplaats]', provincie = '$_POST[provincie]' WHERE klantnummer = $_POST[klantnummer]"; $aantalregelsgewijzigd = $db->exec($sql); // Het wijziging bekijken $sql = "SELECT * FROM klanten WHERE klantnummer = $_POST[klantnummer]"; $resultaat = $db->query($sql); foreach($resultaat as $row) { echo '<p>'; echo 'Klantnummer: '.$row['klantnummer'].'<br>'; echo 'Voornaam: '.$row['voornaam'].'<br>'; echo 'Achternaam: '.$row['achternaam'].'<br>'; echo 'Woonplaats: '.$row['woonplaats'].'<br>'; echo 'Provincie: '.$row['provincie'].'<br>'; echo '</p>'; echo "<p>is nu gewijzigd!</p>"; echo "<p><form action='opdracht42bekijken.php' method='post'> <input type='submit' name='submit' value='terug'> </form></p>"; Hoofdstuk 2PHP met database 37

$db = NULL; In opdracht 40 hebben we de update opdracht al gehad dus echt wat nieuws zie je hier ook niet bij. Nog twee programma s te gaan. Ze worden hier zonder verder commentaar geplaatst in de veronderstelling dat je nu wel de code zou moeten begrijpen. Maak een PHP-bestand met de naam opdracht42verwijderen.php aan en plaats daarin de code zoals hieronder: <title>klant verwijderen</title> <?php // Maken van verbinding try { $db = new PDO('mysql:host=localhost;port=3307; dbname=winkel', 'root', 'usbw'); catch(pdoexception $e) { echo $e->getmessage(); // De SQL opdracht // Hier wordt de klant geselecteerd om de gegevens op // te halen die je wilt verwijderen. Het klantnummer zit // in $_POST[verstopt] $sql = "SELECT * FROM klanten WHERE klantnummer = $_POST[verstopt]"; $resultaat = $db->query($sql); foreach($resultaat as $row) { echo '<p>'; $nummer = $row['klantnummer']; echo 'Klantnummer: '.$row['klantnummer'].'<br>'; echo 'Voornaam: '.$row['voornaam'].'<br>'; echo 'Achternaam: '.$row['achternaam'].'<br>'; echo 'Woonplaats: '.$row['woonplaats'].'<br>'; echo 'Provincie: '.$row['provincie'].'<br>'; echo '</p>'; echo "<p> <form action='opdracht42definitiefverwijderen.php' method='post'> Weet u zeker dat u deze klant wilt verwijderen? <input type='hidden' name='klantnummer' value=$nummer> <input type='submit' name='verwijderja' value='ja'> </form></p>"; echo "<p><form action='opdracht42menu.php' method='post'> <input type='submit' name='verwijdernee' value='terug'> 38 2.5een CRUD voorbeeld

</form></p>"; // Sluiten van verbinding $db = NULL; Maak een PHP-bestand met de naam opdracht42definitiefverwijderen.php aan en plaats daarin de code zoals hieronder: <title>klant verwijderen</title> <?php // Maken van verbinding try { $db = new PDO('mysql:host=localhost;port=3307; dbname=winkel', 'root', 'usbw'); catch(pdoexception $e) { echo $e->getmessage(); // Hier wordt de klant geselecteerd om de gegevens op // te halen die je wilt verwijderen $sql = "SELECT * FROM klanten WHERE klantnummer = $_POST[klantnummer]"; $resultaat = $db->query($sql); foreach($resultaat as $row) { echo '<p>'; echo 'Klantnummer: '.$row['klantnummer'].'<br>'; echo 'Voornaam: '.$row['voornaam'].'<br>'; echo 'Achternaam: '.$row['achternaam'].'<br>'; echo 'Woonplaats: '.$row['woonplaats'].'<br>'; echo 'Provincie: '.$row['provincie'].'<br>'; echo '</p>'; $sql = "DELETE FROM klanten WHERE klantnummer = $_POST[klantnummer]"; $resultaat = $db->exec($sql); echo "<p>is nu verwijderd!</p>"; echo "<p><form action='opdracht42menu.php' method='post'> <input type='submit' name='submit' value='terug'> </form></p>"; // Sluiten van verbinding $db = NULL; Hoofdstuk 2PHP met database 39

Zo dat was hem, een volledige CRUD uitwerking. Zeker nog op veel plaatsen mooier te maken maar wat hij doen moet, doet hij. Probeer elk onderdeel te begrijpen. Voor de volgende opdrachten heb je dat nodig. Meer weten? Er is veel op internet hierover te vinden. Kijk bijvoorbeeld hier: http://www.phptuts.nl/view/27/1/ Opdracht 43 Eerder, in opdracht 25, hebben we een bezoekersteller gemaakt. Maak die nu opnieuw maar gebruik PHP PDO en sla de gegevens op in MySQL. Opdracht 44 Maak nu een gastenboek zoals we eerder gemaakt hebben maar werk het nu uit tot een volledige CRUD toepassing. Gebruik daarbij PHP PDO en MySQL. 40 2.5een CRUD voorbeeld