• PHP Deel 8: Formulieren & Url's (POST & GET)

    2 March 2011 01:40 door
    We gaan het hebben over formulier verwerkingen. Ook gaan we bekijken hoe er waardes d.m.v. url kunnen worden doorgegeven. Zodanig dat we de verkregen informatie in PHP kunnen verwerken.



    We kunnen input van een gebruiker vragen via formulieren, een formulier bevat verschillende elementen waar de gebruiker gegevens kan invullen en deze dan kan terug sturen naar de server. Gegevens uit formulieren kunnen op twee manieren naar de server worden gestuurd:
    • POST: de gegevens staan nu, net zoals bij cookies, in de headers
    • GET: de gegevens staan nu als een querystring in de URL (test.php?name=Martijn)


    8.1 HTML formulier
    Een HTML formulier bevat een aantal velden (tekstvelden, ...) en een button om de gegevens te versturen. Een gewoon formulier met enkele velden ziet er zo uit:
    HTML-code:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="https://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Voorbeeld 1</title>
    </head>
    
    <body>
    	<h1>Mijn formulier:</h1>
    
    	<form action="verstuur_naar_hier.php" method="POST">
    		<div>
    			<label for="name">Naam</label><br />
    			<input type="text" name="name" id="name" />
    		</div>
    	
    		<div>
    			<label id="firstname">Voornaam</label>
    			<input type="text" name="firstname" />
    		</div>
    	
    		<div>
    			<label id="street">Straat</label>
    			<input type="text" name="street" />
    		</div>
    
    		<div>
    			<input type="submit" value="verstuur" />
    		</div>
    	</form>
    </body>
    </html>
    De volgende elementen zijn ook beschikbaar in HTML:
    • Radio buttons: <input type="radio" name="radio" value="kies mij" />
    • Checkbox: <input type="checkbox" name="checkbox" value="vink aan" />
    • Textarea: <textarea name="text">Tekst hier</textarea>
    • ...


    8.2 Afhandelen in PHP
    Als de gebruiker het formulier in voorgaand voorbeeld invult en verstuurt, zullen de gegevens via de HTTP headers (method POST) naar het bestand verstuur_naar_hier.php verzonden worden. In dit bestand kunnen we met PHP de POST gegevens uitlezen. Alle gegevens staan in de superglobal $_POST. Als we formulieren of andere gegevens via GET (querystring) versturen staan deze in de superglobal $_GET. Beide werken op dezelfde manier en zijn ook overal beschikbaar.

    De verstuurde waarden staan in de superglobals als een associatieve array, de key is telkens de name van het HTML element:
    PHP-code:
    <?php
        
    // We gaan de gegevens afdrukken

        
    echo 'De verstuurde gegevens zijn: <br />';
        echo 
    'Naam: ' $_POST'name' ] . '<br />';
        echo 
    'Voornaam: ' $_POST'firstname'  ] . '<br />';
        echo 
    'Straat: ' $_POST'street' ] . '<br />';
    ?>
    Als de gegevens via GET verstuurd zijn gebruiken we $_GET in plaats van $_POST. Er is ook nog een superglobal $_REQUEST. Deze bevat zowel de gegevens van GET en POST maar het gebruik van deze superglobal is om beveiligingsreden afgeraden (session fixation).

    een voorbeeld url: https://www.eendomeinnaam.be/?waarde1=hehe&waarde2=5
    PHP-code:
    <?php

    echo $_GET['waarde1']; // zal als output geven: hehe
    echo $_GET['waarde2']; // deze zal als output geven: 5

    ?>
    We kunnen deze gegevens ook in een MySQL query gebruiken, voordat je deze gegegevens hier mag gebruiken dienen deze eerst geëscaped te worden met mysql_real_escape_string() om SQL Injection te vermijden.

    Indien je van plan bent deze gegevens op een HTML pagina te plaatsen moet je ze eerst door htmlspecialchars() halen. Deze functie haalt alle HTML elementen (<, >,...) eruit en vervangt ze door hun html-entiteit zodat de pagina niet gebruikt kan worden voor injection of XSS attacks.

    Er is 1 gouden regel: VERTROUW NOOIT GEGEVENS DIE DE GEBRUIKER STUURT.

    Formulier inhoud en HTTP headers kunnen door de gebruiker makkelijk aangepast worden, ook gegevens die al door client gecontroleerd zijn (JavaScript) moeten op de server opnieuw gecontroleerd worden. Dit MOET altijd gebeuren. Een gebruiker kan deze formulieren opslaan en zelf aanpassen en zo alle beveiligingen omzeilen.

    De manier waarop we met user input omgaan is zodanig belangrijk dat we dit behandelen in hoofdstuk 12 genaamd Veiligheid.

    Geschreven door: Martijn Croonen.
    Aanpassingen door: Aerts Kurt.