Les 8

In deze les leert u wat lussen zijn. Lussen zijn zoals de benaming laat doorschemeren, stukjes code die steeds opnieuw worden uitgevoerd, totdat er aan een voorwaarde wordt voldaan om de lus te verlaten.

De if-else structuur

De if-else structuur is één van de meest gebruikte vormen van controle in elke programmeertaal. Als de uitdrukking waar is doen we dat, in het geval die niet waar is doen we dit. Met het dreigement van onze ouders wordt dit dan :

Als (de kamer is opgeruimd) {
     tv kijken
}
anders {
     geen TV kijken
}
In PHP taal wordt dit dan :


if (conditie) {
     A;
}
else {
     B;
}

Accolades gebruiken voor de blokken.

Een detail springt hier duidelijk in het oog, het gebruik van de accolades. Je hebt nu steeds geleerd dat elke instructie in php wordt afgesloten met een punt-komma. Welnu, expressies, functies en lussen worden gegroepeerd tussen accolades.
De if wordt altijd gevolgd door een conditie tussen haakjes. bijvoorbeeld if (a=10). Als A gelijk is aan 10 wordt opdracht 1 uitgevoerd, indien niet wordt opdracht 2 uitgevoerd. Tussen de accolades plaats je dan wat er moet gedaan worden. Let wel op , nu gebruiken we terug gewone PHP commando's en die moeten op hun beurt weer afgesloten worden met een punt-komma.


Vergeet nooit je open accolades af te sluiten met een gesloten accolade.



Om dit gemakkelijk te onthouden, van zodra je een open accolade intikt, tik dan direct de gesloten accolade ook. Werk dan verder tussen de accolades.


Ons voorbeeld is hier simpel, maar naargelang we verder gaan, zullen we dikwijls genoodzaakt zijn om eventueel nog een andere lus in een bestaande lus te integreren.
We gaan dit eens toetsen aan een voorbeeld.

<html>
<head>
<title>Man of Vrouw - Aan jouw de keuze</title>
</head>
<body>
<p>
<h1>Man of Vrouw, aan jouw de keuze</h1><br>
</p>
<form action="verwerken2.php" method="post">
Aanspreekvorm <input type="radio" name="titel" value="m"> Mijnheer
<input type="radio" name="titel" value="w"> Mevrouw<br><br>
Uw Naam : <input type="text" name="naam"><br><br>
<input type="submit" value="Versturen">
</form>
</body>
</html>

Code opslaan als manvrouw.html.


Pagina's waarin geen PHP code komt, kan je dus gewoon opslaan als een html document.



En we maken nu een nieuwe pagina verwerken2.php aan met volgende inhoud :

<?php
if ($_POST["titel"]=="m") {
echo " Goedendag Mijnheer ";
}
else {
echo "Goedendag Mevrouw ";
}
echo "<strong>" . $_POST["naam"] . "</strong> , leuk dat je er bent !\n<br>";
?>

En aktie !

Hoe werkt dit script nu ? In ons formulier hebben we nu radiobuttons, een tekst invoerveld en een knop versturen. De radiobuttons hebben de naam titel. Een kenmerk van een radiobutton is, dat je er maar één kunt aanvinken. In het geval dat je de radiobutton van Mijnheer aanvinkt, krijgt die dan de waarde m(an), in het andere geval krijgt die de waarde w(oman). In het tekst invoerveld tik je een naam. PHP ziet dit dan als volgt :


Radiobuttons moeten steeds dezelfde naam hebben. In de code bevat name="" dus voor alle radiobuttons dezelfde waarde. Het is de waarde dat tussen value="" bepaalt welke waarde de radiobutton gaat krijgen. Indien je ziet dat je in je formulier meerdere radiobuttons kunt aanvinken, dan is daar de fout te zoeken.



$_POST["titel"]="m" of "w"
$_POST["naam"]="Wat jij ingetikt hebt"
$_POST["submit"]="Versturen"

Dan gaan we in het formulier verwerken2.php eerst na wat de variabele $_POST["titel"] bevat. Is dit een m dan printen we goedendag Mijnheer af, indien het geen m is kan het enkel en alleen een w zijn, en in dat geval printen we goedendag Mevrouw af gevolgd door de waarde $_POST["naam"], zijnde de naam die jij ingetikt hebt.

We gebruiken hier nu voor het eerst een vergelijkingsoperator, is gelijk aan. if ($_POST["titel"]=="m"). Zoals je kunt merken gebruiken we == en niet =. Aangezien de waarde m een string is, wordt die tussen haakjes geplaatst om te vergelijken. We hebben natuurlijk nog andere vergelijkingsoperatoren, hier zijn ze :

De vergelijkingsoperatoren

 

Operator

Betekenis

==

  gelijk aan

!=

  niet gelijk aan

> 

  groter dan

< 

  kleiner dan

>=

  groter of gelijk aan

<=

  kleiner of gelijk aan

&& of and

  logische en, alle expressies moeten waar zijn

|| of or

  logische of, minstens één van de expressies moet waar zijn


 

De vergelijkings operator is gelijk aan wordt met 2 is gelijk aan tekens geschreven (==). Het is de macht der gewoonte dat je geneigd bent om te schrijven a=b in de plaats van a==b.


Ons formulier heeft nu wel nog een foutje. Stel je eens voor dat de bezoeker van je site rechtstreeks op verwerken2.php terecht komt, of dat je bezoeker vergeten of verzuimd heeft aan te duiden of hij man of vrouw is. Dat zal fouten opleveren.

De if structuur werd speciaal bedacht om die fouten te controleren. Te samen met de functie isset() zullen we controleren of alle velden in ons document werden ingevuld.

De functie isset()

We maken nu een nieuw document aan met de naam verwerken3.php met  volgende code :

<?php
    if (isset($_POST["titel"]) && isset($_POST["naam"]) && $_POST["naam"]!="") {
        if ($_POST["titel"]=="m") {
            echo " Goedendag Mijnheer ";
        }
        else {
            echo "Goedendag Mevrouw ";
        }
        echo "<strong>" . $_POST["naam"] . "</strong> , leuk dat je er bent !\n<br>";
    }
    else {
        echo "Gelieve alle velden in te vullen a.u.b.\n<br>";
    }
?>

We maken vervolgens een nieuw document aan  formulier3.html met  volgende code :

<html>
<head>
<title>Man of Vrouw - Aan jouw de keuze</title>
</head>
<body>
<p>
<h1>Man of Vrouw, aan jouw de keuze</h1><br>
</p>
<form action="verwerken3.php" method="post">
Aanspreekvorm <input type="radio" name="titel" value="m"> Mijnheer
<input type="radio" name="titel" value="w"> Mevrouw<br><br>
Uw Naam : <input type="text" name="naam"><br><br>
<input type="submit" value="Versturen">
</form>
</body>
</html>

Wat hebben we nu gedaan ? Wel, door middel van de functie isset() controleren wij of alle velden correct zijn ingevuld. Met isset($_POST["titel"]) controleren we of er een radiobutton is aangevinkt. Nu is het zo, dat je niet verplicht bent om een naam in te tikken. PHP zal gewoon een lege string invoegen als je dat veld niet hebt ingevuld. Om dat te verhinderen kijken we of er iets ingevuld is met $_POST["naam"]!="") wat betekent dat $_POST["naam"] niet ledig mag zijn.

Je ziet dat we hier nu verschillende operatoren gebruiken, de && operator is hier belangrijk, dit wil zeggen dat aan alle voorwaarden voldaan moet worden. Wat indien aan één voorwaarde niet voldaan wordt ? Wel, daar heb ik onderaan een else opdarcht bijgevoegd die in dit geval dan print dat je alle velden moet invullen.


Bij het gebruik van de operator and (&&) moeten aan alle voorwaarden voldaan zijn. Indien aan één voorwaarde niet wordt voldaan, wordt de bijhorende code niet uitgevoerd.


Dit is hier dan ook een klassiek voorbeeld van genestelde if blokken. Zoals je ziet hou ik de blokken te samen door tab-spaties in te voegen, zodat je weet welke IF en ELSE blok bij elkaar horen. Kijk ook naar de plaats van de accolades. Als je dit op die manier te samen houdt zul je fouten rapper kunnen opsporen.

Kijk naar de pijltjes die ik plaatste bij de accolades.



En aktie !


De $_SERVER['PHP_SELF'] variabele

We hebben nu steeds gezien dat de actie in een formulier steeds verwijst naar een andere pagina. Wat als je nu wenst dat alles op hetzelfde formulier wordt weergegeven ? De inhoud van de $_SERVER['PHP_SELF'] variabele is altijd de naam van de huidige pagina die afgebeeld wordt in je browser. Let op de schrijfwijze. Dit is één van die defined variables, waar het aangeraden wordt de PHP_SELF variabele tussen enkele quotes te plaatsen tussen de vierkante haakjes. We maken nu volgende code aan in onze editor :

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
Aanspreekvorm <input type="radio" name="titel" value="m"> Mijnheer
<input type="radio" name="titel" value="w"> Mevrouw<br><br>
Uw Naam : <input type="text" name="naam"><br><br>
<input type="submit" name="versturen" value="Versturen">
</form>
<hr> <br>
<?php
    if (isset($_POST["titel"]) && isset($_POST["naam"]) && $_POST["naam"]!="") {
    if ($_POST["titel"]=="m") {
        echo " Goedendag Mijnheer ";
    }
    else {
        echo "Goedendag Mevrouw ";
    }
    echo "<strong>" . $_POST["naam"] . "</strong> , leuk dat je er bent !\n<br>";
    }
    else {
        if (isset($_POST["versturen"])) {
        echo "Gelieve alle velden in te vullen a.u.b.\n<br>";
    }
    }
?>

En slaan deze op als formulier5.php.

Wat hebben we nu aangepast en wat is er anders ? We hebben nu onze knop versturen een naam gegeven nl :<input type="submit" name="versturen" value="Versturen"> Vervolgens heb ik een <hr> <br> toegevoegd op het einde van het formulier. Verder heb ik hier een nieuwe isset functie toegevoegd in de else instructie, nl : if (isset($_POST["versturen"])) { en daartoe ook nog een extra accolade om deze isset af te sluiten.

Als je nu formulier5.php oproept, gegevens invult en op de knop versturen klikt, dan zal hetgeen je ingetikt hebben verschijnen onder de horizontale lijn, in tegenstelling tot de voorbeelden die we gebruikt hebben, waar hetgeen je ingetikt had, steeds op een andere pagina werd verwerkt.

En aktie !

Waarom nu onze knop voorzien van een naam ? Wel, daaraan koppel ik de tweede isset funtkie in de else instructie. Door deze isset functie wordt voorkomen dat het echo commando wordt uitgevoerd bij het openen van de pagina. Zolang je niet klikt op de knop versturen wordt het echo commando niet uitgevoerd, als je op de knop klikt en je hebt één of meerdere gegevens niet ingevuld, dan pas wordt het echo commando uitgevoerd.

Bij het openen van het formulier5.php krijg je nu gewoon de html pagina te zien zoals we al gewoon waren. We willen nu dat de gebruiker aanvinkt of ie man of vrouw is en vervolgens dat hij zijn naam intikt. We willen wel dat hij alle informatie verplicht moet invullen, zoniet, krijgt hij te zien dat hij alle velden moet invullen.

Als de gegevens zijn ingevuld kijken we door middel van de eerste isset functie of alles is ingevuld, zo ja, dan printen we Goedendag Mijnheer/Mevrouw naam , leuk dat je er bent !. Als we nu die tweede isset functie niet invoegen, zal dadelijk onder de horizontale lijn ook al staan : Gelieve alle velden in te vullen a.u.b. In dit voorbeeld is dit niet erg, zo weet de gebruiker dat hij alle velden moet invullen. Door middel van de tweede isset functie gaan we na of er al op de knop is geklikt of niet. Zolang je niet klikt op de knop is de variabele $_POST["versturen"] ledig. Op het ogenblik dat je erop klikt, krijgt hij de waarde "Versturen".

We zitten hier in een if-else lus. Dus als aan de voorwaarden van de if wordt voldaan wordt gewoon de if lus afgewerkt. Indien aan één van de voorwaarden niet wordt voldaan, dan pas wordt de else lus afgewerkt. Dus, je vinkt een optie aan, vult een naam in en klikt op de knop versturen. Aan alle voorwaarden wordt voldaan dus er wordt afgedrukt dat het leuk is om jouw te zien. Als er nu echter aan één voorwaarde niet voldaan wordt, dan is het de beurt aan de else lus om jouw er attent op te maken dat je alle velden moet invullen. Als we dit nu niet controleren via de isset functie of je al dan niet op de knop heb geklikt, dan is er aan geen enkele voorwaarde van de if lus voldaan tijdens het openen van de pagina, en wordt bijgevolg de esle lus van toepassing, zodat hij direkt print dat je alle velden moet invullen. Door die tweede isset functie toe te voegen, wordt tijdens het openen van de pagina noch aan de if lus, noch aan de else lus voldaan, waarop er .... inderdaad niets gebeurt.:-)

Als je nu formulier5.php opvraagt, dan zul je zien dat de gegevens die je invulde terug verdwenen zijn als je de foutmedling krijgt dat je alle gegevens moet invullen. In ons voorbeeld moet je niet veel tikken, maar stel je voor dat je heel wat velden hebt moeten invullen, en als je dan klikt op de knop versturen, wordt je doodleuk verteld dat je iets vergeten hebt van in te vullen, en je kunt helemaal opnieuw beginnen. Ik ben het al meer dan eens tegengekomen bij het invullen van een formulier, en dat was telkens vloeken als ik moest herbeginnen.

Wel, wij willen niet dat onze bezoekers op onze site moeten vloeken, dus gaan we daar een mouw aanpassen. Je hebt nu steeds gezien dat je aan de velden in je formulier een naam en een waarde toekent. Wel we gaan nu gewoon een dynamische waarde toekennen aan onze velden. Als de pagina dan de eerste maal geladen wordt, zal de naam ledig zijn, maar van zodra we iets ingetikt hebben zal de naam de waarde aannemen van wat we ingetikt hebben. Als ze je dan terugsturen om meer gegevens in te vulllen, zullen de waarden die we reeds ingevuld hadden, netjes door PHP worden terug geplaatst.

We nemen hier terug on formulier5.php dat we kopiëren naar formulier6.php dat we dan wat gaan aanpassen :

Voorbeeld formulier6.php

<form action="<?php echo $_SERVER[PHP_SELF]; ?>" method="post">
Aanspreekvorm <input type="radio" name="titel" value="m"
<?php if (isset ($_POST["titel"]) && $_POST["titel"]=="m") {echo " checked=\"checked\"";}?>> Mijnheer

<input type="radio" name="titel" value="w"

<?php if (isset ($_POST["titel"]) && $_POST["titel"]=="w") {echo " checked=\"checked\"";}?>> Mevrouw

<br><br>

Uw Naam : <input type="text" name="naam" value="<?php if (isset($_POST["naam"])) { echo $_POST["naam"];} ?>" >

<br><br>


<input type="submit" name="versturen" value="Versturen">
</form>
<hr><br>
<?php
    if (isset($_POST["titel"]) && isset($_POST["naam"]) && $_POST["naam"]!="") {
    if ($_POST["titel"]=="m") {
        echo " Goedendag Mijnheer ";
    }
    else {
        echo "Goedendag Mevrouw ";
    }
    echo "<strong>" . $_POST["naam"] . "</strong> , leuk dat je er bent !\n<br>";
    }
    else {
    if (isset($_POST["versturen"])) {
        echo "Gelieve alle velden in te vullen a.u.b.\n<br>";
    }
    }
?>

Ganse boterham niet ? Zoals je nu ziet geef ik in de input lijn het veld een waarde. Wat is die waarde ? Wel eenvoudig, we gebruiken nu terug de PHP code met de functie isset om de waarde van naam te controleren. Als je het formulier nu voor de eerste keer oproept, is die waarde gelijk aan 0 of ledig. Van zodra je nu iets intikt in het invoerveld, zal $_POST["naam"] de waarde aannemen van wat je intikt. Als je nu vergeet van een radiobutton aan te vinken, en je klikt op de knop versturen, krijg je te zien dat je alle velden moet invullen, waarop de pagina wordt herladen. Nu als de pagina wordt herladen, heeft de variabele $_POST["naam"] nog steeds de waarde van wat jij eerder hebt ingetikt, en wordt die dan ook overeenkomstig al terug ingevuld.

Hetzelfde voor de radiobuttons. De eerste maal heeft die geen waarde, maar van zodra je er ééntje hebt aangevinkt, wordt bij een reload van de pagina de gekozen radiobutton terug aangevinkt. Dat bereiken we door de waarde "checked" te specifiëren indien je er ééntje aanvinkt.
Zo zie je maar dat je gewoon PHP code dooreen de HTML syntax kunt mengen zonder problemen. Let nu wel op, de code staat wel degelijk in de input lijn, want zij maakt er deel van uit. De originele input lijn was :

Uw Naam : <input type="text" name="naam">

En de nieuwe lijn wordt dan :

Uw Naam : <input type="text" name="naam" value="<?php if (isset($_POST["naam"])) { echo $_POST["naam"];} ?>" >

Let dus op de aanhalingstekens en de haakjes. De input lijn begint met een haakje en eindigt met een haakje.

En aktie !

Het begint leuk te worden, niet ? We gaan het nog leuker maken. Stel je nu eens voor dat je al die namen die ze bij jouw ingeven dienen om lid te worden van het één of het andere en dat ze dan een boekje toegestuurd krijgen. Als die persoon nu eens O 'Hara heet ? Die man kan daar wel niets aan doen, maar hij zal nooit een boekje krijgen. Probeer gewoon eens die naam in te geven en klik op versturen, het resultaat is :

Goedendag Mijnheer O \'Hara , leuk dat je er bent !

En aktie !

Als je dit moet verwerken in een database, kun je het gewoon vergeten. Wat gebeurt hier nu ? Herinner je het escapen van karakters ? Wel PHP doet dit auto voor jouw hier. Fijn van PHP, maar dit willen we niet. We willen dat O 'Hara correct in onze ledenlijst wordt opgenomen en dat zijn naam correct wordt weergegeven.

Denk ook maar eens aan een gastenboek, tikfouten zijn rap gebeurd, en van zodra je speciale tekens gaat invoeren of verkeerdelijk gaat invoeren zal de PHP code gebroken worden. Daar is wel een mouw aan te passen.

De functie htmlspecialchars()

Om alle karakters die onder HTML een speciale betekenis hebben correct weer te geven op een HTML-pagina gebruiken we de functie htmlspecialvars($variabele). Deze functie zal al deze tekens omzetten naar hun HTML equivalent.
 

Het karakter

wordt

en betekent

<

&lt;

kleiner dan

> 

&gt;

groter dan

&

&amp;

ampersand

"

&quot;

aanhalingsteken



Voor zover dan de speciale HTML tekens, wat nu voor backslashes ? Om die correct weer te geven hebben we de speciale functie stripslashes().

De functie stripslashes()

Deze functie verwijdert alle backslashes in een tekenreeks. Backslashes, dubbele backslashes die het escapen mogelijk maken van een backslash. De syntax van de functie is stripslashes($variabele).
Om dit nu toe te passen op onze pagina, moeten we alleen de code lichtjes aanpassen als volgt  :


<form action="<?php echo $_SERVER[PHP_SELF]; ?>" method="post">
<?php
$naam=$_POST["naam"];
$titel=$_POST["titel"];
$versturen=$_POST["versturen"];
?>
Aanspreekvorm <input type="radio" name="titel" value="m"<?php if (isset ($naam) && $titel=="m")
{echo " checked=\"checked\"";}?>> Mijnheer
<input type="radio" name="titel" value="w"<?php if (isset ($titel) && $titel=="w") {echo " checked=\"checked\"";}?>>
Mevrouw<br><br>
Uw Naam : <input type="text" name="naam" value="<?php if (isset($naam)) {$naam=htmlspecialchars($naam);
$naam=stripslashes($naam); echo $naam;} ?>" ><br><br>
<input type="submit" name="versturen" value="Versturen">
</form>
<hr><br>
<?php
    if (isset($titel) && isset($naam) && $naam !="") {
    if ($titel=="m") {
        echo " Goedendag Mijnheer ";
    }
    else {
        echo "Goedendag Mevrouw ";
    }
    echo "<strong>" . $naam . "</strong> , leuk dat je er bent !\n<br>";
    }
    else {
    if (isset($versturen)) {
        echo "Gelieve alle velden in te vullen a.u.b.\n<br>";
    }
    }
?>

Code opslaan als formulier7.php.

Ik heb hier de pagina wat leesbaarder gemaakt, zoals je kunt zien. In plaats van steeds te werken met die $_POST["variabel"] heb ik in het begin nu de waarde toegekend aan een makkelijker te manipuleren variabele.

<?php
$naam=$_POST["naam"];
$titel=$_POST["titel"];
$versturen=$_POST["versturen"];
?>

Dit maakt het tikken eenvoudiger en zo zal ik in het vervolg ook mijn pagina's opmaken.
De regel die nu opnieuw werd aangepast is :

Uw Naam : <input type="text" name="naam" value="<?php if (isset($naam)) {$naam=htmlspecialchars($naam); $naam=stripslashes($naam); echo $naam;} ?>" ><br><br>

Zoals je ziet gebruik ik eerst de htmlspecialchars op de variabele $naam en daarna de stripslashes op dezelfde variabele. Run nu opnieuw formulier6.php en vul maar eens als naam in :

s"erg/e>terr<y'n  (kopieer de naam en plak hem in het formulier)

Het resultaat zal nu zijn :

Goedendag Mijnheer s"erg/e>terr<y'n , leuk dat je er bent !

En aktie !

En dat is exact wat we intikten. Kijk nu eens naar de bonpagina en je zult zien dat alle tekens netjes in hun HTML-equivalent werden omgezet. En nu zal O 'Hara zijn naam wel correct worden weergegeven en zal hij ook zijn boekje krijgen :-)

Belangrijke opmerking !

Om dit zo aan de praat te krijgen moet je php.ini file juist geconfigureerd worden. Normaal zou dit goed moeten staan. Indien jij niet hetzelfde resultaat krijgt in je browser, maar in plaats van 1 backslash er meerdere krijgt, ga je de php.ini file moetan aanpassen. Open deze file en zoek naar de regel magic_quotes_gpc = Off  en verander dit in magic_quotes_gpc = On. Dan je webserver herstarten en alles zou correct moeten werken. ( Uit ervaring weet ik dat Slackware bijvoorbeeld deze magic_quotes op Off heeft staan )

De functie strtr()

Met deze functie is het mogelijk om bepaalde karakters te vervangen door een ander. Stel nu, je hebt een prijslijst samengesteld en in plaats van dollars moesten het ponden zijn. Hoe we ganse teksten inlezen en veranderen zien we wat later, stel nu dat de prijs die getoond wordt $40 is maar het moest £40 zijn, wel dat doen we dan als volgt :

$prijs=strtr($prijs,"$","£");

In de variabele $prijs, veranderen we het $ teken door een £ teken.

De functie nl2br()

nl2br staat voor newline to break, wat betekent dat als je een commentaar hoekje hebt op je site bijvoorbeeld, en iemand tikt wat commentaar in, telkens hij op de enter toets drukt om een nieuwe lijn te starten, deze automatisch gaat vertaald worden naar een HTML <br>
We maken nu een nieuw document aan met volgende code :

<form action="<?php echo $_SERVER[PHP_SELF]; ?>" method="post">
<?php
$naam=$_POST["naam"];
$titel=$_POST["titel"];
$versturen=$_POST["versturen"];
$commentaar=$_POST["commentaar"];
?>
Aanspreekvorm <input type="radio" name="titel" value="m"<?php if (isset ($naam) && $titel=="m") {echo " checked=\"checked\"";}?>> Mijnheer
<input type="radio" name="titel" value="w"<?php if (isset ($titel) && $titel=="w") {echo " checked=\"checked\"";}?>> Mevrouw<br><br>
Uw Naam : <input type="text" name="naam" value="<?php if (isset($naam)) {$naam=htmlspecialchars($naam); $naam=stripslashes($naam); echo $naam;} ?>" ><br><br>

Uw commentaar : <br>
<textarea name="commentaar" cols="60" rows="4" wrap="soft">
<?php
if (isset ($commentaar)){
$commentaar=htmlspecialchars($commentaar);
$commentaar=stripslashes($commentaar);
echo $commentaar; }
?>
</textarea>
<br><br>
<input type="submit" name="versturen" value="Versturen">
</form>
<hr><br>
<?php
    if (isset($titel) && isset($naam) && $naam !="") {
    if ($titel=="m") {
        echo " Goedendag Mijnheer ";
    }
    else {
        echo "Goedendag Mevrouw ";
    }
    echo "<strong>" . $naam . "</strong> , leuk dat je er bent !\n<br><hr>";
    echo "<strong>Uw commentaar was : </strong><br><br>\n";
    $commentaar=nl2br($commentaar);
    $commentaar=strtr($commentaar,"$","£");
    echo "<strong>$commentaar</strong>";
    }
    else {
    if (isset($versturen)) {
        echo "Gelieve alle velden in te vullen a.u.b.\n<br>";
    }
    }
?>

En we slaan het op als formulier8.php
 
Tik nu om het even wat voor tekst in en klik dan op de knop versturen. Je zult nu zien dat de tekst letterlijk wordt weergegeven zoals je die hebt ingetikt.
Tik nu ook even in de commentaar box : Ik heb $40 betaald voor die modem. Je zult zien als je op de knop versturen klikt, je opeens £40 zult betaald hebben, heel wat duurder als je het mij vraagt :-)

En aktie !



Pas dus op met die functie strtr(), hij zal overal waar hij het $ teken tegenkomt, deze vervangen door het £ teken.


Verschillende lus structuren.

Stel je eens de volgende situatie voor. Je zit in een kamer en de enige mogelijkheid om die kamer te verlaten, is via een glazen deur, waarachter een bewaker zit. Deze bewaker heeft niets anders te doen dan daar te zitten, en hoge studies moet je daarvoor niet hebben gedaan, met andere woorden, het is een analfabeet. Aan de muren in de kamer waar je zit, hangen bordjes met cijfers erop van 1 tot 100. De analfabeet heeft ook dergelijke bordjes, en trekt er willekeurig eentje uit. Nu moet jij het eerste bordje van de muur nemen (nr 1), naar de glazen deur gaan, en het bordje tonen aan de bewaker, die het zorgvuldig met het zijne vergelijkt. Klopt het niet, dan moet jij je bordje terug hangen en het volgende nemen (nr 2) en terug gaan tonen aan de bewaker enz…. Van zodra jouw bordje met het zijne klopt, opent die de deur voor jou.

Dat brengt ons bij onze eerste lus, de do ... while.

De do-while lus

Doe {
        toon het bordje aan de bewaker;
        }
zolang (jouw bordje niet gelijk is aan dit van de bewaker - hang je bordje terug en toon het volgende);
De bordjes zijn gelijk en de deur gaat open;
Stel nu dat de bewaker het bordje heeft met het nummer 34 op ($zijnnummer). Onze lus do...while wordt dan onder PHP :

<?php
do {
        toon een bordje aan de bewaker;
        }
while ( jouw bordje != $zijnnummer );
        jouw bordje is gelijk, de deur gaat open;
?>

<?php
$zijnnummer="34";
do {
        $nummer = $onsnummer;
        }
while ($nummer != $zijnnummer);
        hij opent de deur;
?>

Zoals je kunt zien, geven we hier de variabele de waarde van ons nummer, zijnde 100. De while vergelijkt dan de waarde van ons nummer met dit van de bewaker, en enkel en alleen indien ons nummer overeenkomt komt met het zijne, wordt de opdracht "hij opent de deur" uitgevoerd. Dus aan ons om opnieuw de variabele $nummer van een ander getal te voorzien.

Stel je nu eens voor, dat er daar een plezante jongen rondloopt, die tussen de bordjes van de bewaker er ééntje heeft gestoken met de letters AD op. Dan bestaat er maar één mogelijkheid om uit die kamer te geraken, namelijk door de glazen deur stuk te trappen. ( onder unix ctrl+c en onder windows ctrl+alt+del ). Dit noemen ze dan een oneindige lus, die enkel kan verlaten worden door actie van de gebruiker van het programma.
Nu, dat lijkt allemaal plezant, maar het is een veel voorkomende fout van beginnende programmeurs. Als je appels met peren vergelijkt kun je dit tegenkomen. Daarom dat je goed moet nadenken bij het opstellen van een do-while lus.

Nu gaan we een teller invoeren. Onder de lussen is dat de normaalste zaak van de wereld. Je zult veel met tellers werken. Ze zijn niet weg te denken uit de lussen. Om op ons voorbeeld terug te keren, we voeren nu een teller in, in de do instructie, kennen de waarde van de teller toe aan $onsnummer en vergelijken dan $onsnummer met $zijnnummer. Als het nummer niet klopt, dan verhogen we de teller met 1 en beginnen we opnieuw. Als het nummer dan klopt, tonen we het bericht "De nummers stemmen overeen !".

<?php
# het getal van de bewaker = 34
$zijnnummer=34;

do {
    $onsnummer=$teller;
    $teller++;
    }
while ($onsnummer != $zijnnummer);
    echo "De nummers stemmen overeen<br>\n";
?>

En we slaan deze code op als dowhile.php.

En aktie !

Als je nu het script runt, ga je enkel in je browser zien : De nummers stemmen overeen.
We gaan nu nog een stapje verder. We laten nu ook afprinten hoeveel maal wij weg en weer hebben gelopen tot we het juiste nummer hadden. Wij gaan dan printen "Na zoveel pogingen stemden de nummers overeen !"

<?php
# het getal van de bewaker = 34

$zijnnummer=34;
do {
    $onsnummer=$teller;
    $teller++;
    }
while ($onsnummer != $zijnnummer);
    echo "Na $teller pogingen stemden de nummers overeen<br>\n";
?>


En we slaan de code op als dowhile2.php.

En aktie !

Nu, wat zie je ? Wel dat we 35 pogingen nodig hadden om het juiste nummer te vinden. Wel dit klopt niet, aangezien de bewaker zijn nummer 34 is, en wij dus ook maar 34 pogingen nodig moeten hebben om het nummer te raden.  Waar ligt de fout ? Wel, als ons nummer gelijk is aan dat van de bewaker, wordt de teller alsnog met 1 verhoogd. Aangezien we hier de waarde van de teller gebruiken voor het aantal keren dat we een bordje getoond hebben, zal deze teller steeds 1 waarde teveel tellen.

Als we de beginwaarde van de variabele teller niet op 1 plaatsen, zal de lus in feite 35 maal doorlopen worden, maar dit kan je niet zien in het eindresultaat. Dus we beginnen met onze teller op 1 te plaatsen, we stellen ons nummer gelijk aan de waarde van de teller, printen vervolgens de waarde van ons nummer en van de teller af, dan verhogen we de teller met 1. Als ons getal gelijk is aan dat van de bewaker, voeren we de while code uit, en printen we dan nog eens de waarde van ons nummer af, alsook de waarde van de teller, die het aantal pogingen moet tonen. Je ziet dan duidelijk dat we 34 pogingen moeten doen om aan het nr 34 te geraken, maar dat de teller toch op 35 staat.

<?php
$teller="1";
 # het getal van de bewaker = 34
$zijnnummer=34;
do {
    $onsnummer=$teller;
    Echo "onsnummer = $onsnummer en de teller = $teller<br>";
    $teller++;
    }
while ($onsnummer != $zijnnummer);
           Echo "onsnummer = $onsnummer en de teller = $teller<br>";
    echo "Na $teller pogingen stemden de nummers overeen<br>\n";
?>

Sla de code op als dowhile3.php en als je nu het script runt, ga je de fout zien.

En aktie !

Hoe kunnen we dit oplossen op een elegante manier ? Heel eenvoudig, door er een tweede teller bij te plaatsen. Deze tweede teller geven we dan de waarde van de teller, voordat die verhoogd wordt. Laten we onze tweede teller de naam poging geven en we passen het script aan op volgende wijze :

<?php
$teller="1";
 # het getal van de bewaker = 34
$zijnnummer=34;
do {
    $onsnummer=$teller;
    Echo "onsnummer = $onsnummer en de teller = $teller<br>";
    $poging=$teller;
    $teller++;
    }
while ($onsnummer != $zijnnummer);
           Echo "onsnummer = $onsnummer en de teller = $teller<br>";
    echo "Na $poging pogingen stemden de nummers overeen<br>\n";
?>

En sla deze code op als dowhile4.php.

Als je vervolgens het script uitvoert, ga je zien dat onze pogingen nu wel kloppen. Let wel dat ik nu op regel 13 $teller door $poging heb vervangen.
Om onze pogingen af te printen, gebruiken we dan ook niet meer de waarde van de $teller maar de waarde van $poging wat dan het correcte resultaat oplevert.

En aktie !

Zoals ik jullie zei, met die tellers gaan we nog veel plezier beleven. Kijk ook goed naar de plaats waar je een teller plaatst in het script. Stel je eens voor dat je $teller++; als eerste instructie plaatst in de do routine. Als de waarde die we zoeken O (nul) is, heb je dan meteen prijs. Je eerste eindeloze lus is dan gecreëerd. Zoals ik reeds zei in het begin van de cursus, ben je onder PHP niet verplicht van je variabelen op voorhand te definiëren. Hier gebruiken we voor de eerste maal $teller, en de waarde van $teller wordt dan ook door PHP op 0 (nul) geplaatst. Als je nu direct $teller++; doet in plaats van na de instructie die $onsnummer de waarde van $teller geeft, kan $onsnummer dus nooit 0 (nul) zijn. Bijgevolg zal de enige manier om het script te onderbreken, de bekende toetsaanslagen zijn.

Hopelijk begrijpen jullie dit goed, want we gaan nu ons script verder uitbreiden. Nu heeft onze bewaker het nummer 34, omdat wij het hem hebben gegeven. Fijn is echter om de bewaker zijn eigen nummer te laten trekken, en dan te kijken welk nummer hij had. Daarvoor beschikt PHP over de functie srand.

De functie rand()

Met de functie rand (random) is het mogelijk om random getallen te laten genereren door de computer. Rand neemt als argument een minimum waarde en een maximumwaarde. vb rand(minimum, maximum). Wil je nu een willekeurig getal laten trekken dat tussen 1 en 100 ligt, roep je rand aan als volgt : rand(1, 100).

In ons voorbeeld laten we de bewaker een nummer trekken tussen 1 en 100 en kennen we dit toe aan de variabele $zijnnummer. Om dit te bereiken gaan we als volgt te werk :

<?php
# het getal van de bewaker laten trekken door de computer

$zijnnummer=rand(1, 100);
$teller=1;

do {
    $onsnummer=$teller;
    $poging=$teller;
    Echo "zijn nummer = $zijnnummer, ons nummer = $onsnummer en we zijn toe aan poging $poging om het nummer te raden<br>\n";
    $teller++;
    }
while ($onsnummer != $zijnnummer);
    echo "Na $poging pogingen stemden de nummers overeen<br>\n";
?>

Sla de code op als dowhile5.php. Run nu gewoon het script. Je zal nu te zien krijgen welk nummer de computer willekeurig heeft getrokken en ons aantal pogingen om dit nummer correct te raden zal gelijk zijn aan deze waarde. Als je op de reload button van je browser klikt, zal een nieuw nummer worden getrokken.

En aktie !

De while lus

Dit is één van de meest gebruikte lussen te samen met de for lus. De while lus gebruiken we als volgt :

zolang ( aan een bepaalde voorwaarde al dan niet wordt voldaan ) {
voer deze code uit;
}

Met ons vorig voorbeeld wordt dat :

Zolang ( het bordje van de bewaker niet gelijk is aan het onze ) {
Loop naar de muur en neem het volgende bordje;
}

While ($zijnnummer != $onsnummer) {
    $teller++;
}

En de volledige code schrijven we als volgt :

<?php
$zijnnummer=rand(1, 100);
$teller=1;
while($teller != $zijnnummer) {
    echo "Zijn nummer = $zijnnummer en dit is poging $teller om het te raden <br>\n";
    $teller++;    
}
echo "Zijn nummer = $zijnnummer en dit is poging $teller  om het te raden <br>\n";
?>

Sla deze code op als whilelus.php en run het script. Je ziet dat deze lus exact hetzelfde doet als de voorgaande, alleen heb je hier minder code nodig. We hebben hier geen extra teller nodig, aangezien de teller deze maal niet verhoogd zal worden als de teller gelijk is aan zijn nummer. Van zodra de teller gelijk is aan het nummer van de bewaker wordt de code tussen de accolades niet meer uitgevoerd, en bevat onze teller dan de juiste waarde van het aantal pogingen die we deden om het nummer te raden. Als we MySQL gaan betrekken in dit boek, ga je zien dat we veelvuldig gebruik gaan maken van deze lus.

En aktie !

De for lus.

De for lus is een ander kanjer van formaat. Deze wordt samen met de while lus waarschijnlijk door iedere progammeur het meest gebruikt.
De for-lus wordt aangemaakt met drie condities, gescheiden door een punt-komma.  
Ik denk dat ik duidelijk ben geweest, de condities worden gescheiden door een punt-komma. Als je een for-lus aanmaakt, zal hij steeds zoeken naar die twee punt-komma's. Ook al heb je één van die condities niet nodig, de punt-komma moet er staan !

De for-lus wordt als volgt geschreven :

for (variabel_nummer; conditie; teller) {
        code tot zolang aan de conditie wordt voldaan
}
Uit ons voorbeeld van de bewaker wordt dit :

for ($teller=1;$teller <= $zijnnumer;$teller++) {
        $poging=$teller;
}

We gaan nu terug ons vorig voorbeeld gebruiken met volgende code :

<?php
$zijnnummer=rand(1,100);
for($teller=1;$teller!=$zijnnummer;$teller++){
    echo "teller = $teller en zijn nummer = $zijnnummer en we zijn toe aan poging $teller om het te raden<br>\n";
}
echo "teller = $teller en zijn nummer = $zijnnummer en we zijn toe aan poging $teller om het te raden<br>\n";
?>

En we slaan dit op als forlus.php. Run het script nu, en je ziet dat het resultaat terug hetzelfde is. Met de forlus hoeven we de $teller niet meer op voorhand initialiseren op 1, aangezien we dit nu in de lus zelf doen.

En aktie !

Ik kom terug op die punt-komma's. Zoals gezegd moet je onder PHP je variabelen niet op voorhand definïeren. Als ik de $teller niet op 1 plaats, zal PHP voor mij de waarde 0 (nul) toe kennen aan $teller. Dus ik kan de for-lus schrijven zonder de $teller=1. Ik doe dit dan als volgt :

<?php
$teller="1";
$zijnnummer=rand(1,100);
for(;$teller!=$zijnnummer;$teller++){
    echo "teller = $teller en zijn nummer = $zijnnummer en we zijn toe aan poging $teller om het te raden<br>\n";
}
echo "teller = $teller en zijn nummer = $zijnnummer en we zijn toe aan poging $teller om het te raden<br>\n";
?>

Sla de code op als forlus2.php en als je het script uitvoert, krijg je nu terug dezelfde uitvoer. Kijk nu aandachtig naar regel 4. Ik laat hier nu $teller=1 weg, maar ik moet wel de punt-komma plaatsen die normaal achter $teller=1 stond. Aangezien ik hier nu de teller niet definieer, zet ik in het begin van het script dan de $teller op 1.

En aktie !


De for-lus verwacht 3 argumenten, gescheiden door een punt-komma. Als je één argument weglaat, ben je wel verplicht om de punt-komma aan te houden. Een for-lus heeft dus steeds twee punt-komma's tussen de ronde haakjes staan.


En nu dan de laatste en geniaalste for-lus die zijn introductie deed sedert PHP4, namelijk de foreach-lus.

De foreach lus.

Foreach loopt doorheen een array en geeft de waarden terug die erin zijn geregistreerd. Foreach kun je gebruiken onder 2 vormen :

1. De verkorte vorm zonder sleutel

voor elke (element in de array -met- waarde) {
        toon de waarde van het array(element);
}

In Nederlandse taal, doorloop de array, kijk naar de waarde en print die vervolgens af. Onder PHP schrijven we dit als :
foreach ($array as $value) {
        echo "$value
\n;
}

Herinner je  nog onze arrays over de dagen van de week ?  We gaan nu terug een voorbeeld aanmaken aan de hand van de dagen van de week.

<?php
# Onze array definiëren
$dag[0]="Zondag";
$dag[1]="Maandag";
$dag[2]="Disndag";
$dag[3]="Woensdag";
$dag[4]="Donderdag";
$dag[5]="Vrijdag";
$dag[6]="Zaterdag";

foreach ($dag as $value) {
    echo "$value<br>\n";
}
?>

Sla deze code op als foreach.php.

En aktie !

Als je dit nu uitvoert, zouden alle dagen van de week netjes moeten worden afgeprint. Dus wat doet foreach eigenlijk ? Hij doorloopt onze array $dag en geeft alle waarden terug die hij erin terug vindt.

2. De lange vorm met sleutel.

Hier zijn we dan terug met onze associatieve arrays. Deze vorm van foreach doorloopt een hashmap en toont daarbij elk element en zijn sleutel. De syntax is als volgt :

foreach ($array as $key => $value) {
        echo "$key=$value<br>\n";
}

Zie het als volgt, loop doorheen de $array, kijk naar de sleutel en print de waarde af. We gaan nu terug het voorbeeld maken met onze hoodsteden .

<?php
# Onze array definiïeren
$hoofdstad["DE"]="Berlijn";
$hoofdstad["BE"]="Brussel";
$hoofdstad["ES"]="Madrid";
$hoofdstad["DK"]="Kopenhagen";
$hoofdstad["FR"]="Parijs";
$hoofdstad["GB"]="London";

foreach ($hoofdstad as $key => $value) {
    echo "sleutel = $key en de waarde = $value<br>\n";
}
?>

Sla deze code op als foreach2.php.

Als je dit nu runt, worden alle hoodsteden met hun sleutel en waarde afgedrukt. Ik hoop dat jullie het belang inzien van de foreach lus. PHP is een webtaal, dus we gaan formulieren aanmaken, gegevens verwerken, gegevens doorsturen enz ... Aangezien we op voorhand niet weten wat een gebruiker zal invullen, totdat hij het ons opstuurt, halen we gewoon de informatie met de foreach lus terug uit een bestand.

En aktie !

Als je foreach gebruikt zoals in ons tweede voorbeeld, kan dit een hulp zijn tijdens het programmeren. Run gewoon de foreach lus en je krijgt alle waarden van de array terug, mocht je soms vergeten zijn wat je er nu in had geplaatst, of indien de uitslag iets anders is dan je had verwacht.

De functie count()

Met count(naam_van_de_array) kom je te weten hoeveel elementen in de array aanwezig zijn. In ons geval kunnen we dan plaatsen :
$elementen=count($hoofdstad);

We maken volgende code aan :

<?php
# Onze array definiïeren
$hoofdstad["DE"]="Berlijn";
$hoofdstad["BE"]="Brussel";
$hoofdstad["ES"]="Madrid";
$hoofdstad["DK"]="Kopenhagen";
$hoofdstad["FR"]="Parijs";
$hoofdstad["GB"]="London";

$teller=count($hoofdstad);
echo "Onze array hoofdstad bevat $teller elementen<br>\n";

?>

Sla de code op als count3.php. Als je de code uitvoert gaat het script jouw vertellen dat onze array $hoofdstad 6 elementen bevat, wat inderdaad zo is.

En aktie !

We hebben nu de lussen gezien en een paar vorbeelden. Ik zal jullie nu nog eens een belangrijke tip meegeven over het gebruik van de foreach lus. Programmeren is progammacode intikken, dat zullen jullie alvast al weten nu. In de code kunnen foutjes zitten, of het resultaat is niet wat je wenste. Je kunt je dan scheel kijken op de code, maar je kunt ook hulpmiddeltjes toepassen. Het echo commando is een grote hulp.

We hebben bij de formulieren geizen  dat de gegevens worden doorgestuurd naar een andere pagina. We weten inmiddels ook dat PHP hashmappen maakt van de velden van een formulier. Begint de frank ( of moet ik nu euro zeggen ?) al te vallen ? Wat als de gegevens die je verwachtte anders zijn dan je dacht ? Wel we vragen die gegevens nu gewoon op met de foreach lus.

Laten we nu eens vlug een formulier aanmaken die ons een paar gegevens vraagt.

<form action="verwerken5.php" method="POST">
<table>
<tr><td>Naam : </td><td><input type="text" name="naam"></td></tr>
<tr><td>Voornaam : </td><td><input type="text" name="voornaam"></td></tr>
<tr><td>Straat : </td><td><input type="text" name="straat"></td></tr>
<tr><td>Nr : </td><td><input type="text" name="nummer"></td></tr>
<tr><td>Postcode : </td><td><input type="text" name="postcode"></td></tr>
<tr><td>Plaats : </td><td><input type="text" name="plaats"></td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td><input type="submit" name="doorsturen" value="Gegevens versturen"></td></tr>
</form>

En sla dit op als formulier9.php.

We maken vervolgens een document verwerken5.php met volgende simpele code :

<?php
foreach($_POST as $key => $value) {
    echo "sleutel = $key en de waarde is $value<br>\n";
}
?>

Run nu het script formulier9.php en verwerken5.php gaat netjes al je waarden uitprinten. Alle waarden van de name velden uit het formulier zijn je sleutel, en de waarden die getoond worden, zijn deze die jij hebt ingevuld hebt op het formulier, op eentje na, namelijk deze van de submit knop, die wij de waarde "Gegevens versturen" hebben meegegeven in het script zelf (value="Gegevens versturen").

En aktie !

In verwerken5.php kan je nu van alles doen met de waarden verkregen uit formulier9.php. Met de foreach lus kan je wel degelijk controleren of alle waarden wel correct werden doorgegeven. Als dit het geval is, kan je dan nadien de code van de foreach lus in commentaar plaatsen. Ik kan daar niet genoeg de nadruk op leggen . Simpele tikfouten kunnen een ware ellende zijn. Neem bijvoorbeeld nu eens dat als je als name voor de straat een tikfout hebt gemaakt en dat je name="srtaat" hebt getikt. Als je dan de gegevens van straat wil verwerken in je verwerken5.php, ga je opeens zien dat straat geen waarde heeft, omdat je een stomme tikfout hebt gemaakt in je formulier. Door de gegevens met een foreach lus op te vragen, ga je dadelijk zien waar je fout zit .

Nu heb je de basis in handen om PHP code te schrijven. Nu begint de fun. We zullen in de volgende lessen steeds die basis nodig hebben en je zult tevens nog meer ontdekken van de kracht van PHP.



Les 1 Les 2 Les 3 Les 4 Les 5 Les 6 Les 7 Les 8 Les 9 Les 10 Les 11 Les 12 Les 13 Home