2.12 Werken met Multipass Scripts
Het is mogelijk dat we het voorbeeld van de profielen zodanig aanpassen dat we geen twee aparte webdocumenten nodig hebben. In plaats daarvan kunnen we die twee pagina's combineren tot één script. Dat betekent dat we het webformulier als onderdeel integreren in het PHP script.
In het aangepaste script is een extra voorwaardelijk statement ingebouwd om te bepalen wat er moet gebeuren:
- Als het script wordt uitgevoerd terwijl er géén keuze is gemaakt (in feite geen waarde aan de variabele is toegekend). Dan moet alleen het formulier worden getoond, eventueel met de aanvulling dat er een selectie moet worden gemaakt.
- Als het script wordt uitgevoerd als er wel een waarde aan de variabele is toegekend. Dan wordt de informatie van het profiel getoond zoals in het vorige voorbeeld is uitgewerkt.
Dit is een voorbeeld van een multipass script - een script dat zichzelf aanroept om te worden uitgevoerd. Het complete script ziet er als volgt uit:
<html> <head> <title>Informatie over profielen</title> </head> <body> <?php $profiel = $_POST["profiel"]; // Haal de gegevens op van selectie if ( !$profiel ) { ?> <h4> De situatie in schooljaar 2007-2008</h4> <p> Kies een profiel en klik op de knop <strong>Informatie</strong>:</p> <form method="POST" action="profielinfo2.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> <?php } else 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> 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>
Hoe werkt het?
Als je het script voor de eerste keer opent is er nog geen optie geselecteerd uit het formulier wat inhoudt dat de variabele $profiel nog geen waarde heeft.
Dat betekent dat in dat geval het formuliergedeelte wordt afgebeeld op het scherm om je in staat te stellen een keuze te maken.
Als je op de knop Informatie klikt, roept het script zich zelf aan. In dit geval heeft de variabele $profiel een waarde. Die waarde moet je voor de zekerheid ophalen met $_POST["profiel"]; .
Na een keuze en de bevestiging wordt de informatie over het profiel getoond en niet het formulier.
Opmerkingen:
Bij de action in de form-tag in het script hierboven kun je behalve de eigen naam van het document ook de volgende code invullen:
<form method="POST" action="<?php print $_SERVER["PHP_SELF"]; ?>">
Dit is ook een mogelijkheid om hetzelfde bestand nog een keer op te roepen na een submit.
Naast de POST-methode bestaat ook de mogelijkheid om gebruik te maken 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 het invulvenster in een formulier. Je moet dan uiteraard in het formulier wel bij method "GET" invullen. Bijvoorbeeld:
<form method = "GET" action="profielinfo.php"> <select name="profiel">
Ophalen van gegevens -->
<?php $profiel = $GET_["profiel"]; ?>
Op webservers met PHP 4.2.0 of hoger, en dat is tegenwoordig standaard, zijn de waarden niet direct meer benaderbaar via de GET-methode.
De GET-methode is een stuk onveiliger dan de POST-methode omdat de gegevens zichtbaar worden in de adresbalk van de browser. Bijvoorbeeld:
http://localhost/PHP_Enigma/hallojij.php?naam=Jan&wachtwoord=jan123
Hier wordt behalve de naam ook het wachtwoord afgebeeld. Dat kan natuurlijk niet de bedoeling zijn. Bij de POST-methode heb je dat niet.