Enigma - PHP en MySQL - MLI

Enigma - PHP en MySQL - MLI

A Inleiding

Vooraf

In de module "Interactieve websites met PHP en MySQL" leer je werken met scripts. Scripts heb je nodig om webpagina’s interactief te maken. Met alleen HTML kunnen geen dynamische webpagina’s worden ontworpen. Scripts kunnen in diverse talen geschreven worden. Voorbeelden van scriptingtalen zijn PHP en JavaScript. In deze module behandelen we de scriptingtaal PHP.

De module over PHP is een vervolg op de module HTML5, CSS3 en JavaScript. Je moet de module over HTML eerst doorgewerkt hebben voordat je kunt beginnen aan de module PHP en MySQL.

Leerdoelen

Na verwerking van deze module:

  • kun je uitleggen wat een scriptingtaal is;
  • kun je het verschil uitleggen tussen een client-side en een server-side scriptingtaal;
  • kun je de basis van PHP toepassen;
  • kun je uitleggen wat de functie is van echo;
  • weet je hoe je PHP-code van commentaar kan voorzien;
  • weet je hoe variabelen worden gebruikt in PHP;
  • kun je werken met functies en arrays;
  • kun je diverse soorten formulieren gebruiken;
  • weet je het verschil tussen get en post;
  • kun je gegevens uit een database op het scherm tonen;
  • kun je een database opzetten en bijhouden met phpMyAdmin;
  • kun je gegevens via scripts met PHP en MySQL in tabellen invoeren, updaten en verwijderen;
  • kun je een bestaande database importeren met phpMyAdmin;
  • weet je wat sessies zijn en waarvoor sessies worden gebruikt;
  • kun je een formulier maken waarmee kan worden ingelogd;
  • kun je eenvoudige webapplicaties maken.

Bijlagen

Wij zullen gebruik maken van USBwebserver
USBwebserver kan je downloaden van gedeelde documenten op Magister

Je kan ook gebruik maken van XAMPP. XAMPP heeft extra functionaliteiten, is iets meer up-to-date.
In principe heb je deze functionaliteiten niet nodig, je kan in een later stadium altijd nog overstappen.
Download hier de installatie en werking van XAMMP.

Zo werkt het

Je bent begonnen in de module PHP en MySQL. Deze module bestaat uit meerdere onderdelen. In ieder onderdeel vind je, verdeeld over verschillende pagina's, informatie in de vorm van teksten, afbeeldingen en video's.

Daarnaast ga je zelf aan de slag. Onder het kopje "Aan de slag" vind je steeds toepassingsopdrachten. Deze opdrachten maak je alleen of met een klasgenoot.

Er zijn ook toetsen. Deze herken je aan de blauwe knop met daarop "Adaptieve Toets".
Een toets bestaat uit meerdere vragen. Dat kunnen gesloten vragen zijn, die door de computer worden nagekeken, of open vragen, die moet je zelf nakijken.
Bij een enkele vraag moet je een bestand uploaden.
Van de toetsen wordt, als je ingelogd bent, de voortgang bijgehouden.
Het resultaat vind je onder de knop "Voortgang". Deze voortgang is ook door je docent te bekijken.

Succes met de module PHP en MySQL.

B Scripts

Javascript versus PHP

PHP is net als JavaScript een scriptingtaal. Scripts maken een webpagina interactief. De manier waarop scripts worden uitgevoerd verschilt. Of in de browser van je computer of op een server.

Voor het schrijven van scripts die worden uitgevoerd in een browser gebruik je een client-side scriptingtaal, bijvoorbeeld JavaScript. Scripts die worden uitgevoerd op een server worden geschreven in server-side scriptingtalen, bijvoorbeeld PHP.

Wanneer een HTML-pagina wordt opgevraagd, zal de server waar de webpagina gehost wordt de gevraagde pagina direct doorsturen naar de client. Dit is de computer die gebruikt wordt om de webpagina te bekijken.

Stel dat in deze HTML-pagina een JavaScript-code is opgenomen, dan vindt de verwerking van het script in de browser van de client plaats en dus niet op de server waar de website wordt gehost. Het script wordt op je eigen computer uitgevoerd.

In een HTML-pagina waar PHP in verwerkt is, zal de server de opgevraagde pagina eerst moeten parsen. Het programma dat daarvoor gebruikt wordt, heet de parser. De parser converteert de ingevoerde code naar begrijpelijke structuur voor het programma. Pas als het script geparst is, stuurt de server de opgevraagde pagina naar de client toe.


Het verschil in hoe een client-side script en een server-side script wordt verwerkt, wordt duidelijk als de broncode van een opgevraagde pagina wordt bekeken.

In een HTML-document waarin JavaScript is verwerkt, krijg je na het opvragen van de broncode van het document het volledige script te zien.
In een HTML-document waarin PHP is opgenomen, zie je in de broncode slechts de uitvoer van het script en dus niet het volledige script zelf. Dat is ook logisch als je bedenkt dat de verwerking van het script op serverniveau plaatsvindt.

Als je goed hebt opgelet, heb je gezien dat de PHP pagina's die door de server worden opgebouwd een extensie .php hebben. Let op dat al jou pagina's waarin je PHP gebruik deze extensie hebben.

Wanneer je de .html extensie gebruik zal PHP code niet worden uitgevoerd en letterlijk als tekst worden teruggegeven aan de client.

Een html bestand kan je ook lokaal gewoon openen. Een PHP bestand moet altijd uitgevoerd worden via een programma om te kunnen bekijken.

PHP-editors

Voor het verwerken van PHP-scripts hebben we een server nodig. Wij maken hiervoor gebruik van USBwebserver.

Alle bestanden die je wilt uitvoeren kom in de 'root'  folder te staan van je USBwebserver.

Stap 1

Start USBwebserver op

Stap 2

Ga naar http://localhost
USBwebserver zal nu kijken of een bestand index.php in de root folder staat. Indien dit bestand aanwezig is zal dit worden uitgevoerd.
Wanneer dit bestand niet bestaat krijg je een lijst te zien van alle bestanden die in de root folder staan. Dit is vaak prettig want dan kan je er eentje aan klikken die jij graag wilt uitvoeren. Dus tip verwijder index.php (indien aanwezig)

Voor het schrijven van je PHP-code kan je gebruik maken van diverse editors. Bijvoorbeeld:

- Kladblok / Notepad

- Notepad++

- VSCode

- PHPStorm

Het gebruik van een bepaalde editor is een kwestie van smaak. VSCode en PHPStorm maken het leven wel een heel stuk makkelijker. Let op als je voor PHPStorm kiest moet je, je met je school emailadres registeren. Voor studenten is het namelijk een gratis programma.

C PHP - basiskennis

Een voorbeeld

Na de eerste kennismaking met PHP wordt het tijd om wat uitgebreider naar een voorbeeld van een PHP-script te kijken. In Notepad++ hebben we de code van een PHP-bestand geopend:

<!DOCTYPE html>
<html lang="nl">
     <head>
           <title>Een eenvoudig voorbeeld van een PHP-script</title>
           <meta charset="utf-8">
     </head>
     <body>
           <?php
                echo "Hallo Wereld";
           ?>

     </body>
</html>

 

 

De PHP-code begint met de tag <?php en eindigt met de tag ?>.

Zet bovenstaande code in een bestand met de naam 'hallo.php' en sla dit bestand op in de root folder van je USBwebserver. Probeer het bestand daarna te openen in je browser met de url http://localhost/hallo.php

 

 

Het php commando 'echo'  zal er voorzorgen dat tekst naar het scherm wordt geschreven. Hiervoor kan ook de functie print() gebruikt worden, maar is minder gebruikelijk.

<?php

echo "Hallo Wereld";

?>

Er zijn een paar dingen waar je op moet letten. Hetgeen je op het scherm wilt schrijven staat tussen quotes als het een tekst betreft. In PHP wordt elk commando afgesloten met een punt-komma

Een voorbeeld - 2

Een bestand dat PHP-code bevat, moet altijd worden opgeslagen onder de extensie .php. Doe je dat niet, dan kan de server de PHP-code in het document niet parsen. De meer betere editors zullen bestanden met een extensie .php voorzien van kleurtjes zodat de code beter leesbaar wordt en fouten sneller kunnen worden opgespoort.

Een voorbeeld - 3

Een opdracht in PHP wordt ook wel een statement genoemd. Statements worden telkens afgesloten met een puntkomma. In ons eerste voorbeeld wordt het statement echo gebruikt. Door deze opdracht wordt de tekst “Hallo Wereld” aan onze webpagina toegevoegd. Zoals je hebt kunnen merken, wordt alleen de tekst tussen de aanhalingstekens op het scherm getoond. De aanhalingstekens zelf krijg je niet te zien.
Het is toegestaan om binnen deze aanhalingstekens ook HTML-tags te gebruiken. Zo is het mogelijk om met de tag <br> binnen het echo-statement een harde return af te dwingen. In sommige HTML-tags moet je gebruik maken van dubbele aanhalingstekens. Binnen een echo-statement veroorzaken deze extra aanhalingstekens problemen.

Het PHP-script wordt wel uitgevoerd als er voor deze extra aanhalingstekens een backslash wordt geplaatst. We noemen dat escapen. Als we in de zin “Het Griekse woord Enigma betekent raadsel.” het woordje Enigma de kleur blauw geven, ontkomen we er niet aan om in de HTML-tag die we daarvoor gebruiken te escapen. Dat is terug te zien in de onderstaande code:

<?php
   echo "Het Griekse woord <span style=\"color:blue;\"> Enigma </span> betekent raadsel.";
?>

Een andere oplossing is het gebruik van enkele quotes in de string. Zie voorbeeld hieronder.

<?php
   echo "Het Griekse woord <span style='color:blue;'> Enigma </span> betekent raadsel.";
?>

★ Aan de slag 7

 

Emmet

Om snel met een HTML tekst te beginnen (met header en body, etc) kan je gebruik maken van de plugin 'emmet' Deze plugin kan je bijna bij alle editors toevoegen.

De volgende start HTML code kan je dan voor elkaar krijgen door ! <tab>

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
 
</body>
</html>

Voor andere short-cuts om code te genereren kan je even kijken in de cheatsheet https://docs.emmet.io/cheat-sheet/

Zorg ervoor dat je in jou editor ook gebruik van Emmet kan maken, door een plugin te installeren.

 

Commentaar

PHP-code kun je op meerdere manieren van commentaar voorzien:

  1. // één regel commentaar voorafgegaan door een dubbele slash.
  2. # één regel commentaar voorafgegaan door een hekje.
  3. /* meerregelig commentaar wordt omsloten door slash-asterisk
    ……….
    */ asterisk-slash

Door het toevoegen van commentaar vergroot je het inzicht in de werking van de geschreven PHP-code. Dat kan handig zijn voor jezelf als je later nog eens terugkijkt naar wat je gedaan hebt. Maar het is ook handig als je met meerdere mensen aan dezelfde documenten werkt.

 

 

D Variabelen in PHP

Kenmerken

In de meeste programmeertalen moeten we voordat we gebruik kunnen maken van variabelen eerst vertellen dat er variabelen bestaan en aangeven van welk type deze variabelen zijn. We noemen dat het declareren van variabelen. In PHP hoef je variabelen niet te declareren. Je kunt ze gewoon meteen gebruiken. Dit in tegenstelling tot bijvoorbeeld Java. De code voor een integer met de naam getal waar de waarde 10 aan wordt toegekend, wordt in Java int getal = 10;. In PHP hoef je het type van de variabele niet aan te geven en wordt het $getal = 10;.

In PHP beginnen variabelen altijd met het dollarteken ($). Het dollarteken moet worden gevolgd door een letter of een underscore. De rest van de naam van een variabele kan bestaan uit letters, cijfers en underscores.

Voorbeelden van PHP-variabelen kunnen zijn:

  • $i
  • $land_id
  • $hoofdstad
  • $inwoners
  • $query

PHP-variabelen zijn hoofdlettergevoelig. $land_ID is een andere variabele dan $land_id. In PHP worden aan variabelen waarden toegekend. Het toekennen van een startwaarde aan een variabele noemen we initialiseren. Voor het toekennen van een waarde wordt het is-teken (=) gebruikt. De toekenning wordt afgesloten, net zoals alle statements, met een puntkomma (;).

Voorbeelden van toekenningen aan variabelen kunnen zijn:

  • $i = 0;
  • $land_id = 3;
  • $hoofdstad = "Athene";
  • $inwoners = 10700000;
  • $query = "SELECT * FROM landen";

Zoals je ziet, is het niet nodig om aan te geven van welke type een variabele is. Uit de naam van de variabele is niet op te maken of we te maken hebben met een string ($hoofdstad) of met een integer ($inwoners). PHP zoekt zelf uit om wat voor soort variabele het in het script gaat.

Met het echo-statement kunnen de diverse waarden van variabelen op het scherm worden getoond. De opdracht echo "De hoofdstad van Griekenland is $hoofdstad."; levert als resultaat op: De hoofdstad van Griekenland is Athene. Uiteraard moet er dan wel een variabele met de naam $hoofdstad bestaan waaraan de waarde Athene is toegekend.

 

Uitleg over variabele in PHP door Jeffrey Way

https://laracasts.com/series/php-for-beginners-2023-edition/episodes/4

★ Aan de slag 11

Maak een bestand "hoofdstad.php" en plaats deze in je root folder.

Bovenaan in je bestand begin je met <?php omdat we in dit bestand geen HTML gaan gebruiken en alleen PHP code hoeft het bestand niet afgesloten te worden met ?> (mag wel)

Maak een variabele aan $hoofdstad met de waarde "Amsterdam"

In de regel daaronder doe je een echo van de variabele.

 

Na het uitvoeren van http://localhost/hoofdstad.php zou je op je scherm Amsterdam moeten zien staan.

Tip. Denk aan het afsluiten van elke regel met een ;

 

   

Concatenatie

In het echo-statement zien we tussen de functie en de tag een punt staan. Deze punt dient ervoor om gegevens aan elkaar te plakken. We noemen dat concatenatie. We kunnen verschillende strings aan elkaar plakken, maar ook variabelen en spaties zoals in onderstaand script is te zien.

   <?php
             $dag =1 ;
             $maand = "januari";
             $gebeurtenis = "nieuwjaarsdag";
             echo $dag . " " . $maand . "is" . $gebeurtenis;
   ?>

Het resultaat van dit stukje code is dat de zin “1 januari is nieuwsjaardag” naar het scherm wordt geschreven:


De dubbele aanhalingstekens worden niet weergegeven. Met het commando echo wordt alles wat tussen de dubbele aanhalingstekens staat als letterlijke tekst naar het scherm weggeschreven. De namen van de variabelen staan niet tussen dubbele aanhalingstekens. Doen we dat wel dan worden alsnog de waarden van de verschillende variabelen getoond. Willen we dat de variabelen als letterlijke tekst wordt afgebeeld, dan plaatsen we de namen van de variabelen tussen enkele aanhalingstekens.

De bijbehorende code en het resultaat worden dan:

   <?php
             $dag =1 ;
             $maand = "januari";
             $gebeurtenis = "nieuwjaarsdag";
             echo '$dag' . " " . '$maand' . "is" . '$gebeurtenis;'
   ?>


Concatenatie - 2

Binnen het echo-statement kunnen we te maken krijgen met het zogenaamd escapen. Bij het escapen van tekens wordt er een backslash (\) geplaatst voor een teken. Daardoor krijgt dit teken een bijzondere betekenis. Voorbeelden hiervan zijn:

  \n - nieuwe regel
  \$ het dollarteken
  \" het dubbele aanhalingsteken


In de zin “Het twee minuten durende reclamefilmpje voor “Chanel 5” heeft ongeveer $61.000.000 gekost” is escapen onontkoombaar wanneer je deze zin door middel van het echo-statement op het scherm wilt laten verschijnen. Het echo-statement wordt:

echo "Het twee minuten durende reclamefilmpje voor \"Chanel\" heeft ongeveer \$61.000.000 gekost.";

Het resultaat na verwerking van het script:


Zou je in deze zin de backslashes in de echo weglaten, dan zal bij het uitvoeren van het script een foutmelding getoond worden. Door het gebruik van dubbele aanhalingstekens bij het woordje Chanel 5 geef je eigenlijk aan dat het echo-statement eindigt voor het woordje Chanel 5. De rest van de zin valt buiten de echo waardoor de PHP-code niet geparst kan worden. Dit voorkom je door gebruik te maken van backslashes.

Datatypen

PHP ondersteunt verschillende typen variabelen. De belangrijkste datatypen waarmee je bij PHP te maken kunt krijgen zijn :

  1. integers of gehele getallen;
  2. doubles of komma getallen (doubles worden ook wel floating point numbers genoemd);
  3. booleans (true/false of waar/onwaar);
  4. strings (letters en andere tekens eventueel gecombineerd met cijfers);
  5. arrays (rijen of reeksen);
  6. objecten.

In PHP bestaan functies waarmee gecontroleerd kan worden welk datatype een variabele heeft. We hebben immers gezien dat bij het schrijven van de code voor een variabele niet hoeft te worden aangegeven van welk type een variabele is. Hoe weten we dan of de variabele $getal van het type int is? Daarvoor beschikt PHP over de functie is_int().

In het volgende script wordt gebruik gemaakt van verschillende functies waarmee het type van een variabele kan worden achterhaald:


 

<!DOCTYPE html>
<html lang="nl">
      <head>
             <title>datatypen</title>
             <meta charset="utf-8">
             <?php
                        $getal = 12;
              ?>
      </head>
      <body>
             <?php
                        echo is_int($getal) . "<br>";
                        echo is_numeric($getal) . "<br>";
                        echo is_bool($getal) . "<br>";
             ?>
      </body>
</html>


De uitkomst zal true zijn als het klopt en false als het niet het geval is. Bij true verschijnt op het scherm de waarde 1.
Bij false zou je een 0 verwachten, maar dat is niet het geval. False krijgt de waarde NULL en dat is letterlijk niets.

Operatoren

In PHP wordt voor het uitvoeren van bewerkingen op variabelen en hun waarden gebruik gemaakt van operatoren. PHP kent verschillende soorten operatoren. We bespreken er een aantal.

Voor het uitvoeren van de berekeningen worden rekenkundige operatoren gebruikt.

Operatie Rekenkundige bewerkingen
  x + y   x wordt bij y opgeteld als beide getallen numeriek zijn
  x - y   y wordt van x afgetrokken
  x * y   x wordt vermeningvuldigd met y
  x / y   x wordt gedeeld door y
  x % y   modules van x en y (het getal dat overblijft als je x door y deelt)
x^y of pow(x,y)   x tot de macht y

 

Vergelijkingsoperatoren vergelijken de waarden van twee variabelen en geven een boolean waarde waar (true) of onwaar (false) terug.

Vergelijking Waar als
  x == y   Als x en y qua waarden gelijk aan elkaar zijn
  x != y   als x en y ongelijk aan elkaar zijn
  x === y   x identiek is aan y, zowel qua datatype als waarde
  x > y   x groter is dan y
  x < y   x kleiner is dan y
  x >= y   x groter is dan of gelijk aan y
  x <= y   x kleiner is dan of gelijk aan y

 

Logische operatoren

Operatie Waar als
  x && y (x AND y)   x en y beiden waar zijn
  x || y  (x OR y)   of x of y waar is
  !x   x onwaar is

E Controlestructuren

Inleiding

De scripts die we tot nu toe gezien hebben, zijn scripts waarin PHP de statements van boven naar beneden uitvoert.
De volgorde waarin de opdrachten worden afgehandeld, wordt ook wel de flow van het programma genoemd. Soms willen we invloed uitoefenen op het verloop, dus op de flow, van het programma. Daarvoor bestaan net zoals in andere programmeertalen in PHP controlestructuren.

if...else-statement

 

In het volgende script wordt gecontroleerd of getal_1 deelbaar is door getal_2 (getal_1 % getal_2 == 0). Zo ja dan verschijnt de melding “$getal_1 is deelbaar door $getal_2” op het scherm. Indien het niet het geval is, lezen we “$getal_1 is niet deelbaar door $getal_2”. (indien de operator % wordt gebruikt is het resultaat de rest van de deling van de twee geallen, bv 5%3=2)

Let op dat je in je if == gebruikt en niet =, de betekenis is namelijk heel anders.

<?php
         $getal_1 = 1248;
         $getal_2 = 13;
         $uitkomst = $getal_1 % $getal_2;
         if ($uitkomst ==0)

        {
               echo "$getal_1 is deelbaar door $getal_2";
         }
         else

       {
               echo "$getal_1 is niet deelbaar door $getal_2";
         }
   ?>


Ons voorbeeld waarin twee getallen met elkaar worden vergeleken, bevat een enkelvoudig if-statement met een else component. Na de expressie (voorwaarde) volgt ofwel een enkelvoudig statement of een opeenvolging van statements tussen accolades. Elk statement wordt afgesloten met een puntkomma.

Er mag geen puntkomma achter het sluithaakje van de voorwaarde en ook niet na else worden geplaatst. De regels die hier gelden, zijn ook van toepassing op het for-, het while- en het switch-statement.

Het gebruik van else is niet verplicht. Er kan ook alleen een if-statement worden gebruikt. Wordt er niet voldaan aan de voorwaarde die wordt gesteld binnen de haakjes, dan gaat PHP verder met het uitvoeren van de eerstvolgende regel na het if-statement.

Video uitleg door Jeffrey Way
https://laracasts.com/series/php-for-beginners-2023-edition/episodes/5

for-statement

Een for-statement is altijd opgebouwd uit drie onderdelen. Het eerste onderdeel van het for-statement bestaat uit de initialisatie van een variabele, het tweede onderdeel bestaat uit een voorwaarde en tot slot volgt een stapopdracht. De drie onderdelen worden door puntkomma’s van elkaar gescheiden.

Ter illustratie nemen we een programma dat van 20 terugtelt naar 1 en de resultaten daarvan op het scherm laat zien. De code en de uitvoer van het programma zijn:

   <?php
         for($i=20;$i>=1;$i--)
         echo "$i<br>";
   ?>


Het resultaat is:

In het for-statement geven we met de eerste opdracht aan dat er een variabele $i bestaat. We kennen aan deze variabele de waarde 20 toe. Vervolgens luidt de voorwaarde “zolang $i groter is dan of gelijk is aan 1”.
Daarna volgt de stapopdracht. In deze stapopdracht wordt $i telkens met 1 verlaagd. Hier had ook kunnen staan $i = $i – 1;. De notatie $i-- betekent dus hetzelfde als $i = $i – 1.
Zolang aan de voorwaarde van het for-statement wordt voldaan, wordt de nieuwe waarde van $i telkens op een nieuwe regel onder de oude waarde van $i op het scherm getoond. Dat gebeurt net zolang totdat er niet meer aan de voorwaarde van het for-statement wordt voldaan. We hebben hier te maken met een herhalingslus. Als telkens dezelfde code continue achter elkaar wordt uitgevoerd, spreken we ook wel van een loop.

★ Aan de slag 15

Schrijf een script dat de getallen 1 tot en met 20 bij elkaar optelt en de som van deze getallen op het scherm laat zien.
Gebruik in je code het for-statement.
Sla je opdracht op als optellen.php.
 

Tip handig is om hiervoor een extra variabele te gebruiken waar je steeds een getal aan toevoegd. En als je for loop klaar is het de variabele op het scherm te schrijven.

   

while-statement

We kunnen het programma dat van 20 terugtelt naar 1 en de resultaten daarna op het scherm toont, zo herschrijven dat er in plaats van een for-loop een while-statement wordt gebruikt. Het resultaat van het programma blijft hetzelfde. De code wordt:

   <?php
         $i = 21;
         while($i>1) {
               $i--;
               echo "$i<br>";
         }
    ?>

★ Aan de slag 16

De faculteit van een getal is het product van alle voorgaande gehele getallen vanaf 1.
Voor de notatie zetten we een ! achter het getal bv 6! betekend 6 faculteit

Bijvoorbeeld  6! = 6x5x4x3x2x1 = 720.

 

Maak een bestand faculteit.php

Vul onderstaande code aan zodat de faculteiten vanaf 1 tot 10 ($stop) op het scherm worden geschreven. Bij voorkeur elke uitkomst op een nieuwe regel.

1! = 1
2! = 2
3! = 6
...

<?php
<?php
 
$stop=10; //tot hier moet de loop doorgaan
$vorige_faculteit=1; //faculteit van voorgaande echo
$i=1; //moet elke stap 1 opgehoogd worden
 
while($i < $stop){
//hier komt jou code
 
}
?>
 
   

switch-statement

Als er een keuze gemaakt kan worden uit meerdere opties is het handig om een switch te gebruiken. Stel je wilt uit een reeks getallen je geluksgetal aangeven, dan kun je dat o.a. door een switch doen.
De code voor die switch ziet er dan bijvoorbeeld als volgt uit:

<?php
$geluksgetal = 7;
switch($geluksgetal) {
  case 3:
    echo "Mijn geluksgetal is $geluksgetal";
    break;
  case 9:
    echo "Mijn geluksgetal is $geluksgetal";
    break;
  case 7:
    echo "Mijn geluksgetal is $geluksgetal";
    break;
  case 13:
    echo "Mijn geluksgetal is $geluksgetal";
    break;
  default:
    echo "Ik geloof niet in geluksgetallen";
}
?>

De switch-syntax werkt als volgt:

 switch(input) {
      case waarde 1:
      code die moet worden uitgevoerd als input = waarde 1;
      break;
      case waarde 2:
      code die moet worden uitgevoerd als input = waarde 2;
      break;
      case etc.
      default:
      code die moet worden uitgevoerd als input ≠ alle cases;
   }

De input is meestal een variabele. Als aan een bepaalde voorwaarde is voldaan, wordt de code die daarachter staat uitgevoerd en de switch via de break verlaten. Als aan geen van de gestelde voorwaarden wordt voldaan, wordt de code uitgevoerd die achter default staat.

F Functies

Wat is een functie?

In PHP-scripts tref je vaak verschillende taken aan die moeten worden afgehandeld. Sommige taken moeten zelfs meer dan één keer worden uitgevoerd. In die gevallen is het handig om voor de uit te voeren taak een functie te schrijven. In de functie leg je één keer vast wat er moet gebeuren. Door de functie aan te roepen, wordt het uitvoeren van de beschreven taak geregeld. Stel je maakt een website en je wilt op elke pagina een copyright afgebeeld hebben. Daarvoor zou je een aparte functie kunnen schrijven.
Een functie in PHP bestaat in het algemeen uit 3 verschillende onderdelen:

  • De functienaam voorafgegaan door het woord function en een spatie.
  • Haakjes () achter de functienaam waarbinnen door een komma gescheiden argumenten kunnen voorkomen.
  • De functie body omsloten door accolades { } .

Het format van een functie ziet er dan als volgt uit:

function functienaam($arg1, $arg2 , …, $arg)
{
    // code sectie
}

Voor het afbeelden van het copyright hebben we de onderstaande functie geschreven:

 

function show_copyright()
    echo "Copyright &copy; 2008 ENIGMA. Alle rechten voorbehouden.";
}



De naam van de functie is show_copyright. De functie heeft geen argumenten.


Als je in een PHP-script deze functie aanroept, wordt de copyright regel afgebeeld op de plek waar de functie wordt aangeroepen. Het enige wat je moet onderhouden is het jaartal in de functie. Het aanroepen van de functie kan door de opdracht show_copyright(); in het PHP-script te plaatsen. Stel dat je in de show_copyright-functie ook het huidige kalenderjaar wilt opnemen en dat je geen zin hebt om dit elk jaar weer aan te passen. Het is dan mogelijk om gebruik te maken van een ingebouwde PHP-functie die dat voor jou doet. Daarvoor gebruiken we de functie date(). De code luidt dan:

 

<?php
function show_copyright()
{
    echo "Copyright &copy; 2008 - " . date("Y") . " ENIGMA. Alle rechten voorbehouden.";
}
show_copyright();
?>



Als functies binnen functies gebruikt worden, spreken we van het nesten van functies. De copyrightregel wordt nu als volgt op het scherm weergegeven:


Door het aanroepen van de functie show_copyright() kun je op elke webpagina waar je het copyright wilt laten zien, dat verwezenlijken.

PHP heeft een grote hoeveelheid standaardfuncties die je uitgebreid gedocumenteerd kunt raadplegen in de functielijst op www.php.net. Maar naast die standaardfuncties biedt PHP je ook de mogelijkheid zelf functies te maken. Dit kan dus handig zijn als je op webpagina’s regelmatig dezelfde taken wilt laten uitvoeren.

 

Het kan zijn dat je als webmaster van verschillende websites eenzelfde copyright wilt gebruiken. Alle websites hebben verschillende namen. Nu kun je een variabele $site_naam introduceren. Met behulp van deze variabele kun je nu elke website voorzien van een unieke copyright regel. Je geeft nu de functie show_copyright() het argument $site_naam mee. Stel deze webmaster past de functie show_copyright op deze manier aan en wil website www.enigma-online.nl in de regel van het coypright laten zien. De functie zou er dan alsvolgt uit kunnen zien

<?php
function show_copyright($site_naam)
{
    echo "Copyright &copy; 2008 - " . date("Y") . " ".$site_naam." Alle rechten voorbehouden.";
}
show_copyright();
?>
Tussen de haakjes van de functie mag je zelf een variabele bedenken. Deze variabele bestaat alleen binnen de functie.
De aanroep van de functie: show_copyright("Enigma");
Met als resultaat:
Copyright © 2008 - 2021 Enigma Alle rechten voorbehouden.
   

★ Aan de slag 18

 

Maak een bestand vlag.php

Schrijf een script waarin je gebruik maakt van een zelf te schrijven functie toon_vlag() waarmee een plaatje van de Nederlandse vlag kan worden afgebeeld. In de PHP-editor gebruiken we voor het plaatje van de vlag een URL. Verwerk daarom de onderstaande URL in je eigen functie.

https://www.sic-info.org/wp-content/uploads/2014/01/nl.png
https://www.countryflags.io/NL/shiny/64.png

Tips:

Als je niet meer weet hoe de html <img> tag werkt kijk dan even bij W3schools.
Je hoeft de afbeelding niet eerst te downloaden. Je kan de url die hierboven staat als src gebruiken.

 

Uitbreiding

Je kan ook aan je functie toon_vlag()een parameter toevoegen.

bv
toon_vlag("nl");
toon_vlag("gb");

Pas je functie aan zodat dit ook gaat werken.

 

Tip: Kijk naar de URL van de vlag en ga hier wat aanpassen

Terugkeerwaarde

Soms is het handig om functies te schrijven die een waarde als output opleveren. Dit wordt mogelijk gemaakt door bij het aanroepen van de functie aan een variabele een waarde toe te kennen. Het maakt daarbij niet uit welk datatype die variabele heeft.

Het volgende voorbeeld zal een en ander verduidelijken. Stel we hebben een bedrijf en we moeten de verkoopprijs van producten gaan bepalen. Daar hoort in veel gevallen het tarief van 21% BTW bij. Het zou handig zijn als we in een functie in een keer het eindbedrag voor de klant zouden kunnen bepalen. We noemen deze functie bereken_eindprijs().

Hoe gaan we te werk?

  • Er moet een variabele $prijs en een variabele $btw zijn.
  • Er moet een functie bereken_eindprijs() geschreven worden waarin de parameters $b en $p worden opgenomen.
  • Binnen de functie moet de verkoopprijs worden berekend en teruggegeven met return().
  • De functie moet binnen het script worden aangeroepen.
  • In een boodschap moet de variabele $verkoopprijs worden meegedeeld.

Het script wordt dan:

<?php
$prijs = 24.95;
$btw = .21; //Je hoeft niet 0.21 te typen.
function bereken_eindprijs($p, $b)
{
    return $p + ($p*$b);
}
// Let op hoe de functie bereken_eindprijs() de waarde terug geeft.
$eindprijs = bereken_eindprijs($prijs, $btw);
 
// Rond het bedrag af op twee decimalen.
$eindprijs = number_format($eindprijs, 2);
echo "Verkoopprijs zonder btw = &euro; $prijs<br>\n";
$tarief = 100 * $btw;
echo "BTW-tarief = $tarief<br>\n";
echo "De eindprijs = &euro; $eindprijs";
?>

Met als resultaat:

Het is ook mogelijk om functies met returnwaarden rechtstreeks in controlestructuren te gebruiken.
Stel we willen online gaan shoppen bij een webwinkel. Deze webwinkel hanteert voor klanten een kredietlimiet. Telkens als een klant iets in zijn winkelwagentje stopt, wordt het bedrag dat hij moet betalen bij de andere gekochte producten opgeteld en wordt dat totaalbedrag vergeleken met de kredietlimiet van de klant. Als de toegestane limiet wordt overschreden, krijgt de klant een melding dat de limiet is overschreden en met welk bedrag. Indien de limiet nog niet is overschreden, krijgt de klant een melding voor welk bedrag er nog aankopen kunnen worden gedaan. De code daarvoor wordt:

<?php
$aankoopbedrag = 234.50;
$kredietlimiet = 500.00;
function check_kredietlimiet($aankoopbedrag, $kredietlimiet)
{
    if($aankoopbedrag > $kredietlimiet) {
        return false;
    } else {
        return true;
    }
}
if (check_kredietlimiet($aankoopbedrag, $kredietlimiet)) {
    $bestedingsbedrag = number_format(($kredietlimiet - $aankoopbedrag),2);
 
    echo "Winkel gerust nog nog even door! <br>";
    echo "U bent nog &euro; " . $bestedingsbedrag . " verwijderd van uw kredietlimiet.";
} else {
    $overschrijding = number_format(($aankoopbedrag - $kredietlimiet),2);
    echo "Uw aankoopbedrag overstijgt de kredietlimiet met &euro; ". $overschrijding ."!";
}
?>

Hoe werkt de functie check_kredietlimiet()?
De functie heeft 2 parameters: $aankoopbedrag en $kredietlimiet. Als het aankoopbedrag groter is dan de kredietlimiet geeft de functie de returnwaarde of terugkeerwaarde 0 (false). Zo niet dan is de returnwaarde 1(true). Als de functie bij de check een 0 geeft, betekent dat dat de vergelijking $aankoopbedrag > $kredietlimiet niet klopt en dus het aankoopbedrag de kredietlimiet niet overstijgt, waardoor dus een 1 als returnwaarde moet worden weergegeven.

De functie include()

Als je meerdere functies gebruikt die vaker terugkomen, is het handig een zogenaamde functiebibliotheek aan te leggen. Je kunt alle gebruikte functies in één PHP-bestand zetten en dat bijvoorbeeld opslaan als functions.php. Het enige wat je dan nog te doen hebt, is dat bestand inladen in een PHP pagina door middel van de PHP-functie include().
De code om de eindprijs te berekenen zou er dan als volgt kunnen uitzien:

 

<?php
include("functions.php");
 
$prijs = 24.95;
$btw = .21;
 
$eindprijs = bereken_eindprijs($prijs,$btw);
$eindprijs = number_format($eindprijs,2);
 
echo "Verkoopprijs zonder BTW = &euro; $prijs<br>\n";
$tarief = 100 * $btw;
echo "BTW-tarief = $tarief<br>\n";
echo "De eindprijs = &euro; $eindprijs";
?>

 

 

In het bestand functions.php staat dan de definitie van de functie bereken_eindprijs
Dus:

 

<?php
function bereken_eindprijs($p, $b)
{
    return $p + ($p*$b);
}
?>

G Arrays

Wat zijn arrays?

In bijna alle programmeer- en scriptingtalen is het mogelijk om met arrays te werken. Zo ook in PHP. In dit onderdeel gaan we kijken naar wat arrays zijn en hoe je ze kunt gebruiken.

Tot nu toe hebben we gewerkt met variabelen die op zichzelf staan. Voorbeelden daarvan zijn de variabelen $prijs en $btw die gebruikt worden in het eerder besproken script waarmee we de eindprijs van een product berekenen. Vaak staan gegevens echter niet los van elkaar, maar vormen ze een reeks. Voorbeelden zijn een literatuurlijst voor het vak Engels, een adreslijst van je klasgenoten of een overzicht van landen die behoren tot de Europese Unie.

Reeksen kunnen we vastleggen met behulp van een array. Je zou een array kunnen vergelijken met een variabele die meerdere waardes (boeken, adressen of landen) kan bevatten.
De verschillende items van een array worden elementen genoemd. Voor het verwijzen naar een element wordt gebruik gemaakt van de indexwaarde die hoort bij dat element. Aan de hand van de index kun je de positie van het element in de array bepalen. Je kunt de individuele waarden uit een array benaderen door gebruik te maken van dat indexgetal.

Bekijk maar eens het onderstaande stukje PHP-code:
 

<?php
$landenBenelux = ["Nederland", "België", "Luxemburg"];
echo $landenBenelux[0];
?>

De Benelux, sinds 2010 spreken we officieel van de Benelux-unie, bestaat uit de landen Nederland, België en Luxemburg. We plaatsen deze landen in een array. In de eerste regel van de code wordt de array gevuld. In dit geval hebben we de array $landenBenelux genoemd en gevuld met 3 waardes, namelijk de strings: "Nederland", "België” en "Luxemburg".

In de tweede regel staat een echo-statement. Het eerste element uit de array wordt afgedrukt. Het resultaat van deze code zal dus zijn dat er "Nederland" op het scherm wordt afgedrukt.
Let op: de indexwaarden in een array beginnen altijd bij 0.
Het eerste element, in dit geval Nederland, heeft index 0. De array $landenBenelux bestaat uit 3 elementen waarvan de indexwaarden zijn 0 tot en met 2.

 

Video uitleg

https://laracasts.com/series/php-for-beginners-2023-edition/episodes/6

https://laracasts.com/series/php-for-beginners-2023-edition/episodes/7

★ Aan de slag 20

Met loops kan je gemakkelijk array's op het scherm tonen hieronder een voorbeeld van een array met provincies.

<?php
$provincies=[
  "Groningen",
  "Friesland",
  "Drenthe",
  "Overijssel",
  "Flevoland",
  "Gelderland",
  "Utrecht",
  "Noord-Holland",
  "Zuid-Holland",
  "Zeeland",
  "Noord-Brabant",
  "Limburg",
];
 
foreach($provincies as $provincie)
{
   echo $provincie."<br>";
}
?>

De foreach loop gaat alle elementen van een array af en die stop je in een andere variabele. In dit geval $provincie

Maak een script kleuren.php en stop daar onderstaande array in. Maak een loop die de kleuren op het scherm schrijft in hun eigen kleur.

$kleuren=[
"red",
"green",
"yellow",
"blue"
];
Resultaat
redgreenyellowblue

 

Gegevens in array aanpassen

Je kunt de waardes van een array veranderen. In het onderstaande script wordt allereerst het element met index 0 op het scherm afgedrukt. Vervolgens wordt aan index 0 een nieuwe waarde toegekend. Deze waarde wordt daarna ook op het scherm getoond.

<?php

$landenBenelux = ["Nederland", "België", "Luxemburg"];
echo $landenBenelux[0] . "<br>";
$landenBenelux[0] = "België";
echo $landenBenelux[0];

?>

Om alle inhoud van een array snel even op het scherm te tonen kan gebruik worden gemaakt van de php functie print_r($landenBenelux)of van var_dump($landenBenelux)

Dit kan met name handig zijn om fouten op te sporen.

Handige functies

Er bestaan handige functies die je in combinatie met arrays kunt gebruiken. Bijvoorbeeld de functie count():

 

<?php
$mijnArray = [1,2,3,4,5];
echo count($mijnArray);
echo "<br>";
$mijnArray[] = 6;
echo count($mijnArray);
?>



Met de functie count()kun je de lengte van een array opvragen. Dat betekent dat het resultaat het totaal aantal elementen in de array is.
De regel $mijnArray[] = 6 voegt het getal 6 toe als element achter aan de array.
In de code wordt de lengte van de array afgedrukt. Vervolgens wordt er een element aan de array toegevoegd. Tenslotte wordt weer de lengte van de array afgedrukt. Na uitvoer van het script zien we:
5
6

Er bestaan ook functies om de elementen van een array om te draaien en om de elementen te sorteren:

 

<?php
$mijnArray = [2,1,5];
echo $mijnArray[0] . " , " . $mijnArray[1] . " , " . $mijnArray [2];
echo "<br>";
 
$mijnArray2 = array_reverse($mijnArray);
echo $mijnArray2[0] . " , " . $mijnArray2[1] . " , " .$mijnArray2[2];
echo "<br>";
 
sort($mijnArray);
echo $mijnArray[0] . " , " . $mijnArray[1] . " , " . $mijnArray[2];
echo "<br>";
?>

In het eerste blok wordt een array gevuld met 3 elementen en afgedrukt. In het tweede blok wordt die array omgedraaid en afgedrukt. In het derde blok wordt de array gesorteerd en op het scherm gezet. De functie array_reverse() laat de array waarop deze functie wordt toegepast onveranderd. De functie sort() daarentegen vervangt de oorspronkelijke array door de gesorteerde array.

Met als resultaat:

★ Aan de slag 26

Maak een bestand weekdagen.php

In je script maak een array met de dagen van de week.
Maak daarna een loop om de dagen van de week op het scherm te schrijven.

Je kan hiervoor gebruik maken van de volgende foreach loop

foreach($dagen as $k=>$dag){
    echo $k.". ".$dag."<br>";
}
Alleen een array begint met tellen bij 0 en niet bij 1. Dus daar moet je iets slims voor bedenken.
PHP


 

★ Aan de slag 29

Maak een bestand gemiddelde.php

Jou script dat gebruik maakt van een array met 10 rapportcijfers moet het gemiddelde van deze cijfers afdrukt op het scherm. Je kan gebruik maken van een loop of een php functie.

$cijfers=[4,7,7,5,6,7,8,5,6,8];
   

 

Resultaat

 

 

2D arrays

We hebben al gezien dat de elementen van een array verschillende soorten waarden kunnen hebben, bijvoorbeeld getallen of strings. Maar wat dacht je ervan als de elementen van een array ook arrays zijn? Dan krijg je een array van arrays, ofwel een tweedimensionaal array. Bekijk de volgende code:

 

<?php
$rij1 = [1,2,3];
$rij2 = [4,5,6];
$rij3 = [7,8,9];
$multi = [$rij1, $rij2, $rij3];
echo $multi[0][2];
?>

In de code worden eerst 3 arrays van 3 elementen aangemaakt. Vervolgens wordt er een nieuw array gemaakt met als elementen de bovenstaande arrays. Daarna wordt het derde element van de eerste array afgedrukt naar het scherm. Let weer op dat we beginnen te tellen bij 0! De uitvoer zal het getal 3 zijn.

Ook 2D arrays kunnen met een loop worden doorlopen. Omdat je twee dimensies hebt, heb je ook een dubbele loop nodig. Dit heeft deze vorm:

 

<?php
for ($i=0; $i<10; $i++) {
    for ($j=0; $j<10; $j++) {
        //code voor elk element
    }
}
//of met een foreach-loop
foreach($items as $item){
    foreach($item as $subitem){
        //code voor elk element
    }
}
?>

Arrayfuncties en databases

Als je met PHP en MySQL gegevens uit een MySQL database haalt, kom je ook in aanraking met arrays. Als je een query uitvoert en de functie mysqli_fetch_array() gebruikt, krijg je een rij uit de database als array terug. De elementen van dit array zijn de waardes van de verschillende velden van die regel uit de database. We komen hier later op terug.

Toets 1

In de volgende toets wordt getoetst wat je inmiddels zou moeten weten over het onderwerp PHP en MySQL.

Maak de toets:

PHP

H Formulieren

Formulieren gebruiken

Het komt regelmatig voor dat je op een webpagina een formulier moet invullen. Voor het verwerken van gegevens die worden ingevuld in een formulier kan PHP worden gebruikt. De gegevens kunnen worden weggeschreven naar een database, maar het is ook mogelijk om de ingevoerde data op een nieuwe of op dezelfde pagina op te vragen.

Onze PHP-editor kan ook formulieren afhandelen. We laten dat zien aan de hand van een formulier waarin NAW-gegevens ingevuld kunnen worden. Deze gegevens worden op een andere pagina weergegeven. Als eerste zie je de HTML-code die je nodig hebt voor het formulier. Het resultaat van de verwerkte HTML-code is een formulier waar naam, adres en woonplaats kunnen worden ingevuld.

<!DOCTYPE html>
<html lang="nl">
  <head>
    <title>invoeren NAW-gegevens</title>
    <meta charset="utf-8">
  </head>
  <body>
    <form name="form1" method="post" action ="naw.php">
      <p>Vul hieronder je naam, adres en woonplaats in:</p>
      <p><input type = "text" size = "25" name = "naam"></p>
      <p><input type = "text" size = "25" name = "adres"></p>
      <p><input type = "text" size = "25" name ="woonplaats"></p>
      <p><input type = "submit" value = "Verstuur"></p>
    </form>
  </body>
</html>


Het formulier is als een .html bestand opgeslagen.
Er staat immers geen enkele PHP-code in.

Laten we de code van het formulier eens nader bekijken. Een formulier wordt altijd geopend met de tag <form> en afgesloten met de tag </form> In de openingstag staan nog drie attributen: name, method en action. Een formulier kan een naam meekrijgen. Het attribuut method zegt iets over hoe het formulier gegevens uitwisselt met de webserver. Daarvoor kan in PHP gebruik gemaakt worden van get of post. In ons voorbeeld is gekozen voor post. Later in deze module leggen we het verschil uit. Het attribuut action heeft de waarde “naw.php” meegekregen. Daarmee regelen we dat bij het klikken op de knop dat de server het bestand naw.php uitvoert. De inhoud van het formulier wordt daarbij naar de pagina naw.php verzonden. Wanneer de action wordt weggelaten zullen de gegevens naar de huidige pagina worden verstuurd. Verder treffen we in het formulier bij de diverse invoervelden een attribuut name aan. Dit attribuut wordt gebruikt voor de naamgeving van de variabelen die gepost worden. In ons voorbeeld zijn dat: naam, adres en woonplaats. In de HTML-pagina zien we dat de gegevens uit het formulier worden gepost. Dat wil zeggen dat ze worden verstuurd naar de server en opgeslagen in een variabele array $_POST. De variabelen naam, adres en woonplaats worden dus opgeslagen in de array $_POST.

De code van naw.php is:

<?php
$naam = $_POST["naam"];
$adres= $_POST["adres"];
$woonplaats = $_POST["woonplaats"]
?>
<!DOCTYPE html>
<html lang="nl">
  <head>
    <title>verwerken NAW-gegevens</title>
    <meta charset="utf-8">
  </head>
  <body>
    <h4>Je ingevulde NAW-gegevens zijn:</h4>
    <?php
    echo $naam . "<br>";
    echo $adres . "<br>";
    echo $woonplaats . "<br>";
    ?>
  </body>
</html>

Door te klikken op de knop verstuur wordt het bestand naw.php aangeroepen en de ingevulde gegevens verwerkt.

★ Aan de slag 31

Maak een bestand ik.php

Start met een html opmaak ! <tab> (als je emmet hebt geïnstalleerd als plugin)

Plaats in de body het volgende formulier:

<form method="post">
  <p><input type="text" name="naam" placeholder="Naam"></p>
  <p><input type="number" name="leeftijd" placeholder="Leeftijd"></p>
  <p><input type="text" name="sport" placeholder="Sport"></p>
  <p><input type="submit" value="verstuur"></p>
</form>

Omdat het formulier geen action heeft zullen de gegevens naar ik.php worden verstuurd.

Voeg helemaal boven aan een stukje php code toe die alle waardes die zijn verstuurd omzetten in een variabele. Hieronder is alvast een begin gemaakt.

<?php
$naam = $_POST['naam'];
$leeftijd =
?>

 

Hierna kan je een nieuw stukje php code toevoegen in de body, waarin de zin komt te staan.

Ik ben <naam>, ben <leeftijd> jaar oud en doe graag <sport>.

Hierbij worden natuurlijk de stukjes tussen < > vervangen door de verstuurde waardes.

 

Als je de pagina voor de eerste keer opent heeft de $_POST nog geen inhoud. Dit zal een foutmelding geven bij $naam = $_POST['naam'];. Na het versturen van je formulier zal de foutmelding verdwijnen omdat de $_POST nu wel inhoud heeft.

Je kan deze fout eenvoudig vermijden door onderstaande IF toe te voegen.

if($_POST!=null){
   $naam = $_POST['naam'];
   //.. nog meer code
}

Formulieren gebruiken - 2

In de code van naw.php staat $naam = $_POST["naam"];. Wanneer gegevens uit een formulier worden verwerkt met de methode post zijn deze variabelen daarna beschikbaar in de globale array $_POST. We kunnen door de regel $naam = $_POST["naam"]; aan een variabele $naam de waarde toekennen van de tekst die we in dit geval in het eerste tekstveld hebben ingevoerd. In het HTML-formulier wordt name gebruikt voor de naamgeving van de variabelen in de array. De code name = "naam" zorgt ervoor dat in het PHP-script dat het formulier verwerkt de variabele $_POST["naam"] beschikbaar is.

Het formulier, waarin de naw-gegevens worden ingevuld, is een voorbeeld van een eenvoudig formulier. Bij formulieren die wat groter zijn, kan de HTML-tag <fieldset> gebruikt worden om delen die bij elkaar horen te groeperen. Daardoor oogt alles wat overzichtelijker. We kunnen aan een fieldset een naam geven door gebruik te maken van het HTML-element legend:

<!DOCTYPE html>
<html lang="nl">
  <head>
    <title>invoeren NAW-gegevens</title>
    <meta charset="utf-8">
  </head>
  <body>
    <form name="form1" method="post" action="naw-php">
      <p>Vul hieronder je naam, adres en woonplaats in:</p>
      <fieldset>
        <legend>mijn gegevens</legend>
        <p><input type = "text" placeholder="Naam" name ="naam"></p>
        <p><input type = "text" placeholder="Adres" name ="adres"></p>
        <p><input type = "text" placeholder="Woonplaats" name ="woonplaats"></p>
      </fieldset>
      <p><input type = "submit" value = "Verstuur"></p>
    </form>
  </body>
</html>

 

Resultaat
 

<html>
  <head>
    <title>Een ingewikkelder formulier</title>
  </head>
  <body>
    <form name="form1" method="post" action="form2afhandeling.php">
    <p> Hoe heet je?
      <input type="text" size="20" name="voornaam">
    </p>
    <p> Informatica is leuk:
      <input type="radio" name="stelling" value="eens" checked>Eens
      <input type="radio" name="stelling" value="oneens">Oneens
    </p>
    <p> Welk profiel heb je?
      <select name="profiel">
        <option>NT</option>
        <option>NG</option>
        <option>EM</option>
        <option>CM</option>
      </select>
    </p>
    <p>
      <input type="submit" value="Verstuur">
    </p>
    </form>
  </body>
</html>

Zoals je ziet staat het formulier weer tussen de <form> en </form> tags. De pagina waar we naartoe gaan is form2afhandeling.php

Ons formulier heeft 4 form onderdelen:

  1. <input type="text" size="20" name="voornaam">
    Deze kennen we al uit het vorige voorbeeld.
  2. <input type="radio" name="stelling" value="eens" checked>Eens
    <input type="radio" name="stelling" value="oneens">Oneens

    Je ziet dat je voor elke radiobutton een aparte tag moet maken.
    type="radio" geeft aan dat het een radiobutton is.

    De name="stelling" is weer de naam waarmee de waarde opgehaald kan worden bij de afhandeling.

    LET OP: radiobuttons die bij elkaar horen moeten dezelfde naam hebben.

    Met value="eens" geven we de waarde aan die doorgestuurd wordt als deze radiobutton aan staat. Bij de eerste optie staat er nog het woordje checked achter. Dat houdt in dat deze standaard geselecteerd is.
  3. <select name="profiel">
         <option>NT</option>
         <option>NG</option>
         <option>EM</option>
         <option>CM</option>
    </select>
  4. <input type="submit" value="Verstuur">

    Deze kennen we al uit het vorige voorbeeld.

★ Aan de slag 32

 

Maak een bestand hoofdstad.php

Maak een formulier met een radio buttons zoals hieronder


Verstuur het antwoord naar hetzelfde bestand (laat de action dus leeg)

Om te kijken of iets verstuurd is in je script kan je gebruik maken van

if(!empty($_POST)){
  //hier jou code
}
of
if($_POST!=null){
  //hier jou code
}
Zorg ervoor dat onder je formulier de volgende tekst op het scherm wordt geschreven.
Je antwoord op de vraag was: Maastricht


Pas de afhandeling zo aan dat er ook nog wordt gecheckt of het antwoord goed is. Daarvoor heb je een if-else-constructie:

Als het antwoord fout is verschijnt de output:

     Je antwoord op de vraag was: Maastricht
     Dat is helaas niet goed!

Als het antwoord goed is verschijnt de output:

      Je antwoord op de vraag was: Maastricht
     Goed geantwoord!


Laad beide bestanden in de PHP-editor en voer de code uit.

PHP

Strings en formulieren

 

Vaak is het handig om te testen of een string-variabele die uit een HTML-formulier afkomstig is, geen waarde heeft, dus een lege string is. Daarvoor gebruiken we de operator ! (uitroepteken). Zo kun je controleren of iemand bijvoorbeeld een wachtwoord heeft ingevuld:

if(!$wachtwoord){
    echo "<strong>Je moet een wachtwoord invullen</strong>"
};

Een tweede manier om te kijken of een variabele een lege string is, is door het gebruik van de functie empty().

if(empty($wachtwoord)){
echo "<strong>Je moet een wachtwoord invullen</strong>"
};

Dit werkt in feite met elk type PHP-variabele, om na te gaan of er aan die variabele een waarde is toegekend.

Gebruik de volgende operatoren om twee strings met elkaar te vergelijken:

Gebruik == om te testen of twee strings gelijk zijn aan elkaar.
Gebruik < om te testen of string 1 lexicografisch vóór string 2 komt.
Gebruik > om te testen of string 1 lexicografisch na string 2 komt.


Lexicografisch betekent alfabetisch en/of numeriek.
Je kunt ook gebruik maken van de operatoren <= en >= die respectievelijk staan voor “vóór of gelijk aan” en “na of gelijk aan”.

De volgende vergelijkingen zijn waar:

"abc" == "abc"
"abc" < "bcd"
"bcd" > "abc"

We zullen de == operator gebruiken in een PHP-script dat een korte beschrijving geeft van de profielen die in de bovenbouw havo en vwo voorkomen.
Allereerst maken we een webpagina met een keuzemenu waar je de waarde van de variabele $profiel kunt kiezen. Houd er rekening mee dat het volgende voorbeeld een eenvoudige string vergelijking uitvoert die werkt op basis van elke vergelijking die gevonden wordt. Daarom is het van groot belang dat je ervoor moet zorgen dat de waarden die je in je HTML-formulier stopt, exact overeenkomen met de waarden waarin je in je PHP-script naar op zoek bent.

De code voor het formulier wordt dan:

<!DOCTYPE html>
<html lang="nl">
     <head>
           <title>Informatie over profielen</title>
           <meta charset="utf-8">
           <link rel="stylesheet" href="opmaak.css">
     </head>
     <body>
           <h4> De situatie in schooljaar 2016-2017</h4>
           <p> Kies een profiel en klik op de knop <strong>Informatie</strong>:</p>
           <form name="form1" method="post" action="profielinfo.php">
                       <select name="profiel">
                       <option selected> Natuur en Techniek </option>
                       <option> Natuur en Gezondheid </option>
                       <option> Economie en Maatschappij </option>
                       <option> Cultuur en Maatschappij </option>
                 </select>
                 <input type="submit" value="Informatie">
           </form>
     </body>
</html>

Resultaat


In het formulier wordt verwezen naar het bestand profielinfo.php.
Hieronder is daarvoor de code weergegeven.

<html>
     <head>
           <title>
                 Informatie over:
                 <?php
                       $profiel = $_POST["profiel"];
                       echo $profiel
                 ?>
           </title>
           <meta charset="utf-8">
           <link rel="stylesheet" href="opmaak.css">
     </head>
     <body>
           <?php
                 if($profiel == "Natuur en Techniek" ) {
                       ?>
                             <h1>Natuur en Techniek</h1>
                             <p>Dit is het profiel met als
                             profielvakken:<br> wiskunde B  natuurkunde en
                             scheikunde
                             </p>
                       <?php
                 }
                 else if($profiel == "Natuur en Gezondheid" ) {
                       ?>
                             <h1>Natuur en Gezondheid</h1>
                             <p>Dit is het profiel met als
                             profielvakken:<br> wiskunde AB (of B)
                              biologie en scheikunde </p>
                       <?php
                 }
                 else if($profiel == "Economie en Maatschappij" ) {
                       ?>
                            <h1>Economie en Maatschappij</h1>
                            <p>Dit is het profiel met wiskunde als
                            profielvakken:<br> wiskunde AB (of B) en economie </p>
                       <?php
                 }
                 else if($profiel == "Cultuur en Maatschappij" ) {
                       ?>
                             <h1>Cultuur en Maatschappij</h1>
                             <p>Dit is het profiel met als
                             profielvakken:<br> wiskunde A en
                             geschiedenis.</p>
                       <?php
                 }
                       ?>
     </body>
</html>

Get en post

Behalve de post-methode> kan er ook gebruik gemaakt worden van de get-methode om gegevens te verzenden en/of op te vragen. Om de gegevens te verkrijgen moet je dan in de PHP-code gebruik maken van de instructie $_GET["inputnaam"] waarbij "inputnaam" de naam is van de waarde die opgehaald wordt uit het invulvenster in een formulier. In de HTML-code van het formulier wordt bij method "get" ingevuld in plaats van "post".

We komen nog even terug op het voorbeeld van een wat ingewikkelder formulier waarvan de broncode reeds eerder is besproken.

 

In dit formulier gaan we nu gebruik maken van de method "get" in plaats van "post".

Dus:

<form name="form1" method="get" action="form2afhandeling.php>

Voor het ophalen van de gegevens staat nu in form2afhandeling.php:

<?php
     $profiel = $GET_["profiel"];
?>


Bij het gebruik van get worden de gegevens als argument achter de URL geplakt in de vorm van een querystring:


Nadelen die kleven aan get zijn:

  • Omdat de gegevens in de querystring zichtbaar zijn is get ongeschikt voor loginsystemen.
  • Een get-statement wordt opgeslagen in de logbestanden op de webserver en passeert ongecodeerd de gateways op het internet.
  • De lengte van de querystrings is beperkt (maximaal 8 kB).

Bij het gebruik van post worden de gegevens "onzichtbaar" in de HTTP-headers van de pagina verwerkt:


Voordelen van post zijn:

  • De gegevens in de querystring zijn niet zichtbaar.
  • De gegevens worden niet opgeslagen in de cache van de browser of in de serverlogs.
  • Er kunnen veel meer gegevens gelijktijdig verzonden worden.

★ Aan de slag 36

Maak een bestand lijn.php

Maak een pagina die zichzelf aanroept en waarin het mogelijk is een lijn van verschillende kleur, lengte en dikte te maken. De gewenste kleur kan geselecteerd worden. De waarden voor de lengte en dikte van de lijn moeten voordat de lijn getekend wordt zelf worden ingevuld. Gebruik hierbij type="number". De lijn kan de kleur rood, groen, blauw of geel krijgen.

Let op dat in de selectbox de naam van de kleur in het Nederlands wordt getoond. Maar in het Engels wordt verstuurd.

 

De lijn kan je maken door middel van css

<div style="width:100px; height:10px; background-color:red"></div>
 

Het resultaat ziet er dan als volgt uit:

 

   

★ Aan de slag 37

Maak een bestand tafel.php waarin je vermenigvuldigingstafel kunt laten zien. In een invoerveld geef je een getal op kleiner dan 100, je drukt op een knop en in dezelfde pagina krijg je dan ook de tafel te zien. Als je daarna een ander getal in het invoerveld opgeeft en weer op de knop drukt, komt het nieuwe tafeltje in beeld.

Controleer eerst of er een getal is ingevoerd. Zo niet, laat dan alleen het invulscherm zien. Zo ja, laat dan zowel het invulscherm zien als de uitkomst in tabelvorm. Je roept in beide gevallen het eigen script weer aan.

 

Hieronder staat de output nadat je eerder het getal 76 hebt ingegeven en op de knop hebt gedrukt.

 

Sla het bestand op als aandeslag_37.php. Laad het bestand in de PHP-editor bij Hoofdscript en voer de code uit.

PHP

Valideren

PHP string functies zijn erg nuttig om aan de serverkant formuliergegevens te valideren. Daarbij is de multipass script techniek erg behulpzaam: het maken van een formulier, de validatiecode en de actie in één script. Als het script voor de eerste keer wordt uitgevoerd, verschijnt er een leeg formulier. Als je op de knop drukt, wordt het script opnieuw aangeroepen. Als de data niet correct zijn, wordt het formulier weer getoond (met de gegevens die wel juist zijn, zodat de gebruiker die niet nog een keer hoeft in te vullen) samen met een foutmelding erbij. Als de ingevulde gegevens correct zijn wordt de eigenlijke scriptactie uitgevoerd.

In dit onderdeel laten we zien hoe je kunt controleren of de gegevens in een formulier wel correct zijn ingevuld.

Als je het script runt, krijg je een formulier te zien dat er ongeveer zo uitziet:

 

We testen het script door niet alle gegevens in te vullen en vervolgens op “Log in” te klikken. We doen dat door eerst niets in te vullen, vervolgens alleen een naam in te vullen en tot slot alleen het e-mailadres in te vullen. Vul je alleen je naam in dan krijg je bijvoorbeeld de melding dat je nog je e-mailadres moet invullen. Dit is te zien in het onderstaande scherm.

De controle zou als volgt kunnen:

<?php
if(!empty($_POST) and empty($_POST['email']))
{
    echo "<p style=\"font-weight:bold; color:red\">
        * * Je moet nog je e-mailadres invullen
        </p>";
}
?>

De foutmelding wordt alleen uitgevoerd als er iets is verstuurd en als $_POST['email'] leeg is.

Op deze manier kan je redelijk eenvoudig valideren.

Je kan ook aan de client kant valideren door attribute required toe te voegen.

<b>E-mail: </b><input type="email" name="email" required><br>
 

I PHP en databases

Inleiding

In dit onderdeel bespreken we hoe PHP gebruikt kan worden voor het benaderen van een database. Veel websites, bijvoorbeeld die van webwinkels, hebben toegang tot grote hoeveelheden gegevens die zijn opgeslagen in een database. Met PHP kunnen gegevens worden opgevraagd, veranderd of worden weggeschreven naar een database. We gebruiken daarvoor PHP in combinatie met MySQL. MySQL is een database system. Onder een database system verstaan we het programma waarmee bewerkingen op een database kunnen worden uitgevoerd en de database, dus de gegevens, zelf. Een programma waarmee bewerkingen op een database kunnen worden uitgevoerd, noemen we een database management system ofwel DBMS. In de interactieve module databases heb je gezien hoe je met de vraagtaal SQL (Structured Query Language) gegevens uit een database kunt opvragen. Het is mogelijk om SQL-opdrachten in combinatie met PHP te gebruiken om gegevens uit een database op te vragen in een webpagina of vanuit een webpagina weg te schrijven naar een database.

Voor MySQL zijn diverse programma’s beschikbaar waarmee de database benaderd kan worden. Het meest gebruikte DBMS voor MYSQL is phpMyAdmin. In phpMyAdmin kan een database, inclusief de daarbij behorende tabellen, worden aangemaakt. Daarnaast is het mogelijk om allerlei bewerkingen op de database uit te voeren en de rechten van gebruikers vast te leggen.
Ook kan hiervoor heel goed gebruik worden gemaakt van Heidi-SQL


Wij gebruiken USBWebserver waarbij de database en PHP gebruikt kunnen worden. Eventueel kan je XAMPP gebruiken. Bij de meeste webhosting pakketten is PHP en MySQL al voor geïnstalleerd. En dit is ook een optie (alleen dit is niet gratis)

 

Voor de opdrachten zullen we gebruik maken database film.

Benaderen database

Met PHP kunnen we gegevens uit een database opvragen of gegevens aan een database toevoegen. Dit proces verloopt in drie fasen:

  1. Als eerste maken we contact met de database server via Database Management Services en wordt de juiste database geselecteerd.
  2. Daarna wordt een query uitgevoerd die de resultaten weergeeft in een webpagina (in ons geval in een editor) of data wegschrijft naar de gekozen database.
  3. Tot slot wordt de verbinding met de database server verbroken.

PHP heeft voor elk DBMS (Database Management System) een set database functies waarmee het kan werken.
In ons geval kijken we alleen maar naar de MySQL server.

Belangrijke functies - Connect

Functie mysqli_connect()

Voordat we bewerkingen op een database kunnen uitvoeren, moet er eerst een verbinding met de server gemaakt worden en zal de gewenste database geselecteerd moeten worden. In een DBMS kunnen meerdere databases inclusief de daarbij behorende tabellen aanwezig zijn.

Om verbinding met de databaseserver te maken, hebben we een hostnaam, een gebruikersnaam en een wachtwoord nodig. Daarnaast moeten we ook de naam van de database opgeven.

De functie die daarvoor gebruikt wordt, is mysqli_connect(). Het format van deze functie is:

 

$link = mysqli_connect($host,$user,$password,$database)
  or die(mysqli_connect_error());

De ' or die(mysqli_connect_error()) kan ook weggelaten worden. Maar dit geeft een duidelijke foutmelding als er geen verbinding kan worden gemaakt. Zeker in het begin erg handig.

Boven aan het scipt kan je de variabele vullen. Dit kan ook direct in de functie

$host = "localhost";
$user = "root";
$password = "usbw";
$database = "school";

Het script start met het contact leggen met de databaseserver en het selecteren van de database. Daarvoor worden de hostnaam, de gebruikersnaam, het wachtwoord en de naam van de database doorgegeven aan MySQL. De functie zorgt er vervolgens voor dat een foutmelding in beeld wordt gebracht als er om de een of andere reden geen verbinding met het DBMS tot stand gebracht kan worden. Dat kan in de trant van: verkeerd wachtwoord, verkeerde gebruikersnaam, DBMS is niet op de computer aangetroffen. Wordt de verbinding wel tot stand gebracht, dan volgt de mededeling “De verbinding met de database is tot stand gebracht”. Voor het verbreken van de connectie met de MySQL server kan de functie mysqli_close() worden gebruikt.

★ Aan de slag 38 - maken connect_film.php

In deze opdracht ga je PHP-code schrijven voor het maken van een verbinding met de database Film.

Voor het opzetten van een verbinding met de database Nederland heb je de onderstaande gegevens nodig:

Host: localhost
Gebruikersnaam: root
Wachtwoord: usbw
Database: film


Maak een bestand connect_film.php Schrijf de PHP-code voor het leggen van een verbinding met de database film. Gebruik geen HTML in dit bestand. Als de verbinding tot stand gebracht kan worden, krijg je te zien "verbinding gemaakt". Als de verbinding mislukt is dan moet er een error verschijnen.
Als dit werkt, haal dan de tekst "verbinding gemaakt" weg. Want dan kunnen we dit bestand voor de volgende opdrachten opnieuw gebruiken.

   
 

Belangrijke functies - Query

Functie mysqli_query()

Nadat we de juiste database hebben geselecteerd, gebruiken we de functie mysqli_query() om queries naar de database te sturen.

Het format van deze functie is:

$result = mysqli_query($link, $query);


De functie stuurt als resultaat alle rijen van een tabel uit een database terug die de uitkomst vormen van de opgegeven query.

We kunnen nu een SELECT query maken:

//verbinding maken met de database
include "connect_film.php";

$query = "SELECT * FROM films ORDER BY titel";
$result = mysqli_query($link, $query);

Belangrijke functies - Array

Functie mysqli_fetch_array()

De functie mysqli_fetch_array() hebben we al eerder besproken bij het onderdeel over arrays. Als je een query uitvoert en de functie mysqli_fetch_array() gebruikt, krijg je een rij uit de database als array terug. De elementen van deze array zijn de waardes van de verschillende velden van die regel uit de database. Het format van deze functie is:

$row = mysqli_fetch_array($result);
//of
$row = mysqli_fetch_assoc($result);


Er zijn verschillende mogelijkheden om de resultaten in een array te zetten. Hierboven worden er twee genoemd. De functies zijn nagenoeg gelijk aan elkaar. Verderop wordt het verschil besproken.
De functie haalt de volgende rij uit het objectresultaat en geeft als terugkeerwaarde false als er geen nieuwe rijen meer zijn. Normaal wordt deze functie gebruikt in een while loop:

   while($row = mysqli_fetch_array($resultaat)) {
         //doe iets met die rij, bv;

         echo "{$row['titel']}<br>";
   }

Elke kolom van een rij wordt benaderd met een array notatie:
De eerste kolom is $row["filmnr"] of $row[0]
De tweede kolom is $row["titel"] of $row[1]

Bij gebruik van mysqli_fetch_array kan zowel een key als kolomnummer worden gebruikt. Bij mysqli_fetch_assoc kan alleen een key worden gebruikt.
Om nu de eerste kolom van alle rijen van de uitkomst van een query in beeld te brengen, gebruik je de volgende code:


         while($row = mysqli_fetch_assoc($result)) {
              echo $row["titel"] . "<br>\n";
         }


We zullen alle tot nu toe behandelde functies eens in een compleet voorbeeld laten zien. Daarin maken we contact met de database film en voeren we een query op deze database uit waarmee we alles uit de tabel films selecteren. De gegevens worden oplopend gesorteerd op naam van de provincie. Het resultaat, een tabel, wordt op het scherm afgebeeld.


De code hiervoor is:

<!DOCTYPE html>
<html lang="nl">
<head>
    <title>overzicht films</title>
    <meta charset="utf-8">
</head>
<body>
<h3>Een overzicht van alle films</h3>
<table border="1" cellpadding="3">
    <tr>
        <th>filmnr</th>
        <th>titel</th>
        <th>regisseurnr</th>
        <th>jaar</th>
        <th>genre</th>
        <th>tijdsduur</th>
    </tr>
    <?php
    include "connect_film.php";


    $query = "SELECT * FROM films ORDER BY titel";
    $result = mysqli_query($link, $query);
    while ($row = mysqli_fetch_assoc($result)) {
        ?>
        <tr>
            <td><?php echo $row["filmnr"]; ?></td>
            <td><?php echo $row["titel"]; ?></td>
            <td><?php echo $row["regisseurnr"]; ?></td>
            <td><?php echo $row["jaar"]; ?></td>
            <td><?php echo $row["genre"]; ?></td>
            <td><?php echo $row["tijdsduur"]; ?></td>
        </tr>
        <?php
    }
    ?>
</table>
<?php
mysqli_close($link);
?>
</body>
</html>

 

★ Aan de slag 40

Maak een bestand regisseurs.php. Schrijf de PHP-code waarmee op het scherm een tabel wordt afgebeeld met de voor en achternaam van alle regisseurs.

   

Meerdere tabellen

Als je complexe websites bouwt, ben je al gauw toe aan het gebruik van meerdere tabellen in een database. Het is van belang dat deze tabellen onderling goede (dat wil zeggen: correcte) relaties bezitten. Je moet tenslotte gegevens uit meerdere tabellen kunnen koppelen. Dan is het noodzakelijk gebruik te maken van subqueries of joins.

Een database over buurtvereniging bestaat uit 4 tabellen. Stel we willen het lidnummer, de roepnaam en de activiteit waarvoor kinderen zich hebben aangemeld, tonen in een tabel. Deze gegevens staan in twee tabellen, namelijk de tabel inschrijvingen en de tabel activiteiten. We moeten ervoor zorgen dat het activiteitnr in de tabel inschrijvingen overeenkomt met het activiteitnr uit de tabel activiteiten. Op die manier kunnen we de koppeling tussen de twee tabellen waarborgen. Het script ziet er als volgt uit:

<!DOCTYPE html>
<html lang="nl">
<head>
    <title>kinderen en activiteiten</title>
    <meta charset="utf-8">
    <link rel="stylesheet" href="opmaak.css">
</head>
<body>
<h3>Een overzicht van alle inschrijvingen</h3>
<table border="1" cellpadding="3">
    <tr>
        <th>lidnr</th>
        <th>roepnaam</th>
        <th>activiteit</th>
    </tr>
    <?php
    include "connect_buurtvereniging.php";
    
    $query = "SELECT inschrijvingen.lidnr, roepnaam, activiteit
                FROM inschrijvingen, activiteiten 
                WHERE inschrijvingen.activiteitnr = activiteiten.activiteitnr";
    $result = mysqli_query($link, $query);
    while ($row = mysqli_fetch_assoc($result)) {
        ?>
        <tr>
            <td><?php echo $row["lidnr"]; ?></td>
            <td><?php echo $row["roepnaam"]; ?></td>
            <td><?php echo $row["activiteit"]; ?></td>
        </tr>
        <?php
    }
    ?>
</table>
<?php
mysqli_close($link);
?>
</body>
</html>

 

★ Aan de slag 41

Maak een bestand films.php. Hierin komt een tabel te staan met de naam van de film en de naam van de regisseur (voor en achternaam).

Je kan als basis de code gebruiken uit het voorbeeld bij "belangrijke functies - array"

   

Aan de slag 42

In deze opdracht gaan we een zoekveld maken.

Maak een formulier met een tekstveld en met een label: ' Film titel'
Daarachter komt een button met de tekst 'ZOEK'

Wanneer je op de button klikt moeten alle films getoond worden waar de titel voldoet aan hetgeen je ingevoerd hebt in het formulier.

 

Tip 1

SELECT * FROM films WHERE titel LIKE '%waar je naar wilt zoeken%'

J phpMyAdmin en Invoeren, Updaten en Wijzigen

XAMPP

Met XAMMP of USBwebserver kun je ook zonder dat je gebruik maakt van een aparte server op je eigen pc of laptop de uitvoer van PHP-scripts bekijken. In een aparte bijlage hebben we de installatie en werking van XAMMP beschreven zodat je ook thuis met deze software kunt werken.


Tabellen aanmaken

Om tabellen te kunnen aanmaken, is het noodzakelijk dat phpMyAdmin wordt opgestart. In XAMPP of USBwebserver kan dat door in de adresbalk van een browser localhost/phpmyadmin/ in te typen. Van tevoren moet dan wel Apache en MySQL worden gestart.

Ook kan hiervoor gebruik worden gemaakt van Heidi-SQL


 



Voor het beheerdersaccount wordt standaard de gebruikersnaam “root” zonder een bijbehorend wachtwoord gebruikt. Dat is onveilig. Vandaar dat we als eerste het wachtwoord voor het beheerdersaccount hebben aangepast. Eigenlijk moet je nooit als root een database benaderen. Als er voor root ook nog geen wachtwoord ingesteld is, wordt het voor hackers wel erg eenvoudig gemaakt toegang tot de database te verschaffen.

Voor instructies voor het wijzigen van het wachtwoord dat bij root hoort zie:
www.helphin.com

In de online-editor heb je al eerder gewerkt met de database Nederland. Deze database bevat de tabellen provincies en vlaggen. We leggen nu uit hoe je in phpMyAdmin deze database en de bijbehorende tabellen kunt aanmaken.

Nadat je bent ingelogd, is de eerste stap het aanmaken van de database Nederland. Dat doe je door te klikken op het tabblad Databases. Vul onder Database aanmaken de naam van de database in en klik op de knop aanmaken. In ons voorbeeld is de naam van de database dus “Nederland”.



Aan de linkerkant zien we in het overzicht Nederland staan. De database is aangemaakt, maar bevat nog geen tabellen.




Onder de melding “Geen tabellen gevonden in de database” kunnen we een nieuwe tabel gaan aanmaken. We noemen de tabel “provincies” en vullen achter het aantal kolommen 6 in.




Nadat er op start is geklikt, wordt een nieuw venster geladen waarin allerlei gegevens moeten worden ingevuld. Het is een hele brede pagina die we voor het gemak in twee delen hebben gesplitst.







In de meest linkse kolom Naam hebben we de namen van de kolommen ingevuld. De tweede kolom wordt gebruikt voor het aangeven van de datatypes. INT gebruiken we voor gehele getallen en VARCHAR voor een combinatie van allerlei karakters. In de kolom Lengte/Waarden vullen we het aantal eenheden in dat de inhoud van de kolom maximaal kan hebben. Voor de eerste kolom (land_id) is dat dus 2, hetgeen betekent dat er maximaal 99 provincie-indexen kunnen worden ingevoerd.

Bij het aanmaken van de tabel provincies laten we de vakken Standaardwaarde, Collatie en Attributen leeg. In de kolom Leeg wordt aangegeven of er in dat veld wel of niet iets moet worden ingevuld. Standaard staat dat op niet Leeg, hetgeen inhoudt dat er beslist iets moet zijn ingevuld. In ons geval laten we dat zo. Maar in andere gevallen kan het voorkomen dat een kolom niet kan worden ingevuld. Bijvoorbeeld bij het invullen van NAW-gegevens waarbij we behalve de kolommen voornaam en achternaam ook een kolom tussenvoegsel hebben. Aangezien de meeste mensen geen tussenvoegsel in hun naam hebben, zal hier de optie leeg aangevinkt moeten worden.

We vullen de gegevens voor de provincie Groningen en Friesland in:


Provincie Hoofdstad Bevolking Oppervlakte_km2 Inwoners_km2
Groningen Groningen 582649 2960 250
Friesland Leeuwarden 646092 5749 193

Daarna klikken we op de eerste Start-knop onder de gegevens van Groningen. Er worden nu twee rijen toegevoegd aan de tabel provincies. Dat kan gecontroleerd worden door in het menu op het tabblad Verkennen te klikken.




We zien nu de twee toegevoegde records. Van elk record kunnen de gegevens gewijzigd worden. Records kunnen ook gekopieerd of verwijderd worden.
De records in de tabel kunnen bekeken worden. We kiezen daarvoor Verkennen:



Er zijn, zoals je wellicht gemerkt hebt, vele mogelijkheden met phpMyAdmin. Nog enkele belangrijke opties zijn:


  1. Legen: hiermee leeg je de volledige inhoud van een tabel.
  2. Verwijderen: hiermee wordt een complete tabel verwijderd.
  3. Exporteer: hiermee kun je back-ups maken van je database in verschillende formaten. Je hebt ook allerlei opties waaruit je kunt kiezen. Als er gekozen wordt voor een SQL-bestand kan dat bestand later weer gebruikt worden voor de import in een andere database.
  4. Importeer: hiermee kun je gegevensbestanden inlezen en toevoegen aan een database. Bijvoorbeeld SQL-bestanden.
  5. Handelingen: hiermee kun je sorteeropties instellen, tabellen naar een andere plaats brengen, tabelopties aanpassen, de auto-increment index aanpassen en tabellen kopiëren naar andere databases.
  6. Zoeken: hiermee kun je allerlei zoekopties ingeven om te zoeken naar records. Er wordt dan automatisch een SQL-query aangemaakt.
  7. SQL: hier kun je zelf SQL-queries aanmaken.
  8. Rechten: Als je links klikt op een database verschijnt ook de optie Rechten. Als je daarop klikt, verschijnen alle gebruikers in beeld die van de database gebruik maken. In ons geval is dat root. Door te klikken op icoon onder Actie verschijnt er een venster waarin alle rechten te zien zijn. In ons geval zijn alle rechten aangevinkt en zijn er verder geen beperkingen. Het kan echter handig zijn om voor bepaalde databases de rechten zodanig aan te passen zodat er weinig schade kan worden berokkend. De rechten UPDATE, DROP en DELETE kunnen bij verkeerd gebruik voor veel ellende zorgen. Je zou die kunnen uitvinken.

In de kolom Index kennen we een primaire sleutel toe. Daardoor worden alle records in de tabel uniek. In de tabel provincies wordt de sleutel toegekend aan de kolom prov_id. Daardoor weten we zeker dat alle id’s uniek zijn. Op deze manier kunnen er nooit twee dezelfde records in de database komen te staan. Bij A_I hebben we de eerste kolom (prov_id) aangevinkt. A_I staat voor auto_increment hetgeen betekent dat er automatisch bij elk record dat wordt ingevoerd de teller met één wordt opgehoogd. Standaard begint dat tellen bij 1.

Nadat alles is ingevuld, kiezen we voor opslaan. Aan de linkerkant van het scherm is nu te zien dat er in de database Nederland een tabel provincies is opgenomen. Hieronder wordt de structuur van de tabel provincies weergegeven:




In de tabel provincies kunnen we records gaan toevoegen. We kiezen daarvoor in phpMyAdmin voor de optie invoegen en vullen 2 records in. Bij de kolom prov_id hoeven we niets in te vullen aangezien dat automatisch gaat.



★ Aan de slag 43

Voor de database Nederland hebben we stap voor stap laten zien hoe je in phpMyAdmin de tabel provincies kan aanmaken. In deze opdracht ga je de tabel vlaggen aanmaken. Start de phpMyAdmin-omgeving op. Maak in de database Nederland de tabel vlaggen aan. Gebruik daarvoor het strokendiagram:

 

De kolommen vlag_id en prov_id zijn van het type int. De kolom vlag_link is van het type varchar en heeft een lengte van 25. In de tabel vlaggen is vlag_id de sleutel van de tabel. Vink voor de sleutel auto_increment aan. prov_id is een verwijzende sleutel naar prov_id uit de provincie tabel.

 

★ Aan de slag 44

  1. Maak in phpMyAdmin een nieuwe database hotel aan. Voeg aan deze database de tabel gasten toe. Daarin moeten de persoonsgegevens en inloggegevens worden opgeslagen (voornaam, tussenvoegsel, achternaam, telefoon, email, gebruikersnaam en wachtwoord). Kies voor een gemakkelijke primaire sleutel. Vul de tabel met 4 personen.
  2. Maak een bestand connect_hotel.php waarin je jouw gegevens verwerkt waardoor je verbinding kunt maken met de server en de database hotel.

INSERT en UPDATE

Om gegevens in een database in te voeren kun je natuurlijk als webmaster via phpMyAdmin iedere keer braaf gegevens toevoegen. Handiger zou het zijn als dit automatisch kan gebeuren. Stel je wilt een forum op internet beheren en je zou van alle gebruikers zelf de gegevens moeten intypen. Dat is haast onbegonnen werk. Nu is er een mogelijkheid om met PHP en MySQL deze gegevens automatisch te verwerken. Je maakt daarvoor een geschikt webformulier waarin je de benodigde gegevens moet invullen. In het formulier check je eerst of de juiste gegevens zijn ingevuld en vervolgens sla je via een PHP-script de gegevens middels een INSERT-query op in de daarvoor bestemde tabel(len) in de database.

Wij werken hier het voorbeeld uit voor de tabel provincies. Hoe kunnen we via een invulformulier meerdere provincies in de tabel opslaan. We zullen daarvoor een formulier moeten ontwerpen met verschillende invoervelden en een knop waarmee de gegevens kunnen worden toegevoegd. Door te klikken op de knop wordt er een PHP-bestand aangeroepen waarmee de query die zorgt voor het toevoegen van de ingevulde gegevens

De code van dat formulier luidt:

<!DOCTYPE html>
<html lang="nl">
<head>
    <title>formulier toevoegen provincies</title>
    <meta charset="utf-8">
</head>
<body>
<form name="toevoegen" action="provtoevoegen.php" method="post">
    <fieldset>
        <legend>Toevoegen provincie</legend>
        <table>
            <tr>
                <td align="right">Provincie:</td>
                <td><input type="text" name="provincie" size="25"></td>
            </tr>
            <tr>
                <td align="right">Hoofdstad:</td>
                <td><input type="text" name="hoofdstad" size="25"></td>
            </tr>
            <tr>
                <td align="right">Bevolking:</td>
                <td><input type="text" name="bevolking" size="10"></td>
            </tr>
            <tr>
                <td align="right">Oppervlakte km2:</td>
                <td><input type="text" name="oppervlakte_km2" size="4"></td>
            </tr>
            <tr>
                <td align="right">Inwoners km2:</td>
                <td><input type="text" name="inwoners_km2" size="4"></td>
            </tr>
            <tr>
            <tr>
                <td><input type="submit" value="Voeg provincie toe"></td>
                <td><input type="reset" value="Wis gegevens"></td>
            </tr>
        </table>
    </fieldset>
</form>
</body>
</html>





 

Je ziet dat de onderdelen door middel van een tabel keurig geordend zijn en dat de tekst in de eerste kolom rechts is uitgelijnd. We willen nu de gegevens van Drenthe aan de database toevoegen:

In het formulier wordt bij de action verwezen naar het bestand provtoevoegen.php. In het PHP-script van dat bestand zal ergens de verbinding met de database Nederland terug te vinden zijn. De kans is groot dat de verbinding met de database ook in andere bestanden gerealiseerd zal moeten worden. Het is daarom handig om daarvoor een apart include-bestand te gaan gebruiken. Include betekent insluiten. Telkens als er een verbinding met de database moet worden geregeld, roepen we dit include-bestand aan. De opdracht voor het insluiten van bestanden is include("bestandsnaam.php"). Stel we hebben het script voor de connectie met de database opgeslagen in een bestand met de naam connect.php. Dan wordt het include-bestand include("connect.php"). Het werken met een include-bestand is zeker uit veiligheidsoverwegingen raadzaam en bovendien ook praktisch. Want stel dat je van webhost verandert en in elk script de connectiegegevens moet gaan wijzigen dan is dat een heleboel werk. Nu hoef je alleen maar dat ene bestand te veranderen.

In connect_nederland.php zou dan bijvoorbeeld kunnen staan:

<?php
$server = "localhost";
$user = "root";
$password = "usbw";
$database = "nederland";

$link = mysqli_connect($server, $user, $password, $database)
or die ("Er kan geen verbinding tot stand worden gebracht: " .
    mysqli_connect_error());

Om overzicht van de bestanden op je server zou je het bestand connect.php op kunnen slaan in de map includes op de webserver. In dezelfde map kunnen we bijvoorbeeld ook het bestand functions.php opslaan. Dit is het bestand waar alle functies instaan die we vaker willen gebruiken. De include-opdracht voor het tot stand brengen van de connectie met de database vinden we terug in het bestand provtoevoegen.php:


<?php

// Connectie met de database maken
include("includes/connect_nederland.php");

// Ophalen van gegevens uit het formulier
$provincie = $_POST["provincie"];
$hoofdstad = $_POST["hoofdstad"];
$bevolking = $_POST["bevolking"];
$oppervlakte_km2 = $_POST["oppervlakte_km2"];
$inwoners_km2 = $_POST["inwoners_km2"];

// Invoegen van de gegevens in de tabel provincies

$query = "INSERT INTO provincies(prov_id,provincie,hoofdstad,bevolking,oppervlakte_km2,inwoners_km2)
     VALUES('','$provincie','$hoofdstad','$bevolking','$oppervlakte_km2','$inwoners_km2')";
$result = mysqli_query($link, $query) or die (mysqli_error($link));

// Verbreken van de verbinding met de database
mysqli_close($link);

// Bevestigen dat de gegevens zijn opgeslagen
echo "De gegevens van $provincie zijn opgeslagen in de database.";

In het vanuit provtoevoegen.html aangeroepen bestand provtoevoegen.php regelen we via de INSERT INTO query het toevoegen van gegevens aan de database nederland. Het format van de INSERT INTO query is:

$query = "INSERT INTO tabelnaam(kol1 , kol2 , etc.) VALUES('var1', 'var2' , etc.)";
$result = mysqli_query($link, $query);

Let erop dat bij het gebruik van de variabelen in de VALUES enkelvoudige aanhalingstekens (‘) worden gebruikt in plaats van dubbele aanhalingstekens (“). Escape is bij enkelvoudige aanhalingstekens niet nodig.
De eerste regel is de query die moet worden uitgevoerd. De tweede regel met de functie mysqli_query() zorgt voor het daadwerkelijk toevoegen van de gegevens in de database.
Als we nu gaan testen of de gegevens inderdaad in de database staan kunnen we dat doe door een SELECT query uit te voeren.

Het resultaat zou er dan als volgt uit kunnen zien:



★ Aan de slag 45

Maak een formulier waarmee je de personen in de tabel gasten kunt invoeren. Je kan een tabel gebruiken voor de lay-out. De kleur van het buitenste gedeelte is #fedcba en dat van het binnenste gedeelte #abcdef. De grootte van de invoervelden is 20. De datum is die van vandaag, vetgedrukt. Het format daarvoor is dag-maand-jaar. Sla dit bestand op als gasten.html. In het HTML-formulier wordt voor het verwerken van de gegevens het bestand gasten.php aangeroepen. Dit bestand heb je nog niet gemaakt. Dat gebeurt bij een volgende opdracht.

Het formulier ziet er dan zo uit:

★ Aan de slag 46

  1. Maak een script waarmee je uiteindelijk via het invulformulier gegevens in de tabel gasten kunt invoeren. Sla dit bestand op als gasten.php.
  2. Voer nu via het zojuist gemaakte formulier nog de gegevens van twee nieuwe gasten toe aan de tabel gasten.

★ Aan de slag 47

  1. Maak een formulier waarmee je een hotelreservering kunt doen. Werk weer met tabellen voor de lay-out. De kleur van het buitenste gedeelte is #fedcba en dat van het binnenste gedeelte #abcdef. De grootte van de invoervelden is 15. De datum is die van vandaag, vetgedrukt. Het format daarvoor is dag-maand-jaar. Sla dit bestand op als reservering.html. In het HTML-formulier wordt voor het verwerken van de gegevens het bestand reservering.php aangeroepen. Dit bestand heb je nog niet gemaakt. Het formulier ziet er dan zo uit:


  2. Maak in phpMyAdmin een tabel reservering aan. Daarbij moet je gebruik maken van: id (auto_increment), gast_id, kamertype, nachten, ontbijten, lunches en diners. Let op de datatypes! Er bestaat een relatie met de tabel gasten.
  3. Maak een script aandeslag47c.php waarmee de gegevens van de reservering worden opgeslagen. Het gast_id is het nummer dat de gast bij de registratie via de website heeft gekregen. Er staan 4 personen in de tabel gasten met de gast_id's 1, 2, 3 en 4. Maak van elke klant twee verschillende reserveringen aan.

Gegevens aanpassen

Stel dat er gegevens uit de database moeten worden aangepast. Daarvoor maken we gebruik van de UPDATE query. We willen de gegevens voor Groningen aanpassen. De bevolking moet worden opgehoogd naar 602750. Dat gaat als volgt:

<?php

// Connectie met de database maken
include("includes/connect_nederland.php");

// Vervangen van gegevens in de tabel landen

$query = "UPDATE provincies 
            SET bevolking = 602750 
            WHERE provincie = \"Groningen\"";
$result = mysqli_query($link, $query);

// Verbreken van de verbinding met de database

mysqli_close($link);

// Bevestigen dat de gegevens zijn opgeslagen

echo "De gegevens zijn aangepast in de database.";

Afbeeldingen

Op websites worden vaak afbeeldingen gebruikt. Hoe ga je daar mee om als bij een website de meeste gegevens in een database staan? Je zou ervoor kunnen kiezen de afbeeldingen ook in de database te stoppen maar dat is niet aan te raden. De database wordt dan heel snel erg groot en kan daardoor ook overbelast raken. Dit probleem kan worden ondervangen door de afbeeldingen niet in de database zelf op te slaan, maar in de database een link te plaatsen die verwijst naar het bijbehorende bestand. We illustreren dit aan de hand van de tabel vlaggen in de database Nederland.

Stel we hebben plaatjes van de vlaggen van provincies als jpg-bestanden opgeslagen in een map vlaggen. Het PHP-bestand waarmee we naar die plaatjes gaan vragen, staat een directory hoger. We hebben in phpMyAdmin in de tabel vlaggen een kolom vlag_link toegevoegd. In deze kolom wordt de plek aangegeven, in ons voorbeeld vlaggen/groningen.jpg, waar de afbeeldingen van de vlaggen van de diverse provincies opgeslagen zijn.



Als je nu een query uitvoert met opnieuw als resultaat de provincies van Nederland maar nu met de bijbehorende vlag zal het script er dan deels als volgt uitzien:


<!DOCTYPE html>
<html lang="nl">
<head>
    <title>vlaggen</title>
    <meta charset="utf-8">
    <link rel="stylesheet" href="opmaak.css">
</head>
<body>
<h3>Een overzicht van de vlaggen van alle provincies</h3>
<table border="1" cellpadding="3">
    <tr>
        <th>provincie</th>
        <th>vlag</th>
    </tr>
    <?php
    include("includes/connect.php");

    $query= "SELECT provincie, vlag_link
                 FROM provincies, vlaggen
                 WHERE provincies.prov_id = vlaggen.prov_id";
    $result = mysqli_query($link, $query);
    while ($row = mysqli_fetch_array($result))
    {
        ?>
        <tr>
            <th><?php echo $row['provincie']; ?></th>
            <td><img src ="<?php echo $row['vlag_link']; ?>"</td>
        </tr>
        <?php
    }
    ?>
</table>
<?php
mysqli_close($link);
?>
</body>
</html>


Het resultaat is een tabel met de vlaggen van de Nederlandse provincies:

 

 



 

 

Aan de slag 48

We gaan een pagina maken waar je film gegevens kan aanpassen. We werken hierbij met één php pagina met twee formulieren. Ons bestand gaat update_film.php heten.

Om een film aan te passen moeten een aantal stappen worden genomen. Je moet eerst een film selecteren die je wilt aanpassen. Daarna moet je de huidige gegevens van de film tonen. En als laatste moet je de gegevens in de database aanpassen.

In je PHP bestand is de volgorde van deze 3 stappen echter anders

  • Gegevens aanpassen (indien verstuurd)
  • Selectbox om de film te selecteren
  • Huidige gegevens aanpassen met een formulier (als er een filmnr is verstuurd)

Om een selectbox te maken moet je een query doen op de film database die alle films ophaalt.
Daarna moeten alle films in een option veld binnen je selectbox komen te staan

<p>Selecteer een film om te wijzigen</p>
<form method="post">
  <select name="filmnr">
  <option value="1">Film 1</option>
  <option value="2">Film 2</option>
  </select>
</form>

Bovenstaande code maakt een selectbox. We geven als 'name' de primaire sleutel van de tabel mee, in dit geval filmnr. De option velden zijn nu hard gecodeerd. Deze moeten natuurlijk afkomstig zijn uit de database. Zodat als er een nieuwe film wordt toegevoegd deze ook meteen te selecteren is. Voeg boven aan de pagina include "connect_film.php"; toe om verbinding te maken met de database.

<p>Selecteer een film om te wijzigen</p>
<form method="post">
  <select name="filmnr">
<?php
$result = mysqli_query($link,"SELECT * FROM films ORDER BY titel");
while($row = mysqli_fetch_assoc($result)){
  echo "<option value=\"{$row['filmnr']}\">{$row['titel']}</option>";
}
?>
  </select>
</form>

In bovenstaande code worden eerst alle films opgehaald. Daarna worden alle rijen doorlopen en voor elke rij wordt een echo gedaan die het <option> veld op het scherm schrijft.
Als je script error maakt binnen een selectbox dan komen de foutmeldingen vaak niet op je scherm. Je kan dan de fout wel opsproren om de bron van de HTML pagina op te vragen (gebruik Chrome met rechtermuis)

We hebben nu een selectbox met alle films erin voeg een button toe ' Selecteer' aan het formulier

<input type="submit" value="Selecteer" name="selecteer">

Zorg ervoor dat de button een naam heeft dat is later handig om onderscheidt te maken tussen de verschillende buttons op de pagina.

 

We gaan nu een formulier maken waar je de gegevens van de geselecteerde film te zien krijgt.
In het formulier willen we de huidige filmgegevens tonen. Deze moeten dus even opgehaald worden uit de database.

$filmnr = mysqli_real_escape_string($link,$_POST['filmnr']);
$result = mysqli_query($link,"SELECT * FROM films WHERE filmnr=$filmnr");
$row = mysqli_fetch_assoc($result);

Om SQL-injecties te voorkomen dien je het verstuurde filmnr te voorzien van escape characters. Daarvoor is een functie. GEBRUIK DIT ALTIJD ALS JE EEN VERSTUURDE PARAMETER IN EEN QUERY GAAT INVULLEN.
We voeren de query uit en het resultaat zetten we in $row
We kunnen nu $row['titel'] bijvoorbeeld gebruiken om de filmtitel te tonen.

Update formulier

In het formulier willen we graag de gegevens van de geselecteerde film voordrukken, dat kan met

Titel <input type="text" name="titel" value="<?php echo $row['titel'];?>">

Op de plaats van 'value'  gaan we naar PHP toe en doen we een echo van de titel. De titel van de film zal dan worden getoond in het tekstveld van het formulier.

<form method="post">
  <input type="hidden" name="filmnr" value="<?php echo $row['filmnr'];?>">
  Titel <input type="text" name="titel" value="<?php echo $row['titel'];?>"><br>
  Tijdsduur <input type="number" name="tijdsduur" value="<?php echo $row['tijdsduur'];?>"><br>
  <input type="submit" name="wijzig" value="Wijzigingen opslaan">
</form>

In het formulier hierboven zijn alleen titel en tijdsduur opgenomen. Hier kan je natuurlijk de overige velden van films aan toevoegen. Belangrijk is dat je ook de primaire sleutel in het formulier plaatst zodat deze ook mee wordt verstuurd. Hierboven is filmnr als 'hidden' veld opgenomen. De gebruiker krijgt het filmnr dan niet te zien, maar wordt wel meegstuurd.
Wanneer je het filmnr wel wilt tonen, maar niet wilt dat de gebruiker het kan aanpassen zou je ook onderstaande optie kunnen gebruiken:

Filmnr <input type="text" name="filmnr" value="<?php echo $row['filmnr'];?>" readonly>
Het 'readonly' attribute zal ervoor zorgen dat het veld wel leesbaar is, maar niet aanpasbaar.
 

De update zelf

Boven aan de pagina kan nu de update van de film gedaan worden.
Voordat je de update gaat doen is het vaak handig om te kijken wat er allemaal wordt verstuurd.

var_dump($_POST);

Deze functie schrijft op het scherm wat er allemaal in $_POST zit. Mocht dit leeg zijn of onbreken er gegevens dan moet je nog even goed kijken naar je update formulier.

De update willen we alleen uitvoeren als er iets verstuurd is, dus we starten met

if($_POST!=null){
  if(!empty($_POST['wijzig'])){
       // hier de update code
  }
}
De !empty($_POST['wijzig']) wordt gebruikt om te kijken of het wijzig formulier is verstuurd.
Als deze is verstuurd, dan wil je een update doen
Omdat de velden die we versturen weer in een query komen te staan moeten we deze door de mysqli_real_escape_string functie heen laten gaan
$filmnr = mysqli_real_escape_string($link,$_POST['filmnr']);
$titel = mysqli_real_escape_string($link,$_POST['titel']);
$tijdsduur = mysqli_real_escape_string($link,$_POST['tijdsduur']);
Nu kunnen we de update query maken
mysqli_query($link,
  "UPDATE films SET titel='$titel',tijdsduur='$tijdsduur' WHERE filmnr=$filmnr")
  or die (mysqli_error($link));
Soms is het wenselijk om de gebruiker feedback te geven of de update gelukt is.
Hiervoor kan gebruik gemaakt worden van de functie mysqli_affected_rows($link) het resultaat van de functie zijn het aantal gewijzigde rijen in de database. Deze functie kan je ook na een INSERT query gebruiken. Hieronder een voorbeeld:
if(mysqli_affected_rows($link)){
   echo "Gegevens zijn aangepast";
}else{
   echo "Er zijn geen gegevens aangepast";
 
Plak alle scriptjes in de juiste volgorde, om het geheel te laten werken.
Extra voeg de overige velden van de tabel films toe om deze ook aan te kunnen passen.

Databases importeren

In phpMyAdmin is het mogelijk om een bestaande database te importeren. In het volgende laten we zien hoe je in phpMyAdmin de databases buurtvereniging kunt importeren.


Start phpMyAdmin op.

 

 



 

 

 

Klik in de linkerkant op nieuw. In het menu zie je de optie “importeren” staan. Voor het importeren van de database buurtvereniging heb je het bestand buurtvereniging.sql nodig. Dit bestand staat onder Bijlagen bij de bestanden die je nodig hebt voor deze module. Klik nu op importeren. Klik op “Bestand kiezen” en selecteer het bestand buurtvereniging.sql.

 

 




Klik daarna op starten. De database buurtvereniging wordt nu ingelezen.

 

K Login en Session

Waarom sessies?

Sessies maken het mogelijk om variabelen te gebruiken binnen een hele website. Op het moment dat een bezoeker een website bezoekt, wordt een sessie id aangemaakt. Een dergelijk id is een uniek nummer. Het unieke nummer komt te vervallen op het moment dat de bezoeker uitlogt, de browser zal afsluiten of een op de server van tevoren ingestelde tijd geen actie meer heeft ondernomen op de website. Je kunt met sessions werken via cookies of via de session_id in de URL.

Een sessie wordt gestart door gebruik te maken van de functie session_start(). Dan wordt er voor iedere bezoeker een uniek sessie_ID aangemaakt dat gedurende het verblijf op de website wordt meegenomen. Doordat je nu zo’n uniek ID hebt is het mogelijk gegevens op te slaan in de vorm van sessievariabelen. Hiervoor wordt de PHP-variabele $_SESSION[] gebruikt. Je kunt sessievariabelen ook wissen door de functie unset(). Tot slot is het mogelijk om de sessie te vernietigen waarbij alle sessievariabelen, inclusief het sessie_ID worden verwijderd.
Daarvoor gebruik je de functie session_destroy().

In de onderstaande tabel staan diverse functies die van belang zijn bij het werken met sessies.


Functie Betekenis
session_start()

Opent nieuwe sessie of stelt gegevens bestaande sessie beschikbaar

Dit commando moet altijd uitgevoerd worden voordat er output is. (Handig om dit helemaal boven aan je pagina te zetten)

session_id() Geeft huidige session ID terug of je kunt zelf een ID meegeven als String voor een sessie (zal je eigenlijk nooit gebruiken)
session_unset() Alle geregistreerde variabelen komen vrij, de sessie blijft bestaan, alleen de waarden van de variabelen zijn weg
session_destroy() Verwijdert alle data voor een sessie. De sessie is daarmee ten einde

We illustreren het gebruik van sessies aan de hand van een voorbeeld:

<?php
//starten van de SESSION
session_start();

//aanmaken van array SESSION['teller'] als deze nog niet bestaat
if(!isset($_SESSION['teller'])){
    $_SESSION['teller']=0;
}

//Als er iets wordt verstuurd
if($_POST!=null){

    //Als er telop wordt verstuurd
    if(isset($_POST['telop'])){
        $_SESSION['teller']+=1;
    }
    //als er telaf wordt verstuurd
    if(isset($_POST['telaf'])){
        $_SESSION['teller']-=1;
    }
}

?>
<!-- Formulier met een op- en aftel button-->
<form method="post">
    <input type="submit" value="+" name="telop">
    <input type="submit" value="-" name="telaf">
</form>
<?php
echo "Teller: ".$_SESSION['teller'];

 

Nadat er een nieuwe sessie is gestart, wordt aan de array $_SESSION[] een variabele 'teller' toegevoegd met waarde 0 als deze nog niet bestaat.

Daarna wordt de $_POST van het formullier afgehandeld die de $_SESSION['teller'] verhoogd of verlaagd.
Na het formulier wordt de huidige waarde van de variabele $_SESSION['teller'] op het scherm getoond.
Wanneer je het tabblad in je browser sluit en daarna weer naar dezelfde url gaat. Zal de teller de voorafgaande waarde behouden hebben. Wanneer de je browser helemaal sluit zal de SESSION verloren gaan. En zal deze weer op 0 staan.

Inloggen

Een aantal aspecten spelen een belangrijke rol:

Veiligheid

Pagina’s kunnen alleen maar ingezien worden indien er ingelogd is en er een bekende gebruikersnaam als sessionvariabele op de server en cliënt aanwezig is.

Behouden van (ingevulde) informatie

Handig als er meerdere pagina’s op een webserver moeten worden bekeken. Eerder ingevulde gegevens raken dan niet verloren maar zijn opgeslagen in sessionvariabelen. Erg handig bijvoorbeeld bij webwinkels:

  • eerst verschillende pagina’s bekijken;
  • artikelen in winkelmandje stoppen;
  • tussentijdse berekeningen uitvoeren;
  • gegevens in formulieren invullen;
  • eventuele wijzigingen doorvoeren;
  • en tot slot afrekenen.

Aandachtspunten

Om een website te beveiligen met een login mogelijkheid moeten aan een aantal voorwaarden worden voldaan. We houden dit onderwerp opervlakkig (je zou hier een heel PWS over kunnen schrijven)

  • Formulier waar gebruikersnaam en wachtwoord kunnen worden ingevoerd
  • Zetten van een SESSION
  • Valideren of de gebruikersnaam en wachtwoord overeenkomen met een geldige gebruiker
  • Opslaan van geldige gebruikersnamen en wachtwoorden in de database
  • Voorkomen dat SQL injecties kunnen worden gedaan

Beveiligen tegen SQL injecties

Bij een heel eenvoudig login formulier is het vaak mogelijk om SQL injecties toe te passen om binnen te komen. Zie dit voor meer info als je er meer van wilt weten https://nl.wikipedia.org/wiki/SQL-injectie

Wij willen SQL injecties voorkomen dit kan door alle quotes te decoderen. Hiervoor is een eenvoudig te gebruiken PHP functie mysqli_real_escape_string($link,$_POST['variabele']).

Het is handig om vanaf nu elke variabele die je via een formulier wil invoeren/wijzigen/selecteren via een SQL query op de database eerst door deze functie te laten gaan. Voor een inlogformulier zou het er zo uit kunnen zien:

<?php
$gebruikersnaam = mysqli_real_escape_string($link, $_POST['gebruikersnaam']);
$wachtwoord = mysqli_real_escape_string($link, $_POST['wachtwoord']);
$result = mysqli_query($link, "SELECT * FROM users WHERE `username`='$gebruikersnaam'");
$user = mysqli_fetch_assoc($result);

//hierna nog even het wachtwoord verifieren met password_verify()

Ons inlogformulier is hiermee een stuk veiliger. Door het gebruik van prepared statements kan het nog veiliger worden gemaakt. Dit valt echter buiten de cursus.

Gebruikers en inloggegevens in de database

Om in te kunnen loggen moet je ergens opslaan wie toegang heeft tot de betreffende pagina. Om hiermee te oefenen maken we gebruik van de firstchoice database. Daarin staat een tabel users.

In deze tabel staan een paar belangrijke kolommen: name, email, password

Stel dat een hacker toegang krijgt tot onze database dan wil je niet dat de wachtwoorden van de gebruikers te lezen zijn. Om dit te voorkomen zullen we de wachtwoorden door een HASH functie laten gaan. Het wachtwoord wordt dan gecodeerd en kan nooit meer teruggecodeerd worden. Een HASH is dus een encryptie die niet omgedraaid kan worden.

Stel onze gebruiker heeft het wachtwoord 'secret' dan zal dit mogelijk encrypt worden naar

$2y$10$8LZsnQ3ul1k42Yniz3B79ev5A03fSaHKyaaF7/r1qHQyaXK8j2Bhm

Wanneer je gaat inloggen met je gebruikersnaam en wachtwoord kan je de php functie password_verify("ingevoerde wachtwoord","wachtwoord in de database") gebruiken om te controleren of het ingevoerde wachtwoord juist is. Er volgt straks in opdracht 50 een voorbeeld script hoe dit verder in zijn werkt gaat.

 

Gebruikers toevoegen

Omdat het via Heidi en PHPMyAdmin lastig is om een gebruik toe te voegen met een wachtwoord met HASH is hieronder een script dat je kan gebruiken om gebruikers toe te voegen. Let op, elke keer dat het script wordt uitgevoerd zal een gebruiker worden toegevoegd.

Copy-paste het script en sla op als add_user.php

<?php
//connectie met de gewenste database
include "connect_firstchoice.php";

//gebruiker met onderstaande gegevens zal worden toegevoegd
$username = 'admin';
$email = 'email@mail.nl';
$password = 'password';

//indien de gebruik al bestaat verwijderen we de gebruiker
mysqli_query($link, "DELETE FROM users WHERE `name`='$username'");

mysqli_query($link, "INSERT INTO users(`name`, `email`, `password`) VALUES ('$username','$email','" . password_hash($password, PASSWORD_BCRYPT) . "')")
or die ("Er ging iets fout bij de gebruiker aanmaken: " . mysqli_error($link));
if (mysqli_affected_rows($link)) {
    echo "Gebruiker $username met wachtwoord $password is aangemaakt";
}

★ Aan de slag 50

We gaan in deze opdracht een login pagina script maken. Dit script is net als de connect.php op elke pagina te gebruiken die je wilt beveiligen.

Een beveiligde pagina kan er dan alsvolgt uit zien

<?php

include "connect_firstchoice.php";
include "login.php";

//hier de rest van je pagina, alleen zichtbaar als je bent ingelogd
echo "Je kan dit alleen zien als je bent ingelogd";

Hieronder volgen een aantal blokken met code. Deze blokken moeten in de juiste volgorde worden gezet om een werkende login.php te krijgen. Copy-paste de blokken en zit in de juiste volgorde. Let op, aan de code zelf hoeft niets aangepast te worden.

Je connect_firstchoice.php ziet er alsvolgt uit

<?php
$server = "localhost";
$user = "root";
$pw = "usbw";
$db = "firstchoice";

//verbinding met database maken
$link = mysqli_connect($server,$user,$pw,$db)
    or die ("Kan geen verbinding maken: ".mysqli_connect_error() );

Blok 1 - Opmaak van het inlogformulier

<?php
////////////////////////
/// css voor de opmaak
/// ///////////////////
?>
    <style>
        div.login {
            border: 5px outset red;
            margin-left: 40%;
            margin-top: 20%;
            padding: 3em;
            width: 300px;
            border-radius: 25px;
        }

        div input {
            margin-bottom: 1em;
            border-radius: 5px;
            padding-left: 0.5em;
            font-size: 1.5em;
        }

        .btn {
            border-radius: 10px;
            height: 2em;
            background-color: lightskyblue;
        }

        h3 {
            margin-bottom: 2em;
        }
    </style>
<?php
////////////////////// einde opmaak
?>

Blok 2 - Een button om uit te loggen (optioneel) en alleen tonen als je ingelogd bent

<?php
////////////////////Blok logout button of logout link //////////
?>
    <form method="post">
        <input type="hidden" name="logout" value="1"/>
        <input type="submit" value="Uitloggen">
    </form>
    <br>
    <br>
    <a href="<?php echo $_SERVER["REQUEST_URI"]; ?>?logout=1">Uitloggen</a>
<?php
/////////////////////einde blok logout button
?>

Blok 3 - script om de uitlogbutton te laten werken

<?php
/////////////////Blok uitloggen //////////////////
if (isset($_POST['logout']) OR isset($_GET['logout'])) {
    unset($_SESSION['user']); //zou eigenlijk niet moeten, maar soms werkt session destroy met zo snel als je zou willen
    session_destroy();
}
/////////////////einde blok uitloggen /////////////
?>

Blok 4 - starten van de sessie

<?php
session_start();
?>

Blok 5 - valideren of een gebruiker in de database bestaat

<?php
////////////////////////// blok check of `user` in database en zetten van session['user'] (ingelogd)
if (isset($_POST['login'])) {

    $user = mysqli_real_escape_string($link, $_POST['user']);
    $password = mysqli_real_escape_string($link, $_POST['password']);

    $result = mysqli_query($link
        , "SELECT * FROM users WHERE `name`='$user' LIMIT 1"
    ); //or die mysqli_error($link));
    $user = mysqli_fetch_assoc($result);
    
    //$user bevat nu een array met alle kolommen van de gebruiker (als deze bestaat)
    if (count($user)) { //kijken of er data zit in $user, zo ja dan mag je naar binnen
        if(password_verify($password,$user['password'])){
            //Alle user gegevens zetten we in de session zodat je erg makkelijk gegevens van de user kan tonen
            //zonder de database te hoeven gebruiken. bv: echo $_SESSION['user']['name'];
            $_SESSION['user'] = $user;
        }else{
            //password is niet juist dus willen we ook geen session hebben
            session_destroy();
        }
    } else {
        //alle sessies verwijderen, want het was geen geldige login
        session_destroy();
    }
}
//////////////////////////// einde blok check ////////////////////////////
?>

Blok 6 - Het inlogformulier

<?php
/////////////// BLOK inlog formulier
if (!isset($_SESSION['user'])) {
    ?>
    <form method="post">
        <div class="login">
            <input type="text" placeholder="Gebruikersnaam" name="user" required><br>
            <input type="password" placeholder="Wachtwoord" name="password" required><br>
            <input type="submit" value="Inloggen" name="login" class="btn">
        </div>
    </form>

    <?php
    //stop met verder uitvoeren van alle code die hieronder komt
    exit();
}
////////////////////// Einde blok inlogformulier
?>

Tips, bepaal een juiste volgorde van de scripts denk logisch na welke stappen het eerste uitgevoerd moeten worden.

Let op dat je wel een gebruiker in de database moet hebben zitten. Om gebruikers toe te voegen moet je het script gebruiken van de theorie.

Voortgang

Bekijk hier je voortgang

Keuzedeel


Docent kan klassen aanmaken en leerlingen volgen
Een docent kan op de profielpagina klassen aanmaken. Als een docent dat gedaan heeft, kunnen de leerlignen zich aan de klas koppelen. Als de leerlingen dat gedaan hebben, kan de docent de voortgang van de leerlingen volgen.

>> Profielpagina
  • Het arrangement Enigma - PHP en MySQL - MLI is gemaakt met Wikiwijs van Kennisnet. Wikiwijs is hét onderwijsplatform waar je leermiddelen zoekt, maakt en deelt.

    Auteur
    Menno Merlijn Je moet eerst inloggen om feedback aan de auteur te kunnen geven.
    Laatst gewijzigd
    2022-09-24 10:25:24
    Licentie

    Dit lesmateriaal is gepubliceerd onder de Creative Commons Naamsvermelding-GelijkDelen 4.0 Internationale licentie. Dit houdt in dat je onder de voorwaarde van naamsvermelding en publicatie onder dezelfde licentie vrij bent om:

    • het werk te delen - te kopiëren, te verspreiden en door te geven via elk medium of bestandsformaat
    • het werk te bewerken - te remixen, te veranderen en afgeleide werken te maken
    • voor alle doeleinden, inclusief commerciële doeleinden.

    Meer informatie over de CC Naamsvermelding-GelijkDelen 4.0 Internationale licentie.

    Het thema 'PHP en MySQL' is ontwikkeld door auteurs en medewerkers van Enigma-online.

    Fair Use
    In de modules van Enigma-online wordt gebruik gemaakt van beeld- en filmmateriaal dat beschikbaar is op internet. Bij het gebruik zijn we uitgegaan van fair use. Meer informatie: Fair use

    Mocht u vragen/opmerkingen hebben, neem dan contact op
    via de helpdesk VO-content .

    Aanvullende informatie over dit lesmateriaal

    Van dit lesmateriaal is de volgende aanvullende informatie beschikbaar:

    Toelichting
    Leren werken met een PHP, MySQL, USBWebserver
    Leerniveau
    HAVO 4; VWO 6; HAVO 5; VWO 4; VWO 5;
    Leerinhoud en doelen
    Informatica;
    Eindgebruiker
    leerling/student
    Moeilijkheidsgraad
    gemiddeld
    Trefwoorden
    arrangeerbaar, leerlijn, rearrangeerbare

    Gebruikte Wikiwijs Arrangementen

    VO-content Informatica. (2020).

    Module: Enigma - PHP en MySQL

    https://maken.wikiwijs.nl/157986/Module__Enigma___PHP_en_MySQL

  • Downloaden

    Het volledige arrangement is in de onderstaande formaten te downloaden.

    Metadata

    LTI

    Leeromgevingen die gebruik maken van LTI kunnen Wikiwijs arrangementen en toetsen afspelen en resultaten terugkoppelen. Hiervoor moet de leeromgeving wel bij Wikiwijs aangemeld zijn. Wil je gebruik maken van de LTI koppeling? Meld je aan via info@wikiwijs.nl met het verzoek om een LTI koppeling aan te gaan.

    Maak je al gebruik van LTI? Gebruik dan de onderstaande Launch URL’s.

    Arrangement

    IMSCC package

    Wil je de Launch URL’s niet los kopiëren, maar in één keer downloaden? Download dan de IMSCC package.

    Meer informatie voor ontwikkelaars

    Wikiwijs lesmateriaal kan worden gebruikt in een externe leeromgeving. Er kunnen koppelingen worden gemaakt en het lesmateriaal kan op verschillende manieren worden geëxporteerd. Meer informatie hierover kun je vinden op onze Developers Wiki.