BBO_CONCEPT_PHP

Page 1

ER

N D

(Z O BE C EL ON D CE -& P TA T AL R ED

TI E)

AC

PHP


INHOUD 3

1

Inleiding PHP 1.1 Opdrachten Inleiding PHP 1.2 Opdrachten Datastructuren 1.3 Opdrachten Besturingsstructuren 1.4 Opdrachten Lussen 1.5 Theorie Inleiding PHP 1.6 Oefentoets 1.7 Praktijkopdrachten 1.8 Terugblik 1.9 Toets

5 7 10 20 26 29 61 63 68 69

2

Gestructureerd programmeren 2.1 Opdrachtenset Gestructureerd programmeren 2.2 Opdrachtenset Globale & lokale variabelen 2.3 Opdrachtenset String-methodes 2.4 Opdrachtenset Date-methodes 2.5 Theorie Gestructureerd programmeren 2.6 Test je kennis 2.7 Praktijkopdrachten 2.8 Terugblik 2.9 Toets

3

Persistente datastructuren 3.1 Persistente datastructuren 3.2 Opdrachtenset Cookies in local storage 3.3 Opdrachtenset Sessions in local storage 3.4 Opdrachtenset Persistente datastructuren 3.5 Theorie Persistente datastructuren 3.6 Test je kennis 3.7 Praktijkopdrachten 3.8 Terugblik 3.9 Toets

(Z O

Index

2

AC ED

BE C EL ON D CE -& P TA T AL R

ER API's 4.1 4.2 4.3 4.4 4.5 4.6 4.7

API's Opdrachtenset API's Theorie API's Test je kennis Praktijkopdrachten Terugblik Toets

N D

4

TI E)

Inleiding

73 75 79 83 85 88 104 106 113 113 117 117 117 119 121 125 138 139 144 145 147 147 148 153 163 164 192 193 195


INLEIDING

TI E)

Digitale leeromgeving Bij sommige opdrachten heb je hulpmiddelen nodig. Bijvoorbeeld filmpjes, formulieren of een link naar een website. Deze staan allemaal in de digitale leeromgeving. Dit icoontje verwijst naar de digitale leeromgeving. Om hier te komen ga je naar digitaal.boomonderwijs.nl/beroepsonderwijs.

ED

BE C EL ON D CE -& P TA T AL R

Daarna kun je aan de slag!

AC

Eerste keer inloggen in de digitale omgeving Voordat je de digitale leeromgeving kunt gebruiken moet je je licentie activeren. • Overleg met je docent welk type account je gebruikt. • Ga naar www.boomberoepsonderwijs.nl/licentie. • Bekijk de instructiefilm of lees het stappenplan. • Volg de stappen.

Inleiding Dit boek gaat over back end programmeren in PHP. PHP wordt gebruikt door 76,9% van alle websites met een server-side programmeertaal. Voorkennis Kennis van en ervaring met software development is vereist, met name html, CSS en JavaScript.

Bekijk het volgende filmpje. Het is een inleiding tot PHP in 100 seconden.

Leerdoelen

ER

Je hebt basiskennis van PHP en back end programmeren Je hebt basiskennis van Gegevensanalyse Je kunt databases creëren en manipuleren met MySQL Je kunt gestructureerd programmeren Je hebt basiskennis van Objectgeoriënteerd programmeren Je kunt Application Program Interfaces coderen

N D

1. 2. 3. 4. 5. 6.

(Z O

Elk hoofdstuk bestaat uit: • Theorie, begrippen en opdrachten Hierbij leer je over en oefen je met de praktijk. •

Test je kennis Hiermee kun je zelf je kennis van de theorie testen.

3


4

ER

N D

(Z O BE C EL ON D CE -& P TA T AL R ED

TI E)

AC


TI E) AC ED BE C EL ON D CE -& P TA T AL R

Blok 1 Inleiding PHP

ER

PHP is een veelgebruikte opensourcescripttaal voor algemene doeleinden die vooral geschikt is voor webontwikkeling en die kan worden ingebed in HTML. PHP wordt gebruikt door 76,9% van alle websites met een server-side programmeertaal.

Leerdoelen

Je kunt een ontwikkelomgeving voor PHP creëren. Je kunt de basiskennis van PHP begrijpen en daarmee coderen. Je kunt datastructuren begrijpen en coderen. Je kunt beheersstructuren begrijpen en coderen.

(Z O

N D

1. 2. 3. 4.


ER

N D

(Z O BE C EL ON D CE -& P TA T AL R ED

TI E)

AC


Opdracht 1 Oriëntatie PHP

TI E)

Voer een online onderzoek uit en maak een lijst van de vijf meest gebruikte backend programmeertalen. Geef een korte beschrijving van het gebruikersgebied van de programmeertaal.

AC

1.1 Opdrachten Inleiding PHP

ED

Opdracht 2 Download en installeer het XAMPP framework

Download het XAMPP framework (voor Windows) of MAMPP (voor MacOS) vanaf de website van Apache Friends. 1.

Installeer XAMPP op je harde schijf (níét in de map programs in Windows).

2.

Zoek de map htdocs in je installatie van XAMPP.

3.

Maak een nieuwe map met de naam lessen in de map htdocs van je installatie.

BE C EL ON D CE -& P TA T AL R

• • •

Opdracht 3 Eerste PHP-script

Raadpleeg zo nodig de theorie bij Inleiding PHP. a. Waardoor wordt HTML-code behandeld? door de browser door de server

b. Waardoor wordt PHP-code behandeld? door de browser door de server

PHP

Backend Frontend

N D

HTML

ER

c. Koppel de programmeertaal aan frontend of backend.

De webserver herkent een PHP-script aan de volgende tags:

(Z O

<?php ... ?>

d. Codeer een HTML-pagina met daarin ingebed het volgende blok PHP. Sla het op als info.php in de map htdocs/lessen.

7


<!DOCTYPE html> <html lang="nl"> <head> <meta charset="utf-8">

TI E)

<title>testen</title> </head> <?php phpinfo();

AC

?> <body>

ED

</body>

BE C EL ON D CE -& P TA T AL R

</html>

Opdracht 4 Troubleshooting: de installatie

Troubleshooting of probleemoplossing is een systematisch proces dat wordt gebruikt om de oorzaak van een fout in een computersysteem te achterhalen en de relevante hardware- en softwareproblemen te corrigeren. Het kan gebeuren dat bij de installatie van XAMPP problemen ontstaan. In deze opdracht ga je controleren of de configuratiebestanden correct ingesteld zijn. Soms kun je bij het opstarten van de Apache-server de volgende melding krijgen: "Port 80 blocked". Dit betekent dat software in je computer gebruikmaakt van poort 80, bijvoorbeeld Skype. a. Zet de software waarvan je denkt dat deze poort 80 blokkeert uit (bijvoorbeeld Skype) en start XAMPP opnieuw. b. Als dit niet werkt, open dan het httpd.conf-bestand en zoek de regel: Listen 80. Hier kun je een nieuwe poort, bijvoorbeeld 8080, voor Apache gebruiken. Als je een nieuwe poort gebruikt, moet je dit voortaan in je browser als volgt aangeven: http://localhost:8080

Opdracht 5 Error reporting

ER

Tijdens het maken van je PHP-opdrachten is het handig om alle foutmeldingen te kunnen zien. Open het bestand php.ini en zoek de volgende regel:

N D

;error_reporting = E_ALL

Verwijder het teken (;) om error_reporting te activeren:

(Z O

error_reporting = E_ALL

Opdracht 6 Debuggen Debuggen is het proces waarbij fouten of bugs in de broncode van software worden gevonden en opgelost. Wanneer software niet werkt zoals verwacht, bestuderen computerprogrammeurs de code om te bepalen waarom fouten zijn opgetreden.

8


Blok 1 Inleiding PHP

TI E)

Als je localhost/lessen/info.php opent met de browser en geen pagina te zien krijgt, is het mogelijk dat je een typefout of codeerfout gemaakt hebt. Probeer dan de fouten te traceren door het php_error.log-bestand te openen in Mac of door op Open Error Log te klikken in XAMPP voor Windows. Maak hiervoor de volgende opzettelijke typefout. Verander de regel: phpinfo(); in: phpinf(); En probeer het script opnieuw te draaien vanuit de adresbalk van je browser. Je krijgt de volgende foutmelding in php_error.log te zien: [23-Jul-2018 01:50:13 Europe/Berlin] PHP Fatal error: Uncaught Error: Call to undefined function phpinf()

Opdracht 7 Variabelen

ED

BE C EL ON D CE -& P TA T AL R

Geef aan of de volgende namen van variabelen juist of onjuist zijn. 1. $auto2Juist / Onjuist 2. $auto'sJuist / Onjuist 3. $auto/onderdelenJuist / Onjuist 4. $thuis&tuinJuist / Onjuist 5. $nawJuist / Onjuist 6. $n-a-wJuist / Onjuist 7. $n_a_wJuist / Onjuist 8. $22Juist / Onjuist 9. $$autoJuist / Onjuist 10. $autoKleurJuist / Onjuist

AC

PHP heeft eigen regels bij variabelen benoemen. Je mag bijvoorbeeld geen gereserveerde woorden gebruiken als naam van een variabele.

Opdracht 8 Rekenkundige operatoren

Maak een nieuw PHP-bestand en sla dit op als rekenkundig.php in de map lessen. Voer de volgende rekenkundige operaties uit: 1.

Codeer een PHP-script waarin je de volgende variabelen met de afmetingen in meters van een container opslaat: – breedte = 10 m – lengte = 11 m – hoogte = 5 m.

2.

Reken in je script de volgende variabelen uit: – oppervlakte van de basis van de container in vierkante meters – volume van de container in kubieke meters.

3.

Echo de resultaten. Die moeten er als volgt uitzien: – containerbasisoppervlakte is 110 vierkante meters – containervolume is 550 kubieke meters.

4.

Een kubieke meter bevat 1.000 liters. Bereken het aantal liters in het volume van je container. $liters = ?

5.

Hoeveel liters passen in een kwart van je container? $kwart = ?

6.

1 liter is gelijk is aan 0.2641720524 gallon(VS.). Converteer je $kwart in gallons. $gallons = ?

N D

ER

(Z O

• • •

9


Het resultaat ziet er als volgt uit:

1.2 Opdrachten Datastructuren Opdracht 9 Datatypen

1.

Typ het volgende over en sla het op als datatypen.php in de map lessen.

<?php

BE C EL ON D CE -& P TA T AL R

$naam = "Carl";

ED

AC

Een datatype is een attribuut dat is gekoppeld aan een stukje gegevens en vertelt hoe de waarde ervan geïnterpreteerd moet worden. Voer de volgende operaties met datatypen uit:

$straat = "Kruislaan 111"; $woonplaats = "Utrecht"; ?>

2.

Typ het volgende over en sla het op als datatypen.php in de map lessen.

<?php

$naam = "Carl";

$straat = "Kruislaan 111"; $woonplaats = "Utrecht";

$naw = $naam . $straat . $woonplaats; echo "Gegevens: $naw";

ER

?>

N D

Hier hebben we de variabele $naw binnen een string als volgt geplaatst:

(Z O

echo "Gegevens: $naw";

De waarde van de variabele wordt eerst geëvalueerd en daarna wordt de echo-opdracht uitgevoerd. Het resultaat van deze opdracht moet er als volgt uitzien: Gegevens: Carl Kruislaan 111 Utrecht

10

TI E)

Containerbasisoppervlakte is: 110 vierkante meters Containervolume is: 550 kubieke meters Liters in container: 550000 Liters in kwart container: 137500 Gallons in kwart container: 36323.657205


Blok 1 Inleiding PHP

Opdracht 10 Datatypen a. Je kunt een speciale syntaxis (genaamd heredoc) gebruiken om strings in PHP te definiëren. Na de <<< operator moet je een ID opgeven met daarin welke naam je maar wilt. In de volgende regel staat de string zelf. Aan het einde voeg je dezelfde ID toe. Maak de volgende code:

$naam = "Jacinda";

TI E)

echo <<<TEKST <br>Salarisspecificatie van $naam: 2000 euro's <br>Maand: November

AC

<br>Jaar: 2023

ED

TEKST;

BE C EL ON D CE -& P TA T AL R

Let op

De eindtag moet dezelfde naam als de begintag hebben, in dit geval <<<TEKST. De eindtag TEKST(zonder <<<) moet direct aan het begin van de regel (dus tegen de linkerkantlijn) beginnen, anders krijg je een error.

Het resultaat van deze opdracht zie je hierna: Salarisspecificatie van Jacinda: 2000 euro's Maand: November Jaar: 2023

b. Converteer het salaris van Jacinda naar dollars als de dollarkoers 0.94176 is.

Toon het bedrag in dollars afgerond op twee decimalen. Het resultaat moet er als volgt uitzien: Bedrag in dollars is: 1883.52

Opdracht 11 Datatypen

ER

Noteer het resultaat van de codes als $tarief = 21.21. $type = gettype($tarief);

2.

$euros = $tarief * 11;

N D

1.

$tarief = round($tarief,2);

4.

$tarief = round($tarief);

(Z O

3.

5.

printf("<br />tarief is: %.2f", $tarief);

6.

echo "Tarief: $tarief";

7.

vsettype($tarief, "string"); echo"<br>".gettype($tarief);

11


Opdracht 12 Datatypen Typ de volgende code over en sla deze op als table.php in je map lessen.

$naam = "Karim"; $nederlands = 8.5;

TI E)

$engels = 7.7; $rekenen = 6.7; $programmeren = 8.5;

AC

$databases = 9.4;

<table border='1'><caption><strong>Rapport</strong></caption>

<th>Naam</th>

BE C EL ON D CE -& P TA T AL R

<thead><tr>

<th>Nederlands</th> <th>Engels</th>

<th>Rekenen</th>

<th>Programmeren</th>

<th>Databases</th><th>Gemiddeld</th> </tr></thead>

<tbody><tr> <td>$naam</td>

<td>$nederlands</td> <td>$engels</td>

<td>$rekenen</td>

ER

<td>$programmeren</td> <td>$databases</td> <td>------- </td>

N D

</tr></tbody>

(Z O

<tfoot><tr>

<td colspan='6'>Groep gemiddeld</td> <td>--------- </td> </tr></tfoot>

12

ED

echo<<<TABLE


Blok 1 Inleiding PHP

</table> TABLE;

TI E)

Het resultaat moet er als volgt uitzien:

BE C EL ON D CE -& P TA T AL R

ED

AC

Maak nieuwe variabelen voor de tweede student en breng de nodige conversies aan om de gemiddelde cijfers met twee decimalen en het groepsgemiddelde met één decimaal te kunnen uitrekenen. Zie de volgende figuur voor een voorbeeld.

Opdracht 13 Maak een array

Een array is een datastructuur waarin een verzameling elementen van hetzelfde datatype kan worden opgeslagen. Voer de volgende stappen uit om te oefenen met arrays.

1.

Open een nieuw bestand en sla het op als arrays.php in de map lessen. Voeg de volgende code eraan toe:

<?php

$producten = [];

ER

$producten[0] = "Boeken"; $producten[1] = "CD's";

N D

$producten[2] = "Smartphones"; $producten[3] = "DVD's";

2.

Geef je array weer met de print_r()-methode.

3.

Geef je array weer met de var_dump()-methode.

(Z O

• •

Welke methode geeft het datatype van de elementen in de array weer? var_dump print_r

13


Opdracht 14 Test of array key bestaat Open arrays.php en voer de volgende stappen uit. 1.

Verwijder met de juiste arraymethode het derde element in je array en geef je array weer. Het resultaat van print_r($producten) moet er daarna als volgt uitzien: Array ( [0] => Boeken [1] => CD's [3] => DVD's )

2.

Zoek een arrayelement op key. Codeer de methode array_key_exists()voor key 2 als volgt:

TI E)

echo(array_key_exists(2, $producten)?"JA":"NEE");

AC

Hier staat een echo-opdracht met een ternaryopdracht ( ? : ). Wat is het resultaat van deze code?

ED

JA

BE C EL ON D CE -& P TA T AL R

NEE

Opdracht 15 Zoek een element op waarde

a. Welke methode gebruik je om te vragen of een elementwaarde bestaat? array_key_exists in_array

array_search array_shift implode explode

b. Open arrays.php en codeer de juiste methode om te vragen of het element met de waarde "Boeken" bestaat. c. Wat is het resultaat van je code? JA NEE

Opdracht 16 Zoek de key van een element

ER

a. Welke methode gebruik je om de key van een element op te zoeken? array_key_exists in_array

N D

array_search array_push

(Z O

implode explode

b. Open arrays.php en codeer de juiste methode om de key van het element "CD's" op te zoeken. Het resultaat moet er als volgt uitzien: De key van CD's is: 1

14


Blok 1 Inleiding PHP

Opdracht 17 Elementen aan het einde toevoegen a. Welke methode gebruik je om nieuwe elementen aan het einde van een array toe te voegen? array_search array_push array_pop array_shift

TI E)

array_unshift

b. Open arrays.php en codeer de juiste methode om de elementen "Laptops" en "Tablets" aan het einde van $producten toe te voegen.

AC

Het resultaat van print_r($producten) moet er daarna als volgt uitzien:

Opdracht 18 Het laatste element verwijderen

BE C EL ON D CE -& P TA T AL R

a. Welke methode gebruik je om het laatste element in een array te verwijderen?

ED

Array ( [0] => Boeken [1] => CD's [3] => DVD's [4] => Laptops [5] => Tablets )

array_key_exists unset array_search array_push array_pop

b. Open arrays.php en codeer de juiste methode om het laatste element te verwijderen. Het resultaat van print_r($producten) moet er daarna als volgt uitzien: Array ( [0] => Boeken [1] => CD's [3] => DVD's [4] => Laptops )

Opdracht 19 Het eerste element verwijderen

a. Welke methode gebruik je om het eerste element in een array te verwijderen? array_push array_pop

ER

array_shift array_unshift implode

N D

explode

b. Open arrays.php en codeer de juiste methode om het eerste element te verwijderen.

(Z O

Het resultaat van print_r($producten) moet er daarna als volgt uitzien: Array ( [0] => CD's [1] => DVD's [2] => Laptops )

c. Open arrays.php en voeg de volgende code eraan toe, waarbij de callback-function printArray()tussen enkele aanhalingstekens moet staan:

15


function printArray($item, $key){ echo "<br>$key" . ": " . "<i> $item </i>"; } array_walk($producten, 'printArray');

TI E)

Het resultaat moet het volgende zijn:

BE C EL ON D CE -& P TA T AL R

Opdracht 20 Elementen aan het begin toevoegen

ED

AC

0: Boeken 1: CD's 2: Smartphones 3: DVD's

a. Welke methode gebruik je om elementen aan het begin van een array toe te voegen? array_push array_pop

array_shift

array_unshift implode explode

b. Open arrays.php en codeer de juiste methode om de elementen "TV's" en "Stereo's" aan het begin toe te voegen. Het resultaat van print_r($producten) moet er daarna als volgt uitzien: Array ( [0] => TV's [1] => Stereo's [2] => CD's [3] => DVD's [4] => Laptops )

Opdracht 21 Converteer een string in een array

ER

a. Welke methode gebruik je om een string in een array te converteren? array_push array_pop

N D

array_shift

array_unshift

(Z O

implode explode

b. Open arrays.php en codeer de juiste methode om de string $string = "BMW, Alfa Romeo, Jaguar, Volvo" in de array $autos te converteren. Het resultaat van print_r($autos) moet er daarna als volgt uitzien:

16


Blok 1 Inleiding PHP

Array ( [0] => BMW [1] => Alfa Romeo [2] => Jaguar [3] => Volvo )

Opdracht 22 Converteer een array in een string a. Welke methode gebruik je om een array in een string te converteren? array_pop

array_unshift implode explode

AC

b. Open arrays.php en codeer de juiste methode om de array $autos in de string $string te converteren.

BE C EL ON D CE -& P TA T AL R

Opdracht 23 Maak een tweedimensionale array

ED

Het resultaat van echo $string moet er daarna als volgt uitzien: BMW, Alfa Romeo, Jaguar, Volvo

TI E)

array_shift

a. Maak een nieuw PHP-bestand en sla dit op als 2dArrays.php in de map lessen. Typ de volgende code over om een tweedimensionale array te maken.

$boeken = array (

array("titel"=> "Stoner", "auteur" => "John Williams", "genre" => "Fictie", "prijs" => 19.99 ),

array("titel"=> "Cirkel", "auteur" => "Dave Eggers", "genre" => "Fictie", "prijs" => 22.50 ),

array("titel"=> "Rayuela", "auteur" => "Julio Cortazar", "genre" => "Fictie", "prijs" => 25.50 ) );

b. Welke methode gebruik je om de elementen in een tweedimensionale array te lezen?

ER

array_pop

array_shift

array_unshift

N D

array_walk_recursive explode

(Z O

c. Open 2dArrays.php en voeg de volgende code eraan toe, waarbij de callback-function tussen enkele aanhalingstekens moet staan:

function printArray($item, $key){ echo "<br>$key" . ": " . "<i> $item </i>";

17


} array_walk_recursive($boeken, 'printArray');

John Williams

genre

Fictie

prijs

19.99

titel

De Cirkel

auteur

Dave Eggers

genre

Fictie

prijs

22.50

titel

Rayuela

AC

auteur

ED

Stoner

BE C EL ON D CE -& P TA T AL R

titel

TI E)

Het resultaat moet er als volgt uitzien:

Julio Cortazar

auteur genre

Fictie

prijs

25.50

Opdracht 24 Maak een JSON-Object

a. Open 2dArrays.php in de map lessen en maak een JSON-Object van de array $boeken.

b. Geef het JSON-Object met de echo-opdracht weer. Maak gebruik van JSON_PRETTY_PRINT. Het resultaat zie je hierna:

'[ {

ER

"titel": "Stoner",

"auteur": "John Williams",

N D

"genre": "Fictie", "prijs": 19.99

(Z O

}, {

"titel": "De Cirkel", "auteur": "Dave Eggers", "genre": "Fictie", "prijs": 22.5

18


Blok 1 Inleiding PHP

}, { "titel": "Rayuela", "auteur": "Julio Cortazar", "genre": "Fictie",

TI E)

"prijs": 25.5 }

Opdracht 25 Converteer een JSON-Object in een array

ED

a. Open 2darrays.php in de map lessen en converteer het volgende JSON-Object in een array.

AC

]'

BE C EL ON D CE -& P TA T AL R

'[ {

"merk": "Dell", "prijs": 900 }, {

"merk": "Lenovo", "prijs": 800 } ]'

b. Geef de geconverteerde array weer.

Array (

ER

Het resultaat van print_r zie je hierna:

N D

[0] => stdClass Object

(Z O

(

[merk] => Dell [prijs] => 900

) [1] => stdClass Object ( [merk] => Lenovo

19


[prijs] => 800 ) )

AC ED

BE C EL ON D CE -& P TA T AL R

Maak een nieuw script en sla dit op als arraytoets.php in de map lessen. 1. Codeer de array (“een”, “twee”, 3, “vier”). 2. Voeg het vijfde element met de waarde 5 eraan toe. 3. Toon de array. 4. Toon het datatype van het vijfde element. 5. Verwijder het vijfde element. 6. Toon de array. 7. Voeg aan het begin een element in met de waarde nul. 8. Toon de array. 9. Delete key[0]. 10. Toon het datatype van key[0]. 11. Verwijder het eerste element. 12. Toon de array. 13. Verwijder het tweede element. 14. Toon de array. 15. Als key[2] bestaat: verwijder deze. 16. Toon de array.

TI E)

Opdracht 26 Arraytoets

Als alles goed verloopt, zal het resultaat er als volgt uitzien: Stap 3. een,twee,3,vier,5 Stap 4. Datatype is: nummer Stap 6. een,twee,3,vier Stap 8. nul,een,twee,3,vier Stap 10. Datatype van key 0 is: undefined Stap 12. een,twee,3,vier Stap 14. een,3,vier Stap 16. een,3

ER

1.3 Opdrachten Besturingsstructuren Opdracht 27 De if-opdracht

N D

Met besturingsstructuren wordt de volgorde van de uitvoering van instructies in een script bepaald. Raadpleeg zo nodig de theorie bij Besturingsstructuren.

(Z O

a. Open een nieuw script en sla dit op als if-opdracht.php. Voeg de volgende code eraan toe:

<?php $functie = "Software Developer";

$gewerkteuren = 40; $uurtarief = 15.00;

20


Blok 1 Inleiding PHP

$bruto = $gewerkteuren * $uurtarief; if($gewerkteuren <= 40){ echo "<br>Je functie is: " . $functie; echo "<br>Je basissalaris is: €" . $bruto; echo "<br>Je belasting is: €" . 0.40*$bruto;

TI E)

}

Zie het volgende resultaat.

ED

AC

Je functie is: Software Developer Je basissalaris is: € 600 Je belasting is: € 240

Let op

BE C EL ON D CE -& P TA T AL R

Als je het euroteken niet ziet, moet je charset UTF-8 boven het PHP-blok als volgt toevoegen:

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

Basisnettobedrag

b. Open if-opdracht.php en codeer het volgende:

In deze opdracht ga je het basisnettobedrag uitrekenen als basissalaris min belasting. Voeg daarvoor de benodigde functionaliteit eraan toe. Het resultaat moet er zo uitzien:

ER

Je functie is: Software Developer Je basissalaris is: € 600 Je belasting is: € 240 Je basisnettobedrag is: € 360

N D

Nettobedrag

c. Open if-opdracht.php en codeer het volgende:

(Z O

In deze opdracht ga je als volgt het nettobedrag uitrekenen:

Als functie gelijk is aan Software Developer dan is de toeslag € 100. Het nettobedrag gelijk aan het basisnettobedrag + toeslag. Het resultaat moet er zo uitzien:

21


Je functie is: Software Developer Je basissalaris is: € 600 Je belasting is: € 240 Nettobedrag is: € 360 Nettobedrag met toeslag is: € 460 Else-if()

TI E)

d. Open if-opdracht.php en codeer het volgende. In deze opdracht ga je als volgt een elseif-clausule aan je if-opdracht toevoegen: Anders als functie NIET gelijk is aan Software Developer dan is de toeslag € 200

ED

BE C EL ON D CE -& P TA T AL R

Je functie is: Netwerk beheerder Je basissalaris is: € 600 Je belasting is: € 240 Nettobedrag is: € 360 Nettobedrag met toeslag is: € 560

AC

Het resultaat moet er zo uitzien:

Opdracht 28 POST-variabelen

N D

ER

a. Codeer een PHP-script en sla dit op als formulier.php. Codeer een formulier met de volgende input controls. Het resultaat moet er als volgt uitzien:

(Z O

b. De <form>-tag moet action- en methodattributen hebben. Bij action geef je de naam van het PHP-script waarin je de formuliergegevens gaat verwerken. Bijvoorbeeld:

<form action="verwerken.php" method="POST">

c. De drie keuzerondjes (radio buttons) krijgen dezelfde naam (taal) en een eigen value:

22


Blok 1 Inleiding PHP

<input type="radio" name="taal" value="N"> Nederlands <input type="radio" name="taal" value="E"> Engels <input type="radio" name="taal" value="S"> Spaans

TI E)

d. De verzendknop moet van het type submit zijn.

1.

Codeer het verwerken.php-script als volgt:

<?php

BE C EL ON D CE -& P TA T AL R

if(isset($_POST["submit"]) ){

ED

AC

<input type="submit" name="submit" value="Versturen">

if(empty($_POST["naam"]) ){

echo "naam niet ingevuld"; } else{

$naam = $_POST["naam"]; $taal = $_POST["taal"]; if($taal == "N") {

echo " Goedendag " . $naam; }elseif($taal == "E") {

echo "Good morning " . $naam; }elseif($taal == "S") {

echo "Buenos dias " . $naam; }else{

ER

echo "Taal niet ingevuld"; }

N D

}

}

2.

De eerste if-opdracht controleert of de submitknop was aangeklikt.

3.

De tweede if-opdracht controleert of een naam was ingevuld.

4.

Het resultaat moet het volgende zijn: Als je de naam Zakarias intypt en op het keuzerondje voor Spaans klikt, worden de gegevens als volgt verwerkt:

(Z O

• • •

23


Buenos dias Zakarias

5.

Het formulier.php-script heeft de formuliergegevens naar het verwerken.php-script verstuurd en het verwerken.php-script heeft de gegevens verwerkt.

BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

e. Maak een nieuw script en sla dit op als inschrijfformulier.php met daarin het formulier uit de volgende figuur:

ER

f. Maak een tweede script (formulierverwerken.php) dat de gegevens vanuit het formulier verwerkt zoals in de volgende figuur.

N D

Zorg dat je formulier voldoet aan de volgende voorwaarden: 1. Op de xxxx’en moeten de gegevens uit het formulier verschijnen. 2. Op de puntjes moet de naam van de gekozen opleiding verschijnen. 3. Als gekozen werd voor ICT, toon je bovendien de volgende melding:

(Z O

ICT opleidingen zijn vol. Kies een andere opleiding.

24


Opdracht 29 De switchopdracht

BE C EL ON D CE -& P TA T AL R

ED

AC

a. Maak een nieuw script en sla dit op als switch.php met daarin het formulier uit de volgende figuur:

TI E)

Blok 1 Inleiding PHP

b. Geef het attribuut action = "". Hiermee zeg je dat je de gegevens in ditzelfde script wilt verwerken.

<form action="" method="POST">

N D

ER

c. Codeer onderaan het HTML-blok een <?php-blok met een switchopdracht die de waarde voor een land controleert. • Voor Nederland geef je de tekst "Retourtje Nederland is 100" weer. • Voor België geef je de tekst "Retourtje België is 80" weer. • Voor Duitsland geef je de tekst "Retourtje Duitsland is 90" weer. • Voor Spanje geef je de tekst "Retourtje Spanje is 190" weer. • Voor default geef je de tekst "Je hebt geen bestemming gekozen" weer.

(Z O

d. Maak een nieuw script en geef dit de naam inloggen.php. De inlogpagina moet een inlogformulier hebben met de volgende input controls: • Een veld voor Gebruikersnaam. • Een veld voor Wachtwoord. • Twee keuzerondjes voor het kiezen van een Rol: – admin – student. • Een verzendknop.

25


BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

Codeer de backend in PHP met de volgende switchopdracht. Het wachtwoord voor de rol admin moet 'admin' zijn en het wachtwoord voor de rol student moet 'student' zijn. In andere gevallen geef je een foutmelding aan. Zie het volgende stroomdiagram:

1.4 Opdrachten Lussen Opdracht 30 De for-lus

Raadpleeg zo nodig de theorie bij Lussen. a. In deze opdracht maak je een script met de naam lussen.php. Codeer een for-lus als volgt:

<?php echo"<pre>";

ER

for($x = 0; $x < 10; $x++){ echo $x;

N D

}

(Z O

echo "</pre>";

Deze lus laat de waarde van de variabele $x zien bij elke lus.

b. Codeer in lussen.php een tweede for-lus. Laat deze lus acht rondjes lopen, beginnend met rondje vijf. Het resultaat moet er als volgt uitzien:

26


BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

Blok 1 Inleiding PHP

Opdracht 31 De foreach-lus

a. Codeer een foreach-lus in lussen.php die de elementen in de volgende array weergeeft:

$fruiten = ["Appel","Sinaasappel","Druif","Perzik"];

b. Codeer een foreach($arraynaam as $key => $value)-lus in lussen.php die de volgende array weergeeft:

$json = array( 'naam' => 'Json', 'leeftijd' => 17, 'beschikbaar' => 1 ); echo "<pre>";

foreach($json as $key => $value){ if($key == 'beschikbaar'){

$value = ($value ? 'JA' : 'NEE'); }

ER

echo "

$key: $value";

N D

}

echo "</pre>";

(Z O

Het resultaat moet als volgt zijn: naam: Json leeftijd: 17 beschikbaar: JA

27


1.

Codeer een foreach($arraynaam as $key => $value)-lus die de volgende array weergeeft:

$kleuren["oranje"] = "orange"; $kleuren["rood"] = "red"; $kleuren["paars"] = "violet";

TI E)

$kleuren["groen"] = "green"; $kleuren["blauw"] = "blue"; $kleuren["zwart"] = "black";

Codeer de echo-opdracht als volgt:

echo <font color=""

AC

2.

ED

BE C EL ON D CE -& P TA T AL R

De tag moet de outputtekst "Deze tekst in . . ." weergeven met op de puntjes een kleur uit de array $kleuren. Zie het resultaat hierna:

Opdracht 32 De while-lus

Het voordeel van een while-lus is dat deze net zo vaak wordt herhaald als nodig is om zijn doel te bereiken.

ER

a. Codeer een while()-lus in lussen.php die een stringvariabele ongeacht de lengte weergeeft:

N D

echo " ";

(Z O

$wachtwoord="#@*123456"; $index=0; $lengte=strlen($wachtwoord); while($index<$lengte){ echo $wachtwoord[$index++];

28


Blok 1 Inleiding PHP

} echo "</pre>";

Als je het wachtwoord korter of langer maakt, werkt de while-lus nog altijd.

TI E)

b. Codeer een while)-lus in lussen.php die controleert of het wachtwoord de ongeldige tekens * en # heeft en daarna de melding "wachtwoord ongeldig" weergeeft. Daarna beëindig je de while-lus.

a. Codeer een while)-lus in lussen.php die minimaal een gerecht kiest uit een menu.

$index = 0;

echo"<pre>"; echo " Ik bestel: "; do{

BE C EL ON D CE -& P TA T AL R

$lengte = count($menu);

ED

$menu = array("voorgerecht","hoofdgerecht","nagerecht");

AC

Opdracht 33 Do-while-lus

echo " " . $menu[$index]; $index++;

}while( $index < $lengte ); echo"</pre>";

b. Codeer een do-while)-lus in lussen.php die controleert of het wachtwoord leeg is en daarna controleert of het wachtwoord de ongeldige tekens * en # heeft. Als dat zo is, geef je de melding "wachtwoord ongeldig" weer en beëindig je de do-while-lus.

ER

1.5 Theorie Inleiding PHP Inleiding PHP

(Z O

N D

Client-server-model Het client-server-model is een model waarin twee computers in samenwerking twee of meer programma’s uitvoeren, bijvoorbeeld e-mail of internetbankieren. Dit model werkt als volgt: een clientprogramma doet een aanvraag (request) bij het serverprogramma. Het serverprogramma voert hierop handelingen uit en geeft informatie terug aan de client. Bijvoorbeeld: een webserver ontvangt requests van verschillende webbrowsers. De server voert acties uit en geeft de informatie terug in de vorm van webpagina’s.

29


TI E) AC ED BE C EL ON D CE -& P TA T AL R

Figuur 1.1 Figuur 1.1 - Client-server-model

Dit client-server-model gebruiken we ook voor het realiseren van webapplicaties. Een webapplicatie, vaak webapp genoemd, is een interactief computerprogramma dat is gebouwd met webtechnologieën (HTML, CSS, JS) en dat gegevens opslaat in databases of bestanden met logica codeert in backend programmeertalen, zoals PHP, C# of Java.

N D

ER

Wat is PHP? PHP (oorspronkelijk Personal Home Page) is een server-side scripttaal die speciaal ontworpen is voor het web. Je kunt PHP-code binnen een HTML-pagina embedden. De PHP-code wordt uitgevoerd door de webserver wanneer iemand jouw webpagina bezoekt. PHP is in 1994 ontworpen door Rasmus Lerdorf. Dit opensourceproduct is gratis te downloaden van de website van PHP. PHP is een scripttaal die geïnterpreteerd wordt door de PHP-interpreter. Je hoeft PHP niet te compileren, zoals C of Java. Een Java-programma moet eerst gecompileerd worden door een compiler en daarna worden uitgevoerd. Een ander voorbeeld van een scripttaal is JavaScript.

(Z O

Figuur 1.2 Figuur 1.2 - Een webapplicatie

Het XAMPP-framework Om te beginnen moet je een webserver, een dataserver en een mailserver op je computer installeren. Een webserver biedt webpagina’s aan (‘serveert’) de browsers van de gebruikers aan. PHP draait op de Apache-webserver. Om PHP-scripts te kunnen draaien, moet je eerst de Apache-webserver op je computer installeren. Het populairste opensourceframework (softwarebundel) voor PHP is XAMPP. Het framework staat voor

30


Blok 1 Inleiding PHP

Multi-platform Apache MySQL PHP en Pearl. Je kunt XAMPP op een webhost installeren. Maar voor het ontwikkelen en testen van je websites kun je XAMPP op je eigen pc of laptop installeren. XAMPP kan gedownload worden voor Windows, MacOS of Linux.

BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

Je kunt XAMPP downloaden vanaf de website www.apachefriends.org. Als je XAMPP downloadt en installeert voor je operating system, start je XAMPP door op de icoon van het XAMPP-controlepaneel te klikken (zie figuur 1.3). Hierna verschijnt de XAMPP Control Panel Application.

Figuur 1.3 Figuur 1.3 - XAMPP Control Panel Application

In het eerste deel van het XAMPP-controlepaneel kun je de Apache- en MySQL-services zien. In het tweede deel zien we de Start- en Stop-knoppen voor de services. In het derde deel zien we onder andere de Configuratie-knop, waarmee we de installatie kunnen instellen. Belangrijk voor ons zijn de volgende mappen en bestanden: httpd.conf: het bestand voor het configureren van de Apache-server. php.ini: het bestand waar de standaardinstellingen van PHP te vinden zijn.

(Z O

N D

ER

De root-map Na de installatie van XAMPP zien we de volgende mappenstructuur:

31


TI E) AC ED

BE C EL ON D CE -& P TA T AL R

Figuur 1.4 Figuur 1.4 - Root-map

Bij het maken van je PHP-opdrachten is de root-map htdocs belangrijk. htdocs is de root-map van de te coderen applicatie. In deze root-map gaan we onze PHP-scripts plaatsen. We zien dat de Apache-server in XAMPP draait in port 80. In MacOS draait deze in port 8888. Om te testen of de installatie goed verlopen is, typ je in het adresvakje van de browser het volgende: localhost:80 voor Windows of localhost:8888 voor MacOS

(Z O

N D

ER

Localhost is een hostnaam die verwijst naar de lokale machine die momenteel het verzoek indient. Op veel computers is localhost een alias voor het IP-adres 127.0. 0.1. Wanneer een computer dit IP-adres pingt, communiceert deze met zichzelf. Localhost verwijst naar de map htdocs in je PHP-installatie. In deze map vind je de map dashboard en daarin het bestand index.html. Nu moet het dashboard als volgt verschijnen:

32


ED

AC

TI E)

Blok 1 Inleiding PHP

BE C EL ON D CE -& P TA T AL R

Figuur 1.5 Figuur 1.5 - Dashboard

Taalcomponenten Een programmeertaal is een reeks instructies en syntaxis die wordt gebruikt om softwareprogramma's te maken. Enkele van de belangrijkste kenmerken van programmeertalen zijn: • Syntaxis: de specifieke regels en structuur die worden gebruikt om code in een programmeertaal te schrijven. • Gegevenstypen: het type waarden (datatypen) dat in een programma kan worden opgeslagen, zoals getallen, tekenreeksen en booleans. • Variabelen: benoemde geheugenlocaties die waarden kunnen opslaan. • Operatoren: symbolen die worden gebruikt om bewerkingen uit te voeren op waarden, zoals optellen, aftrekken en vergelijken. • Besturingsstructuren: instructies die worden gebruikt om de stroom van een programma te regelen, zoals if-else-instructies, lussen en functieaanroepen. • Bibliotheken en frameworks: verzamelingen van vooraf geschreven code die kunnen worden gebruikt om algemene taken uit te voeren en de ontwikkeling te versnellen.

Tabel 1.1

ER

Syntaxis Syntaxis betreft de specifieke regels en structuur in een programmeertaal. De PHP-syntaxis is hetzelfde als de syntaxis van andere programmeertalen, zoals C en Java. De volgende tabel toont een samenvatting van de PHP-syntaxis:

N D

Tabel 1.1 Taalcomponenten

PHP-syntaxis

Openen en sluiten scripttags

<?php

(Z O

Taalcomponent

?>

Block

{ }

Commentaarregel

// commentaar

Commentaarblok

/* commentaar */

Declareren variabelen

$mijnvar = 0;

Declareren strings

$mijnstring = "tekst"

33


Tabel 1.1 Taalcomponenten Taalcomponent

PHP-syntaxis

Escapeteken \

"filmtitel \"Serpico\" "

TI E)

Een tekst begint en eindigt met aanhalingstekens. Het escapeteken (\) gebruiken we binnen een tekst tussen aanhalingstekens wanneer we een teken letterlijk willen gebruiken. Bijvoorbeeld in de tekst "filmtitel \"Serpico\" " gebruiken we escape + aanhalingstekens (\") als onderdeel van de tekst, maar níét voor het markeren van het einde van de tekst.

AC

Let op

ED

Binnen dubbele aanhalingstekens kunnen we enkele aanhalingstekens gebruiken. Dan is duidelijker wat bij elkaar hoort:

BE C EL ON D CE -& P TA T AL R

"tekst 'tekst' ". En binnen enkele aanhalingstekens kun je dubbele aanhalingstekens gebruiken als dat nodig is: 'tekst "tekst" '.

PHP-variabelen Variabelen kun je gebruiken om daarin tijdelijk gegevens op te slaan. Deze gegevens kunnen bijvoorbeeld bestaan uit getallen, stukken tekst of booleans, ofwel waar-/niet waar-gegevens. Ook kun je een reeks gegevens (array) in een variabele zetten. Alles wat je in PHP kunt aanmaken, kun je in een variabele zetten. Een PHP-variabele is een datacontainer met een naam en een waarde. De naam van de variabele is het adres van de variabele in het computergeheugen. Op dit adres kun je data tijdelijk bewaren. Een variabele kun je je voorstellen als een laatje met een naam in het geheugen van de computer. Door middel van de naam kun je de inhoud van dat laatje bekijken of wijzigen. Om een variabele te kunnen gebruiken, moet je deze eerst aanmaken. Ook wel declareren genaamd. Dit doe je door een dollarteken ($) gevolgd door een zelfgekozen naam in te tikken. Met het isgelijkaanteken (=) kun je vervolgens een waarde aan de variabele toekennen. Ten slotte sluit je de regel af met een puntkomma, zoals dat bij elke PHP-regel hoort te gebeuren.

N D

ER

Namen van variabelen De naam van een variabele: • begint altijd met het $-teken en een letter • mag letters, getallen en underscores (_) bevatten • is hoofdlettergevoelig. $straat en $Straat zijn bijvoorbeeld twee verschillende variabelen.

(Z O

Bij variabelen met twee woorden gebruiken PHP-programmeurs twee conventies: • underscores, bijvoorbeeld: mijn_auto • camelCase, bijvoorbeeld: mijnAuto. Bij camelCase begint het tweede woord met een hoofdletter. CamelCase is de meest gebruikte conventie.

34


Blok 1 Inleiding PHP

Een variabele mag de volgende datatypen en waarden hebben: Tabel 1.2

Betekenis

Voorbeeld

string

tekst

"Carl"

boolean

ja/nee

true/false

integer

geheel getal

19

float

getal met drijvende

19,99

komma verzameling

[1,2,3,4,5]

ED

array

AC

Datatype

TI E)

Tabel 1.2 Datatypen

Tabel 1.3

BE C EL ON D CE -& P TA T AL R

Om variabelen te kunnen verwerken, gebruiken we operatoren. Hierna zie je de belangrijkste rekenkundige operatoren:

Tabel 1.3 Rekenkundige operatoren Operator ++ -+ * / .

Betekenis

Voorbeeld

plus 1

$teller++

min 1

$teller--

optellen

$teller + 1

aftrekken

$teller -1

vermenigvuldigen

$som * 2

delen

$bedrag / 2

tekst samenvoegen

"Error" . "01"

Hierna declareren we drie variabelen:

ER

$naam = "Carl"; $leeftijd = 16;

N D

$leerplichtig = true;

(Z O

De waarde van een variabele kan gewijzigd worden:

$leeftijd = $leeftijd + 2;

35


Gereserveerde sleutelwoorden in PHP Gereserveerde sleutelwoorden in PHP hebben speciale betekenissen. Het woord array bijvoorbeeld is de naam van de methode voor het creëren van een array of matrix. Je mag geen gereserveerde sleutelwoorden gebruiken bij het maken van je eigen variabelen, want dan krijg je een foutmelding. In de volgende tabel zie je de gereserveerde sleutelwoorden in PHP. Tabel 1.4

abstract

and

array()

as

break

callable

case

catch

class

clone

const

continue

declare

default

die()

do

echo

else

elseif

empty()

enddeclare

endfor

endforeach

endif

endswitch

endwhile

eval()

exit()

final

finally

for

foreach

include_once list() private return try Xor

ED extends

function

BE C EL ON D CE -& P TA T AL R

global

AC

halt_compiler()

TI E)

Tabel 1.4 Gereserveerde sleutelwoorden

goto

if

implements

include

instanceof

insteadof

interface

isset()

namespace

new

or

print

protected

public

require

require_once

static

switch

throw

trait

unset()

use

var

while

yield

Datastructuren

Een datastructuur is een gespecialiseerd formaat voor het organiseren, verwerken, ophalen en opslaan van gegevens. Om datastructuren te begrijpen kijken we eerst naar datatypen van de data.

ER

Datatypen Een datatype is een attribuut dat is gekoppeld aan een stukje gegevens en vertelt hoe de waarde ervan geïnterpreteerd moet worden.

(Z O

N D

PHP werkt, zoals elke programmeertaal, met de volgende datatypen: • String voor teksten of tekenreeksen. • Integer voor gehele getallen, bijvoorbeeld 3 of 500. • Double voor reële getallen, bijvoorbeeld 67 of 123.465. • Boolean voor de waarden true of false. • NULL voor variabelen die (nog) geen waarde hebben. Het is belangrijk om goed te begrijpen wanneer en waarom je een specifiek datatype moet gebruiken. Hierna volgt een overzicht van datatypen.

36


Blok 1 Inleiding PHP

Het datatype string Strings zijn tekenreeksen. Een string geef je aan als een tekst tussen aanhalingstekens, bijvoorbeeld "tekst". De meeste informatie in databases of webapplicaties bestaat in de vorm van teksten, bijvoorbeeld naw-gegevens of productinformatie.

TI E)

Samenvoegen van twee tekstelementen Met de operatorpunt (.) kun je twee tekstelementen samenvoegen. Bijvoorbeeld: "boek". "titel" geeft als resultaat de string "boektitel".

AC

De heredoc-syntaxis (<<<) Je kunt een speciale syntaxis, heredoc genaamd, gebruiken om strings in PHP te definiëren. Na de <<< operator moet je een ID opgeven met welke naam je maar wilt, in de volgende regel gevolgd door de string zelf. Dezelfde ID wordt aan het einde toegevoegd.

<<<TEKST Lange tekst TEKST;

BE C EL ON D CE -& P TA T AL R

ED

Met de heredoc-syntaxis kun je lange teksten maken. Je hoeft alleen een eindmarkering te specificeren en aan het einde van je tekst de eindmarkering te plaatsen. Dit kan worden gebruikt om complexe strings te tonen. Je kunt nu zonder problemen aanhalingstekens in je echo plaatsen zonder een error te krijgen. Bijvoorbeeld:

Het datatype integer Een integer is een getal zonder decimale komma (of decimale punt), bijvoorbeeld het getal 6. Een getal van het datatype integer kan positief of negatief zijn. Bijvoorbeeld:

$tarief = 13;

Het datatype double Een getal van het datatype double is een getal met een decimale punt. Bijvoorbeeld:

ER

$tarief = 13.637;

N D

Getallen van het datatype double kunnen geformatteerd worden voor het printen, bijvoorbeeld met drie of twee decimale posities. Dit doen we met de methode printf().

(Z O

Het datatype boolean Het datatype booleankan alleen de volgende twee waarden krijgen: true of false (waar of onwaar). Op basis van de waarde van booleanvariabelen kunnen we straks interessante controles programmeren. Bijvoorbeeld:

$minderjarig = true;

$sportief = false;

De waarde true wordt als het getal 1 weergegeven. De waarde false wordt als blanco weergegeven.

37


Conversiemethodes De methode printf() De methode printf() formatteert de waarde van een variabele naar een gegeven printformaat. De oorspronkelijke waarde van de variabele blijft hetzelfde. Bijvoorbeeld:

TI E)

printf("<br />tarief is: %.2f", $tarief);

De methode printf("tarief is: %.2f", $tarief) formatteert de doublewaarde van de variabele $tarief naar het formaat %.2f, ofwel afgerond op twee decimale posities: 13.64.

AC

<br/> is de HTML-tag voor een nieuwe regel.

BE C EL ON D CE -& P TA T AL R

$tarief = 13.637;

ED

De conversie van double naar integer met intval() Met de methode intval() maken we conversies van double- naar integerdatatypen. Bijvoorbeeld:

$tarief = intval($tarief);

De intval()-methode levert het integerdeel van een doublegetal op. In dit voorbeeld krijg je in $tarief het resultaat 13. Het getal wordt niet afgerond. Afronden van double naar integer met round() Met de methode round()kunnen we een double afronden naar een integer. Bijvoorbeeld:

$tarief = 13.637;

$tarief = round($tarief);

In dit voorbeeld is het resultaat 14. Met de round()-function kunnen we ook het aantal decimalen aangeven.

ER

$tarief = round($tarief,2);

In dit voorbeeld is het resultaat van $tarief: 13.64.

N D

De conversie naar double met doubleval() Met de methode doubleval() maken we conversies naar double. Bijvoorbeeld:

(Z O

$tarief = "13.99"; $tarief = doubleval($tarief);

In dit voorbeeld is het resultaat van $tarief: 13.99. De string “13.99” wordt geconverteerd naar de doublewaarde 13.99.

38


Blok 1 Inleiding PHP

gettype() De gettype()-methode geeft als resultaat het datatype van een variabele. Bijvoorbeeld:

$tarief = 13.0; $type = gettype($tarief) // Resultaat is "double"

$type = gettype($tarief) // Resultaat is "string"

$tarief = 13.0; settype($tarief, "string");

BE C EL ON D CE -& P TA T AL R

$type = gettype($tarief) // Resultaat is "string"

ED

AC

settype() Met de settype()-methode kunnen we het datatype van een variabele omzetten naar een ander datatype. Bijvoorbeeld:

TI E)

$tarief = "tien";

$tarief = "33.99tien";

settype($tarief, "double");

$type = gettype($tarief) // Resultaat is "double" echo $tarief // Resultaat is 33.99

Arrays Een array is een datastructuur waarin een verzameling elementen van hetzelfde datatype kan worden opgeslagen. Een array is een lijst met items, een beetje zoals een boodschappenlijstje. Wanneer je boodschappen moet doen, zou je voor elk artikel dat je moet kopen één geeltje kunnen gebruiken. Een geeltje functioneert dan als een variabele. Maar wanneer je alle boodschappen op één lijstje zet, is dit lijstje de array.

ER

Geïndexeerde arrays in PHP zijn zoals de geïndexeerde arrays in andere programmeertalen. We kunnen deze geïndexeerde verzamelingen van gegevens op de volgende drie manieren declareren:

$arrayNaam = array(1,2,3,4,5);

N D

Of:

(Z O

$arrayNaam = [1,2,3,4,5];

Of:

$arrayNaam[0] = 1; $arrayNaam[1] = 2;

39


$arrayNaam[2] = 3; $arrayNaam[3] = 4; $arrayNaam[4] = 5;

BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

Bij de laatste vorm krijgen de elementen een index tussen haakjes [ ] die de volgorde in de array bepaalt. Hierna volgt een lijst met arraymethodes: • print_r • var_dump • unset • array_key_exists • in_array • array_search • array_push • array_pop • array_shift • array_unshift • array_rand • array_walk • implode • explode • array_walk_recursive • array_merge • array_slice De methode print_r() PHP beschikt over de methode print_r() om snel de inhoud van een array te printen. De syntaxis is als volgt:

print_r($arrayNaam);

De methode var_dump() De methode var_dump() gebruiken we om snel de inhoud van een variabele of array te printen. De syntaxis is als volgt:

ER

var_dump($producten)

N D

unset() Met de methode unset() verwijderen we een arrayelement. De syntaxis is als volgt:

(Z O

unset($arrayNaam[index]);

array_key_exists() Met de methode array_key_exists() kunnen we controleren of een bepaalde array-key (index) binnen een array bestaat. De returnwaarde is boolean (true/ false). De syntaxis is als volgt:

40


Blok 1 Inleiding PHP

array_key_exists(key, $arrayNaam);

Let op

TI E)

PHP geeft de waarde true weer als 1 en de waarde false weer als NULL, of blanco.

ED

BE C EL ON D CE -& P TA T AL R

in_array(element, $arrayNaam);

AC

De methode in_array() De methode in_array() controleert of een bepaald arrayelement binnen een array bestaat. De returnwaarde is boolean true/false. De syntaxis is als volgt:

array_search() De methode array_search() controleert of een bepaald arrayelement binnen een array bestaat. De returnwaarde is de elementindex of positie in de array. Het verschil tussen de methodes in_array() en array_search() is de returnwaarde. De syntaxis is als volgt:

array_search(element, $arrayNaam);

array_push() Met de methode array_push() kunnen we één of meer nieuwe elementen aan het einde van een array toevoegen. De syntaxis is als volgt:

array_push($arrayNaam, element [,element] ...);

ER

array_pop() De methode array_pop() verwijdert en retourneert het laatste arrayelement. De syntaxis is als volgt:

N D

array_pop($arrayNaam);

(Z O

array_shift() De methode array_shift() verwijdert en retourneert het eerste arrayelement. De syntaxis is als volgt:

array_shift($arrayNaam);

41


array_unshift() Met de methode array_unshift() kunnen we één of meer elementen aan het begin van een array toevoegen. De syntaxis is als volgt:

array_unshift($arrayNaam, element [,element]...);

AC

TI E)

array_rand() Met de methode array_rand() kunnen we één of meer random (willekeurige) elementen uit een array kiezen. De syntaxis is als volgt:

ED

array_rand($arrayNaam, aantal);

BE C EL ON D CE -& P TA T AL R

implode() Met de methode implode() kunnen we een array naar een string (tekst) converteren. De syntaxis is als volgt:

$string = implode($delimiter, $array);

$delimiter is het onderscheidingsteken in de string dat de elementen onderscheidt. $array is de inputarray.

$string is de outputstring.

explode() Met de methode explode() kunnen we een string naar een array converteren. De syntaxis is als volgt:

$array = explode($delimiter, $string);

$delimiter is het onderscheidingsteken in de string dat de elementen onderscheidt. $string is de inputstring. $array is de outputarray.

ER

Associatieve arrays Een associatieve array associeert een naam (in plaats van een index) met een arrayelement. Bijvoorbeeld:

N D

$mijnarray = array ("titel"=> "Stoner", "auteur" => "John Williams");

(Z O

De associatie maken we met de =>-tekens. Zo kunnen we een array beter coderen en lezen. De volgende associatieve array is makkelijker te lezen dan de daarop volgende geïndexeerde array:

42


Blok 1 Inleiding PHP

$mijnarray = array ("titel"=> "Stoner", "auteur" => "John Williams");

Geïndexeerde array:

TI E)

$mijnarray[0] = "Stoner";

AC

$mijnarray[1] = "John Williams";

BE C EL ON D CE -& P TA T AL R

ED

Tweedimensionale arrays Het voorbeeld van het boodschappenlijstje is een eendimensionale array. Wanneer we voor het artikel het aantal stuks zetten en achter elk artikel de prijs, zijn er drie kolommen. De regels in de verschillende kolommen horen dan bij elkaar. Dit kun je zien als een tweedimensionale array.

Figuur 1.6 Figuur 1.6 - Tweedimensionale array

ER

Met tweedimensionale arrays kunnen we complexere datastructuren construeren. In het volgende voorbeeld maken we een geïndexeerde array met daarin associatieve arrays met laptops.

$laptops = array (

array("merk"=>"Dell", "prijs"=>900),

N D

array("merk"=>"Lenovo", "prijs"=>800),

(Z O

);

array_map De methode array_map past een door de programmeur gedefinieerde callback-function toe op elk element van een tweedimensionale array. In het volgende voorbeeld worden alle elementen van de array $laptops weergegeven door een anonieme (naamloze) function. Functions worden in de volgende sectie besproken.

43


echo"<pre> <br>Merk

Prijs";

array_map(function ($laptop) { echo " ", $laptop['prijs'];

TI E)

", $laptop['merk'], " }, $laptops);

AC

echo "</pre>";

ED

Callback-function Callback-functions zijn functions die als parameters aan andere methodes worden doorgegeven. Het stukje code van een callback-function zal 'aangeroepen' worden door bijvoorbeeld de array_map-methode.

BE C EL ON D CE -& P TA T AL R

In het voorgaande voorbeeld wordt een anonieme callback-function gecodeerd om elk element van een tweedimensionale array weer te geven. Hierna wordt de array_map-methode schematisch weergegeven.

Figuur 1.7 Figuur 1.7 - Array_map-methode

array_walk()-methode Een andere manier om alle elementen in een tweedimensionale array te doorlopen is de array_walk()-methode. Met de methode array_walk() kunnen we de elementen van een array doorlopen om elk element te kunnen verwerken. De syntaxis is als volgt:

ER

array_walk(array_naam, 'callback function');

(Z O

N D

array_walk_recursive() Ook met de methode array_walk_recursive() kunnen we de elementen van een tweedimensionale array doorlopen. Recursive in programmering betekent opeenvolgende uitvoeringen. In ons geval gaat de array_walk_recursive()-methode opeenvolgend de elementen van een array weergeven door gebruik te maken van een anonieme (naamloze) callback-function. Bijvoorbeeld:

44


Blok 1 Inleiding PHP

array_walk_recursive( $boeken, function(&$value, $key) { echo "$key : $value<br>"; });

TI E)

array_merge() Met de methode array_merge() kunnen we twee arrays samenvoegen. De syntaxis is als volgt:

AC

array_merge($array1, $array2)

BE C EL ON D CE -& P TA T AL R

array_slice($array, beginIndex, lengte);

ED

array_slice() Met de methode array_slice() kunnen we een deel van een array kopiëren. De syntaxis is als volgt:

JSON-Objects en literals Serialisatie en deserialisatie zijn twee belangrijke concepten in de programmering waarmee objecten gemakkelijk kunnen worden opgeslagen, verzonden en gereconstrueerd. Ze worden gebruikt in verschillende scenario's, zoals het opslaan van objecten in een database of het verzenden van objecten via een netwerk. JSON en XML zijn populaire indelingen voor serialisatie, omdat ze door mensen kunnen worden gelezen en gemakkelijk door andere systemen kunnen worden verwerkt. JSON is een gegevenscontainer die wordt gebruikt voor het verzenden, ontvangen en opslaan van variabelen. JSON is een 'gegevensuitwisselingsformaat'. Veel webapplicaties gebruiken dit gegevensformaat om gegevens via internet uit te wisselen. Bijvoorbeeld: • gegevens uitwisselen via internet tussen HTTP-services • moderne API's voor klanten creëren.

ER

Literals zijn vaste waarden die je letterlijk codeert. Een tekst-literal bijvoorbeeld geef je als volgt aan:

N D

"tekst literal"

Een JSON-Object in PHP is een string met propertynamen en waarden binnen accolades { }. Bijvoorbeeld:

(Z O

'{

"attribuut ": "waarde" }'

45


JSON-Objects maken we met JavaScript Object Notation (JSON). JSON is een syntaxis voor het structureren en transporteren van tekstinformatie. JSON is programmeertaalonafhankelijk, vergelijkbaar met XML. De meeste programmeurs hebben een voorkeur voor JSON, omdat de datastructuren daarvan eenvoudiger te lezen zijn door andere programmeertalen. De syntaxis voor het maken van een JSON-Object in PHP is als volgt:

TI E)

$jsonObject = '{ "attribuut1": "waarde1", "attribuut2": "waarde2"

AC

}';

Bijvoorbeeld:

BE C EL ON D CE -& P TA T AL R

ED

De properties en de waarden coderen we binnen dubbele aanhalingstekens. De mogelijke waarden voor de properties van een JSON-Object zijn: • getallen: integer of float • tekst: string tussen aanhalingstekens " " • boolean: true of false • array: tussen vierkante haakjes [ ] • object: tussen accolades { } • null.

$jsonObject = '{ "naam": "Json",

"leeftijd": 17",

"beschikbaar : true }';

ER

Een JSON-Object mag geen eigen methodes hebben. PHP heeft twee methodes voor het verwerken van JSON-Objects: • json_encode • json_decode.

N D

json_encode Met de methode json_encode formatteren we een PHP-array naar een JSON-Object. De syntaxis is als volgt:

(Z O

$jsonObject = json_encode($array);

Ons JSON-Object kunnen we dan lezen en verwerken in andere programmeertalen.

De beste manier om een JSON-Object te maken is door te beginnen vanuit een PHP-array. Bijvoorbeeld:

46


Blok 1 Inleiding PHP

$array = array("naam"=>"Json", "leeftijd"=>17, "beschikbaar"=>true); $jsonObject=json_encode($array); echo $jsonObject;

TI E)

Dit geeft als resultaat het volgende JSON-Object:

AC

{"naam":"Json","leeftijd":17,"beschikbaar":true}

ED

echo <pre> formatteren We gebruiken de <pre> HTML-tag om de leesbaarheid te verbeteren. Met <pre> formatteren kun je nieuwe regels ("\n") en tabs ("\t") in strings coderen. Je kunt ook de optie JSON_PRETTY_PRINT gebruiken om JSON-Objects te formatteren.

BE C EL ON D CE -& P TA T AL R

Bijvoorbeeld:

$jsonObject=json_encode($array, JSON_PRETTY_PRINT); echo '<pre>'; echo $jsonObject; echo '</pre>';

Dit geeft als resultaat de volgende weergave:

{ "naam": "Json", "leeftijd": 17,

"beschikbaar": true

ER

}

N D

json_decode Deze methode neemt een jsonObject als input en formatteert het als een array. De syntaxis is als volgt:

(Z O

$array = json_decode($jsonObject);

Als we het jsonObject naar een array willen omzetten, geven we de tweede parameter weer als true:

$array = json_decode( $jsonObject, true); print_r($array);

47


Dit geeft als resultaat de volgende array:

Array ( [naam] => Json [leeftijd] => 17 [beschikbaar] => 1 )

Besturingsstructuren

AC

TI E)

Besturingsstructuren Besturingsstructuren verwijzen naar de manier waarop de computerinstructiestroom wordt beheerd. In principe worden instructies na elkaar uitgevoerd, op dezelfde manier als waarop ze in het computergeheugen zijn opgeslagen (model van Von Neumann).

BE C EL ON D CE -& P TA T AL R

ED

Besturingsstructuren zijn slechts een manier om de controlestroom in programma's te specificeren. Deze analyseren en kiezen in feite in welke richting een programma stroomt op basis van bepaalde parameters of voorwaarden. Er zijn drie basistypen: • sequentielogica of sequentiële stroom • selectielogica of voorwaardelijke stroom • iteratielogica of repetitieve stroom.

(Z O

N D

ER

De if-opdracht Alle programmeertalen hebben selectielogica nodig. Een selectielogica bepaalt de volgorde van de uitvoering van de instructies in een programma. Bijvoorbeeld de if-opdracht om te beslissen wat moet gebeuren als een voorwaarde true is.

48


(Z O

N D

ER

BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

Blok 1 Inleiding PHP

Figuur 1.8 Figuur 1.8 - Stroomdiagram van de if-opdracht

49


De syntaxis van de if-opdracht in PHP is dezelfde als die in JavaScript:

if (voorwaarde){ acties uit te voeren als voorwaarde true is; }

TI E)

De gebruikelijke vergelijkingsoperatoren zie je in de volgende tabel: Tabel 1.5 Tabel 1.5 Vergelijkingsoperatoren Betekenis

Voorbeeld

==

gelijk aan

if($leeftijd == 16)

===

identiek aan

if($naam === "Carl")

!= of <>

niet gelijk aan

if($naam <> "Jan")

>

groter dan

if($leeftijd > 17)

groter of gelijk

if($leeftijd >= 17)

kleiner dan

if($leeftijd < 12)

kleiner of gelijk

if($leeftijd <= 12)

AND

if($a && $b)

OR

if($a || $b)

< <= && ||

ED

BE C EL ON D CE -& P TA T AL R

>=

AC

Symbool

In het volgende voorbeeld zien we een if-opdracht die controleert of het ochtend is:

<?php $uur = 10; if($uur <= 11){

echo "Goedemorgen"; }

ER

?>

(Z O

N D

De elseif-clausule De elseif-clausule geeft de mogelijkheid voor een alternatieve beslissing. De syntaxis van de if-elseif-methode is als volgt:

if (voorwaarde1){ acties uit te voeren als voorwaarde1 true is; }elseif (voorwaarde2){ acties uit te voeren als voorwaarde2 true is;

50


Blok 1 Inleiding PHP

}else{ anders deze acties uitvoeren; }

BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

Bij de if-opdracht wordt altijd maar één van de volgende clausules uitgevoerd: • if • elseif • else

Figuur 1.9 Figuur 1.9 - Stroomdiagram van de if-elseif-opdracht

In het volgende voorbeeld controleren we of het ochtend, middag of avond is:

<?php

ER

$uur = 10;

if($uur <= 11){

N D

echo "Goedemorgen"; }

elseif($uur >= 12 && $uur < 18){

(Z O

echo "Goedemiddag"; }

else {

echo "Goedenavond";

51


} ?>

De laatste else-clausule wordt alleen uitgevoerd als de if- en de elseif-voorwaarden false zijn.

TI E)

AND-vergelijking In het vorige voorbeeld hebben we de AND-vergelijking (&&) als volgt gebruikt:

elseif($uur >= 12 && $uur < 18)

if($uur==24 && $minuut>=0) { echo 'het is middernacht';}

ED

AC

Bij de AND-vergelijking is het hele if()-argument alleen true als argument1 én argument2 true zijn. Bijvoorbeeld:

Tabel 1.6

BE C EL ON D CE -& P TA T AL R

Hier krijg je alleen de echo-opdracht te zien als uur gelijk is aan 24 en als minuut groter dan of gelijk aan 0 is. Beide voorwaarden moeten waar zijn.

Tabel 1.6 Beslissingstabel voor AND Argument 1 && Argument 2

Resultaat

true && true

true

true && false false && false false && true

false false false

OR-vergelijking Bij een OR-vergelijking is het hele if()-argument true als één of beide argumenten true zijn. Bijvoorbeeld:

$cola = true;

ER

$thee = false;

if($cola || $thee) {

N D

echo 'we mogen of cola of thee of allebei';

(Z O

}

Tabel 1.7 Tabel 1.7 Beslissingstabel voor OR

52

Argument 1 || Argument 2

Resultaat

true || true

true

true || false

true


Blok 1 Inleiding PHP

Tabel 1.7 Beslissingstabel voor OR Argument 1 || Argument 2

Resultaat

false || false

false

false || true

true

TI E)

De ternaryoperator (?:) De ternary-operator is een verkorte vorm van de if-opdracht. De ternary-operator heeft de volgende syntaxis:

AC

$voorwaarde ? resultaat als true : resultaat als false;

BE C EL ON D CE -& P TA T AL R

$geslaagd = ($cijfer > 5.5 ? "JA" : "NEE");

ED

Bijvoorbeeld:

De switchopdracht We gebruiken de if-opdracht wanneer we twee of drie vergelijkingen coderen. De PHP switch-opdracht kan efficiënter zijn dan de if-opdracht. Deze is beter gestructureerd en leesbaarder dan de if-opdracht. In plaats van veel if-elseif-elseif- elseif-blokken gebruiken we de switch-opdracht wanneer we een blok uit veel blokken code moeten selecteren en uitvoeren. Het nadeel is dat we geen expressies kunnen coderen in cases. case ($n + 5) bijvoorbeeld genereert een error. Hier volgt de syntaxis van de switch-opdracht:

switch($variabele) {

case <waarde in variabele>: acties uit te voeren; break;

case <waarde in variabele>: acties uit te voeren; break;

ER

default:

acties uit te voeren;

N D

}

(Z O

De switch-opdracht is efficiënter, omdat deze meteen wordt beëindigd door het break-commando van de uitgevoerde case:

switch($n) {

case 1: acties uit te voeren als $n==1;

53


break; case 2: acties uit te voeren als $n==2; break; default:

TI E)

acties uit te voeren als $n anders is dan 1 of 2; }

BE C EL ON D CE -& P TA T AL R

ED

AC

Deze syntaxis zie je hierna schematisch weergegeven:

Figuur 1.10 Figuur 1.10 - Stroomdiagram van de switchopdracht

Lussen

Met lussen kun je de code één keer schrijven en deze zo vaak herhalen als nodig is.

N D

ER

De for-lus Een lusopdracht in een computerprogramma herhaalt specifieke regels code zolang wordt voldaan aan een bepaalde voorwaarde. Wanneer we lussen coderen, moeten we een limiet of voorwaarde van herhalingen aangeven. Zonder een limiet zal de lus zich tot in de eeuwigheid herhalen en zal je computer vastlopen. We richten ons hier op de volgende controlestructuren: • for-lus • while-lus • do-while-lus • for-each-lus.

(Z O

De for-lus Met de for-lus kun je hetzelfde blok instructies een bepaald aantal keren herhalen. Syntaxis De syntaxis van de PHP for-lus splitsen we in drie delen:

54


Blok 1 Inleiding PHP

for(deel 1; deel 2; deel 3){ body; }

TI E)

Bijvoorbeeld:

for( $x=0; $x<10; $x++) { echo $x;

In deel 1 maak je de controlevariabele, bijvoorbeeld $x=0. In deel 2 bepaal je de voorwaarde, bijvoorbeeld $x < 10. In deel 3 tel je de controlevariabele op, bijvoorbeeld $x++.

ED

• • •

AC

}

BE C EL ON D CE -& P TA T AL R

In de body van de for()-lus coderen we de acties die worden uitgevoerd zolang de voorwaarde true is. Bijvoorbeeld: zolang $x kleiner is dan 10, wordt de waarde van echo $xweergegeven. Hier wordt de $xtien keer weergegeven.

In deel 3 geeft $x++ aan met hoeveel (in dit geval +1) de variabele $x wordt verhoogd bij elke lus. De volgende for-lus herhaalt de echo-opdracht drie keer:

for ($x=0; $x<3; $x++){ echo "dit is lus" . $x; }

N D

ER

In dit voorbeeld zijn de volgende punten van belang: • $x=0 geeft aan dat de beginwaarde van de variabele $x nul is. • $x<3 geeft de voorwaarde of limiet van de lus aan. • Zolang deze voorwaarde true is, wordt de lus herhaald. • Als de voorwaarde false is, wordt de lus beëindigd. • $x++ geeft aan dat de variabele $x bij elke lus wordt verhoogd. • echo "dit is lus " . $x in de body geeft de uit te voeren acties aan.

(Z O

In de volgende figuur zie je het stroomdiagram van de for-lus.

55


TI E) AC ED

Figuur 1.11 Figuur 1.11 - Stroomdiagram van de for-lus

Syntaxis

BE C EL ON D CE -& P TA T AL R

De foreach-lus Soms wil je de elementen uit een array steeds opnieuw verwerken. De foreach-lus maakt het eenvoudig om met arrays te werken. De foreach-lus leest elke keer het volgende element uit je array. Deze lus werkt zoals de array_walk- en de array_walk_recursive-methodes. Behalve arrayobjecten kunnen we JSON-Objects met de foreach-lus verwerken.

foreach ($arraynaam as $key){

acties uit te voeren met $key; }

(Z O

N D

ER

In de volgende figuur zie je het stroomdiagram van de foreach-lus.

Figuur 1.12 Figuur 1.12 - Stroomdiagram van de foreach-lus

56


Blok 1 Inleiding PHP

Je kunt met de foreach-lus elke keer een element uit de array lezen en specifieke acties uitvoeren. Als er geen elementen meer te lezen zijn, wordt de foreach-lus beëindigd. Bijvoorbeeld:

$boeken = array('UML', 'JavaScript', 'Databases'); foreach($boeken as $boek){ echo "<br>" . $boek;

TI E)

}

Hier wordt elk element in $boeken als $boek behandeld. Dit is het resultaat:

ED

AC

UML JavaScript Databases

BE C EL ON D CE -& P TA T AL R

Foreach met verwijzing Met de foreach-lus kunnen we het (&)-verwijzingsteken gebruiken om de waarden in een array te wijzigen. Bijvoorbeeld:

foreach ($array as &$key) { $key = 0; }

Hier worden alle elementen van de array op nul gezet.

De while-lus Lussen zijn handig, maar we moeten altijd complexe lussen vermijden. Bijvoorbeeld lussen binnen lussen binnen lussen. In de while-lus testen we een voorwaarde. De voorwaarde kan waar of onwaar zijn. Bijvoorbeeld:

while ($totaal == 100){}

ER

Als de voorwaarde waar is, wordt de code tussen de accolades uitgevoerd.

N D

Op het moment dat de voorwaarde niet meer waar is, wordt de code tussen de accolades niet meer uitgevoerd. De syntaxis van de while-lus is als volgt:

while ( voorwaarde ){

(Z O

acties uit te voeren; }

Het voordeel van een while-lus is dat deze zo vaak wordt herhaald als nodig is om zijn doel te bereiken. In de volgende figuur zie je het stroomdiagram van de while-lus.

57


AC

TI E) $bedrag = 5;

BE C EL ON D CE -& P TA T AL R

Bijvoorbeeld:

ED

Figuur 1.13 Figuur 1.13 - Stroomdiagram van de while-lus

while ( $bedrag > 0 ){ echo $bedrag--; }

Hier wordt de while-lus vijf keer uitgevoerd. Bij elke lus wordt $bedrag met 1 verminderd.

De do-while-lus De do-while-lus is natuurlijk anders dan de while-lus. Het verschil is dat bij do-while de eerste lus altijd wordt uitgevoerd, waarbij aan het einde van elke lus de voorwaarde voor eventuele herhaling wordt gecontroleerd. Dit betekent dat de do-while-lus altijd minimaal één keer wordt uitgevoerd. Syntaxis

do{

ER

acties uit te voeren;

N D

}while( voorwaarde );

(Z O

In de volgende figuur zie je het stroomdiagram van de do-while-lus.

58


AC

TI E)

Blok 1 Inleiding PHP

Figuur 1.14 Figuur 1.14 - Stroomdiagram van de do-while-lus

BE C EL ON D CE -& P TA T AL R

ED

Een lus onderbreken Er zijn drie opties voor het onderbreken van de normale uitvoering van een lus: 1. Als je midden in een lus wilt stoppen met het uitvoeren van de lusopdracht, gebruik je de opdracht break. Met breakonderbreek je de lusopdracht. Je PHP-script gaat na de lusopdracht door met de volgende regel. 2. Als je midden in een lus wilt beginnen met de volgende iteratie (herhaling) van de lusopdracht, gebruik je de opdracht continue. Met continue wordt de huidige iteratie onderbroken, maar de lus gaat door naar het begin van de volgende iteratie. 3. Als je wilt stoppen met het uitvoeren van het hele PHP-script, gebruik je de opdracht exit. Met deze opdracht wordt het uitvoeren van je PHP-script onderbroken.

1.6 Begrippen

Besturingsstructuren Instructies die worden gebruikt om de stroom van een programma te regelen.

Bibliotheken verzamelingen van vooraf geschreven code die kunnen worden gebruikt om algemene taken uit te voeren en de ontwikkeling te versnellen. Debuggen is het proces waarbij fouten of bugs in de broncode van software worden gevonden en opgelost

ER

Gegevenstypen het type waarden dat in een programma kan worden opgeslagen

N D

Localhost is een hostnaam die verwijst naar de lokale machine

(Z O

Operatoren symbolen die worden gebruikt om bewerkingen uit te voeren op waarden String Een tekenreeks die je aangeeft als tekst tussen aanhalingstekens. Syntaxis de specifieke regels en structuur die worden gebruikt om code in een programmeertaal te schrijven;

59


Troubleshooting is een systematisch proces dat wordt gebruikt om de oorzaak van een fout in een computersysteem te achterhalen Variabelen Benoemde geheugenlocaties die waarden kunnen opslaan

TI E)

XAMPP-framework Multi-platform Apache MySQL PHP en Pearl

Array_key_exists() controleert of een index binnen een array bestaat

ED

Boolean Een variabele die slechts één van de twee mogelijke waarden kan hebben: waar of onwaar

AC

Array een verzameling elementen

BE C EL ON D CE -& P TA T AL R

Client-server-model is een model waar twee computers in samenwerking twee of meer programma’s uitvoeren, Datatype is een attribuut dat is gekoppeld aan een stukje gegevens Double Een getal met een decimale punt Doubleval() conversie naar double

Frameworks verzamelingen van vooraf geschreven code die kunnen worden gebruikt om algemene taken uit te voeren en de ontwikkeling te versnellen Gettype() geeft als resultaat het datatype van een variabele.

ER

Heredoc Een speciale syntaxis waarmee je lange teksten kunt maken.

N D

Integer Een getal zonder decimale komma (of decimale punt)

(Z O

Intval() conversie van double naar integer Lussen Met lussen kunt je de code één keer schrijven en deze zo vaak herhalen als nodig is

Print_r() de inhoud van een array printen.

60


Blok 1 Inleiding PHP

Printf() formatteert de waarde van een variabele naar een gegeven printformaat. Round() Afronden van double naar integer

TI E)

Settype() kan het datatype van een variabele omzetten naar een ander datatype. Unset() verwijdert een array-element

AC

Var_dump() snel de inhoud van een variabele of array printen

Opdracht 34

BE C EL ON D CE -& P TA T AL R

1.7 Oefentoets

ED

Webapplicaties is een interactief computerprogramma gebouwd met webtechnologieën zoals HTML, CSS, JS en PHP.

In welk configuratiebestand in XAMPP configureer je de listenpoort? php.ini httpd.conf config.inc

Opdracht 35

In welk configuratiebestand in XAMPP configureer je error_reporting? php.ini httpd.conf config.inc

Opdracht 36 php.ini

ER

In welk configuratiebestand in XAMPP configureer je de Apache-server? httpd.conf

(Z O

N D

config.inc

61


Opdracht 37 Koppel de begrippen aan de juiste beschrijving.

Symbolen om bewerkingen uit te voeren op waarden

Syntaxis

Geheugenlocaties die waarden kunnen opslaan

Operatoren

Hoe je de code in een programmeertaal schrijft

Framework

Verzamelingen vooraf geschreven code

De naam van een variabele begint altijd met het $-teken en een letter. De naam van een variabele mag letters, getallen en underscores (_) bevatten.

Opdracht 39

AC

BE C EL ON D CE -& P TA T AL R

De naam van een variabele is niet hoofdlettergevoelig.

ED

Opdracht 38 Welke beweringen zijn juist? Er zijn meerdere antwoorden goed.

Koppel het datatype aan het voorbeeld daarvan.

String

""

Boolean Float

19.99 true

Opdracht 40

Koppel de operator aan de betekenis daarvan.

--

Min 1

ER

*

N D

/ .

Delen Vermenigvuldigen Teksten aaneenschakelen

(Z O

Opdracht 41

De for-lus is een besturingsstructuur. Voor welke van de volgende stromen zorgt deze lus? sequentiële stroom voorwaardelijke stroom repetitieve stroom

62

TI E)

Variabelen


Blok 1 Inleiding PHP

Opdracht 42 Maak de volgende zin af. De switchopdracht bepaalt de ... sequentiële stroom voorwaardelijke stroom

TI E)

repetitieve stroom

Opdracht 43

||

AND

&&

OR

>=

Gelijk aan

ED

Groter of gelijk

BE C EL ON D CE -& P TA T AL R

==

AC

Koppel de vergelijkingsoperatoren aan de betekenis daarvan.

1.8 Praktijkopdrachten

Opdracht 44 Praktijkopdracht - Codefouten

(Z O

N D

ER

In het volgende script vind je een aantal codefouten. Typ de code over en zoek en corrigeer de codefouten.

63


Opdracht 45 Praktijkopdracht - Stringmethodes Typ de volgende brief als een string in PHP.

<?php $brief="

TI E)

<pre> Beste <b><<abonnee>></b> U heeft het laatste nummer van ons magazine ontvangen.

AC

Omdat we u heel graag als abonnee willen behouden, bieden we u een aantrekkelijke en exclusieve korting: U betaalt <b><<bedrag-met-korting>></b>

BE C EL ON D CE -& P TA T AL R

<i>Profiteer nu van deze aanbieding!</i>

ED

in plaats van 65 euro.

Met vriendelijke groet, Sam Simons Hoofdredacteur </pre>"; ?>

Codeer de str_replace-methode en vervang <<abonnee>> door Jan Davids en <<bedrag-met-korting>> door 50. Het resultaat moet er als volgt uitzien:

ER

Beste Jan Davids U heeft het laatste nummer van ons magazine ontvangen. Omdat we u heel graag als abonnee willen behouden, bieden we u een aantrekkelijke en exclusieve korting: U betaalt 50 in plaats van 65 euro. Profiteer nu van deze aanbieding! Met vriendelijke groet, Sam Simons Hoofdredacteur

Opdracht 46 Praktijkopdracht - Codefouten 2

N D

Codefouten

(Z O

In het volgende script vind je een aantal codefouten. Typ de code over en zoek en corrigeer de codefouten.

64


ER

N D

(Z O BE C EL ON D CE -& P TA T AL R ED

TI E)

AC

Blok 1 Inleiding PHP

65


AC ED

BE C EL ON D CE -& P TA T AL R

Maak een nieuw script en sla dat op als arrayopdracht.php in de map lessen. 1. Codeer de array (“een”, “twee”, 3, “vier”). 2. Voeg het vijfde element met de waarde 5 eraan toe. 3. Toon de array. 4. Toon het datatype van het vijfde element. 5. Verwijder het vijfde element. 6. Toon de array. 7. Voeg aan het begin een element in met de waarde nul. 8. Toon de array. 9. Delete key[0]. 10. Toon het datatype van key[0]. 11. Verwijder het eerste element. 12. Toon de array. 13. Verwijder het tweede element. 14. Toon de array. 15. Als key[2] bestaat: verwijder deze. 16. Toon de array.

TI E)

Opdracht 47 Praktijkopdracht - Arrays

Als alles goed verloopt, zal het resultaat er als volgt uitzien: Stap 3. een,twee,3,vier,5 Stap 4. Datatype is: nummer Stap 6. een,twee,3,vier Stap 8. nul,een,twee,3,vier Stap 10. Datatype van key 0 is: undefined Stap 12. een,twee,3,vier Stap 14. een,3,vier Stap 16. een,3

Opdracht 48 Praktijkopdracht - Bestelformulier

(Z O

N D

ER

a. Maak een nieuw PHP-script en sla dat op als bestelformulier.php. Codeer het bestelformulier en zorg dat het eruitziet als het volgende voorbeeld.

66


ED

AC

TI E)

Blok 1 Inleiding PHP

ER

BE C EL ON D CE -& P TA T AL R

b. Codeer onderaan de nodige code om het aantal en de korting weer te geven. Zie de volgende figuur.

(Z O

N D

c. Voeg een dropdownmenu aan het formulier toe. Codeer onderaan de nodige code om het aantal, de korting en de betalingswijze weer te geven. Zie de volgende figuur.

67


TI E) AC ED BE C EL ON D CE -& P TA T AL R

d. Codeer onderaan het bestelformulier de nodige code om de volgende zaken uit te rekenen: • Bedrag is aantal besteld vermenigvuldigd met de prijs. • Korting is bedrag gedeeld door kortingspercentage. • Als betalingswijze Visa is, wordt 1 euro extra gerekend. • Totaal te betalen is bedrag min korting + betalingswijze.

1.9 Terugblik

ER

Opdracht 49 Terugblik

N D

Zet een kruisje in de kolom die voor jou van toepassing is. Beoordelingscriteria Je kunt een ontwikkelomgeving voor PHP creëren.

(Z O

Je kunt de basiskennis van PHP begrijpen en daarmee coderen.

Je kunt datastructuren begrijpen en coderen. Je kunt besturingsstructuren begrijpen en coderen.

68

Ja

Nee


Blok 1 Inleiding PHP

Opdracht 50 Terugblik Denk na over wat je hebt gedaan in dit blok. a. Noem twee dingen waarover je tevreden bent. 1.

TI E)

2. b. Noem twee dingen die je de volgende keer anders wilt doen. 1.

AC

2.

ED

c. Vraag je docent en/of leermeester om feedback.

Tips:

1.10 Toets Opdracht 51

BE C EL ON D CE -& P TA T AL R

Tops:

Koppel de vergelijkingsoperatoren aan de betekenis daarvan. ===

Groter dan

>

Identiek aan

Kleiner of gelijk

< <=

Kleiner dan

Opdracht 52 extends

ER

Welke van de volgende woorden zijn gereserveerde sleutelwoorden? Er zijn meerdere antwoorden goed. function

N D

do

local

(Z O

global

69


Opdracht 53

break

Stopt het PHP-script

continue

Slaat een iteratie over

exit

Stopt de lusopdracht

TI E)

Koppel de opdracht aan de betekenis daarvan.

Opdracht 54

AC

Welke methode gebruik je om een double naar een geheel getal om te zetten? doubleval intval

ED

rond

BE C EL ON D CE -& P TA T AL R

Opdracht 55 Vraag 5xxx Koppel het datatype met het voorbeeld daarvan.

String

""

Boolean Float

true

19.99

Opdracht 56

Maak de volgende zin af. De if-opdracht bepaalt de ... sequentiële stroom

voorwaardelijke stroom repetitieve stroom

Opdracht 57 Vraag 7xxx

N D

String

ER

Koppel het datatype met het voorbeeld daarvan.

"" true

Float

19.99

(Z O

Boolean

Opdracht 58

Geef aan welke arraymethodes in de volgende lijst worden gebruikt om tweedimensionale arrays te lezen. Er zijn meerdere antwoorden goed.

70


Blok 1 Inleiding PHP

array_merge array_map array_slice array_walk array_walk_recursieve

TI E)

Opdracht 59 Maak de volgende zin af. Een JSON-Object is een ... array tweedimensionale array

AC

string

Koppel de methode aan de betekenis daarvan.

json_encode

Opdracht 61

Formatteert een PHP-array naar een JSON-Object

BE C EL ON D CE -& P TA T AL R

json_decode

ED

Opdracht 60

Neemt een JSON-Object als input en formatteert dit als een array

Wat mag een JSON-Object niet bevatten? getallen tekst functions booleans objecten

Opdracht 62

Wat is geen besturingsstructuur? if-opdracht variabele for-lus

ER

switchopdracht

(Z O

N D

while-lus

71


72

ER

N D

(Z O BE C EL ON D CE -& P TA T AL R ED

TI E)

AC


TI E) AC ED BE C EL ON D CE -& P TA T AL R

Blok 2 Gestructureerd programmeren

ER

Gestructureerd programmeren kan gezien worden als een subdiscipline van procedureel programmeren. Het is een van de belangrijke programmeerparadigma's, en waarschijnlijk het populairste voor het programmeren van computers. Bij Gestructureerd programmeren vermijd je lange scripts en beperk je je tot relatief kleinere blokken code.

Leerdoelen

Je kunt gestructureerd programmeren begrijpen en coderen. Je kunt globale en lokale variabelen begrijpen en coderen. Je kunt string-methodes begrijpen en coderen. Je kunt date-methodes begrijpen en coderen.

(Z O

N D

1. 2. 3. 4.


ER

N D

(Z O BE C EL ON D CE -& P TA T AL R ED

TI E)

AC


Opdracht 1 Oriëntatie gestructureerd programmeren Zoek op Internet naar verschillende programmeerparadigma's. Welk programmeerparadigma zou je aanbevelen voor de ontwikkeling van een eenvoudige softwaretoepassing, zoals een takenlijst-applicatie? Leg je keuze uit door de programmeerparadigma's met elkaar te vergelijken.

TI E)

2.1 Opdrachtenset Gestructureerd programmeren Opdracht 2 Functions

<?php function maxGetal($getal1, $getal2){

BE C EL ON D CE -& P TA T AL R

if($getal1 > $getal2){

ED

AC

Een function is een stuk(je) code met een specifieke taak die je vaker wilt aanroepen. Maak een nieuw PHP-script en sla het op als functions.php in de map gestructureerdprogrammeren. Codeer de volgende function.

return($getal1);

}elseif($getal2 > $getal1){ return($getal2); }else{

return("gelijk"); } } ?>

Opdracht 3 Functions

Codeer de interface voor je maxGetal function onderaan in functions.php als volgt:

ER

<h4>De maxGetal function</h4>

<form action="" method="post"> <input type="text" name="eerstegetal" placeholder="Eerste getal"><br>

N D

<input type="text" name="tweedegetal" placeholder="Tweede getal"><br><br> <input type="submit" name="submit" value="Bereken hoogste getal">

(Z O

<p>------------------------------ </p> </form>

Opdracht 4 Functions Codeer een PHP-blok onderaan in functions.php en roep de maxgetal function als volgt:

75


<?php if(isset($_POST["submit"])){ $maxgetal=maxGetal($_POST["eerstegetal"],$_POST["tweedegetal"]); echo"Hoogste getal is: $maxgetal";

TI E)

}

BE C EL ON D CE -& P TA T AL R

ED

AC

Het resultaat moet er als volgt uitzien:

Opdracht 5 Functions

Codeer een nieuwe function in functions.php die de hoogste van drie getallen uitrekent.

Opdracht 6 Functions

Codeer een nieuwe function in functions.php. Dit script rekent de reiskosten voor een treinrit uit.

1.

Codeer de reiskosten function als volgt:

function reiskosten($vertrek, $bestemming){ $reiskosten = array();

$reiskosten[1] = array();

ER

$reiskosten[2] = array(); $reiskosten[3] = array();

N D

$reiskosten[4] = array(); $reiskosten[1][1] = 0;

(Z O

$reiskosten[1][2] = 30;

76

$reiskosten[1][3] = 60; $reiskosten[1][4] = 90; return($reiskosten[$vertrek][$bestemming]);

}


Blok 2 Gestructureerd programmeren

2.

Als alternatief kunt je ook een associatieve-array als volgt maken:

function reiskosten($vertrek, $bestemming){ $reiskosten=array(); $reiskosten['amsterdam'] =

TI E)

['amsterdam'=>0,'utrecht'=>30, 'den haag'=>60,'rotterdam'=>90]; $reiskosten['utrecht'] = ['amsterdam'=>30,'utrecht'=>0,

AC

'den haag'=>40,'rotterdam'=>20]; $reiskosten['den haag'] =

ED

['amsterdam'=>60,'utrecht'=>40, 'den haag'=>0,'rotterdam'=>10];

BE C EL ON D CE -& P TA T AL R

$reiskosten['rotterdam'] = ['amsterdam'=>90,'utrecht'=>20,

'den haag'=>10,'rotterdam'=>0] ;

return ($reiskosten[$vertrek][$bestemming]); }

3.

De reiskosten-array heeft twee indices: de eerste index voor vertrek en de tweede index voor bestemming. Index[1] is Amsterdam, index[2] is Utrecht, index[3] is Den Haag, index[4] is Rotterdam. Maak de array $reiskosten af door de codes voor de volgende reiskosten in te voeren. Reiskosten Amsterdam Utrecht Den Haag

Utrecht

Den Haag

Rotterdam

0

30

60

90

30

0

40

20

60

40

0

10

90

20

10

0

4.

Codeer de volgende interface voor de reiskostenfunction. De function moet de berekende reiskosten retourneren. Zie figuur:

(Z O

N D

ER

Rotterdam

Amsterdam

Opdracht 7 Externe functions

Maak een nieuw PHP-script en sla het op als myfunctions.php in de map gestructureerdprogrammeren. Codeer de volgende function:

1.

Maak een nieuw PHP-script en sla het op als myfunctions.php Codeer de volgende function:

77


<?php function naw($naam, $adres, $woonplaats){ $naw = "$naam $adres $woonplaats"; return $naw;

2.

Met include voegen we de externe function in ons script in. Daarna voeren we de externe function uit. Door het benoemen van de parameters hoeven we geen volgorde aan te houden. Codeer het volgende PHP-blok onderaan functions.php.

AC

TI E)

};

$naw = naw(woonplaats:'Amsterdam', naam:'Jos', adres:'A-straat 22');

BE C EL ON D CE -& P TA T AL R

echo"<br> $naw";

ED

include("myfunctions.php");

Opdracht 8 Externe functions

(Z O

N D

ER

De htmlspecialchars() functie is een ingebouwde functie in PHP die wordt gebruikt om alle vooraf gedefinieerde tekens naar HTML-entiteiten te converteren. In deze opdracht codeer je het volgende formulier:

Voer de volgende stappen uit:

• •

78

1.

Codeer de interface en sla het op als formvalidatie.php in de map gestructureerdprogrammeren.

2.

Codeer de externefunction formvalideren in myfunctions.php als volgt:


Blok 2 Gestructureerd programmeren

functionformvalideren(){ $naam=htmlspecialchars(($_POST["naam"])); . . . . . .

TI E)

}

Op de puntjes valideer je de email en het wachtwoord ook. De function moet de veldnamen en de waarden weergeven. 3.

Roep de formvalideren function aan in formvalidatie.php. Het resultaat moet zoals in de figuur hier boven uitzien.

AC

Opdracht 9 Super globale variabelen

ED

2.2 Opdrachtenset Globale & lokale variabelen

<?php

BE C EL ON D CE -& P TA T AL R

Typ het volgende over en sla het op als globals.php in de map gestructureerdprogrammeren.

// superglobale scope

$GLOBALS['url'] = "www.mijndomeinnaam.nl";

function doneren($bedrag) {

// function scope

$melding = "GIRO 555";

echo "<br>" . $melding;

echo "<br>URL: " . $GLOBALS["url"]; echo "<br>Bedrag: " . $bedrag; }

?>

ER

doneren(100);

N D

Een superglobale variabele is overal in het script zichtbaar, binnen en buiten je functions. Het resultaat zie je hieronder:

(Z O

GIRO 555 URL:www.mijndomeinnaam.nl Bedrag: 100

Opdracht 10 Globale variabelen

Zorg dat globals.php er als volgt uitziet:

79


<?php // superglobale scope $GLOBALS["url"] = "www.mijndomeinnaam.nl"; // globale scope

TI E)

global $email; $email = "webmaster@mijndomeinnaam.nl"; function doneren($bedrag) {

AC

// function scope

echo "<br>" . $melding; echo "<br>URL: " . $GLOBALS["url"];

BE C EL ON D CE -& P TA T AL R

echo "<br />Bedrag: " . $bedrag; // declareer $email als globaal global $email;

echo "<br>E-mail:" . $email; } doneren(200); ?>

De globale variabele $email is nu zichtbaar binnen de function. De lokale variabele $melding is niet zichtbaar buiten de function. Het resultaat zie je hieronder: GIRO 555 URL: www.mijndomeinnaam.nl Bedrag: 200 E-mail:webmaster@mijndomeinnaam.nl

ER

Opdracht 11 Globale constanten

N D

Zorg dat globals.php er als volgt uitziet:

<?php

// superglobale scope

(Z O

$GLOBALS["url"] = "www.mijndomeinnaam.nl";

// globale scope global $email; $email = "webmaster@mijndomeinnaam.nl"; // globale constanten

80

ED

$melding = "GIRO 555";


Blok 2 Gestructureerd programmeren

define("BIJDRAGE",0.10); function doneren($bedrag) { // function scope $melding = "GIRO 555";

TI E)

echo "<br>" . $melding; echo "<br>URL: " . $GLOBALS["url"]; echo "<br>Bedrag: " . $bedrag; global $email;

AC

echo "<br>E-mail:" . $email;

$donatie = $bedrag + $bijdrage; echo "<br>Inclusief bijdrage: $donatie";

doneren(300); ?>

BE C EL ON D CE -& P TA T AL R

}

ED

$bijdrage = $bedrag * BIJDRAGE;

Constanten kunnen ook globaal zichtbaar binnen en buiten functions zijn. De naam van een constante typen we in hoofdletters en zonder $-teken. Zo kunnen we duidelijk zien dat het om een constante gaat. Het resultaat zie je hieronder: GIRO 555 URL: www.mijndomeinnaam.nl Bedrag: 300 E-mail: webmaster@mijndomeinnaam.nl Inclusief bijdrage: 330

Opdracht 12 Statische variabelen

<?php

ER

De waarde van een statische variabele binnen een function wordt bijgehouden van de ene tot de volgende keer als de function wordt uitgevoerd (gedraaid). Zorg dat globals.php er als volgt uitziet:

N D

// superglobale scope

$GLOBALS["url"] = "www.mijndomeinnaam.nl";

(Z O

// globale scope global $email; $email = "webmaster@mijndomeinnaam.nl"; // globale constanten define("BIJDRAGE",0.10); function doneren($bedrag)

81


{ // function scope $melding = "GIRO 555"; echo "<br>" . $melding; echo "<br>URL: " . $GLOBALS["url"];

TI E)

echo "<br>Bedrag: " . $bedrag; global $email; echo "<br>E-mail:" . $email; $bijdrage = $bedrag * BIJDRAGE;

AC

$donatie = $bedrag + $bijdrage;

static $pot; $pot = $pot + $donatie;

BE C EL ON D CE -& P TA T AL R

echo "<br><span style='background-color: yellow'> Totaal bedrag in pot $pot</span><br>"; } doneren(100); doneren(1000); doneren(33333); ?>

(Z O

N D

ER

Het resultaat zie je hieronder:

82

ED

echo "<br>Inclusief bijdrage: $donatie";


Blok 2 Gestructureerd programmeren

Opdracht 13 Statische variabelen Open globals.php en codeer een function die het aantal function calls bijhoudt. Het resultaat bij drie function calls moet er als volgt uitzien: Aantal calls: 1 Aantal calls: 2 Aantal calls: 3

TI E)

2.3 Opdrachtenset String-methodes Opdracht 14 String-methodes

ER

BE C EL ON D CE -& P TA T AL R

ED

AC

Raadpleeg zo nodig de theorie bij String-methodes. Een string is een reeks tekens tussen aanhalingstekens. In deze opdrachten codeer je alle methoden die een stringobject kunnen aanroepen. Maak een nieuw PHP-script en sla het op als stringmethodes.php in de map gestructureerdprogrammeren. Codeer het volgende formulier:

Opdracht 15 Strings verwerken

N D

a. Welke methode gebruik je om een string met speciale tekens op te schonen? trim

(Z O

htmlspecialchars strtoupper strtolower ucfirst explode

83


b. Open stringmethodes.php en codeer in een PHP-blok de juiste string-methode om JavaScript-injecties uit te schakelen bij alle formuliergegevens.

Opdracht 16 String-methodes Welke methode gebruik je voor het bijknippen voor en na spaties in een string?

TI E)

trim htmlspecialchars strtoupper strtolower

AC

str_replace str_starts_with

BE C EL ON D CE -& P TA T AL R

Opdracht 17 String-methodes

ED

Open stringmethodes.php. Codeer de juiste string-methode om de voor- en achterspaties in de formuliergegevens te verwijderen. Geef het resultaat weer.

Welke methode gebruik je om een string in hoofdletters te converteren? strpos str_replace

str_starts_with str_ends_with str_contains strtoupper

Open stringmethodes.php. Codeer de juiste string-methode om de woonplaats in hoofdletters te wijzigen. Geef het resultaat weer.

Opdracht 18 String-methodes

Welke methode gebruik je om een string met een hoofdletter te laten beginnen? trim strtoupper

ER

strtolower ucfirst explode

N D

strlen

(Z O

Open stringmethodes.php. Codeer de juiste string-methode om de naam en straat gegevens met een hoofdletter te latten beginnen. Geef het resultaat weer.

Opdracht 19 String-methodes

Welke methode gebruik je om een string in een array te converteren?

84


Blok 2 Gestructureerd programmeren

strtolower ucfirst explode strlen substr strpos

TI E)

Open stringmethodes.php. Codeer de juiste string-methode om de e-mail op te splitsen in twee delen: adres en domain. Bijvoorbeeld, als het e-mailadres wesley@rocva.nl, dan moet het adres wesley zijn en het domain moet rocva.nl zijn. Geef het resultaat weer.

AC

Opdracht 20 String-methodes strtoupper

strlen

strtolower

str_ends_with

ucfirst

str_contains

BE C EL ON D CE -& P TA T AL R

explode

ED

Welke methode gebruik je om een subtekst in een lange tekst te zoeken?

Open stringmethodes.php. Codeer de juiste string-methode om te zoeken of het commentaar het woord 'negatief' bevat . Geef het commentaar weer.

Opdracht 21 String-methodes

Welke methode gebruik je om een woord in een lange tekst te vervangen? substr

str_starts_with

strpos

str_ends_with

nl2br

str_contains

str_replace

Open stringmethodes.php. Codeer de juiste string-methode om het woord 'negatief' in het commentaar met 'positief' te vervangen. Geef het commentaar weer.

2.4 Opdrachtenset Date-methodes

ER

Opdracht 22 Date-methodes

Raadpleeg zo nodig de theorie bij Date-methodes.

N D

Welke methode gebruik je om het aantal seconden tussen 1 januari 1970, 00:00:00 en nu uit te rekenen? DateTime time

(Z O

getTimestamp strftime date_diff

Maak een nieuw PHP-script en sla het op als datemethodes.php in de map gestructureerdprogrammeren. Codeer het volgende:

85


<?php $vandaag = new DateTime("now"); echo "<br>Vandaag timestamp: ". $vandaag->getTimestamp(); $eenDag = 86400;

TI E)

$begin2000 = DateTime::createFromFormat("d/m/Y", "1/1/2000"); $eind2000 = DateTime::createFromFormat("d/m/Y", "31/12/2000"); $begin = $begin2000->getTimestamp(); $einde = $eind2000->getTimestamp();

AC

$dagenIn2000 = ($einde-$begin)/$eenDag;

Het resultaat zie je hieronder:

BE C EL ON D CE -& P TA T AL R

Aantal dagen in 2000: 365

Opdracht 23 Date-methodes

Welke methode gebruik je om een interval van tijd te creëren? DateTime time format

createFromFormat date_create DateInterval

Open datemethodes.php. Voer de volgende stappen uit: 1.

Creëer een nieuwe begindatum voor 1-1-2000

2.

Formateer je begindatum als Y-m-d

3.

Creëer een datum interval van 10 dagen

4.

Voeg je datum interval aan de begindatum toe

ER

• • • •

Geef de volgende resultaten weer:

N D

Begindatum: 2000-01-01 Begindatum plus tien dagen: 2000-01-11

(Z O

Opdracht 24 Date-methodes Welke methode gebruik je om een bestaande datum te formatteren?

86

ED

echo"<br>Aantal dagen in 2000: ".$dagenIn2000;


Blok 2 Gestructureerd programmeren

DateTime format createFromFormat date_format date_diff

1.

Formateer je begindatum als d-m-y

2.

Geef het resultaat weer

AC

• •

TI E)

Open datemethodes.php. Voer de volgende stappen uit:

Het resultaat moet het volgende zijn:

Opdracht 25 Date-methodes getTimestamp

BE C EL ON D CE -& P TA T AL R

a. Welke methode gebruik je om het verschil tussen twee data te creëren?

ED

Begindatum: 01-11-2000

createFromFormat strftime date_diff DateInterval

b. Welke methode gebruik je om een string-datum om te zetten in aantal seconden sinds 1 januari 1970? getTimestamp

createFromFormat strtotime date_diff DateInterval

Open datemethodes.php. Voer de volgende stappen uit: Creëer een nieuwe datum voor vandaag

2.

Creëer een betaaldatum voor 2030-01-01

3.

Reken het verschil in dagen tussen vandaag en de betaaldatum

4.

Geef het resultaat weer

ER

1.

N D

• • • •

Het resultaat moet het volgende zijn:

(Z O

Je hebt nog xxxx dagen te betalen

Opdracht 26 Date-methodes

Open datemethodes.php. Voer de volgende stappen uit:

1.

Formateer je betaaldatum als "Tuesday 01 January 2030"

87


2.

Geef het resultaat weer

Het resultaat moet het volgende zijn: Betaaldatum is Tuesday 01 January 2030

Opdracht 27 Date-methodes

TI E)

Welke methode gebruik je om een nieuwe datum te creëren die gebaseerd is op een string? getTimestamp createFromFormat

AC

strtotime date_diff

Opdracht 28 Date-methodes

ED

DateInterval

BE C EL ON D CE -& P TA T AL R

Open datemethodes.php. Voer de volgende stappen uit: vergelijk de datum van vandaag met de kerstdatum dit jaar. Geef het aantal dagen tot kerst aan. Het resultaat is afhankelijk van de datum vandaag.

2.5 Theorie Gestructureerd programmeren Gestructureerd programmeren

Een programmeerparadigma is een stijl, of "manier", van programmeren. Programmeerparadigma's verschillen van elkaar op basis van de functies en de stijl die ze ondersteunen. Er zijn verschillende kenmerken die een programmeerparadigma bepalen, zoals modulariteit, objecten, onderbrekingen of gebeurtenissen, regelstroom enzovoort. Gestructureerd programmerenkan gezien worden als een subdiscipline van procedureel programmeren, een van de belangrijke programmeerparadigma's. De programmeur beperkt zich tot de vier basis controlstructuren (if-opdrachten, lussen, blokstructuren en functions), dat wil zeggen het vermijden van lange programmablokken door relatief kleine functions en iteraties. De term "gestructureerd programmeren" is bedacht in 1968 door de Nederlandse informaticus Edsger W. Dijkstra.

ER

Objectgeoriënteerd programmeren (OOP) is een programmeerparadigma gebaseerd op het concept van "objecten", dat gegevens en code kan bevatten: gegevens in de vorm van velden (vaak bekend als attributen of eigenschappen) en code, in de vorm van procedures (vaak bekend als methoden).

N D

In PHP kunt je zowel Gestructureerd als Objectgeoriënteerd programmeren. Dit boek gaat over Gestructureerd programmeren.

(Z O

Functions Een function is code die een specifieke taak uitvoert. Functions codeer je apart. Dan zijn ze leesbaarder en je kunt ze hergebruiken wanneer je dezelfde taak moet uitvoeren. • Een function is een blok van statements die herhaaldelijk in een programma gebruikt kunnen worden. • Een function wordt niet automatisch uitgevoerd wanneer een pagina wordt geladen. • Een function wordt uitgevoerd door een functionaanroep.

88


Blok 2 Gestructureerd programmeren

Ingebouwde functions in PHP PHP heeft een enorme collectie interne of ingebouwde functions die je direct kunt aanroepen binnen je PHP-scripts om een specifieke taak uit te voeren, zoals gettype, print_r, var_dump enzovoort.

TI E)

Door de programmeur gedefinieerde functions Naast de ingebouwde functions kun je ook je eigen functions definiëren. Een function kan bewaard en onderhouden worden los van de basiscode. Voordelen van het gebruik van functions zijn: • Functions verminderen de herhaling van code binnen een programma. • Functions maken de code makkelijker te onderhouden. • Functions maken het gemakkelijker om fouten te voorkomen. • Functions kunnen worden hergebruikt in andere programma’s.

BE C EL ON D CE -& P TA T AL R

function functionnaam ( $input[optioneel] ){

ED

In PHP declareer je een function als volgt:

AC

PHP ondersteunt eersteklas functions, wat betekent dat een function kan worden toegewezen aan een variabele, als argumenten kan worden doorgegeven aan andere functions. Een function kan andere functions retourneren.

acties uit te voeren;

wanneer deze function wordt opgeroepen; return($output [optioneel]); }

(Z O

N D

ER

De functionnaam verzin je zelf. De naam moet een beschrijving zijn van wat de function doet. Je mag de namen van bestaande PHP-functions niet herdefiniëren. Een web-applicatie kan bestaande functions in bibliotheken oproepen en mag ze niet opnieuw coderen. Zie de volgende figuur:

Figuur 2.1 Figuur 1.24 Function-bibliotheken

Hier zien we een applicatie die function-calls naar bibliotheken uitvoert. Voor de applicatie is een function als een zwarte doos met input en output. De acties worden binnen de zwarte doos uitgevoerd. Een function mag een of geen waarde retourneren.

89


Function met input-parameters Hier maken we een nieuwe function met de naam print en de parameter $input. In deze function geef je wat input en de function kan dan iets met de input doen:

function print($input){ echo $input;

TI E)

}

BE C EL ON D CE -& P TA T AL R

ED

AC

De volgende figuur geeft de syntaxis schematisch aan:

Figuur 2.2 Figuur 1.25 Een function met input-parameters

Function met input en output Hier volgt een voorbeeld van een function met input en output. Deze function gebruikt de input om een resultaat te genereren en vervolgens om het resultaat met het commando return te retourneren:

function verdubbelen ($input){ $resultaat = $input * 2; return($resultaat); }

(Z O

N D

ER

De volgende figuur geeft de syntaxis schematisch aan:

Figuur 2.3 Figuur 1.26 Een function met input en output

Function zonder input of output Bij een function zonder input laat je de haakjes leeg:

90


Blok 2 Gestructureerd programmeren

function groet() { echo "goedemorgen"; }

Bij een function zonder output gebruik je geen return():

TI E)

Function calls Om een function te kunnen gebruiken (‘aanroepen’) moet je de juiste syntaxis van de function gebruiken. De syntaxis of signatuur van een function is de function- naam plus de function-parameters. In het volgende voorbeeld heeft de function verdubbelen een getal als input-parameter nodig, of een variabele met een getal. Bijvoorbeeld:

AC

verdubbelen(44);

BE C EL ON D CE -& P TA T AL R

verdubbelen($bedrag);

ED

of

De volgende figuur geeft schematisch weer hoe een function wordt opgeroepen en uitgevoerd.

Figuur 2.4

ER

In deze figuur worden de volgende vijf stappen uitgevoerd: 1. Bij de echo-opdracht roepen we de verdubbelen-function aan met het getal 44 als input. 2. De function wordt uitgevoerd met 44 als de input-parameter. 3. De function rekent 44 * 2 uit. 4. Het resultaat 88 wordt geretourneerd. 5. De echo-opdracht geeft het resultaat 88 weer.

(Z O

N D

Externe functions Je codeert PHP-functions binnen een PHP-script, maar je kunt ook een externe function coderen in een ander bestand. Externe functions kun je vanuit een PHP-script oproepen, maar dan moet je eerst de externe functions laden met de opdracht include() of require(). De include()-opdracht Met include kun je bestanden met functions, tekst en html-tags importeren in je PHP-script. Een externe include is ideaal wanneer je herbruikbare code wilt programmeren.

91


Syntaxis

include "bestandsnaam.php";

TI E)

De require()-opdracht Met require() kun je ook bestanden importeren, maar als het bestand niet gevonden is, geeft deze opdracht een foutmelding.

AC

Syntaxis

ED

require "bestandsnaam.php";

BE C EL ON D CE -& P TA T AL R

De include_once() en require_once()-opdrachten Deze opdrachten importeren bestanden eenmalig en worden verder includes genegeerd, want het bestand is nu al geïmporteerd.

include_once "bestandsnaam.php";

Het importeren van externe bestanden maakt onze code meer: • modulair • gestructureerd • leesbaar

Met include/ require kunnen we ook gebruikmaken van code van derden of van software-bibliotheken. Open source libraries (bibliotheken) Open source software is computer-software die openbaar en in samenwerking is ontwikkeld en waarbij de broncode beschikbaar is onder een ‘public domain licentie’. Dit betekent dat we de software kunnen bestuderen en verbeteren. Er zijn veel ervaren programmeurs die vrijwillig samenwerken om de kwaliteit van open source te verbeteren. Voorbeelden van open source zijn onder andere Linux, Android, PHP, MySQL. Een platform voor het ontwikkelen en het delen van software is GitHub.

N D

ER

Dependency Bij het gebruik van externe bibliotheken creëren we dependencies (afhankelijkheden). Bij programmering betekent een dependency dat software afhankelijk is van andere software. We moeten ervoor zorgen dat de gebruikte bibliotheken betrouwbaar zijn. Onbetrouwbare software kan bijvoorbeeld computervirussen bevatten.

(Z O

Genoemde inputparameters De inputparameters voor een function worden op volgorde geëvalueerd, bijvoorbeeld:

function naw($naam, $adres, $woonplaats){ $naw = $naam . ' ' . $adres . ' ' . $woonplaats;

return ($naw);

92


Blok 2 Gestructureerd programmeren

}; echo (naw('Jos', 'A-straat 22', 'A-plaats'));;

Hier wordt Jos gekoppeld aan $naam enzovoort. Dus bij het uitvoeren van de function naw moet je de juiste volgorde van de parameters volgen.

TI E)

Vanaf PHP versie 8.0 kunnen we inputparameters voor een function benoemen. Dit kunnen we in een willekeurige volgorde doen.

function naw(naam: $naam, adres: $adres, woonplaats: $woonplaats){

AC

$naw = $naam . ' ' . $adres . ' ' . $woonplaats; return ($naw);

ED

};

BE C EL ON D CE -& P TA T AL R

echo (naw(naam:'Jos', adres:'A-straat 22', woonplaats:'A-plaats'));

Functions en variabele-scope Iedere programmeertaal werkt met het begrip ‘scope’. De scope, of reikwijdte van een variabele, geeft aan waar in een script die variabele ‘zichtbaar’ is. PHP heeft ook regels voor de scope van variabelen. Variabelen kunnen bijvoorbeeld globaal of lokaal zichtbaar zijn. Een variabele binnen een blok is lokaal-zichtbaar alleen in zijn blok. Globale variabelen Globale variabelen zijn variabelen die globaal of overal in het programma toegankelijk zijn. Globale variabelen declareren we als volgt:

global $email;

Een globale variabele is zichtbaar binnen het script, maar niet binnen een function. Als je een globale variabele binnen een function wilt gebruiken, moet je de variabele binnen de function weer als globale declareren:

function naam(){

N D

}

ER

global $email;

(Z O

Constanten Een constante is het tegenovergestelde van een variabele: de waarde van een constante blijft altijd hetzelfde. Denk bijvoorbeeld aan gegevens die zelden veranderen, zoals het btw-percentage of een bedrijfsadres. Statische variabelen Statische variabelen (‘static’) die gemaakt worden binnen een function zijn niet zichtbaar buiten de function. De waarde van een statische variabele binnen een function wordt bijgehouden van de ene tot de volgende keer als de function wordt uitgevoerd (gedraaid). Zo kun je bijvoorbeeld een teller maken die het aantal keer dat een function wordt aangeroepen bijhoudt.

93


Superglobale arrays Sommige vooraf gedefinieerde arrays in PHP zijn "superglobals", wat betekent dat ze altijd toegankelijk zijn, ongeacht hun scope- en dat je ze vanuit elke functie kunt benaderen. We kunnen een $_GLOBALS-array overal benaderen, bijvoorbeeld:

TI E)

$_GLOBALS_['variabelenaam']

BE C EL ON D CE -& P TA T AL R

Een sessie ontstaat gedurende een bezoek aan een website.

ED

AC

Een paar voorbeelden van super globals zijn: • $GLOBALS is een array met alle globale variabelen. • $_GET is een array met formuliervariabelen die je met method="get" zichtbaar maakt in je script. • $_POST is een array met formuliervariabelen die je met method="post" zichtbaar maakt in je script. • $_COOKIE is een array met cookie-variabelen. • $_FILES is een array met variabelen over file-uploads. • $_SESSION is een array met sessie-variabelen.

Cookies Cookies zijn kleine bestandjes die opgeslagen worden in local storage op de harde schijf van de bezoeker. Hierin kan informatie opgeslagen worden, bijvoorbeeld of de bezoeker al eerder op de website is geweest. Wanneer de browser een verbinding maakt met een URL, zoekt de browser naar bestaande cookies op de harde schijf van de bezoeker. Als de cookies bestaan, zijn deze cookies beschikbaar in de PHP-array $_COOKIES[]. Cookies plaatsen Je kunt een cookie plaatsen op de computer van je bezoeker met de volgende code:

setcookie("naam", "inhoud");

Bij naam vul je de naam van de cookie in, inhoud vervang je door de inhoud van de cookie. Om een cookie te maken met een geldigheidsduur van een uur gebruik je de volgende code:

ER

setcookie("naam", "inhoud", time() + 3600);

N D

Cookies lezen Om de inhoud van een eerder geplaatste cookie op te roepen gebruik je de volgende code:

(Z O

$_COOKIE["naam"];

Output-buffer Een andere oplossing is het gebruik van de output-buffer. We plaatsen meerdere outputs in de output-buffer zodat we alles in één keer kunnen verzenden. We starten en flushen (leegmaken) de output-buffer met de volgende twee methodes:

94


Blok 2 Gestructureerd programmeren

ob_start()

en

TI E)

ob_end_flush()

AC

Met de print_r($_COOKIE)-methode hebben we de $_COOKIE-array weergegeven. Hier zien we de gebruiker en de PHPSESSID-cookies. De PHPSESSID is de sessie-ID. Alle gebruikers die een request versturen naar de server krijgen een unieke sessie-ID. We behandelen sessies aan het einde van dit hoofdstuk.

ED

Cookies updaten De inhoud van een cookie kan gewijzigd worden door simpelweg een cookie met dezelfde naam, maar andere inhoud eroverheen te schrijven.

BE C EL ON D CE -& P TA T AL R

Cookies verwijderen Als je een cookie hebt geplaatst met een geldigheidsduur, kun je de cookie ook verwijderen door de geldigheidsduur negatief te maken. $_POST-variabelen $_POSTis een superglobale PHP-array die wordt gebruikt om formuliergegevens te verzamelen na het indienen van een HTML-formulier met method="post". Deze en andere servervariabelen zij te vinden in de volgende globale associatieve arrays: • De $_POST-array bevat formuliergegevens. • De $_GET-array bevat de verzonden URL-variabelen. • De $_COOKIE-array bevat de aangemaakte cookies. Form, action en method Gebruikers kunnen een html-formulier gebruiken om gegevens in te voeren en te versturen. Een formulier wordt gedefinieerd door middel van de tags form en /form. Bijvoorbeeld:

<form action="verwerken.php" method="post">

action: dit attribuut geeft de URL van het script waar het formulier naartoe wordt gestuurd.

ER

method: dit moet GET of POST zijn.

N D

Dit zijn de twee methodes om variabele informatie van de browser naar de server te sturen. In dit geval gebruiken we POST om de formuliergegevens te posten naar een tweede script: verwerken.php.

(Z O

Met de GET-methode kunnen we variabelen via de request-URL naar de server sturen. Het vraagteken roept de GET-methode aan. Bijvoorbeeld: http://www.test.com/index.html?variabele1=een&variabele2=twee

Hier hebben we twee variabelen naar de server verstuurd. De GET-methode kan maximaal 1024 tekens versturen.

Formuliergegevens verwerken Kijk nogmaals naar de <form>-tag:

95


<form action="verwerken.php" method="post">

Als actie hebben we gekozen voor action="verwerken.php" en de methode om dat te doen is method="post". Als je op de versturen-knop klikt, worden de formuliergegevens verstuurd naar het verwerken.php-script.

TI E)

$_SERVER[‘PHP_SELF’] Een tweede optie is de action-attribuut $_SERVER['PHP_SELF']bijvoorbeeld:

<form name="form"

AC

action="<?php echo $_SERVER['PHP_SELF']; ?>"

ED

method="post">

BE C EL ON D CE -& P TA T AL R

Met $_SERVER['PHP_SELF'] geven we aan dat de formuliergegevens verwerkt worden in ditzelfde script. We kunnen ook gewoon zeggen: action="". Een lege action heeft dezelfde functie als $_SERVER['PHP_SELF']. In de volgende afbeelding zien we formuliergegevens door verstuurd naar een PHP-script:

Figuur 2.5 Figuur 1.13 Formulier wordt verstuurd naar verwerken-script

ER

isset() In het verwerken-script kun je controleren of het formulier verzonden is. Daarvoor gebruik je de methode isset() bijvoorbeeld:

N D

if(isset($_POST["submit"])

(Z O

Isset is true alleen als de variabele $_POST["submit"] bestaat en niet NULL, 0, “” of “0” is.

empty() In het verwerken-script kun je ook controleren of een formulier-inputveld is ingevuld. Daarvoor gebruik je de methode empty(), bijvoorbeeld:

96


Blok 2 Gestructureerd programmeren

if(empty($_POST["naam"]))

Empty is true alleen als de variabele $_POST["naam"] 0, "" of "0" is.

TI E)

Element-naam arrays In dit script hebben we een formulier gecodeerd met een enkel album. De album- gegevens hebben we onzichtbaar gemaakt met het attribuut:

AC

<input type="hidden"

BE C EL ON D CE -& P TA T AL R

name="albumcode[0]"

ED

Bij ieder input-element hebben we een naam en een index gebruikt. Zo hebben we een array gecreëerd voor alle albumcodes.

Zo kunnen we later meerdere albums toevoegen. Een bepaald element controleer je als volgt:

if( isset($_POST["albumcode"][0]) )

Checkboxes Bij de <input type="checkbox">-elementen geven we ieder element een eigen naam:

Korting:

<input type="checkbox" name="student" value="15" /> Student: 15%<br />

<input type="checkbox" name="klant" value="10" /> Klant: 10%<br />

ER

Bij de uitwerking kunnen we iedere checkbox als volgt individueel controleren:

N D

if( isset($_POST["student"]) ) $korting = $korting + 15;

(Z O

String-methodes Een string is een reeks tekens tussen aanhalingstekens. Hier vind je alle methoden die een stringobject kan aanroepen.

String-methodes Wanneer we gebruikersinformatie krijgen toegestuurd via een formulier, moeten we controleren of de informatie goed of fout is. Dit kunnen we doen met behulp van string-methodes. Net zoals de array-methodes gebruiken we string-methodes om strings te verwerken.

97


Uitschakelen van script-injections Een steeds belangrijker onderdeel van het beroep van applicatieontwikkelaar is de beveiliging. Je wilt te allen tijde voorkomen dat vreemden aan jouw code gaan sleutelen. Een manier om een code te kraken is script-injection. Script-injections zijn letterlijk JavaScripts die ‘geïnjecteerd’ worden in je PHP-code via een formulier-invoervak.

AC

TI E)

htmlspecialchars() htmlspecialchars is een methode die helpt tegen script-injections is de htmlspecialchars()-methode. De methode maakt de input onschadelijk door de codes als volgt om te zetten in tekst: & wordt omgezet in &amp " wordt omgezet in &quot ' wordt omgezet in &apos < wordt omgezet in &lt > wordt omgezet in &gt

BE C EL ON D CE -& P TA T AL R

<script>alert("XSS-aanval")</script>

ED

Als we in het vorige script via het postcode-invoervak de volgende JavaScript-in- jections gebruiken:

kunnen we de script-injection als volgt uitschakelen:

$postcode = htmlspecialchars($_POST["postcode"]);

Zo wordt de script-injection in de volgende tekst omgezet en zo onschadelijk gemaakt: &ltscript&gtalert(&quotXSS-aanval&quot)&lt/script&gt

Als je dit ziet dan was er een poging om via je formulier een stuk code te injecteren.

trim() De methode trim() verwijdert spaties aan het begin en einde van een input-string. Bijvoorbeeld trim(" Umut ") geeft als resultaat "Umut". Je kunt ook de methodes ltrim() en rtrim() gebruiken voor het verwijderen van spaties links of rechts van een string. strtoupper() De methode strtoupper() verandert een input-string in hoofdletters. Bijvoorbeeld:

ER

strtoupper("amsTERdam") geeft als resultaat "AMSTERDAM".

N D

strtolower() De methode strtolower() verandert een input-string in kleine letters. Bijvoorbeeld strtolower("LETTERS") geeft als resultaat "letters".

(Z O

ucfirst() Deze methode wijzigt de eerste letter van een string in een hoofdletter. Bijvoorbeeld: ucfirst("umut sandoval") geeft als resultaat "Umut sandoval".

explode() Deze methode hebben we al gezien bij array-methodes. De methode explode() splitst een input-string in substrings, gebaseerd op het scheidingsteken. Het resultaat is een array met de gesplitste substrings.

98


Blok 2 Gestructureerd programmeren

strlen() De methode strlen() geeft als resultaat de lengte van de input-string. Met deze methode kunnen we input-gegevens controleren.

$postcodelengte = strlen($postcode);

TI E)

substr() De methode substr() geeft als resultaat een deel of substring van de input-string. Deze methode heeft drie input-parameters: substr(input-string, vanaf positie, lengte van de substring)

AC

Bijvoorbeeld:

ED

$postcodePrefix = substr($postcode,0,4);

BE C EL ON D CE -& P TA T AL R

strpos() De methode strpos() geeft als resultaat de positie van een substring binnen de input-string. Als de substring niet gevonden is, dan is het resultaat false. Deze methode heeft drie input-parameters:

strpos(input-string, substring, [offset]);

offset is optioneel en geeft de beginpositie in de input-string, bijvoorbeeld:

$email = "user@domain.nl";

$nl = strpos($email, ".nl"); // Resultaat is "12"

$be = strpos($email, ".be"); // Resultaat is false

ER

nl2br() De methode nl2br() (newline to break) gebruiken we voor het omzetten van tekst naar hypertekst of html-tekst. Dit gaat op de volgende manier:

N D

Alle nieuweregeltekens (‘newlines’) worden vervangen door de html-code <br>. Zo kunnen we de lange string vanuit het element

(Z O

$_POST['commentaar']

formatteren voor het weergeven in een browser. nl2br() herkent de Enter-toets als een <br>-tag.

99


str_replace() De methode str_replace() gebruik je voor het zoeken en vervangen van substrings in een input-string. Zo kunnen we een meer persoonlijk PHP-document genereren door het vervangen van bijvoorbeeld <<naam>> door de persoonsnaam en <<straat>> door de straat uit het formulier. De te vervangen woorden en de nieuwe woorden kun je ook in arrays doorgeven. Bijvoorbeeld:

Het resultaat is dat alle scheldwoorden in $commentaar worden vervangen door “*#@#*!%!”.

TI E)

$scheldwoorden = array("debiel", "laf", "gestoord"); str_replace($scheldwoorden, "*#@#*!%!", $commentaar);

ED

AC

str_starts_with() Gebruik deze methode voor het zoeken naar een tekst aan het begin van een string-variabele. Het resultaat is 1 als de string begint met een tekst of 0 als niet. Bijvoorbeeld:

BE C EL ON D CE -& P TA T AL R

echo str_starts_with( "vandaag is de dag","vandaag")?"waar":"onwaar";

Geeft als resultaat de tekst 'waar'.

str_ends_with() Gebruik deze methode voor het zoeken naar een tekst aan het einde van een string variabele. Het resultaat is 1 als de string eindigt met een tekst of 0 als niet. Bijvoorbeeld: echo str_ends_with( "vandaag is de dag","vandaag")?"waar":"onwaar";

Geeft als resultaat de tekst 'onwaar'.

str_contains() Gebruik deze methode voor het zoeken naar een tekst overal in een string-variabele. Het resultaat is 1 als de string bevat de gegeven tekst of 0 als niet. Bijvoorbeeld:

echo str_contains( "vandaag is de dag","is de")?"waar":"onwaar";

Geeft als resultaat de tekst 'waar'.

ER

Date-methodes

(Z O

N D

Date-methodes Het date-datatype komt bijna altijd voor wanneer we gegevens verwerken, bijvoorbeeld geboortedatum, factuurdatum enzovoort. In deze paragraaf bekijken we de volgende onderwerpen: • DateTime-object • Timestamp • Date-methodes • Date-intervals • Lokale date en time Het DateTime-object Een date-object is een object met informatie over de datum en tijd en met methodes om deze informatie te verwerken. Zo kunnen we bijvoorbeeld twee data vergelijken en het aantal dagen tussen de twee data uitrekenen. Hiervoor gebruiken we methodes van het DateTime-object. Bijvoorbeeld:

100


Blok 2 Gestructureerd programmeren

$datum = new DateTime("now");

Maakt het $datum-object met de datum van nu.

TI E)

$datum = new DateTime("2019-01-01");

Maakt het $datum-object met de datum van 1 januari 2019.

Voorbeeld

c

Datum in de vorm JJJJ-MM-DD T HH:MM:SS

d

Dag van de maand in twee cijfers (01 t/m 31)

j

Dag van de maand in cijfers (1 t/m 31)

l

Volledig dag van de week (Monday t/m Sunday)

D

Dag van de week in drie letters (Mon t/m Sun)

G

Uur in de vorm 0 t/m 23

H

Uur in de vorm 00 t/m 23

m

De maand in twee cijfers (01 t/m 12)

M

De maand in drie letters (jan t/m dec)

F

De maand in letters (januari t/m december)

w

Dag van de week (0 t/m 6) voor zondag t/m zaterdag

y

Jaartal in twee cijfers (b.v. 11)

Y

Jaartal in vier cijfers (b.v. 2011)

BE C EL ON D CE -& P TA T AL R

Code

ED

Tabel 2.1 Formatteren van het DateTime-object

AC

Formattering codes voor het DateTime-object Je kunt uit verschillende codes kiezen om de datum naar wens te formatteren:

ER

Omdat DateTime een class is en $datum een object moeten we het object eerst formatteren en daarna weergeven. Hiervoor gebruiken we de methodes van de Date- Time-class. Bijvoorbeeld:

N D

$datum = new DateTime("2019-01-01");

(Z O

Dit date-object heeft methodes, zoals de format-methode. Deze methodes gebruiken we als volgt:

$object->methode();

Bijvoorbeeld:

101


echo $datum->format('Y-m-d H:i:s');

formatteert het $datum-object als volgt: 2019-01-01 00:00:00

TI E)

Timestamp De tijdstempel of de Unix-timestamp is een 32-bits integer met het aantal seconden die verlopen zijn sinds middernacht 1 januari 1970. Een dag bevat 86.400 seconden, dus we kunnen een dag in seconden als volgt coderen:

BE C EL ON D CE -& P TA T AL R

$tijdStempel = time();

ED

time() Om de tijdstempel (in seconden) van nu te krijgen gebruiken we de time-methode als volgt:

AC

$eenDag = 86400;

mktime Om de tijdstempel van een andere datum te creëren gebruiken we de mktime-methode. Bijvoorbeeld:

$tijdStempel = mktime(0,0,0,1,1,2000);

is de tijdstempel voor middernacht van het nieuwe jaar 2000.

De getTimestamp-methode We kunnen de tijdstempel van een date-object aanvragen met de getTimestamp-methode als volgt:

$datum = new DateTime("2019-01-01");

ER

$tijdstempel = $datum->getTimestamp();

N D

Formateer een Timestamp We kunnen een tijdstempel formatteren met formatteercodes. Bijvoorbeeld:

$datum = new DateTime();

(Z O

$tijdstempel = $datum->getTimestamp(); echo date('l d/m/Y',$tijdstempel);

De strtotime-methode Deze methode converteert een string-datum in het aantal seconden since 1 januari 1970. Bijvoorbeeld:

102


Blok 2 Gestructureerd programmeren

$datum = "05/15/2020 5:36 PM"; //converteer $datum en tijd in seconden $seconden = strtotime($datum);

AC

TI E)

createFromFormat We kunnen een date-object ook maken met de createFromFormat-methode. Dan maken we een date-object dat gebaseerd is op het aangegeven format. Dit is een statische methode van de DateTime-class. Een statische methode hoef je niet te creëren met het woord new en gebruik je als volgt:

Bijvoorbeeld:

BE C EL ON D CE -& P TA T AL R

$object = DateTime::createFromFormat("d/m/Y", "1/1/2000");

ED

$object = Class::methode();

In de volgende opgave creëren we een datum met de statische createFromFormat-methode.

DateIntervals Een date-interval kan een interval van uren, dagen, maanden of jaren zijn. De interval-methode maakt intervals van tijd aan en gebruikt de volgende codes. Tabel 2.2 Date-interval-codes

Code

Voorbeeld

Intervaltijd

Tijd

PT

PT10H30M30S

10 uur 30 minuten 30 seconden

Datum

P

P1Y0M0D

1 jaar

Datum en tijd

P

P1Y0M0DT0H0M0S

1 jaar 0 maanden 0 dagen 0 tijd

ER

Bijvoorbeeld:

N D

DateInterval("P10D");

maakt een interval van tien dagen aan.

(Z O

Datum wijzigen met add DateInterval We kunnen de datum zelf wijzigen met de add-methode als volgt:

$datum->add(new DateInterval("P10D"));

Format is de formatcode uit de volgende tabel. Timestamp is optioneel en representeert de te formatteren datum

en tijd. Default is de huidige datum en tijd. De methode time() geeft de huidige timestamp.

103


Lokale datuminstelling In het vorige resultaat kregen we de datum geformatteerd in het Engels. Maar we kunnen de lokale datuminstellingen gebruiken om de datum in het Nederlands te formatteren.

setlocale(LC_ALL, 'nld_nld'); // voor Windows

TI E)

setlocale(LC_ALL, 'nl_NL'); // voor Linux

AC

De date_create-methode Zoals we eerder hebben gezien, is DateTime een manier om een date-object te maken. Een tweede manier om dit te doen is de date_create-methode. Bijvoorbeeld:

ED

$datum = date_create("2000-01-01");

BE C EL ON D CE -& P TA T AL R

De date_format-methode Zoals we eerder hebben gezien, kunnen we een date-object met de codes uit tabel formatteren. Een tweede manier om een date-object te formatteren is met de date_format-methode. Zoals eerder gezegd, een date-object kunnen we niet rechtstreeks weergeven of printen. Om de datum in een date-object te printen, moeten we eerst het object formatteren met de date_format-methode. De date_diff-methode We kunnen twee data vergelijken wat betreft jaren, maanden, dagen en tijd. Daarvoor gebruiken we de date_diff-methode als volgt:

$verschilInDagen = date_diff($datum1, $datum2);

2.6 Begrippen

2.7 Test je kennis Opdracht 29 Vraag 1

ER

Welke programmeerstijl beperkt zich tot de vier basis controlestructuren (if-opdrachten, lussen, blokstructuren en functions)? Objectgeoriënteerd programmeren

N D

Gestructureerd programmeren Functioneel programmeren

(Z O

Opdracht 30 Vraag 2 Wat is een blok code die een specifieke taak uitvoert? array function blok

104


Blok 2 Gestructureerd programmeren

Opdracht 31 Vraag 4 Hoe noem je software als die afhankelijk is van andere software? scope dependency open source

TI E)

Opdracht 32 Vraag 3 Koppel de funtion met de juiste beschrijving.

importeert bestanden met functions, tekst en html-tags in je PHP-script

require

importeert bestand en geeft foutmelding wanneer bestand niet gevonden is

include_once

importeert bestanden eenmalig en negeert verder includes

BE C EL ON D CE -& P TA T AL R

require_once

ED

AC

include

importeert bestand eenmalig en geeft foutmelding wanneer bestand niet gevonden is

Opdracht 33 Vraag 5

a. Welke van de volgende opdrachten geeft een foutmelding als een script niet gevonden wordt? include require include_once

b. Wat doe de require-opdracht? Er zijn meerdere goede antwoorden. Inporteert een script

Geeft een foutmelding als een script niet gevonden wordt Exporteert een script

ER

Opdracht 34 Vraag 6

N D

Koppel het concept met de beschrijving.

Cookies

kleine bestandjes opgeslagen in local storage

Scope

reikwijdte van een variabele

(Z O

Globale variabelen

overal en altijd toegankelijk

Opdracht 35 Vraag 8

Selecteer alle voordelen van gestructureerd programmeren.

105


Korte coderingstijd Beter organisatie van de code Lange code scripts

Opdracht 36 Vraag 5 Welke variabelen worden bijgehouden van de ene tot de volgende keer dat een function wordt uitgevoerd?

TI E)

super globale variabelen globale variabelen constante variabelen lokale variabelen

AC

statische variabelen

Welke variabelen blijven altijd hetzelfde? super globale variabelen

BE C EL ON D CE -& P TA T AL R

globale variabelen

ED

Opdracht 37 Vraag 7

constante variabelen lokale variabelen

statische variabelen

Opdracht 38 Vraag 9

Welke variabelen zijn overal in het programma toegankelijk? super globale variabelen globale variabelen

constante variabelen lokale variabelen

statische variabelen

Opdracht 39 Vraag 10

Welke variabelen zijn alleen in hun blok toegankelijk? super globale variabelen globale variabelen

ER

constante variabelen lokale variabelen

N D

statische variabelen

2.8 Praktijkopdrachten

(Z O

Opdracht 40 Bestanden uploaden

Uploadsformulier Maak een nieuw PHP-script met het volgende uploadsformulier en sla het op als uploads.php in de map gestructureerdprogrammeren. Het formulier moet er als volgt uitzien:

106


BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

Blok 2 Gestructureerd programmeren

Om het formulier te maken voer de volgende stappen uit:

1.

Codeer de form-tag met een enctype attribuut als volgt:

<form action="" method="post" enctype="multipart/form-data">

2.

Codeer een <img>-tag als volgt:

<img id="foto" width="20%" src="uploads/profiel.png" alt="img"/>

Maak de map uploads in de map gestructureerdprogrammeren en plaats een afbeelding met de naam profiel.png zoals de afbeelding in de figuur hierboven.

4.

Codeer de input type file als volgt:

ER

3.

N D

• •

<label for="fotoupload">Upload je foto</label>

(Z O

<input type="file" name="fotoupload" id="foto" />

5.

Codeer als laatst een <output>-tag voor meldingen als volgt:

<output id="melding">Een foto voor je profiel uploaden</output>

Het resultaat moet zoals hierboven zijn.

107


6.

De styles voor de tag input type=file moet je specifiek als volgt coderen:

input[type=file]::file-selector-button { background-color: slategray; border:none;

TI E)

border-radius:5px; font-size: 15px; color:white; padding: 5px 18px 5px 18px;

AC

cursor: pointer;

Het resultaat moet zoals hierboven zijn.

ED

}

BE C EL ON D CE -& P TA T AL R

Foto uploaden Codeer een nieuwe PHP-script en sla het op in de map functions als externefunctions.php in de map gestructureerdprogrammeren. Codeer de function upload() als volgt:

<?php

// deze function uploadt de foto function upload(){

// initialiseer variabelen

if(isset($_POST["submit"])) { // de bestandsnaam is ...

$fotoNaam = basename($_FILES["foto"]["name"]); // de uploadsmap is ... global $uploadsMap;

$uploadsMap = "uploads/".$fotoNaam; }

ER

// maak globale variabele

N D

global $uploadsMap;

// controleer of deze foto al bestaat

(Z O

if (file_exists($uploadsMap)) {

?>

<script> document.getElementById("melding").innerHTML= "Foto bestaat al!" </script>

108


Blok 2 Gestructureerd programmeren

<?php return false; } // valideer bestandsformaat $fotoType = pathinfo($uploadsMap,PATHINFO_EXTENSION);

TI E)

if($fotoType != "png" && $fotoType != "jpeg" && $fotoType != "gif") { ?> <script> document.getElementById("melding").innerHTML=

AC

"Formaat moet JPEG, PNG of GIF zijn!" </script>

ED

<?php return false;

return true;

BE C EL ON D CE -& P TA T AL R

}

} // einde van upload function

De eerste if-opdracht controleert met de file_exists()-methode of het te uploaden bestand eerder was geüpload. Als het bestand bestaat wordt een JavaScript-blok gecodeerd om de melding "Formaat moet JPEG, PNG of GIF zijn!" te vermelden. Daarna retourneer je de waarde false.

// controleer of deze foto al bestaat if (file_exists($uploadsMap)) { ?> <script>

document.getElementById("melding").innerHTML= "Foto bestaat al!"

<?php

ER

</script>

return false;

(Z O

N D

}

Het bestandsformaat moet png, jpeg of gif zijn. Controleer het formaat met de volgende if-opdracht en de methode pathinfo(). Als het bestandsformaat niet klopt codeer een JavaScript-blok om de melding "Formaat moet JPEG, PNG of GIF zijn!" te vermelden. Daarna retourneer je de waarde false.

// valideer bestandsformaat $fotoType = pathinfo($uploadsMap,PATHINFO_EXTENSION);

109


if($fotoType != "png" && $fotoType != "jpeg" && $fotoType != "gif") { ?> <script> document.getElementById("melding").innerHTML= "Formaat moet JPEG, PNG of GIF zijn!"

TI E)

</script> <?php return false;

AC

}

<?php

BE C EL ON D CE -& P TA T AL R

ED

Als het bestand voldoet aan alle twee controles dan retourneer je de waarde true. Importeer de upload function Open uploads.php en codeer onderaan een PHP-blok als volgt. Importeer je externefunctions.php en codeer een function-call voor de upload-function.

include_once "externefunctions.php";

// voer de upload function uit if (upload()) {

// als upload de waarde true retourneert

// verplaats foto van temp-map naar uploadsMap

if (move_uploaded_file($_FILES["foto"]["tmp_name"], $uploadsMap)) { ?> <script>

document.getElementById("melding").innerHTML=

ER

"Foto is geüpload!"

document.getElementById("foto").src= "<?php echo $uploadsMap ?>"

N D

</script>

<?php

(Z O

}

}

}

110


Blok 2 Gestructureerd programmeren

Als de function upload de waarde trueretourneert dan is de foto naar een temp-map geüpload. Verplaats de foto van temp-map naar je uploadsMap met de methode move_uploaded_file. Daarna codeer een JavaScript-blok om de melding "foto is geüpload" te vermelden.

BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

Test je code Zorg eerst voor dat je de map uploads voor het uploaden van de foto’s hebt gemaakt en een profielfoto hebt geplaatst. Test voor een valide fotoformaat. Als je een PDF uploadt moet je de volgende melding krijgen.

(Z O

N D

ER

Test voor bestaande foto's. Als je twee keer dezelfde foto uploadt moet je de volgende melding krijgen.

111


TI E) AC ED BE C EL ON D CE -& P TA T AL R

(Z O

N D

ER

Test dit met een geldige foto. Als het juiste fotoformaat uploadt, moet je de volgende melding krijgen. Controleert of de afbeelding in de map uploads is geplaatst.

112


Blok 2 Gestructureerd programmeren

2.9 Terugblik Opdracht 41 Terugblik Zet een kruisje in de kolom die voor jou van toepassing is. Beoordelingscriteria

Ja

Nee

TI E)

Je kunt gestructureerd programmeren begrijpen en coderen. Je kunt globale en lokale variabelen brgrijpen en coderen. Je kunt string-methodes begrijpen en coderen.

BE C EL ON D CE -& P TA T AL R

Opdracht 42 Vraag 1

ED

2.10 Toets

AC

Je kunt date-methodes begrijpen en coderen.

Een function moet input-parameters hebben. waar onwaar

Opdracht 43 Vraag 2

Hoe importeer je een bestand in je PHO-script? Er zijn meerdere antwoorden goed. import include require insert

Opdracht 44 Vraag 3

Selecteer alle super-globale arrays uit de volgende lijst: $_POST $_COOKIES $_FILE

ER

$_ECO

N D

Opdracht 45 Vraag 4

Welke string-methode gebruik je om een string om te zetten in kleine letters? substr

(Z O

strtolower substr

Opdracht 46 Vraag 5 Welke string-methode gebruik je om te controleren of een string eindigt met een bepaald woord?

113


substr str_starts_with str_ends_with str_contains

Opdracht 47 Vraag 6

TI E)

Welke van de volgende opties zijn geen date-methodes? Er zijn meerdere antwoorden goed. getTimestamp time_diff mkdate

Opdracht 48 Vraag 7

ED

Selecteer alle date-methodes die het aantal seconden sinds 1 januari 1970 uitrekenen: getTimestamp

BE C EL ON D CE -& P TA T AL R

mk_time strtotime

AC

time

createFromFormat

Opdracht 49 Vraag 8

Koppel de methode met de betekenis daarvan.

Date-interval Timestamp

Date-object

is een tijdssegment

integer met het aantal seconden die verlopen zijn sinds middernacht 1 januari 1970. heeft informatie over de datum plus tijd en de date-methodes

Opdracht 50 Vraag 9

Welke date-methode gebruik je om het verschil tussen twee data uit te rekenen?

ER

mktime

date_interval

(Z O

N D

date_diff

114


Blok 2 Gestructureerd programmeren

Opdracht 51 Vraag 10 Koppel de methode met het juiste resultaat.

een integer die de lengte van een string geeft

Strpos

een integer die verwijst naar de positie van een tekst binnen een string

Str_contains

een integer 1 of 0 die verwijst naar de waarde true of false

(Z O

N D

ER

BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

Strlen

115


116

ER

N D

(Z O BE C EL ON D CE -& P TA T AL R ED

TI E)

AC


Blok 3 Persistente datastructuren

TI E)

3.1 Persistente datastructuren

Figuur 3.1

Leerdoelen 1. 2. 3.

BE C EL ON D CE -& P TA T AL R

ED

AC

Persistente data zijn data die wordt opgeslagen op een persistent (langdurig) opslagmedium, zodat deze bewaard kunnen worden voor langdurig gebruik. Een eenvoudig voorbeeld van gegevenspersistentie is het laden en opslaan van bestanden binnen een applicatie.

Je kunt gegevens serialiseren, opslaan en deserialiseren. Je kunt cookies in localstorage creëren, lezen, updaten en verwijderen. Je kunt sessions bergrijpen en coderen.

ER

Opdracht 1 Oriëntatie Persistente datastructuren

3.2 Opdrachtenset Cookies in local storage

N D

Opdracht 2 Cookies in local storage

(Z O

Een cookie maken Om een cookie te maken voer de volgende stappen uit:

• • •

1.

Maak een nieuw PHP-script en sla het op met de naam cookies.php. in de map cookies

2.

Codeer een cookie met de naam gebruiker en de waarde Sanskriet met een vervaltijd van één dag. Vergeet niet de output-buffer op te starten.

3.

Geef de melding: Cookie aangemaakt weer.

117


<?php ob_start(); echo "Maak een cookie met vervaldatum van 30 dagen"; $vervaldatum = time()+ (86400*30); // 86400 = 1 daag setcookie("gebruiker", "Sanskriet", $vervaldatum, "/");

TI E)

echo "<br> Cookie aangemaakt, vervaldatum is: " . date('d/m/Y',$vervaldatum); ob_end_flush();

BE C EL ON D CE -& P TA T AL R

ED

AC

Controleer of je cookie aangemaakt is in de local storage van je browser. Gebruik daarvoor Control-shift-C en klik op de Application-tab om cookies in localstorage te zien. Zie hieronder:

Cookie updaten Om de cookie met de naam "gebruiker" te updaten voer je de volgende stappen uit:

• • •

1.

Open cookies.php en codeer de benodigde code om de cookie gebruiker te wijzigen met als waarde je eigen naam.

2.

Geef de melding: cookie is geüpdatet.

3.

Controleer of je cookie geüpdatet was in de local storage van je browser.

Cookie verwijderen Om de cookie gebruiker te verwijderen voer je de volgende stappen uit:

Open cookies.php en codeer de benodigde code om de cookie gebruiker te verwijderen.

2.

Geef de melding: cookie is verwijderd weer.

3.

Controleer of je cookie verwijderd is uit de local storage van je browser.

ER

1.

(Z O

N D

• • •

118


Blok 3 Persistente datastructuren

ED

AC

TI E)

Inloggegevens in cookies

• • • •

BE C EL ON D CE -& P TA T AL R

Om alle gegevens in dit formulier in een cookie op te slaan voer je de volgende stappen uit: 1.

Maak een nieuw bestand en sla het op als inlogcookies.php in de map cookies.

2.

Codeer bovenstaand formulier in inlogcookies.php

3.

Open inlogcookies.php en codeer een PHP-blok met de benodigde code om de gegevens in het formulier in een cookie met een vervaldatum van 10 dagen op te slaan, maar alleen als de checkbox aangevinkt was.

4.

Controleer of je cookie aangemaakt was in de local storage van je browser. Het resultaat moet een cookie zijn met een naam, een e-mail en een vervaldatum van 10 dagen zijn.

3.3 Opdrachtenset Sessions in local storage Opdracht 3 Sessions in local storage

(Z O

N D

ER

Een inlogsession maken Om een session-cookie te maken voer je de volgende stappen uit:

119


TI E) AC ED BE C EL ON D CE -& P TA T AL R

• • •

1.

Maak een nieuw PHP-script en sla het op met de naam inlogsession.php. in een nieuwe map sessions.

2.

Open inlogsession.php en codeer bovenstaand inlogformulier.

3.

Codeer onderaan het volgende PHP-blok:

<?php

if(isset($_POST["submit"])&&!empty($_POST["email"])) { $email = htmlspecialchars($_POST['email']); session_start();

ER

$mijnSession = session_id(); $_SESSION["USER"] = $naam;

N D

$_SESSION["EMAIL"] = $email; $_SESSION["ID"] = $mijnSession;

(Z O

print_r($_SESSION);

}

Het resultaat van print_r($_SESSION)zie je hieronder: Array ( [USER] =>usernaam [EMAIL] => a@a.nl [ID] => c0ahujo98jkjt8rr0tuv04julj )

120


Blok 3 Persistente datastructuren

AC

TI E)

De session-ID zal bij je laptop anders zijn. Controleer local storage in je browser om te kijken of de session-cookie aangemaakt was. In dit geval was de PHPSESSID = c0ahujo98jkjt8rr0tuv04julj (zie volgende afbeelding).

Opdracht 4 Persistente gegevens

ED

3.4 Opdrachtenset Persistente datastructuren

(Z O

N D

ER

BE C EL ON D CE -& P TA T AL R

Persistente data zijn data die wordt opgeslagen op een persistent (langdurig) opslagmedium zoals een database of een bestand. Deze opdracht gaat over het opslaan van inschrijvingen in een bestand en het terug lezen van de inschrijvingen. Inschrijfformulier Maak een nieuw script met het volgende inschrijfformulier en sla het op als inschrijven.php in de nieuwe map studenten. Het formulier moet er als volgt uitzien:

121


Inschrijving opslaan Codeer de volgende function in externefunctions.php in de map library. De function moet de volgende stappen uitvoeren: Lees de formuliergegevens en sla de inschrijving in een associatieve-array op.

2.

Maak een Json-object van de array met de methode json_encode().

3.

Sla de inschrijving op in een bestand met de methodes fopen() en fwrite().

4.

Geef de melding Inschrijving succesvol door.

TI E)

1.

AC

• • • •

function inschrijven(){ if(isset($_POST["submit"])) {

BE C EL ON D CE -& P TA T AL R

$gegevens = array( "naan" => htmlspecialchars($_POST["naam"]),

"email" => htmlspecialchars($_POST["email"]),

"opleiding" => htmlspecialchars($_POST["opleiding"]) );

// elke inschrijving eindigt met een

$student = json_encode($gegevens)." ";

$bestand = fopen("studenten.txt","ab"); if(!$bestand) {

return false; }

fwrite($bestand, $student, strlen($student));

ER

if(fclose($bestand)) {

?> // voeg een JavaScript blok om de melding door te geven <script>

N D

document.getElementById("melding").innerHTML= "Inschrijving succesvol!"

(Z O

</script> <?php

}else {

?>

<script> document.getElementById("melding").innerHTML=

122

ED

// en slaat de gegevens in een bestand op


Blok 3 Persistente datastructuren

"Er is iets fout gegaan!" </script> <?php } }

TI E)

} // einde inschrijven

@import url("https://fonts.googleapis.com/css?family=Roboto"); body{

AC

font-family: Roboto, sans-serif;

height: 100vh; display:flex;

BE C EL ON D CE -& P TA T AL R

flex-direction: column;

ED

font-size: large;

align-items: center; } button{

background-color: cadetblue; width: 200px; height: 40px;

font-size: large;border:0px; border-radius: 10px; color:white; }

(Z O

N D

ER

Maak een aantal inschrijvingen. Het resultaat moet het bestand studenten.txt in de map studenten zijn met alle inschrijvingen. Open studenten.txt met Kladblok om naar het resultaat te kijken. Zie figuur

Bestand lezen en weergeven Het resultaat van deze opdracht moet de volgende grid-component met de gegevens uit het bestand studenten.txt zijn, bijvoorbeeld:

123


TI E)

AC

Frontend Codeer een nieuw PHP-script en sla het op als studentenweergeven.php in de map studenten. Geef deze pagina de volgende styles voor een grid-component. Sla die op als studenten.css

#grid {

grid-template-columns : auto auto auto;

BE C EL ON D CE -& P TA T AL R

width : 80%;

ED

display: grid;

color: black; } #grid.cell {

background: #e2e9eb;

border: 1px solid white; padding: 10px; opacity: 70%; color:black; }

Backend Codeer onderaan een PHP-blok om het bestand studenten.txt te lezen en weergeven.

<?php

ER

include_once"../library/externefunctions.php";

N D

studentenweergeven();

(Z O

Externe function Codeer de externe function studentenweergeven() in je externefunctions.php in de map library.

// studenten weergeven function studentenweergeven() { $bestand=fopen("studenten.txt","r"); if(!$bestand)

{

echo "Kon geen bestand openen!";

124


Blok 3 Persistente datastructuren

} $grid = " <output id='grid'> <div class='cell'><b>Naam</b></div> <div class='cell'><b>E-mail</b></div>

while(!feof($bestand))

TI E)

<div class='cell'><b>Opleiding</b></div>";

{

$student = fgets($bestand);

"<div class='cell'>$decoded->naan</div>".

BE C EL ON D CE -& P TA T AL R

"<div class='cell'>$decoded->email</div>".

ED

$grid .=

AC

$decoded = json_decode($student);

"<div class='cell'>$decoded->opleiding</div>"; }

$grid .= "</output>"; echo $grid; }

// einde studenten weergeven

3.5 Theorie Persistente datastructuren Persistente datastructuren

Serialisatie en deserialisatie Serialisatie en deserialisatie zijn twee concepten in de programmering waarmee objecten gemakkelijk kunnen worden opgeslagen, verzonden en gereconstrueerd. Zoals bij het opslaan van objecten in een database of bestand, en het verzenden van objecten via een netwerk.

ER

Serialisatie Serialisatie is het proces waarbij een object wordt omgezet in een bytestream. Deze bytestream kan vervolgens worden opgeslagen in een bestand, via een netwerk worden verzonden of in een database worden opgeslagen.

N D

JSON en XML zijn populaire indelingen voor serialisatie omdat ze door mensen kunnen worden gelezen en gemakkelijk door andere systemen kunnen worden verwerkt. We kunnen bijvoorbeeld een array-object omzetten in een json-object met json_encode om vervolgens het in a bestand opslaan in het JSON-formaat.

(Z O

Deserialisatie Deserialisatie is het omgekeerde proces van serialisatie. Het gaat om het nemen van een bytestream en deze weer omzetten in een object. Dit wordt gedaan met behulp van de juiste tools om de bytestream te verwerken en een nieuw object te maken. Bijvoorbeeld door het lezen van een bestand en de bytestream omzetten in een array-object met json_decode.

125


Persistente datastructuren Persistente data zijn data die wordt opgeslagen op een persistent (langdurig) opslagmedium, zodat deze bewaard kunnen worden voor langdurig gebruik. Een eenvoudig voorbeeld van gegevenspersistentie is het laden en opslaan van bestanden binnen een applicatie.

TI E)

Serverzijde bestanden Gegevens op de server opslaan doe je in drie stappen: 1. Bestand openen. 2. Bestand schrijven. 3. Bestand afsluiten.

ED

$bestand = fopen("users.txt","w");

AC

Bestand openen met fopen() PHP opent een bestand met de fopen()-methode. Als het bestand nog niet bestaat, wordt het bestand eerst aangemaakt en daarna geopend, bijvoorbeeld:

Tabel 3.1

BE C EL ON D CE -& P TA T AL R

De eerste parameter is de bestandsnaam. De tweede parameter is de open-mode. Een bestand open je om te schrijven, te lezen of allebei. In de volgende tabel staat een samenvatting van de open-mode:

Code

Omschrijving

r

Open om te lezen

r+

Open om te lezen en schrijven

w

Open om te schrijven; deze mode begint altijd met een leeg bestand

a

Open om toe te voegen; als het bestand nog niet bestaat: maak een nieuw bestand

b

Bestandsformaat is binair

t

Bestandsformaat is tekst (alleen in Windows)

Als de fopen()-methode een bestand niet kan openen, geeft deze function de waarde false. Dit kun je als volgt melden:

ER

$bestand = fopen("users.txt","ab"); if(!$bestand){

echo "Kon geen bestand openen!";

(Z O

N D

}

Bestand schrijven met fwrite() PHP schrijft een bestand met de fwrite()-methode, bijvoorbeeld:

fwrite($bestand, $tekst, $lengte);

126

$tekst is de tekst die je wilt schrijven;


Blok 3 Persistente datastructuren

$lengte is het maximum aantal bytes van de output-tekst.

Bijvoorbeeld:

fwrite($bestand,$tekst,strlen($tekst));

TI E)

De strlen()-methode geeft de lengte van een string-tekst. De $tekst representeert een rij (record) in je bestand, bijvoorbeeld:

$tekst =

AC

$achternaam . " " . $voornaam . " " .

ED

$straat . " " . $plaats . " " .

$email . " " .

BE C EL ON D CE -& P TA T AL R

$postcode . " " .

$gebruikersnaam . " " . $wachtwoord . " ";

\t is de code voor een tab en \n voor een nieuwe regel.

Bestand afsluiten met fclose() Nadat je een bestand hebt aangemaakt of gelezen, moet je het bestand altijd afsluiten. Dat doe je met de fclose()-function, bijvoorbeeld:

fclose($bestand);

ER

Deze function geeft de waarde true bij het afsluiten van het bestand of false als het bestand niet afgesloten kan worden. Bijvoorbeeld:

if(fclose($bestand)){

echo "Account is aangemaakt";

N D

}else{

echo "Kon bestand niet afsluiten";

(Z O

}

Bestand lezen Om een bestand te kunnen lezen moet je eerst het bestand openen, bijvoorbeeld:

127


$bestand=fopen("gebruikers.txt","r"); if(!$bestand){ echo "Kon geen bestand openen!";

TI E)

}

AC

Bestand lezen met fgets() Met fgets() lees je een hele rij gegevens. Elke keer dat we een record lezen, gebruiken we de feof()-function om te kijken of het einde van het bestand (end of file) bereikt is. Bijvoorbeeld:

while(!feof($bestand)){

ED

$account = fgets($bestand); echo $account . "<br>";

BE C EL ON D CE -& P TA T AL R

} fclose($bestand);

De fgets()-function leest elke keer een rij • tot de nieuwe rij (code \n) of • tot een end of file (EOF).

Bestand lezen met fgetcsv() Om de individuele gegevens uit een rij (record) te kunnen lezen, kopiëren we eerst de hele rij naar een array. Bijvoorbeeld:

$account = fgetcsv($bestand);

Cookies in local storage

ER

Cookies in local storage Local storage is een lokale opslag functie van webbrowsers waarmee een website gegevens lokaal op het apparaat van de gebruiker kan opslaan.

Cookies

Local Storage

Sessions

Maximale capaciteit

4kb

10mb

5mb

Toegankelijkheid

Alle browservensters

Alle browservensters

Huidige browservenster

Vervaltijd

Programmeerbaar

Nooit

Bij sluiten van venster

Opgslagplaats

In browser en server

In browser

In browser en server

(Z O

N D

Tabel 3.2

128


Blok 3 Persistente datastructuren

Cookies Cookies zijn kleine bestandjes die opgeslagen worden in de local storage op de harde schijf van de bezoeker. Hierin kan informatie opgeslagen worden, bijvoorbeeld of de bezoeker al eerder op de website is geweest. Wanneer de browser een verbinding maakt met een URL, zoekt de browser naar bestaande cookies op de harde schijf van de bezoeker. Als de cookies bestaan, zijn deze cookies beschikbaar in de PHP-array $_COOKIES[].

TI E)

Cookies plaatsen Je kunt een cookie plaatsen op de computer van je bezoeker met de volgende code:

setcookie("cookienaam", "inhoud");

setcookie("cookienaam", "inhoud", time() + 3600);

ED

AC

Bij naam vul je de naam van de cookie in, inhoud vervang je door de inhoud van de cookie. Om een cookie te maken met een geldigheidsduur van een uur gebruik je de volgende code:

BE C EL ON D CE -& P TA T AL R

Hierin staat 3600 voor het aantal seconden, in dit geval dus een uur (60 × 60 = 3600 seconden). Je kunt ook een datum opgeven waarop de cookie verloopt; dat doe je bijvoorbeeld met de volgende code:

setcookie("cookienaam", "inhoud", mktime(0,0,0,1,1,2038));

Zo kunt je de tijd en de datum aangeven.

Cookies lezen Om de inhoud van een eerder geplaatste cookie op te roepen gebruik je de volgende code:

$_COOKIE["cookienaam"];

Wanneer we via de browser een script aanvragen, zoals hierboven, stuurt PHP eenmalig de volgende header naar de browser.

http/1.1 2000 OK

ER

Powered-By: PHP/7

Vary: Accept-Encoding

N D

Content-Type: tekst/html; charset=utf-8

(Z O

Daarna kan de header niet meer gewijzigd worden. PHP verstuurt alle headers, zodat normale output kan beginnen, bijvoorbeeld: echo stuurt normale output naar de browser toe. Maar het resultaat van de setcookie-methode is ook als header-output verstuurd en maakt een cookie in de local storage van de browser. Als je de volgende melding krijgt:

129


Warning: Cannot modify header information - headers already sent by ...

dan kan de header-informatie niet gewijzigd worden – de header was al verzonden. Na de echo-methode mogen we geen header-informatie meer versturen met de setcookie-methode.

TI E)

Een oplossing is om eerst alle header-output te versturen en daarna de normale output zoals de echo-methode, bijvoorbeeld:

setcookie("cookienaam", "waarde", mktime(0,0,0,1,1,2050));

AC

echo "Maak een cookie";

ob_start()

en

ob_end_flush()

BE C EL ON D CE -& P TA T AL R

ED

Output-buffer Een andere oplossing is het gebruik van de output-buffer. We plaatsen meerdere outputs in de output-buffer zodat we alles in één keer kunnen verzenden. We starten en flushen (leegmaken) de output-buffer met de volgende twee methodes:

Een voorbeeld van het gebruiken van de output-buffer is het volgende:

<?php ob_start();

echo "Maak een cookie";

setcookie("gebruiker", "Sanskriet", mktime(0,0,0,1,1,2055));

ER

$gebruiker = $_COOKIE["gebruiker"];

echo "<br>Gebruikersnaam is: $gebruiker <br>"; print_r($_COOKIE);

N D

ob_end_flush();

(Z O

?>

130


Blok 3 Persistente datastructuren

Het resultaat moet er als volgt uitzien: Tabel 3.3

TI E)

Maak een cookie Gebruikersnaam is: Sanskriet Array( [gebruiker]=>Sanskriet [PHPSESSID]=>589a8f7fa5bd7a481c639d6544c0e290 ) Als je geen gebruikers-cookie ziet, probeer dan de verloopdatum van de cookie te veranderen.

ED

AC

Met de print_r($_COOKIE)-methode hebben we de $_COOKIE-array weergegeven. Hier zien we de gebruiker en de PHPSESSID-cookies. De PHPSESSID is de sessie-ID. Alle gebruikers die een request versturen naar de server krijgen een unieke sessie-ID. We behandelen sessies aan het einde van dit blok.

BE C EL ON D CE -& P TA T AL R

Cookies verwijderen De inhoud van een cookie kan gewijzigd worden door simpelweg een cookie met dezelfde naam, maar andere inhoud eroverheen te schrijven. Als je een cookie hebt geplaatst met een geldigheidsduur, kun je de cookie ook verwijderen door de geldigheidsduur negatief te maken.

Sessions in localstorage

Sessions in localstorage HTTP is een stateless protocol, elk verzoek aan de webserver wordt verwerkt zonder enige kennis van eerdere of toekomstige verzoeken. Cookies zijn de standaardmethode om gebruikers te volgen of gegevens bij te houden, maar ze zijn beperkt door de grootte, het toegestane aantal en ze worden opgeslagen op de client. We hebben een methode nodig om informatie over een gebruiker en zijn keuzes tussen bezoeken aan je website bij te houden. Een sessionin PHP is een manier om gegevens tijdelijk op te slaan en toegankelijk te maken op alle webpagina's. Er wordt een tijdelijk bestand gemaakt waarin verschillende session-variabelen en hun waarden worden opgeslagen. Deze wordt vernietigd wanneer je de website sluit.

(Z O

N D

ER

Sessions PHP stelt ons in staat om elke bezoeker te volgen via een unieke session-ID die kan worden gebruikt om gegevens tussen verbindingen te gebruiken. Deze ID is een willekeurige tekenreeks die naar de gebruiker wordt verzonden wanneer een sessie wordt gemaakt. De ID wordt opgeslagen in de browser van de gebruiker in de vorm van een cookie (standaard PHPSESSID genoemd). Deze cookie is hieronder te zien in de volgende afbeelding (van de Application-tab in de ontwikkelaarstools van Chrome).

131


TI E) AC

Figuur 3.2

ED

Aan de serverzijde slaat het systeem deze sessie-ID en een bijbehorende reeks informatie over de client op die je PHP-scripts kunnen gebruiken, in een $_SESSION global array of in een database.

Let op

BE C EL ON D CE -& P TA T AL R

Een session creëren Om sessions te creëren moet je eerst een PHP script starten met: session_start();

Deze regel code moet komen voordat er uitvoer wordt geproduceerd door het script!

De functie session_start();maakt een nieuwe session, als deze niet bestaat, of zet een bestaande session voort. Werken met de $_SESSION global array Je start een session in elk PHP-script. Nadat de session is begonnen, kun je de globale array $_SESSION openen, gebruiken en eventueel wijzigen. In deze array blijven gegevens bestaan tussen je PHP-scripts. Als je een waarde wilt instellen, behandel je deze variabele op dezelfde manier als elke array.

$_SESSION['variableNaam'] = 'waarde';

ER

Bijvoorbeeld:

N D

$_SESSION['userNaam'] = 'Geraldo';

(Z O

Als je een session-variabele instelt door de array $_SESSION te wijzigen, wordt die informatie opgeslagen in een bestand of database (afhankelijk van de serverinstellingen) en heb je nu toegang tot deze informatie vanuit elk script, zolang de session geldig is. Als je snel de volledige inhoud van $ _SESSION wilt weergeven, kun je elke associatieve array afdrukken in een mooi formaat met print_r()omringd door <pre> tags.

<pre><?php print_r($_SESSION); ?></pre>

132


Blok 3 Persistente datastructuren

Bij het werken met session-waarden is het vaak handig om te testen of een bepaalde session-variabele bestaat. De eenvoudigste manier om te controleren of er een variabele bestaat, is met isset().

if (isset($_SESSION['userNaam']) { echo $_SESSION['userNaam'];

TI E)

}

AC

Session verwijderen Als je een session-variabele wilt verwijderen, moet je deze uitschakelen (net zoals je elke variabele in PHP kunt verwijderen):

ED

unset($_SESSION['userNaam']);

session_destroy();

BE C EL ON D CE -& P TA T AL R

Als je de volledige inhoud van de SESSION wilt verwijderen, kun je deze vernietigen met:

Bijvoorbeeld bij het uitloggen van de gebruiker.

Continuïteit tussen browsers Aangezien jouw gebruikers verbinding kunnen maken vanuit verschillende browsers op verschillende computers, kan het nodig zijn om hun session-gegevens op te slaan in een bestand in een bestand dat onder jouw beheer valt. Als je bepaalde session-gegevens wilt behouden (bijvoorbeeld een winkelwagentje dat op de ene computer is gestart en op een andere computer is voortgezet), zodat hun session opnieuw gerstart kan worden wanneer ze zich aanmelden,. De session_id kan worden opgehaald uit je PHP-script nadat session_start()is uitgevoerd via:

$mijnID = session_id();

Alle session-gegevens kunnen worden geconverteerd naar een tekenreeks met:

ER

$mysession = session_encode();

En deze tekenreeks kan worden terug geconverteerd naar de array $_SESSION met: session_decode($mysession);

N D

Met alleen de bovenstaande functies kunnen we de SESSION coderen en decoderen in en van een tekenreeks. Deze tekenreeks kan eenvoudig worden opgeslagen in een bestand.

(Z O

Stel je dit scenario voor: een gebruiker maakt verbinding met een website en logt in. De session-gegevens worden vervolgens opgehaald en hersteld naar hun array $ _SESSION. Terwijl ze door de website browsen, kunnen eventuele wijzigingen in de SESSION vervolgens worden vastgelegd en teruggeschreven, zodat elke transactie die ze met je website hebben, vanaf elke locatie, naadloos verloopt.

133


Session-beheer De meeste webdevelopment-frameworks hebben methodes voor het vernieuwen van sessions. Deze methodes gebruiken we om sessions te openen, vernieuwen en sluiten. Bijvoorbeeld: session_start()

en

TI E)

session_regenerate_id(true)

AC

Deze methode creëert een session-ID-cookie. Met de true-parameter verwijderen we de oude session-ID. Met false blijft de oude session-ID bestaan.

BE C EL ON D CE -& P TA T AL R

ED

Session-fixation Session-fixation is een cyberaanval waar een hacker de session van een ingelogde gebruiker steelt om toegang tot een applicatie te krijgen. De hacker kan de session op de volgende drie manieren stelen: • Session-ID raden. • Session-ID stelen met behulp van malware, het netwerk scannen of met JavaScript exploits. • Session-ID zelf maken. We moeten daarom de session-ID regelmatig wijzigen, bijvoorbeeld bij het inloggen en wanneer de gebruikers van privileges veranderen.

Restful API's

Een API is een Application Programming Interface. Het is een stuk software dat communiceert met andere software. Met API’s kunnen we webservices gebruiken in onze applicaties. Een API voer je uit met de URI van de API. Een internet-resource zoals een webdocument identificeren we door zijn URI en kan gerepresenteerd worden in de volgende formaten: • JSON • XML • JSV • HTML. Een voorbeeld van een API is:

http://maps.googleapis.com/maps/api/geocode/json?address=amsterdam&sensor=false$key=xxxxxxxxxxxx

(Z O

N D

ER

Waar key is je Google developer key. Deze API van Google geeft als webservice de gegevens van een bepaalde locatie (in dit geval Amsterdam) in een JSON-array. Door gebruik te maken van deze webservice kunnen we deze gegevens in onze applicaties gebruiken.

134


AC

TI E)

Blok 3 Persistente datastructuren

BE C EL ON D CE -& P TA T AL R

RESTful API’s zijn API’s die aan de volgende constraints (eisen) voldoen. 1. Uniforme interface 2. Stateless 3. Client-server 4. Cacheable 5. Layered system 6. Code on demand 7. HATEOAS (Hypermedia As The Engine Of Application State) 8. API-foutmelding 9. Backward compatibiliteit.

ED

Figuur 3.3 Figuur 4.48 Response van Google’s geocode API.

Uniforme interface

Een RESTful API maakt gebruik van URI’s voor de adressering van de API. Het maakt een representatie (kopie) van de bron door de HTTP GET-methode en gebruikt daarna de PUT-methode en de URI om de oorspronkelijke bron te updaten.

Stateless

ER

Een RESTful API is stateless. Voorbeelden van stateless REST-interacties zijn: • State 1: Gebruiker zoekt een bron via een URI-adres. De server haalt de bron op met behulp van de GET-methode. • State 2: Gebruiker krijgt een representatie van de bron in de vorm van een HTML- pagina of een XML- of JSON-document. • State 3: Gebruiker klikt op een link in de representatie.

N D

Het klikken op hyperlinks in de representatie van de bron leidt tot nieuwe states, bijvoorbeeld een nieuwe webpagina. (De gebruiker verandert van state met elke nieuwe representatie. Vandaar de term REST: Representational State Transfer.).

Client-server

(Z O

Een RESTful API gebruikt het HTTP- of HTTPS-protocol, het protocol voor client-server-architectuur. Als we de volgende fictieve webpagina willen zien, typen we de volgende request in de browser: http://example.org/news/ De header van de request ziet er als volgt uit:

135


GET /news/ HTTP/1.1 HOST: example.org Accept-Encoding: compress, gzip User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) De header van de response ziet er als volgt uit:

AC

TI E)

HTTP/1.1 200 Ok Date: Fri, 14 Apr 2017 14:55:00 GMT Server: Apache ETag: "65b89834b3838439c3e989" Content-Type: text/html Cache-Control: max-age=3600

BE C EL ON D CE -& P TA T AL R

ED

De representatie ziet er als volgt uit:

Figuur 3.4 Code 4.8.

ER

De body is de content van de bron. De HTTP-methodes hebben verschillende kenmerken. Hier volgt een lijst van methodes en de kenmerken: • GET-methode met als kenmerken: safe, idempotent (zie hieronder), cacheable • PUT is idempotent • DELETE is idempotent • HEAD is safe, idempotent • POST is niet idempotent.

N D

Idempotent betekent dat de methode meerdere keren uitgevoerd mag worden, maar dat het resultaat in de bron altijd hetzelfde blijft. Behalve de POST-methode zijn alle andere methodes idempotent. Mits de server dat correct implementeert. Het betekent dat we meerdere keren een resource kunnen aanvragen met GET en de resource blijft altijd hetzelfde. Maar als we bijvoorbeeld meerdere keren dezelfde employé toevoegen met POST, dan maken we telkens weer een nieuwe employé.

(Z O

Cacheable

Een RESTful API moet cacheable zijn. Cacheable responses zijn responses die in het cache-geheugen van je browser tijdelijk blijven staan. In de header van de response zien we of de responses cacheable zijn. Cache-Control: max-age=3600

136


Blok 3 Persistente datastructuren

In dit geval blijft de response een uur lang in de cache. Als je binnen een uur dezelfde request uitvoert, krijg je de response veel sneller vanuit de browser-cache dan vanuit de server. Dit maakt de API efficiënter.

Layered system Een RESTful API maakt gebruik van de client/server/storage multi-layer architectuur. De client hoeft niets te weten van de software of hardware tussen client en server.

Code on demand

AC

TI E)

De server kan, als erom wordt gevraagd, code naar de client sturen. De code wordt dan bij de client uitgevoerd. Een voorbeeld zie je in de volgende figuur:

Figuur 3.5 Code 4.9.

HATEOAS

BE C EL ON D CE -& P TA T AL R

ED

HATEOAS (Hypermedia As The Engine Of Application State) is het concept dat applicaties veranderen, data-eisen veranderen en het path van een resource kan veranderen, maar dat deze veranderingen geen consequenties hoeven te hebben voor de client-software. De nadruk ligt bij hypermedia. Hypermedia houdt in dat de resource data bevat maar ook hyperlinks. Deze hyperlinks leiden dan naar de volgende state. Bijvoorbeeld: {"data": {"gebruiker": {"e-mail": "email"}}, "_links": {"edit": {"href": "/api/gebruiker/id/1"}}, "id": "1"} De geretourneerde resource bevat dus de data plus URI’s naar de mogelijke states.

API-foutmelding

ER

De HTTP-states zijn: • 200: OK request succesvol • 201: gecreëerd • 300: redirection – 301: permanent verplaatst – 302: tijdelijk verplaatst – 304: niet gewijzigd • 400: probleem met request – 401: onbevoegd request – 403: verboden, geen toegang – 404: resource niet gevonden – 405: methode niet toegestaan • • 500: probleem met server.

N D

De foutmeldingen van de API beschrijven wat is misgegaan, zodat de webapplicatie-ontwikkelaar zijn code kan aanpassen, bijvoorbeeld:

(Z O

{"data": {"gebruiker": {"e-mail": "email"}}, "_links": {"edit": {"href": "/api/gebruiker/id/1"}}, "melding": { "Error": {"GebruikerID ontbreekt" }}, "id": "1"}

Backward compatibiliteit Updates in je API moeten geen onvoorziene consequenties hebben voor de gebruikers van de API. In de header kan de programmeur informatie over nieuwere versies doorgeven aan de client.

137


Alle programmeertalen hebben een header-functie waar de programmeur zelf een HTTP-header voor de client kan genereren. Bijvoorbeeld: header("Cache-Control: no-cache")

3.6 Begrippen

TI E)

3.7 Test je kennis Opdracht 5 Vraag 1 Welke van de volgende zijn persistente datastructuren?

AC

Arrays Hash-arrays Variabelen

BE C EL ON D CE -& P TA T AL R

Opdracht 6 Vraag 2

ED

Databases

Koppel de term met de juiste beschrijving.

Serialisatie Deserialisatie

Opdracht 7 Vraag 3

Wat is de naam van een sessioncookie in local storage? ID MySession PHPSESSID

Opdracht 8 Vraag 4

Wanneer verloopt een PHPSESSID cookie? Aan het einde van de session.

ER

Aan het einde van de maand.

(Z O

N D

Na een dag.

138

object wordt omgezet in een bytestream

bytestream wordt omgezet in een object


Blok 3 Persistente datastructuren

Opdracht 9 Vraag 5

r

Open om te lezen

a

Open om toe te voegen

w

Open om te schrijven

r+

Open om te lezen en schrijven

AC

3.8 Praktijkopdrachten

TI E)

Koppel de bestands open-mode met de juiste beschrijving.

ED

Opdracht 10 Welkom-session

BE C EL ON D CE -& P TA T AL R

Sessies zijn een waardevol hulpmiddel bij het maken van websites met gegevens die een gebruiker volgt tussen bezoeken. Maak een PHP-script dat de laatste keer dat je de pagina hebt bezocht (datum en tijd) onthoudt en afdrukt. Kijk eens naar de functie date().

Het resultaat moet zijn zoals volgt:

Laatste bezoek Array ( [ID] => tlfr6rso8khefdkjblbp9sk64o [laatsteBezoek] => Thursday 16 Nov 2023 14:47:19 ) Nieuwe session Thursday 16 Nov 2023 14:53:59 Array ( [ID] => tlfr6rso8khefdkjblbp9sk64o [laatsteBezoek] => Thursday 16 Nov 2023 14:53:59 )

ER

Opdracht 11 Sessionbeheer

(Z O

N D

Een PHPSESSID wordt opgeslagen in je browser en in de server in de array $_SESSION. Session-fixation is een cyberaanval waar een hacker de session van een ingelogde gebruiker steelt om toegang tot een applicatie te krijgen. De hacker kan de session op de volgende drie manieren stelen: • Session-ID raden. • Session-ID stelen met behulp van malware, het netwerk scannen of met Java Scriptexploits. • Session-ID zelf maken. We moeten daarom de session-ID regelmatig wijzigen, bijvoorbeeld bij het inloggen en wanneer de gebruikers van privileges veranderen. Sessionrole Maak een nieuw PHP-script en sla het op als sessionrole.php in de map sessions. Codeer de volgende formulier:

139


TI E) AC ED BE C EL ON D CE -& P TA T AL R

Voer sessionbeheer uit Codeer onderaan een PHP-blok om de function sessionbeheer uit te voeren als volgt:

<?php

if(isset($_POST["submit"]) ) {

$role = htmlspecialchars($_POST['role']); session_start();

$mijnSession=session_id();

$_SESSION["ID"] = $mijnSession;

ER

print_r($_SESSION);

N D

echo"<br>";

// session protection

(Z O

// Genereer session voor role sessionbeheer($role);}

Sessionbeheer function Open externefunctions.php in de map library en voeg de volgende function sessionbeheer toe. Deze function verwijdert de oude PHPSESSID in localstorage en genereert een nieuwe PHPSESSID met een sessionrole.

140


Blok 3 Persistente datastructuren

<?php function sessionbeheer($sessionRole) { // Genereer een nieuwe session

TI E)

// met true wordt de oude session verwijderd session_regenerate_id(true);

// Sla nieuwe session_ID op

AC

$nieuwSessionID = session_id();

// vernietig session

BE C EL ON D CE -& P TA T AL R

session_write_close();

ED

$_SESSION["ROLE"] =$sessionRole;

// Start nieuwe session met nieuwe session_id session_id($nieuwSessionID);

session_start();

$_SESSION["ID"] = session_id(); print_r($_SESSION); }

Voer sessionrole.php uit. Het resultaat moet er als volgt uitzien:

ER

Array ( [ID] => qubjledp1agvb53q9phq8e5fjs [laatsteBezoek] => Thursday 16 Nov 2023 14:53:59 [ROLE] => student )

N D

Array ( [ID] => i47p2fjtd4bjo9l9lksln5iefq [laatsteBezoek] => Thursday 16 Nov 2023 14:53:59 [ROLE] => student )

(Z O

Controleer of je browser de nieuwe PHPSESSID heeft opgeslagen.

141


TI E) AC

Opdracht 12 Gebruikers registreren

(Z O

N D

ER

BE C EL ON D CE -& P TA T AL R

ED

Gebruikers registreren Maak een nieuw HTML-script met het volgende registratieformulier en sla het op als registreren.phpl in de nieuwe map gebruikers. Het formulier moet er als volgt uitzien:

142


BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

Blok 3 Persistente datastructuren

1.

Codeer het formulier.

2.

Om de foto op te laden, maak je gebruik van de function upload() in externefunctions.php in de map library.

3.

Codeer een nieuwe function gebruikersregistreren in externefunctions.php in de map library.

(Z O

N D

• • • •

ER

Voer de volgende stappen uit:

4.

De function gebruikersregistreren moet de gegevens – naam – e-mail – wachtwoord – naam van de foto uit het formulier lezen en in een associative array plaatsen.

143


• •

5.

De array moet geconverteerd worden in een Json-object.

6.

Het Json-object moet opgeslagen worden in het bestand gebruikers.txt

ED

Opdracht 13 Gebruikers lezen en weergeven

AC

TI E)

Hier is een voorbeeld van het resultaat:

BE C EL ON D CE -& P TA T AL R

Gebruikers lezen en weergeven Codeer een nieuw PHP-script gebruikersweergeven.php in de map gebruikers die de gebruikers in het bestand gebruikers.txt leest en weergeeft. Zie volgende figuur:

3.9 Terugblik

Opdracht 14 Terugblik

Zet een kruisje in de kolom die voor jou van toepassing is.

ER

Beoordelingscriteria

Je kunt gegevens serialiseren, opslaan en deserialiseren.

N D

Je kunt cookies in localstorage creëren, lezen, updaten en verwijderen.

(Z O

Je kunt sessions bergrijpen en coderen.

Opdracht 15 Terugblik Denk na over wat je hebt gedaan in dit blok. a. Noem twee dingen waarover je tevreden bent. 1.

144

Ja

Nee


Blok 3 Persistente datastructuren

2. b. Noem twee dingen die je de volgende keer anders wilt doen. 1. 2.

TI E)

c. Vraag je docent en/of leermeester om feedback. Tops:

AC

Tips:

ED

3.10 Toets

BE C EL ON D CE -& P TA T AL R

Opdracht 16 Vraag 1 Waar worden cookies opgeslagen? In de browser In de server

In de browser en server

Opdracht 17 Vraag 2

Koppel de bestandscommando's met de juiste beschrijving.

fwrite

bestand schrijven

fclose

bestand sluiten bestand lezen

fgets

Opdracht 18 Vraag 3 Array

ER

JSON is een open standaard bestandsformaat en gegevensuitwisselingsformaat JSON-object

N D

Bestand

Opdracht 19 Vraag 4

(Z O

Hoe noem je een cyberaanval waar een hacker de session van een ingelogde gebruiker steelt? Session-hack Session-fixation Script-injection

145


Opdracht 20 Vraag 5 Op welke manieren kan een hacker de session stelen? Er zijn drie antwoorden goed. Session-ID raden Session-ID maken Met behulp van je gebruikersnaam

(Z O

N D

ER

BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

Met behulp van malware

146


Blok 4 API's

TI E)

4.1 API's

Figuur 4.1

Leerdoelen

ER

Je kunt een JSON-server installeren. Je kunt een JSON-database maken. Je kunt API GET-methodes coderen. Je kunt API POST-methodes coderen. Je kunt API PUT-methodes coderen. Je kunt API DELETE-methodes coderen. Je kunt een PDF creëren. Je kunt een e-mail programma coderen.

(Z O

N D

1. 2. 3. 4. 5. 6. 7. 8.

BE C EL ON D CE -& P TA T AL R

ED

AC

API staat voor Application Programming Interface. Het is een stuk software dat communiceert met andere software. Met API’s kunnen we webservices gebruiken in onze applicaties.

Opdracht 1 Oriëntatie API's Kunt je een voorbeeld bedenken van software die met andere software communiceert?

147


4.2 Opdrachtenset API's Opdracht 2 Gebruikers ophalen

TI E)

Fetch API Maak een nieuw HTML-script (de klant-script) met een knop om de gebruikers uit de API https://jsonplaceholder.typicode.com op te halen. Sla het op als fetchAPI.html.

<!DOCTYPE html> <html lang="en"> <head>

AC

<meta charset="UTF-8">

<title>Document</title> <script src="fetchAPI.js" defer></script>

</head> <body>

BE C EL ON D CE -& P TA T AL R

<link rel="stylesheet" href="fetchAPI.css">

<button onclick="getUsers()">Get Users</button> <ul></ul> </body> </html>

FetchAPI styles. Codeer de de volgende styles en sla ze op als fetchAPI.css.

// en slaat de gegevens in een bestand op function inschrijven(){

if(isset($_POST["submit"])) {

ER

$gegevens = array( "naan" => htmlspecialchars($_POST["naam"]),

N D

"email" => htmlspecialchars($_POST["email"]),

"opleiding" => htmlspecialchars($_POST["opleiding"])

(Z O

);

// elke inschrijving eindigt met een

$student = json_encode($gegevens)."

"; $bestand = fopen("studenten.txt","ab");

148

ED

<meta name="viewport" content="width=device-width, initial-scale=1.0">


Blok 4 API's

if(!$bestand) { return false; } fwrite($bestand, $student, strlen($student)); if(fclose($bestand)) {

TI E)

?> // voeg een JavaScript blok om de melding door te geven <script> document.getElementById("melding").innerHTML= "Inschrijving succesvol!"

AC

</script> <?php

ED

}else { ?>

BE C EL ON D CE -& P TA T AL R

<script> document.getElementById("melding").innerHTML= "Er is iets fout gegaan!" </script> <?php } }

} // einde inschrijven

@import url("https://fonts.googleapis.com/css?family=Roboto"); body{

font-family: Roboto, sans-serif; font-size: large; height: 100vh;

ER

display:flex;

flex-direction: column;

N D

align-items: center; }

button{

(Z O

background-color: cadetblue; width: 200px; height: 40px; font-size: large;border:0px;

border-radius: 10px;

149


color:white; }

Voer een fetch-opdracht om de gebruikers uit de API https://jsonplaceholder.typicode.com op te halen.

2.

Voer een foreach-opdracht om iedere gebruiker als een <li>-item weer te geven.

3.

Codeer een catch-clausule om fouten op te vangen en weergeven.

AC

1.

ED

• • •

TI E)

Featch API met JavaScript Codeer het volgende JavaScript en sla het op als fetchAPI.js

BE C EL ON D CE -& P TA T AL R

Resultaat Als resultaat moet je de opgehaalde gebruikers uit de API https://jsonplaceholder.typicode.com kunnen zien. Zie volgende figuur. Druk op Ctrl-Shift-C en selecteer het venster Network. Je ziet in je browser in het netwerk verkeer de Name van de API en de Status 200. Dit betekent dat de request succesvol was.

ER

Opdracht 3 Gebruiker posten

N D

Maak een nieuw HTML-script en sla het op als postAPI.html. Codeer een knop en koppel de JavaScript function postUser() eraan. Deze function moet een nieuwe gebruiker posten en de Status 201 retourneren. Status 201 betekent: gecreëerd.

(Z O

Let op

De methode POST is niet toegestaan in deze API, maar de code hieronder is correct en retourneert Status 201.

POST Open fetchAPI.js en codeer de volgende function postUser().

150


Blok 4 API's

// POST USER const postUser = async () => { const nieuwUser = { name: "Adam"

try { const res = await fetch("https://jsonplaceholder.typicode.com/users", { method: "POST",

AC

headers: {"Content-Type": "application/json" },

const data = await res.json();

BE C EL ON D CE -& P TA T AL R

if (!res.ok) {

ED

body: JSON.stringify(nieuwUser), });

TI E)

};

console.log(data.description); return; }

} catch (error) {

console.log(error); } };

Voer de volgende stappen uit: 1.

Maak een nieuwUser object.

2.

Voer een fetch-opdracht met de URI https://jsonplaceholder.typicode.com/users

3.

Deze fetch-opdracht gebruikt de volgende attributen: method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(nieuwUser),

ER

• • •

(Z O

N D

Zie het resultaat hieronder:

151


TI E) AC

De status code is 201. Het betekent dat de nieuwe user was gecreëerd.

Opdracht 4 Fetch gegevens

ED

In deze opdracht haal je meer user-gegevens. Open fetchAPI.css en voeg de volgende styles toe:

BE C EL ON D CE -& P TA T AL R

#grid { display: grid;

grid-template-columns: auto auto auto; width:80%;

color: black; } #grid .cell {

background: #e2e9eb;

border: 1px solid white; padding: 10px; opacity: 70%; color:black; }

N D

ER

Open fetchAPI.js en wijzig de forEach-lus om meer gegevens weer te geven.

(Z O

Het resultaat moet het volgende zijn.

152


AC

TI E)

Blok 4 API's

Open fetchAPI.js en wijzig de fetch-opdracht voor user met id=1 als volgt: fetch("https://jsonplaceholder.typicode.com/users?id=1")

BE C EL ON D CE -& P TA T AL R

Het resultaat moet het volgende zijn:

ED

Opdracht 5 Fetch user op ID

4.3 Theorie API's Restful API's

Er zijn twee soort webpagina’s: statische en dynamische pagina’s. Een statische webpagina toont altijd dezelfde informatie. Een dynamische webpagina krijgt informatie rechtstreeks vanuit de server. Als de informatie in de server verandert wordt de informatie in de webpagina dynamisch vertoond.

(Z O

N D

ER

Data-gestuurd programmeren Data-gestuurd programmeren is programmeren waar de programmastroom primair wordt bepaald door data en vervolgens door de logica van het programma. Het doel van data-gestuurd programmeren is het zo min mogelijk harde code schrijven en zo veel mogelijk dynamisch coderen. Bijvoorbeeld, in plaats van dat je een webpagina met een aantal producten in html codeert, raadpleeg je liever een database met productgegevens om daarna een dynamische webpagina te genereren met de juiste gegevens vanuit de database. Hiermee zorg je ervoor dat de webpagina nooit gedateerd raakt. Je hoeft dus bijvoorbeeld niet meer de html-codes handmatig te updaten als de prijs van een product verandert, want de gegevens in de database zijn actueel en gekoppeld aan de webpagina. Een API is een Application Programming Interface. Het is een stuk software dat communiceert met andere software. Met API’s kunnen we webservices gebruiken in onze applicaties. Een API voer je uit met de URI van de API. Een internet-resource zoals een webdocument identificeren we door zijn URI en kan gerepresenteerd worden in de volgende formaten: • JSON • XML

153


• •

JSV HTML.

Een voorbeeld van een API is: http://maps.googleapis.com/maps/api/geocode/json?address=amsterdam&sensor=false$key=xxxxxxxxxxxx

Figuur 4.2

BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

Waar key is je Google developer key. Deze API van Google geeft als webservice de gegevens van een bepaalde locatie (in dit geval Amsterdam) in een JSON-object. Door gebruik te maken van deze webservice kunnen we deze gegevens in onze applicaties gebruiken.

Een REST API (Representational State Transfer) is een application programming interface (API). Het is een architecturale stijl dat de interactie met RESTful webservices mogelijk maakt.

ER

RESTful API’s zijn API’s die aan de volgende constraints (eisen) voldoen. 1. Uniforme interface 2. Stateless 3. Client-server 4. Cacheable 5. Layered system 6. Code on demand 7. HATEOAS (Hypermedia As The Engine Of Application State) 8. API-foutmelding 9. Backward compatibiliteit.

(Z O

N D

Uniforme interface Een RESTful API maakt gebruik van URI’s voor de adressering van de API. Het maakt een representatie (kopie) van de bron door de HTTP GET-methode en gebruikt daarna de PUT-methode en de URI om de oorspronkelijke bron te updaten.

Stateless Een RESTful API is stateless. Voorbeelden van stateless REST-interacties zijn: • State 1: Gebruiker zoekt een bron via een URI-adres. De server haalt de bron op met behulp van de GET-methode. • State 2: Gebruiker krijgt een representatie van de bron in de vorm van een HTML- pagina of een XML- of JSON-document. • State 3: Gebruiker klikt op een link in de representatie.

154


Blok 4 API's

Het klikken op hyperlinks in de representatie van de bron leidt tot nieuwe states, bijvoorbeeld een nieuwe webpagina. (De gebruiker verandert van state met elke nieuwe representatie. Vandaar de term REST: Representational State Transfer.). HTTPS-protocol Hypertext transfer protocol secure (HTTPS) is de beveiligde versie van HTTP, het primaire protocol dat wordt gebruikt om gegevens tussen een webbrowser en een website te verzenden.

TI E)

Een RESTful API gebruikt het HTTP- of HTTPS-protocol, het protocol voor client-server-architectuur. Als we de volgende fictieve webpagina willen zien, typen we de volgende URL in de browser:

AC

http://example.org/news/

De header van de request ziet er als volgt uit:

HOST: example.org

BE C EL ON D CE -& P TA T AL R

GET /news/ HTTP/1.1

ED

Een URL is een Uniform Resource Locator, een tool die wordt gebruikt om webpagina's te vinden. Het bestaat uit een protocol, een domein, een pad en een webpaginanaam.

Accept-Encoding: compress, gzip

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)

De header van de response ziet er als volgt uit: HTTP/1.1 200 Ok

Date: Fri, 14 Apr 2017 14:55:00 GMT Server: Apache

ETag: "65b89834b3838439c3e989" Content-Type: text/html

Cache-Control: max-age=3600

ER

De HTTP-methodes hebben verschillende kenmerken. Hier volgt een lijst van methodes en de kenmerken: • GET-methode met als kenmerken: safe, idempotent (zie hieronder), cacheable • PUT is idempotent • DELETE is idempotent • HEAD is safe, idempotent • POST is niet idempotent.

(Z O

N D

Idempotent betekent dat de methode meerdere keren uitgevoerd mag worden, maar dat het resultaat in de bron altijd hetzelfde blijft. Behalve de POST-methode zijn alle andere methodes idempotent. Mits de server dat correct implementeert. Het betekent dat we meerdere keren een resource kunnen aanvragen met GET en de resource blijft altijd hetzelfde. Maar als we bijvoorbeeld meerdere keren dezelfde employé toevoegen met POST, dan maken we telkens weer een nieuwe employé. Cacheable Een RESTful API moet cacheable zijn. Cacheable responses zijn responses die in het cache-geheugen van je browser tijdelijk blijven staan. In de header van de response zien we of de responses cacheable zijn. Cache-Control: max-age=3600

155


In dit geval blijft de response een uur lang in de cache. Als je binnen een uur dezelfde request uitvoert, krijg je de response veel sneller vanuit de browser-cache dan vanuit de server. Dit maakt de API efficiënter.

TI E)

Layered system Een RESTful API maakt gebruik van de client/server/storage multi-layer architectuur. De client hoeft niets te weten van de software of hardware tussen client en server. Code on demand De server kan, als erom wordt gevraagd, code naar de client sturen. De code wordt dan bij de client uitgevoerd.

AC

HATEOAS HATEOAS (Hypermedia As The Engine Of Application State) is het concept dat applicaties veranderen, data-eisen veranderen en het path van een resource kan veranderen, maar dat deze veranderingen geen consequenties hoeven te hebben voor de client-software. De nadruk ligt bij hypermedia. Hypermedia houdt in dat de resource data bevat maar ook hyperlinks. Deze hyperlinks leiden dan naar de volgende state. Bijvoorbeeld:

"data": {

}, "_links": {

BE C EL ON D CE -& P TA T AL R

"gebruiker":{"e-mail": "email"}

ED

{

"edit": {"href": "/api/gebruiker/id/1"} }, "id": "1" }

De geretourneerde resource bevat dus de data plus URI’s naar de mogelijke states.

N D

ER

API-foutmelding De HTTP-states zijn: • 200: OK request succesvol • 201: gecreëerd • 300: redirection – 301: permanent verplaatst – 302: tijdelijk verplaatst – 304: niet gewijzigd • 400: probleem met request – 401: onbevoegd request – 403: verboden, geen toegang – 404: resource niet gevonden – 405: methode niet toegestaan • • 500: probleem met server.

(Z O

De foutmeldingen van de API beschrijven wat is misgegaan, zodat de webapplicatie-ontwikkelaar zijn code kan aanpassen, bijvoorbeeld:

{

"data": { "gebruiker":{"e-mail": "email"} },

156


Blok 4 API's

"_links": { "edit": {"href": "/api/gebruiker/id/1"} }, "error": { "Error": {"GebruikerID ontbreekt" }

TI E)

}, }

AC

Backward compatibiliteit Updates in je API-code moeten geen onvoorziene consequenties hebben voor de gebruikers van de API. In de header kan de programmeur informatie over nieuwere versies doorgeven aan de client.

BE C EL ON D CE -& P TA T AL R

header("Cache-Control: no-cache")

ED

Alle programmeertalen hebben een header-functie waar de programmeur zelf een HTTP-header voor de client kan genereren. Bijvoorbeeld:

Backend API client Een backend API client maakt een API call naar een andere server. In PHP wordt de Curl-tool hiervoor gebruikt. De Curl-tool Curlis een tool voor het verzenden van HTTP/HTTPS-requests en het behandelen van HTTP/HTTPS-responses. Met Curl kunnen we API requests uitvoeren en de response-data ophalen. Een RESTful HTTP-request bestaat uit simpele tekstregels (request-header) waarbij de client een actie van de server aanvraagt. De server voert de actie uit en retourneert als eerste een response-header met informatie over de uitvoering van de actie en vervolgens de aangevraagde informatie naar de client. Het eenvoudigste request/actie-verzoek naar een http-server is een GET-verzoek. Dit kan een verzoek voor een html-pagina, een afbeelding of een rij in een database zijn en we noemen het de resource. Deze resource in het internet identificeren we met een URI (Uniform Resource Identifier). Bijvoorbeeld: curl https://example.net

geeft als resultaat de html-pagina van deze URI.

<?php

ER

In het volgende voorbeeld wordt de Curl-tool gebruikt om een aanvraag naar een API voor resources.

N D

$url="http://localhost:3000/films/1"; $ch=curl_init();

(Z O

curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); $result=curl_exec($ch); if($e = curl_error($ch)){ echo $e; die("Connection Failure");

157


}else{ $films=json_decode($result); } curl_close($ch);

AC

$url is de URI van de RESTfulAPI. curl_init($url) initialiseert de curl API call. curl_exec($curl) voert de API aanvraag uit. curl_setopt() specificeert de opties voor de API call. json_decode($curl_response,true) decodeert de response JSON-object in een array. curl_close() eindigt de API call.

ED

• • • • • •

TI E)

Uitleg

BE C EL ON D CE -& P TA T AL R

Access control Een REST-service die niet publiek is moet access-controles uitvoeren op alle API-endpoints. Dat wil zeggen, access-control-beslissingen moeten lokaal bij de REST-endpoints plaatsvinden. Een gecentraliseerde Identity Provider (IdP) verstrekt tokens voor het authenticeren van de gebruikers (applicaties of andere services). Deze tokens zijn dan geverifieerd bij elke service. Als het token klopt, wordt de service uitgevoerd. Json Web Tokens (JWT) Een JSON-webtoken (JWT) is een JSON-object dat wordt gebruikt om veilig informatie over het web (tussen twee partijen) over te dragen. Het kan worden gebruikt voor een authenticatiesysteem en kan ook worden gebruikt voor informatie-uitwisseling. Een microservice is een benaderingswijze in software-ontwikkeling waarbij een grote applicatie uit modulaire onafhankelijke services wordt opgebouwd. Elke module voert een specifiek proces uit en communiceert met geverifieerde gebruikers via een goed gedefinieerd, lichtgewicht mechanisme of Identity Provider (IdP).

(Z O

N D

ER

JWT OAauth 2.0 authorization framework OAuth 2.0 staat voor "Open Authorization". Het is een standaard ontworpen om een website of applicatie namens een gebruiker toegang te geven tot bronnen in andere web-apps. JWT (JSON Web Token) is een JSON-datastructuur met gebruikers-credentials en wordt gebruikt voor access-control. We kunnen deze cryptografische handtekening gebruiken om de integriteit van het JWT-token te beschermen. Op de website vind je JWT-libraries voor de meeste programmeertalen.

Figuur 4.3

158


Blok 4 API's

Figuur 4.4

De header specificeert het hash-algoritme te gebruiken. De payload bestaat uit de API-client data. De signature is het encoden van de header, plus de payload, plus een secretKey.

N D

• • •

ER

BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

Structuur van een JWT De structuur van een JWT bestaat uit drie delen: een header, een payload en een signature.

(Z O

Het encoded resultaat ziet er als volgt uit:

159


TI E) AC ED BE C EL ON D CE -& P TA T AL R

Figuur 4.5

Frontend API client

Frontend API client Een frontend client kan een request aanvragen aan een API door middel van de fetch()function. De fetchfunction in JavaScript genereert een Promise. Promises Een Promise is een placeholder voor een asynchrone taak die nog niet voltooid is. Wanneer je een promise-object definieert en retourneert een belofte in plaats van onmiddellijk resultaat. Een Promise in JavaScript is asynchroon, wat betekent dat het tijd kost om het op te lossen of af te ronden. De JS-engine wacht ook niet tot stilstand en begint andere delen van de code uit te voeren, in afwachting van de geretourneerde waarde van de Promise. Voobeeld van een Promise Hier volgt een voorbeeld van een Promise in JavaScript.

ER

let promise = new Promise((resolve, reject) => { let ok = true;

N D

if (ok) {

resolve("vervuld");

(Z O

} else {

reject("afgewezen");

}

})

Om op te geven welke callback functions moeten worden aangeroepen, gebruikt je de volgende twee callback functions:

160


Blok 4 API's

• •

Resolve (vervuld) Reject (afgewezen)

Bijvoorbeeld resolve('vervuld') geeft aan dat de Promise is geslaagd.

TI E)

Een callback-function is een function die toegankelijk is via een andere function en wordt aangeroepen na dat die eerste functie is voltooid. In de volgende code wordt de callback in de then() handler aangeroepen.

AC

Test een Promise

console.log('Promise ' + message + ' vanuit then-handler') }).catch((message)=>{

})

BE C EL ON D CE -& P TA T AL R

console.log('Promise ' + message + ' vanuit catch error')

ED

promise.then((message)=>{

De callback function hier is een Promise handler. In dit geval:

(message)=>{

console.log('Promise ' + message + ' vanuit de then-handler') }

Het resultaat in de console is: Tabel 4.1

Promise vervuld vanuit de then-handler

ER

Async/wait Asynchrone code maakt het mogelijk om meerdere bewerkingen tegelijkertijd uit te voeren zonder het programma te blokkeren. Dit wordt gedaan door callbacks of Promises (beloften) te gebruiken om aan te geven wanneer een bewerking is voltooid. Het programma kan andere instructies blijven uitvoeren terwijl de Promise wordt uitgevoerd.

N D

De syntaxis is:

(Z O

async function f() { return 1; }

161


Een concreet voorbeeld Stel je voor dat de helpdesk heeft beloofd je terug te bellen. Je zal uiteraard niet bij je telefoon blijven wachten. Je zal liever andere werkzaamheden doen terwijl je op de terugbel van de helpdesk wacht. Zo'n situatie kunt je als volgt coderen, beginnend met de bellen function:

function bellen(){

TI E)

console.log("Ring Ring Ring"); return true; }

AC

De helpdesk creëert een Promise in hun backlog

return new Promise((resolve, reject) => { console.log(`Telefoongesprek in de wachtrij ....`);

ED

function backlog() {

BE C EL ON D CE -& P TA T AL R

const gebeld = setTimeout(bellen, 10000); // bellen na tien seconden if (gebeld) {

resolve("Heeft gebeld"); } else {

reject("Er is iets fout gegaan!"); } }); }

De helpdesk start de backlog met een asynchroon function:

async function startbacklog() { try {

const response = await backlog();

ER

// Dit zal de resolve sectie van de promise retourneeren // zodra de promise is voltooid

N D

// maar gaat door met de volgende code console.log("Een ogenblik geduld a.u.b. ");

(Z O

} catch (err) { console.log(err);

}

}

startbacklog();

162


Blok 4 API's

Als resultaat moet je het volgende in de console zien: Tabel 4.2 Telefoongesprek in de wachtrij .... Een ogenblik geduld a.u.b.

TI E)

Ring Ring Ring Omdat de startbacklog function asynchroon is:

AC

async function startbacklog()

const response = await backlog();

BE C EL ON D CE -& P TA T AL R

De bel function was als volgt gecodeerd:

ED

Wacht de function backlog af tot de Promise in backlog voltooid is:

const bel = setTimeout(bellen, 10000);

Je ziet de Ring melding pas na tien seconden is vermeld.

De Fetch()-method De JavaScript fetch()-methode wordt gebruikt om gegevens van een server op te vragen. Het verzoek kan van elk type API zijn dat de gegevens in JSON of XML retourneert. De methode fetch() vereist één parameter, de URL die moet worden aangevraagd, en retourneert een Promise. De syntaxis van de fetch()-methode is als volgt

fetch('url') //url van de API

.then(response => response.json()) .then(data => console.log(data));

ER

De then-handler handelt de callback function wanneer die voltoid is.

4.4 Begrippen

N D

4.5 Test je kennis

(Z O

Opdracht 6 Vraag 1 Wat is het doel van data-gestuurd programmeren? Er zijn meerdere antwoorden goed. Zo min mogelijk harde code schrijven. Zo veel mogelijk dynamisch coderen. Zo veel mogelijk data creëren. Dynamische webpagina's genereren.

163


Opdracht 7 Vraag 2 Wat is een idempotent HTTP-methode? Een methode die maar een keer uitgevoerd moet worden. Een methode die meerdere keren uitgevoerd mag worden, maar dat het resultaat in de bron altijd hetzelfde blijft.

TI E)

Een callback-function.

Opdracht 8 Vraag 3 Wat is een cacheable HTTP-response? Een mislukte HTTP-response.

AC

Een HTTP-response

Opdracht 9 Vraag 4 Een RESTful respopnse kan gerepresenteerd worden in de volgende formaten:

BE C EL ON D CE -& P TA T AL R

JSON

ED

Een opgeslagen HTTP-response om later opgehaald en gebruikt te worden.

XML CSS HTML

Opdracht 10 Vraag 5

Wat is achterwaartse compatibiliteit?

Zorgt ervoor dat je API compatibel met alle clients blijft.

Zorgt ervoor dat alleen oude versies van je API compatibel zijn.

Zorgt ervoor dat alleen nieuwe versies van je API compatibel zijn.

4.6 Praktijkopdrachten

Opdracht 11 JSON database creëren

Om een JSON database te creëren voer je de volgende stappen uit: 1.

Maak een nieuwe map in htdocs en geef het de naam top10-films.

ER

• •

2.

Open de map top10-films in je terminal en istalleer Node.js van uit de volgende link: https://nodejs.org/en/download

3.

Open de map top10-films in je terminal en istalleer de JSON database. Voer het volgende npm commando van Nodejs uit:

N D

npm install -g json-server

(Z O

4.

Creëer de JSON database Maak de volgende JSON object voor je database en sla het op als db.json in de map top10-films

164


Blok 4 API's

{ "films": [ { "id": 1, "top": 1,

TI E)

"titel": "The Shawshank Redemption", "jaar": "1994", "regiseur": "Frank Daborant" },

AC

{

"top": 2, "titel": "The Godfather",

BE C EL ON D CE -& P TA T AL R

"jaar": "1972",

ED

"id": 2,

"regiseur": "Francis Ford Coppola" }, { "id": 3, "top": 3,

"titel": "Pulp Fiction", "jaar": "1994",

"regiseur": "Quentin Tarantino" }, { "id": 4, "top": 4,

"titel": "Lord of the rings",

ER

"jaar": "2001",

"regiseur": "Peter Jackson"

N D

}, {

"id": 5,

(Z O

"top": 5,

"titel": "Schindlers List", "jaar": "1993", "regiseur": "Steven Spielberg"

}, {

165


"id": 6, "top": 6, "titel": "The Dark Knight", "jaar": "2008", "regiseur": "Christopher Nolan"

TI E)

}, { "id": 7, "top": 7,

AC

"titel": "The Good, The Bad and The Ugly",

"regiseur": "Sergio Leone" },

"id": 8, "top": 8,

BE C EL ON D CE -& P TA T AL R

{

ED

"jaar": "1966",

"titel": "Forrest Gump", "jaar": "1994",

"regiseur": "Robert Zemeckis" }, { "id": 9, "top": 9,

"titel": "12 Angry Men", "jaar": "1957",

"regiseur": "Stopney Lumet" },

ER

{ "id": 10,

N D

"top": 10,

"titel": "Goodfellas",

(Z O

"jaar": "1990", "regiseur": "Martin Scorcese"

}

]

}

Start je database op Start je db.json database door het volgende commando in je terminal uit te voeren:

166


Blok 4 API's

json-server --watch db.json

Je moet de volgende meldingen in je terminal krijgen. Loading db.json Done

Resources

TI E)

http://localhost:3000/films

Home

AC

http://localhost:3000

ER

BE C EL ON D CE -& P TA T AL R

ED

Je JSON database is nu een resource voor API's. Als je de URI (Uniform Resource Identifier) http://localhost:3000/films in je browser intypt krijg je als response een JSON-object met de top10 films in je database.

(Z O

N D

Je kunt de specifieke gegevens van een film downloaden door de ID aan te geven.

167


Opdracht 12 De API GET-methode

BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

In deze opdracht codeer je een PHP-script dat alle top-10 films uit de JSON-database ophaalt met behulp van een API GET-methode. Het resultaat moet het volgende zijn.

Dit script bevat drie actieknoppen: Een delete, een edit en een knop voor het toevoegen van nieuwe films Codeer het volgende script en sla het op als getfilms.php in de map top10-films.

<!DOCTYPE html>

<html lang="en"> <head>

<meta charset="UTF-8" />

<meta name="viewport" content="width=device-width, initial-scale=1.0" />

ER

<title>Document</title>

<link rel="stylesheet" href="films.css" />

N D

<link href='http://netdna.bootstrapcdn.com/font-awesome/4.0.3/ css/font-awesome.css' rel='stylesheet' type='text/css'>

</head>

(Z O

<body>

<img id="filmstrip" src="img/filmstrip.png" alt="x" /> <h2>Top-10 Films</h2>

<form id="searchform" action="" method="post">

168


Blok 4 API's

<div class="search"> <input type="search" name="search" id="zoektekst" placeholder="Zoek een film"/> <button id="searchbutton" name="submit"> <span class="fa fa-search fa-2x"></span></button>

TI E)

</div> </form> <!-- Grid headers --> <div id="grid">

AC

<span class='cell'><b>TOP</b></span>

<span class='cell'><b>JAAR</b></span> <span class='cell'><b>REGISEUR</b></span>

BE C EL ON D CE -& P TA T AL R

<span class='cell'><b>DELETE</b></span>

ED

<span class='cell'><b>TITEL</b></span>

<span class='cell'><b>EDIT</b></span>

<?php

// deze function scant elementen in een array

// en als er een match is met een gegeven substring retourneert true function scanarray($substring, $array){ foreach($array as $item){

if (strpos($item, $substring)!==false){ return true; } } return false; }

ER

$search = false;

if(isset($_POST['submit'])){

N D

$searchtext = $_POST['search']; $search = true;

}

(Z O

// fetch alle films $ch = curl_init(); $url = "http://localhost:3000/films"; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

169


$resultaat = curl_exec($ch);

// check voor errors if($e = curl_error($ch)){ echo $e;

TI E)

die("Kon geen verbinding maken"); }else{ $films=json_decode($resultaat);

AC

}

foreach($films as $film){

BE C EL ON D CE -& P TA T AL R

if($search){

ED

curl_close($ch);

$filmgegevens = get_object_vars($film);

if(!scanarray($searchtext, $filmgegevens)) { // als geen match sla deze film over continue; } } $item =

"<span class='cell'>$film->top</span>".

"<span class='cell'>$film->titel</span>". "<span class='cell'>$film->jaar</span>".

"<span class='cell'>$film->regiseur</span>". "<span class='cell'>

<a onClick="javascript:return confirm('Weet je zeker?');"

ER

href='deletefilm.php?&id=".$film->id."'>

<i class='fa fa-trash-o' aria-hidden='true'></i></a></span>".

N D

"<span class='cell'> <a class='material-icons' href='editfilm.php?id=".$film->id."'>

(Z O

<i class='fa fa-pencil-square-o' aria-hidden='true'></i>

</a></span>";

echo $item;

}

?>

</div> <div id="rond" ><a id="roundbutton" href='addfilm.php'>+</a></div>

170


Blok 4 API's

</body> </html>

Maak de styles voor het getfilms script Codeer de volgende styles en sla ze op als films.css in de map top10-films.

TI E)

@importurl("https://fonts.googleapis.com/css?family=Roboto"); body { display: flex;

AC

flex-direction: column; align-items: center;

font-size: large;

} img{ width:100%; height:150px;

BE C EL ON D CE -& P TA T AL R

width:100%;

ED

font-family: Roboto, sans-serif;

object-fit: cover; } form{ width: 30%; border: none;

border-radius: 10px;

box-shadow:2px 6px 6px 6px rgba(0, 0, 0, 0.2); text-align: center; padding-top:20px;

} input{

ER

margin-bottom: 35px;

N D

height: 30px; width: 80%;

(Z O

font-size: large; margin-bottom:15px; padding-left: 5px; border-radius: 5px;

} button {

171


height: 40px; width: 80%; font-size: large; background-color: cadetblue; border: none;

TI E)

border-radius: 5px; color: white; margin-bottom: 25px; }

AC

#roundbutton{

background-color: cadetblue; color :#ffff;

BE C EL ON D CE -& P TA T AL R

border-radius: 50%; font-size: 3rem;

padding-left:15px;

padding-right:15px; } a{

text-decoration: none; } /* GRID */ #grid {

display: grid;

grid-template-columns: auto auto auto auto auto auto; width: 80%; }

ER

/* GRID CELLS */ #grid.cell {

N D

background: #e2e9eb; border: 1px solid white; padding: 5px;

(Z O

opacity: 70%; color: #000;

}

172

ED

margin-top: 30px;


Blok 4 API's

Opdracht 13 De API POST-methode

BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

Codeer het postfilm.php script om een film te kunnen toevoegen door op de + knop in getfilms.php op te klikken. Het resultaat moet een formulier zijn waar je de gegevens van een nieuwe film kan toevoegen met de API POST-methode.

Codeer het volgende script en sla het op als postfilm.php in de map top10-films.

<!DOCTYPE html> <html lang = "en"> <head>

<meta charset = "UTF-8" />

ER

<meta http-equiv = "X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />

N D

<link rel = "stylesheet" href = "films.css" /> <title>Add film</title>

(Z O

</head> <body>

<img id="filmstrip" src="img/filmstrip.png" alt="x" /> <h2>Add Film</h2> <form name="form" action="" method="POST"> <label>Top</label><br>

173


<input type="text" name="top" id="top" /><br> <label>Titel:</label><br> <input type="text" name="titel" id="titel"/><br> <label>Jaar:</label><br> <input type="text" name="jaar" id="jaar" /><br>

TI E)

<label>Regiseur:</label><br> <input type="text" name="regiseur" id="regiseur" /><br> <button name="submit" class="button">✔</button> </form>

AC

<div> <a id="roundbutton" href='getfilms.php'><</a>

ED

</div> </body>

<?php

BE C EL ON D CE -& P TA T AL R

</html>

if(isset($_POST["submit"])) { $top = ($_POST["top"]);

$titel = ($_POST["titel"]); $jaar = ($_POST["jaar"]);

$regiseur = ($_POST["regiseur"]);

// maak een JSON-object $postdata='{

"top":'.$top.',"titel":"'.$titel.'",'.'"jaar":"'.$jaar.'",'. '"regiseur":"'.$regiseur.'"'.'}';

ER

// API POST-methode

$url = "http://localhost:3000/films";

N D

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

(Z O

curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Authorization: Basic '.'1111111111111', 'Content-Type: application/json',

));

174


Blok 4 API's

$resultaat = curl_exec($ch); if($e = curl_error($ch)){ echo $e; die("Connection Failure"); }else{

TI E)

$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); print_r("Returncode:".$httpcode." Film toegevoegd"); curl_close($ch); }

BE C EL ON D CE -& P TA T AL R

Opdracht 14 De API DELETE-methode

ED

Voeg nieuwe films toe Voeg een aantal nieuwe films door op de + knop in het script getfilms op te drukken

AC

}

Codeer het volgende script en sla het op als deletefilms.php in de map top10-films.

<?php

// De API DELETE-methode $id = $_GET["id"];

$url = "http://localhost:3000/films/".$id; $ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); $result = curl_exec($ch);

if($e = curl_error($ch)){ echo $e;

die("Connection Failure");

ER

}else{

$films = json_decode($result);

N D

}

curl_close($ch);

(Z O

header("Location:getfilms.php");

Delete films Delete de toegevoegde films van de vorige opdracht door op de deleteknop in het script getfilms.php op te klikken.

175


Opdracht 15 De API PUT-methode

BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

In deze opdracht codeer je een script dat een film kan editen met behulp van de API PUT-methode. Het script wordt uitgevoerd door op de editknop in getfilms.php op te klikken. Je codeert je script in twee stappen. Stap 1: Voer een API GET-methode om de gegevens van de gegeven ID op te halen en deze in een edit-formulier in te vullen. Stap 2: Voer een API PUT-methode om de geüpdatet gegevens op te slaan. Bijvoorbeeld als je film nummer 10 wil editen krijg je het volgende editformulier met de gegevens van de gekozen film.

Codeer het volgende script en sla het op als editfilm.php in de map top10-films

<!DOCTYPE html>

<html lang = "en">

ER

<head>

<meta charset="UTF-8" />

N D

<meta name = "viewport" content="width = device-width, initial-scale=1.0" />

<title>Editfilm</title>

(Z O

<link rel = "stylesheet" href="films.css" />

</head>

<body> <img id = "filmstrip" src = "img/filmstrip.png" alt = "x" />

176


Blok 4 API's

<?php // GET de geselecteerde film met de API GET-methode $id = $_GET["id"]; $url = "http://localhost:3000/films/".$id; $ch = curl_init();

TI E)

curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $resultaat = curl_exec($ch); if($e = curl_error($ch)){

AC

echo $e;

}else{ $film = json_decode($resultaat);

curl_close($ch); ?>

BE C EL ON D CE -& P TA T AL R

}

ED

die("Connection Failure");

// vul het formulier met de gegevens van de geselecteerde film <h2>Edit Top-10 Film</h2> <form

action = "" method = "post">

<input type = "hidden" name = "id" id = "id" value = "<?php echo $film->id; ?>"/><br> <label>Top</label><br>

<input type = "text" name = "top" id = "top"

value = "<?php echo $film->top; ?>" /><br> <label>Jaar:</label><br>

<input type = "text" name = "jaar" id = "jaar" value = "<?php echo $film->jaar; ?>" /><br>

ER

<label>Titel:</label><br>

<input type = "text" name = "titel" id = "titel"

N D

value = "<?php echo $film->titel; ?>" /><br> <label>Regiseur:</label><br> <input type = "text" name = "regiseur" id = "regiseur"

(Z O

value = "<?php echo $film->regiseur; ?>" /><br>

<button name = "submit">Edit</button>

</div>

</form> <div>

<a id = "roundbutton" href = 'getfilms.php'><</a>

177


</div>

<?php if(isset($_POST['submit'])){ $id = $_POST['id']; {

TI E)

$editdata='

"id":'.$_POST["id"]. ',"top":'.$_POST["top"]. ',"titel":"'.$_POST["titel"].'",'.

AC

'"jaar":"'.$_POST["jaar"].'",'.

'}'; // De API PUT-methode

BE C EL ON D CE -& P TA T AL R

$ch=curl_init(); curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");

curl_setopt($ch, CURLOPT_POSTFIELDS, $editdata); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Authorization: Basic '.'1111111111111', 'Content-Type: application/json', ));

$result=curl_exec($ch);

if($e=curl_error($ch)){ echo $e;

die("Kon geen verbinding maken");

ER

}else{

$httpcode=curl_getinfo($ch, CURLINFO_HTTP_CODE);

N D

$returncode=("Returncode:".$httpcode." Film gewijzigd");

curl_close($ch); header("Location:getfilms.php");

(Z O

} }

178

ED

'"regiseur":"'.$_POST["regiseur"].'"'.


Blok 4 API's

Opdracht 16 Search component

BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

In deze opdracht maak je een search component in getfilms.php om films te kunnen opzoeken. Bijvoorbeeld, als je een titel of een directeur of een jaargetal opzoekt krijg je het juiste resultaat:

Codeer de volgende search component tussen het <h2> en het <grid>-element in.

<h2>Top-10 Films</h2>

<form id="searchform" action="" method="post"> <div class="search">

<input type="search" name="search" id="zoektekst" placeholder="Zoek een film"/>

ER

<button id="searchbutton" name="submit">

<span class="fa fa-search fa-2x"></span></button>

</div>

N D

</form>

(Z O

<!-- Grid headers -->

Codeer de volgende styles voor de search component in je films.css bestand.

.search { width: 80%; margin-top: 10px;

179


} #zoektekst { width: 100%; border: 1pxsolid; padding: 15px;

font-size: 20px; }

AC

Codeer de volgende function en if()-opdracht als de eerste bovenaan in je <?php blok in getfilms.php

// deze function scant elementen in een array

ED

<?php

BE C EL ON D CE -& P TA T AL R

// en als er een match is met een gegeven substring retourneert true // anders retourneert false

function scanarray($substring, $array){ foreach($array as $item){

if (strpos($item, $substring)!==false){ return true; } }

return false; }

if(isset($_POST['submit'])){

$searchtext = $_POST['search']; $search = true;

ER

}else{

$search = false;

N D

}

(Z O

Codeer de volgende if($search)-opdracht na je curl_close($ch) en binnen de foreach()-lus.

curl_close($ch); // geef de films weer in de grid foreach($films as $film){ if($search){ // haal de gegevens in het object $film naar array $filmgegevens

180

TI E)

border-radius: 5px;


Blok 4 API's

$filmgegevens = get_object_vars($film); if(!scanarray($searchtext, $filmgegevens)) { // als geen match sla deze film over continue; }

TI E)

}

Opdracht 17 API authorizatie

{ "films": [ { "id": 1, "top": 1,

BE C EL ON D CE -& P TA T AL R

ED

AC

De Top10-films API wil posters van de top10 films als service aanbieden. Services in API's maken gebruik van tokens. Tokens werken volgens het OAuth 2.0-protocolframework die de verbinding tussen vertrouwde services eenvoudig maakt met behulp van JSON-webtokens (JWT). Een token dient als een soort tijdelijke referentie van een geverifieerde API-client. Met het token verleent de API-server toegang tot services. In deze stap codeer je het JWTprovider.php script dat een token genereert in JWT-formaat: de headers, payload en signature worden gehasht met gebruik van het HS256 hash-algoritme. Stap 1: update je top10-films json database en voeg een poster attribuut bij alle films als volgt:

"titel": "The Shawshank Redemption", "jaar": "1994",

"regiseur": "Frank Daborant",

"poster": "1-the-shawshank-redemption.jpg" },

N D

<?php

ER

Stap 2: De APIserver levert JWT tokens voor geverifieerde clients. Dat zijn clients die correct ingelogd zijn. In deze opdracht gaan we er vanuit dat de clients geverifieerd door een inlog procedure zijn. Codeer het JWTprovider.php script als volgt en sla het op in de nieuwe map APIserver

// de secret key is bekend alleen bij de server global $secretKey;

(Z O

$secretKey='secret key'; function tokenGenerator($apiClient){ // deze function genereert een JWT voor een $apiClient $issuedAt=time(); $expiresAt=$issuedAt+60*60;

181


// codeer header $header= ['alg'=>'HS256','typ'=>'JWT']; // hash de header

TI E)

$header_encoded=base64url_encode(json_encode($header));

// codeer payload $payload= ['apiclient'=>$apiClient, 'issuedAt'=>$issuedAt, 'expiresAt'=>$expiresAt];

AC

// hash de payload

// codeer signature

BE C EL ON D CE -& P TA T AL R

global $secretKey;

ED

$payload_encoded=base64url_encode(json_encode($payload));

$signature=hash_hmac('sha256',"$header_encoded.$payload_encoded", $secretKey,true);

// hash de signature

$signature_encoded=base64url_encode($signature);

// build token

$token="$header_encoded.$payload_encoded.$signature_encoded"; return $token; }

functionbase64url_encode($data) {

// deze function retourneert een hash

ER

// strtr (string translate) verwijdert alle =-tekens in de hash return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');

N D

}

(Z O

Tokens dienen als toegangssleutels voor clients (meestal applicaties of services) om te communiceren met beveiligde bronnen op een API-server. Stap 3: Codeer het APIclient.php script als volgt en sla het op in de nieuwe map APIclient:

<!DOCTYPE html> <html lang="en"> <head>

182


Blok 4 API's

<meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Top10-film posters</title> <link rel="stylesheet" href="films.css" /> </head>

TI E)

<body> <img id="filmstrip" src="img/filmstrip.png" alt="x" /> <h2>Top-10 Film Posters</h2> <!-- Grid -->

AC

<div class="grid">

<?php

BE C EL ON D CE -& P TA T AL R

ED

Stap 4: Ga door met je APIclient.php. Onderaan maak een PHP-blok en genereer een token voor deze client. Vervolgens koppel dit token aan door het op te nemen als onderdeel van de HTTPHEADER "Authorization". Elke aanvraag wordt vervolgens individueel ontvangen en verwerkt op de server. Maak gebruik van Curl om een aanvraag voor de posterservice van de APIserver aan te dienen.

// vraag een token aan voor deze client

include_once'../API-server/JWTProvider.php'; $token=tokenGenerator('top-10-posters');

// vraag de posterservice aan $ch=curl_init();

$url="http://localhost/APIserver/posterservice.php"; curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// vraag authorizatie

ER

// stuur je token via de header

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json' ,

N D

'Authorization: Bearer '.$token));

(Z O

$result=curl_exec($ch);

// check voor errors if($e=curl_error($ch)){ echo $e; die("Connection Failure"); }

183


// haal de posters op $posters=json_decode($result);

// check voor token errors

TI E)

if($posters==NULL){ die("Token niet geldig"); }

AC

// toon de posters

$poster="<span class='cell'><img class = 'poster' src='../API-server/img/$poster->poster' /></span>";

} ?>

BE C EL ON D CE -& P TA T AL R

echo $poster;

ED

foreach($posters as $poster){

</div> <!-- einde grid --> </body> </html>

Stap 5: Codeer de tokenValidator function in JWTprovider.php. Deze function leest het verzonden token om de geldigheid te controleren.

function tokenValidator($token){

// deze function valideert een token $token_parts=explode('.', $token);

// decodeer eerst de token

ER

$header=base64_decode($token_parts[0]); $payload=base64_decode($token_parts[1]);

N D

$signature=base64_decode($token_parts[2]);

(Z O

// chek voor hash algoritme van verzonden token $header_data=json_decode($header); if(!isset($header_data->alg)||$header_data->alg!=='HS256'){

}

184

return false;


Blok 4 API's

// encode verzonden header $header_encoded=base64url_encode($header);

// check voor verlopen token $payload_data=json_decode($payload);

TI E)

if(time() > $payload_data->expiresAt ){ return false; }

AC

// encode verzonden payload

// maak nieuwe signature met verzonden token en secret key

BE C EL ON D CE -& P TA T AL R

global$secretKey;

ED

$payload_encoded=base64url_encode($payload);

$signature=hash_hmac('sha256', "$header_encoded.$payload_encoded", $secretKey, true);

$signature_encoded=base64url_encode($signature);

// build nieuw token met versonden token en signature

$nieuwtoken="$header_encoded.$payload_encoded.$signature_encoded";

// vergelijk de tokens

if($token===$nieuwtoken){ returntrue; }else{ returnfalse; }

ER

}

N D

Stap 6: Codeer het posterservice.php script als volgt. Sla het op in de map APIserver.

<?php

(Z O

// deze service controleert of de verzonden token in de header geldig is $headers=getallheaders(); $token=null;

// check voor authorizatie if (isset($headers['Authorization'])) {

185


$authorizationHeader=$headers['Authorization']; $matches=array(); if (preg_match('/Bearer (.+)/', $authorizationHeader, $matches)) { if (isset($matches[1])) { $token=$matches[1];

TI E)

} }

// verifieër de geldigheid van de token

AC

include_once 'JWTprovider.php';

if(!$isGeldig){ echo 'Token niet geldig';

BE C EL ON D CE -& P TA T AL R

}

// haal de gegevens uit de database $ch=curl_init();

$url="http://localhost:3000/films";

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result=curl_exec($ch); echo $result; }

(Z O

N D

ER

Als alles goed gaat zal je het volgende resultaat zien.

186

ED

$isGeldig=tokenValidator($token);


N D

ER

BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

Blok 4 API's

(Z O

Stap 7: Om te testen verander de volgende regel in de function tokenValidator $nieuwtoken="$header_encoded.$payload_encoded.$signature_encoded";

Verwijder de signatuur als volgt: $nieuwtoken="$header_encoded.$payload_encoded";

Dan zal je de volgende melding krijgen: Token niet geldig

187


Opdracht 18 API Consumentenbond De consumentenbond wil API's ontwikkelen voor de website MijnConsumentenbond waar leden van de bond API-calls kunnen maken naar de Top10-laptops API om de top10 best geteste laptops weer te geven.

Opdracht 19 MPDF installeren

Open je terminal en navigeer naar je projectmap.

2.

Voer de volgende opdracht uit om MPDF via composer te installeren: $ composer require mpdf/mpdf.

3.

Zodra de installatie is voltooid, kun je MPDF gaan gebruiken in je PHP-code.

Opdracht 20 PDF creëren

AC

1.

ED

• • •

TI E)

Het zou handig zijn om de top10-films in PDF-formaat te genereren om het straks te kunnen mailen. De MPDF-bibliotheek is een zeer populaire bibliotheek voor PHP-programmeurs. Om MPDF te installeren met composer, kun je de onderstaande stappen volgen:

<?php

BE C EL ON D CE -& P TA T AL R

Open een nieuw script en sla het op als pdf_genereren.php. Sla dit script op in de map top10-films. Voeg de volgende code eraan toe:

require_once"vendor/autoload.php"; use mpdf\mpdf\mpdf;

// maak output buffer schoon ob_clean();

// start de output buffer ob_start();

$top10lijst = ob_get_clean(); // Buffer opslaan in $top10lijst $mpdf = new \Mpdf\Mpdf();

$mpdf->WriteHTML($getfilms.pdf) ;

ER

$mpdf->Output() ;

Uitleg

N D

MPDF maakt een pdf-bestand uit html-input bijvoorbeeld:

(Z O

$mpdf->WriteHTML("<h1>Hello world.</h1>"); In ons geval willen we de top10 films in het getfilms.php in pdf-formaat genereren. Om dit te doen moeten we gebruikmaken van de output-buff er in PHP. ob_start(); // Start buffer Na het includen van rapport_orders.php slaan we de buff er als volgt in

188


Blok 4 API's

$rapport op: $rapport = ob_get_clean(); // Buffer opslaan in $rapport Als laatste genereren we het pdf-bestand als volgt: $mpdf->WriteHTML($rapport); Het resultaat zie je hieronder:

Installeer de PHPMailer bibliotheek

BE C EL ON D CE -& P TA T AL R

ED

AC

www.sitepoint.com/sending-emails-php-phpmailer. enhttps://github.com/PHPMailer/PHPMailer

TI E)

Een bibliotheek (library) is open source (gratis) software die is gecodeerd en beschikbaar gesteld door andere programmeurs. Er zijn meerdere sites met instructies voor het installeren van deze PHPMailer-library, bijvoorbeeld:

Figuur 4.6

GitHub is een software repository platform waar we software van derden (andere ontwikkelaars) kunnen delen en hergebruiken. Bij GitHub kun je het zip-bestand downloaden en handmatig installeren. Dit doen we in de volgende stappen.

(Z O

N D

ER

composer require phpmailer/phpmailer

Figuur 4.7 Gmail-instellingen Vervolgens moet je de instellingen van je Gmail-account wijzigen. Doe dit in de volgende stappen:

189


1.

Ga naar je Gmail-account en klik op Instellingen.

2.

Open de tab voor Doorsturen en POP/IMP

3.

Controleer dat IMAP ingeschakeld is.

4.

Wijzigingen opslaan

Figuur 4.8

BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

• • • •

php.ini-instellingen Als laatste moet je de instellingen van XAMPP wijzigen. Open php.ini in de map config van je XAMPP-installatie en zoek de volgende regels:

;SMTP = localhost ;smtp_port = 25

ER

Je moet deze twee regels uitschakelen door een puntkomma (;) aan het begin van de regel in te voegen zodat het mailen via je Gmail loopt in plaats van via je local-host.

N D

Opdracht 21 E-mailen

(Z O

Voor het mailen van een bevestiging bij het maken van een nieuw account gebruiken we PHPMailer. PHPMailer is een bibliotheek met statische code van een derde partij. Als je code van derden gebruikt moet je controleren of deze betrouwbaar is. In de volgende opgave laden we de volgende classes handmatig: • PHPMailer • SMTP • Exception Open een nieuw bestand en sla het op als mailen.php in de map top10-films. Voeg de volgende code eraan toe:

190


Blok 4 API's

<?php require_once"vendor/autoload.php"; use PHPMailerPHPMailerPHPMailer; // Deze function stuurt e-mails via Gmail

TI E)

function mailen($ontvangersemail, $ontvangersnaam, $onderwerp, $bericht){

$mail = new PHPMailer();

AC

// Verbinden met Gmail

$mail->SMTPAuth = true; $mail->SMTPSecure = "ssl";

$mail->Port = 465;

BE C EL ON D CE -& P TA T AL R

$mail->Host = "smtp.gmail.com";

ED

$mail->ISSMTP();

// Identificeer jezelf bij Gmail

$mail->Username = "xxxxxxx@gmail.com"; $mail->Password = "xxxxxxxxxxx";

// E-mail opstellen

$mail->isHTML(true);

$mail->SetFrom("xxxxxxxx@gmail.com", "Verzendersnaam"); $mail->Subject = $onderwerp;

$mail->CharSet = "UTF-8";

ER

$body = "<body style="font-family: Verdana, Geneva, sans-serif;

font-size: l4px; color: #000;">" . $bericht . "</body></html>";

N D

$mail->AddAddress($ontvangersemail, $ontvangersnaam) ; $mail->Body = $body;

(Z O

// Stuur mail

if($mail->Send()){ echo"<script>alert('Mail is verstuurd’ );</script=";

}else{

191


echo"<script>alert('Kon geen mail versturen');</script>"; }

Open een nieuw bestand en sla het op als mailsturen.php in de map top10-films. Voeg de volgende code eraan toe:

TI E)

<?php require_once "mailen.php"; $ontvanger="xxxxxxxxx@xs4all.nl";

AC

$ontvangersnaam="xxxxxxxxxxxxx"; $onderwerp="Mailinglijst";

// verstuur e-mail

BE C EL ON D CE -& P TA T AL R

mailen($ontvanger, $ontvangersnaam, $onderwerp, $bericht);

ED

$bericht="Geachte $ontvangersnaam, welkom bij onze top10-films mailinglijst";

4.7 Terugblik

Opdracht 22 Terugblik

Zet een kruisje in de kolom die voor jou van toepassing is. Beoordelingscriteria

Je kunt een JSON-server installeren Je kunt een JSON-database maken

Je kunt API GET-methodes coderen

Je kunt API POST-methodes coderen

Je kunt API DELETE-methodes coderen

ER

Je kunt een PDF creëren

N D

Je kunt een e-mail programma coderen

Opdracht 23 Terugblik

(Z O

Denk na over wat je hebt gedaan in dit blok. a. Noem twee dingen waarover je tevreden bent. 1. 2.

192

Ja

Nee


Blok 4 API's

b. Noem twee dingen die je de volgende keer anders wilt doen. 1. 2. c. Vraag je docent en/of leermeester om feedback.

TI E)

Tops:

AC

Tips:

Opdracht 24 Vraag 1 Wat doet data-gestuurd programmeren? Er zijn meerdere antwoorden goed.

BE C EL ON D CE -& P TA T AL R

Koppelt database gegevens met webpagina's.

ED

4.8 Toets

Maximaliseert statische pagina's.

Maximaliseert dynamische pagina's.

Opdracht 25 Vraag 2

Welke van de volgende HTTP-methoden zijn idempotent? Er zijn meerdere antwoorden goed. GET POST PUT DELETE

Opdracht 26 Vraag 3

Koppel de HTTP return code aan de juiste beschrijving. Code

Beschrijving

300

N D

400

request succesvol

ER

200

request mislukt probleem met server

(Z O

500

redirection

Opdracht 27 Vraag 4

Wat is een callback-function? Function that retourneert een andere function. Function that is input voor een andere function. Function zonder input parameters.

193


Opdracht 28 Vraag 5

Beschrijving

URI

Uniform Resource Identifier

URL

Uniform Resource Locator

HTTP

Hyper Text Transfer Protocol

HTTPS

Hyper Text Transfer Protocol Secure

(Z O

N D

ER

BE C EL ON D CE -& P TA T AL R

ED

AC

Acroniem

TI E)

Koppel het acroniem met de juiste beschrijving.

194


$_POST 95

Intval() 38

A Application Programming Interface 153 Array 39 Array_key_exists() 40 Asynchrone code 161

J JSON-webtoken 158

ED

O Objectgeoriënteerd programmeren 88 Open source software 92 Operatoren 33

D Data-gestuurd programmeren 153 Datatype 36 Debuggen 8 Dependency 92 Deserialisatie 125 Double 37 Doubleval() 38 Dynamische webpagina 153

ER

F Fetch()-methode 163 Frameworks 33 Function 88

(Z O

N D

G Gegevenstypen 33 Gestructureerd programmeren 88 Gettype() 39 Globale variabelen 93 H Heredoc 37 Htmlspecialchars 98 I Idempotent 155 Integer 37

P Persistente data 126 Printf() 38 Print_r() 40 Programmeerparadigma 88 Programmeringscontrolestructuren 48 Promise 160

BE C EL ON D CE -& P TA T AL R

C Callback-function 161 Client-server-model 29 Constante 93 Cookies 94, 129 Curl 157

L Localhost 32 Localstorage 128 Lussen 54

AC

B Besturingsstructuren 33 Bibliotheken 33 Boolean 37

TI E)

INDEX

R REST API 154 Round() 38

S Scope 93 Serialisatie 125 Session 131 Setype() 39 Statische variabelen 93 Statische webpagina 153 Strings 37 Super globals 94 Syntaxis 33 T Troubleshooting 8 U Unset() 40 V Variabelen 33, 34 Var_dump() 40

195


W Web-applicaties 30

(Z O

N D

ER

BE C EL ON D CE -& P TA T AL R

ED

AC

TI E)

X XAMPP framework 7

196


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.