Je ziet dit bericht omdat de EU dat een goed idee vindt. Deze website maakt gebruik van cookies van Google voor het tonen van advertenties en het bijhouden van bezoekersstatistieken. Google kan hiermee je surfgedrag volgen. Zie voor meer informatie het privacybeleid van Google. Via Your Online Choices kun tracking cookies van advertentiebedrijven blokkeren. Deze melding verbergen.

12 Sessies

Sessies zijn vergelijkbaar met cookies, ze kunnen gebruikt worden om tijdelijk iets op te slaan dat gekoppeld is aan de browser van de bezoeker. Het verschil met cookies is dat sessies worden opgeslagen op de server en dat de gegevens blijven bewaard totdat de bezoeker zijn browser sluit met een (standaard) maximum van drie uur. Sessies kunnen gebruikt worden om gegevens te bewaren die de bezoeker niet mag kennen, of om gegevens van de ene pagina naar de andere over te dragen.

Theorie

In dit hoofdstuk bekijken we hoe sessies gemaakt kunnen worden, hoe gegevens kunnen worden opgeslagen in en uitgelezen uit de $_SESSION variabele, en hoe een sessie beëindigd kan worden.

Sessie starten

Voordat iets in een sessie-variabele kan worden opgeslagen, moet eerst een sessie worden aangemaakt middels de session_start() functie. Net als bij cookies kan een sessie alleen worden aangemaakt voordat er iets naar de browser is gestuurd. Dit heeft er mee te maken dat PHP op de achtergrond een cookie op de computer van de bezoeker plaatst met een unieke identificatie, zodat de gegevens op de server aan de juiste bezoeker kunnen worden gekoppeld. De functie session_start() is eenvoudig:

bool session_start ( void )

Er wordt geen parameter meegegeven en de functie geeft als resultaat TRUE als het aanmaken van de sessie is gelukt of FALSE als geen sessie kan worden gestart. In principe moet gecontroleerd worden of de sessie inderdaad aangemaakt is, maar in de praktijk gaat het zelden verkeerd, waardoor hier eventueel van af gezien kan worden. Doe de controle wel als er echt dingen aan de kant van de server fout kunnen gaan als de sessie niet goed is gestart. In PHPBoek(); gaan we uit van een eenvoudige toepassing en dan volstaat het volgende bovenaan het script:

<?php
session_start
();

Plaatst dit bovenaan ieder script waarin sessies worden gebruikt. Als sommige pagina's van de website geen sessies gebruiken, dan hoeft session_start() daar niet opgenomen te worden, ook niet als de bezoeker 'tussendoor' op zo'n pagina komt.

Gegevens opslaan in een sessie

Nadat de sessies is aangemaakt kunnen gegevens worden opgeslagen in de globale sessie-variabele $_SESSION. $_SESSION is een array waaraan zelf sleutels met waarden kunnen worden toegevoegd. De inhoud van $_SESSION bestaat niet alleen in het huidige script, maar blijft op de server bewaard zodat deze ook in andere scripts kan worden gebruikt.

Het opslaan van gegevens gaat zoals een normale array:

<?php
//begin sessie
session_start();

//gegevens opslaan
$_SESSION['foo'] = 'bar';
$_SESSION['gebruikersid'] = 21;
?>

Gegevens uitlezen

Gegevens uit een sessie uitlezen is net zo eenvoudig als het opslaan ervan. We moet bovenaan het script nog steeds session_start(); worden opgenomen, om PHP te vertellen dat met een bestaande sessie verdergegaan moet worden. Als er voor de bezoeker nog geen sessie bestaat, wordt een nieuwe sessie gemaakt voor deze bezoeker. De array $_SESSION is in dat geval uiteraard leeg.

Voor het uitlezen kan direct de $_SESSION variabele worden aangesproken:

<?php
//sessie hervatten
session_start();

//gegevens uitlezen
echo $_SESSION['foo'];
echo $_SESSION['gebruikersid'];
?>

Gegevens verwijderen

Normaal gesproken komt het niet vaak voor dat sessie-gegevens verwijderd moeten worden. Immers, als gegevens niet meer gebruikt worden kunnen ze net zo goed blijven staan tot het einde van de sessie, dan worden ze uiteindelijk toch automatisch verwijderd. Om toch een enkele waarde uit de $_SESSION-array te verwijderen, kan de functie unset() worden gebruikt:

void unset ( mixed $var [, mixed $var [, mixed $... ]] )

De functie geeft geen waarde terug, en vereist als parameter één of meerdere variabelen die moeten worden verwijderd. Dus om een waarde uit de sessie te verwijderen:

<?php
//sessie hervatten
session_start();

//gegevens verwijderen
unset($_SESSION['foo']);
?>

Let op: unset() nooit de hele $_SESSION-array. Hiermee wordt de hele sessie om zeep geholpen en kunnen ook geen nieuwe waarden meer in de sessie worden opgeslagen. Om alle opgeslagen waarden in één keer te wissen kun je $_SESSION overschrijven met een lege array:

<?php
//sessie hervatten
session_start();

//alle gegevens verwijderen, maar sessie laten bestaan
$_SESSION = array();
?>

Sessie opheffen

Als sessies worden gebruikt voor het beveiligde gedeelte van de website, is het verstandig om de gehele sessie op te heffen op het moment dat de bezoeker op de uitlog-knop klikt. Helaas bestaat hier geen eenvoudige functie voor, dus zijn er wat handelingen nodig om een sessie volledig op te heffen. Doe het volgende bovenaan het script, voordat er output naar de browser wordt gestuurd:

  1. Hervat de sessie;
  2. Leeg de sessie-variabele;
  3. Verwijder het sessie-cookie als dit bestaat
  4. Verwijder de sessie-gegevens op de server

In code ziet dat er als volgt uit:

<?php
//sessie hervatten
session_start();

//sessie-variabel leeg maken
$_SESSION = array();

//sessie-cookie verwijderen
if (isset($_COOKIE[session_name()])) {
    
$params = session_get_cookie_params();
    
setcookie(session_name(), '', 1,
        
$params['path'], $params['domain'],
        
$params['secure'], $params['httponly']
    );
}

//sessie beeindigen
session_destroy();

?>

Wat session_start(); en $_SESSION = array(); doen moet inmiddels duidelijk zijn. Kijk anders nog eens naar de vorige twee paragrafen.

Daarna wordt het wat ingewikkelder. Het verwijderen van het cookie gaat met setcookie() zoals is uitgelegd in hoofdstuk 11. Alleen weten we helemaal niets van dit cookie, zelfs de naam niet, omdat het door PHP is aangemaakt. De naam van het sessie-cookie wordt achterhaald met de functie session_name(). De verdere eigenschappen die zijn opgegeven bij het aanmaken van het cookie worden achterhaald met de functie session_get_cookie_params():

string session_name ( void )

array session_get_cookie_params ( void )

session_name() geeft de naam van het sessie-cookie. Deze gebruiken we allereerst in combinatie met isset() om te kijken of er wel een cookie is geplaatst. Even verderop wordt session_name() om de naam van het sessie-cookie op te geven aan de functie setcookie(). De functie session_get_cookie_params() geeft een array met vijf sleutels: 'lifetime', 'path', 'domain', 'secure', 'httponly'. Dit zijn precies de laatste vijf parameters van setcookie():

bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] )

Het is belangrijk om deze eigenschappen te gebruiken bij het verwijderen van het cookie, omdat anders misschien wel een nieuw cookie wordt geplaatst in plaats van het sessie-cookie te verwijderen. Alleen 'lifetime' wordt niet gebruikt, omdat we toch een tijd in het verleden willen instellen. Met dit alles kan het sessie-cookie op de juiste manier verwijderd worden. Als naam gebruiken we de waarde van session_name(), het cookie wordt leeg gemaakt door als inhoud met '' een lege string op te geven, de verloopdatum van het cookie wordt ingesteld op 1 seconde na 1 januari 1970, en middels de hulpvariabele $params worden de verdere gegevens uit session_get_cookie_params() ingevuld.

Tot slot worden de gegevens op de server gewist middels de functie session_destroy();:

bool session_destroy ( void )

Deze functie is weer eenvoudig, want hier zijn geen parameters meer nodig. De functie geeft TRUE als de gegevens op de server correct zijn gewist en FALSE als dat niet gelukt is.