• PHP Deel 9: Cookies & Sessies

    8 April 2011 00:12 door
    Data doorspelen van de ene naar de andere pagina is mogelijk zoals we eerder leerde d.m.v. formulieren of in de url ($_POST, $_GET) maar soms mag data niet zichtbaar zijn voor de gebruiker zelf of wil je de url ordelijk houden zonder 100 extra parameters mee te geven. Dit hoofdstuk zal je hier dan ook aanleren hoe het anders kan.



    HTTP is stateless, als we een pagina opvragen en we vragen een minuut later een andere pagina op weet de server niet dat beide aanvragen van dezelfde gebruiker komen. Om dit probleem op te lossen zijn er cookies, cookies zijn kleine tekstbestanden die worden opgeslaan op je computer en met iedere request worden meegestuurd in de headers.

    9.1 Cookies

    We kunnen in PHP cookies instellen met de functie setcookie():

    PHP-code:
    <?php
        setcookie
    ('naam''waarde'); // Methode 1
        
    setcookie('naam''waarde'0); // Methode 2
    ?>
    Het cookie hierboven zal vervallen indien het browser venster gesloten wordt, vermits we niet verteld hebben hoelang dit cookie mag worden bijgehouden. Methode 1 en methode 2 doen juist het zelfde.

    Cookies worden gebruikt om te weten dat een gebruiker ingelogd is maar hoe onthouden we dan bijvoorbeeld 1h lang ondanks de dat de browser gesloten wordt?
    Dit kan door een extra parameter mee te geven waarbij we de huidige tijd + het aantal seconden dat we willen dat het cookie blijft bestaan invullen.

    PHP-code:
    <?php
        setcookie
    ('naamCookie''waarde van cookie'time()+3600);
    ?>
    Je kan een cookie verwijderen door het te setten met een lege waarde of de verval datum en tijd in het verleden te zetten:

    PHP-code:
    <?php
        setcookie
    ('naam'''time()); // D.m.v. de huidige tijd
        
    setcookie('naamCookie'''time()-3600); // 1h terug in de tijd.
    ?>
    De cookies die worden meegestuurd kan je uitlezen via de superglobal $_COOKIE['naam'], deze zitten ook in de superglobal $_REQUEST.

    9.2 Sessions

    PHP heeft een eigen implementatie om het probleem van stateless HTTP op te lossen, namelijk sessions. Als we een session starten wordt op de computer van de gebruiker een cookie geplaats met een unieke code. Als de gebruiker daarna terug naar de site komt, herkent PHP zelf dit cookie, zoekt de sessie op en plaatst de juiste gegevens in de superglobal $_SESSION, deze superglobal is dus uniek voor iedere sessie en dus voor iedere gebruiker.

    Je kan een sessie starten met session_start(), deze functie plaatst automatisch het cookie, omdat het setten van een cookie gebeurt in de headers moet deze functie aangeroepen worden VOOR de gewone output naar de gebruiker wordt gestuurd.

    Nadat de sessie gestart is met session_start() kunnen we gegevens in de superglobal $_SESSION plaatsen, als de gebruiker nu later terugkomt zal PHP de juiste gegevens (die we eerder in de superglobal geplaatst hebben) terugplaatsen. We hoeven zo zelf geen rekening te houden met de state van de verbinding.

    PHP-code:
    <?php
        session_start
    ();
        
    $_SESSION['bezoek'] += 1;

        echo 
    'Je hebt deze pagina al' $_SESSION['bezoek'] . ' keer bezocht';
    ?>
    Data verkregen uit $_COOKIE is niet te vertrouwen vermits dit van de gebruiker komt en daardoor makkelijk aan te passen is. Het moet dus ten alle tijden gecontroleerd worden. Hierover meer in hoofdstuk 12 genaamd veiligheid.

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