banner

3.1: Sessies in PHP

Wat is een sessie (session) ?

Een sessie is een bestand aan de serverkant van een website die gegevens van een bezoeker kan onthouden (een soort van serverside cookie, zie volgend hoofdstuk). Elke bezoeker krijgt een eigen sessie toegewezen met een uniek nummer, het sessie-id. De bezoeker heeft de beschikking over een verwijzing naar deze sessie zolang de browser waarin de pagina wordt bekeken open staat. Word de browser afgesloten, is de verwijzing naar de sessie verloren (en de sessie zal na verloop van tijd opgeruimd worden).

Wat kan ik met een sessie ?

In sessies kun je variabelen met bijbehorende waarden opslaan. Met behulp van een sessie kun je bijvoorbeeld een pagina beveiligen of bepalen welke delen een gebruiker (wel of niet) te zien krijgt, in een sessie kun je een boodschappenmandje van een winkelende klant bijhouden etc.
De programmeur van de website dient er echter wel voor te zorgen dat de sessie niet een soort van 'rijdend archief' wordt, waar je zomaar alles ingooit wat je denkt nodig te hebben. Het kost immers hoe dan ook geheugen op de webserver en hier dient zuinig mee omgesprongen te worden.

Hoe maak ik een sessie aan ?

Je kan een sessie aanmaken met behulp van session_start(). Deze functie gebruik je ook voor het voortzetten van een al eerder aangemaakte sessie. Op elke pagina waar je sessies wilt gebruiken zet je dus session_start(). Je moet er voor zorgen dat session_start() bovenaan in je pagina staat, dus nog voordat je iets anders met je pagina doet. Zet in dit geval dus session_start() helemaal bovenin je PHP-pagina, nog vóór je <head> of <!DOCTYPE ...> tags, anders zal je pagina errors genereren.

<?php
session_start()
;
?>
<!DOCTYPE ...>

Hoe gebruik ik sessie-variabelen ?

Een sessievariabele $_SESSION['....'] vertoont overeenkomsten met een postvariabele $_POST['....']. Er is echter één belangrijk verschil:

Een $_POST['....']-variabele bestaat alleen na een klik op een formulier. De $_POST['....']-variabele bestaat echter niet meer als je via een link op een andere pagina terecht komt. Het bereik van deze variabele is dus heel klein en kortstondig.
Hier tegenover staat een $_SESSION['....']-variabele. Als deze eenmaal bestaat dan blijft hij in principe bestaan zolang het browser-venster van de bezoeker geopend blijft! Als de de $_SESSION['....']-variabele eenmaal een waarde gekregen heeft dan is deze dus altijd beschikbaar ook na het bezoeken van tal van andere webpagina's.
Je kunt de volgende bewerkingen op sessievariabelen uitvoeren:

Een waarde aan een sessievariabele toekennen

Je kunt een waarde aan een sessievariabele toekennen zoals je ook toekenningen van waarden aan (gewone) variabelen kunt doen:

<?php
$_SESSION
['gebruikersnaam'] = 'Jan';   
// de naam Jan wordt toegekend aan de sessievariabele gebruikersnaam

$_SESSION['getal1'] = 10;   
// het getal 10 wordt toegekend aan de sessievariabele getal1

$_SESSION['wachtwoord'] = $_POST['wachtwoord'];   
// de waarde die in $_POST['wachtwoord'] zit wordt toegekend aan de sessievariabele wachtwoord
?>
Als je een $_POST['....']-variabele toekent aan een $_SESSION['....']-variabele dan zorg je ervoor dat, via een formulier doorgegeven variabelen, onthouden worden tijdens het surfen op je webpagina!!
OPDRACHT 8

Maak 3 bestanden:
  • één index.html-bestand waarin een bezoeker een gebruikersnaam en wachtwoord in moet voeren.
  • één checklogin.php pagina die controleert of de bezoeker een juiste combinatie van gebruikersnaam en wachtwoord ingevuld heeft. Als dat het geval is dan wordt hij welkom geheten en ziet hij een link naar bezoeker.php (zie 3e gedachtenstreepje hieronder). Is de inlog niet oké dan wordt hij terug naar de index.html-pagina geleid.
  • één bezoeker.php pagina met daarop een willekeurige afbeelding die de bezoeker alleen mag zien indien hij ingelogd is (dus succesvol voorbij de checklogin.php-pagina is gekomen). Als iemand in als url het volgende intypt: http://localhost:8080/bezoeker.php en dus niet voorbij de checkinlog.php pagina is geweest dan mnoet de opmerking verschijnen dat de bezoeker éérst moet inloggen (en evt. een linkje terug naar de index.html-pagina).
N.B. Bedenk goed; daar waar je op een pagina een $_SESSION-variabele gebruikt moet je de sessie eerst starten bovenaan de pagina!

Een variabele van waarde veranderen

Als een sessievariabele al bestaat en je doet opnieuw een toekenning van een waarde aan deze variabele, zal de waarde van je sessievariabele overschreven worden:

<?php
$_SESSION['voornaam'] = 'Jan';
// $_SESSION['voornaam'] heeft de waarde 'Jan'

$_SESSION['voornaam'] = 'Annie';
// $_SESSION['voornaam'] heeft nu de waarde 'Annie'
?>

Een variabele uit een sessie verwijderen

Je kan een sessievariabele en de daarin opgeslagen waarde verwijderen uit je sessie met behulp van de unset() functie.

<?php
$_SESSION['getal1'] = 10;    // $_SESSION['getal'] heeft de waarde 10

unset($_SESSION['getal1']);
// de sessievariabele 'getal1' bestaat niet meer. Uiteraard is de waarde 10 hierbij ook verloren gegaan!!
?>

Controleren op het bestaan van een sessie-variabele

Je kan controleren op het bestaan van een sessievariabele met de functie isset(). Deze functie geeft als antwoord true wanneer de gezochte variabele bestaat, en anders (wanneer deze niet bestaat) false.

<?php
$_SESSION['getal1'] = 10; // $_SESSION['getal1'] bestaat wel, $_SESSION['getal2'] niet

if(isset($_SESSION['getal1'])) // levert true op
{

echo 'getal1 bestaat.<br />';
}
else
{

echo 'getal1 bestaat niet!<br />';
}

if(isset($_SESSION['getal2'])) // levert false op
{

echo 'getal2 bestaat.<br />';
}
else
{

echo 'getal2 bestaat niet!<br />';
}

De bovenstaande code zal dus de volgende output produceren:

getal1 bestaat.
getal2 bestaat niet!

Op grond van het wel of niet bestaan (en eventueel ook op grond van de waarde) van een sessievariabele kun je dus bepalen hoe je webpagina er uit ziet en kun je bepaalde delen van je site afschermen voor bezoekers, en extra onderdelen laten zien aan leden van de site.

De waarde van een sessievariabele controleren

Wanneer je de waarde van een sessievariabele gaat bekijken, moet je eigenlijk eerst weten of een sessievariabele wel bestaat. Daarna kun je de waarde met iets anders vergelijken.

<?php
// $_SESSION['gebruikersrol'] heeft de waarde 'admin'
if(isset($_SESSION['gebruikersrol']))
{

    // de sessievariabele 'gebruikersrol' bestaat, inspecteer de waarde
    if($_SESSION['gebruikersrol'] == 'admin')
    {
        echo
'Welkom admin.';
    }
    else
    {
        echo
'Dit onderdeel is alleen voor admins.';
    }
}
else
{

// de sessievariabele 'gebruikersrol' bestaat niet
    echo 'Je gebruikersrol is op dit moment onbekend.';
}

?>
OPDRACHT 9

Maak 1 bestand: index.php

  • Het index.php bestand moet bij het éérste bezoek een inlogscherm laten zien met een knop. Als action kan er in het <form>-element worden opgenomen: action="index.php". Dit betekent dat de gegevens naar dezelfde pagina gestuurd worden als waar je vandaan komt.
  • Als je de inloggegevens hebt ingevuld en op de knop klikt dan:
    • mag je het inlogscherm niet meer zien (er moet een controle uitgevoerd worden die checkt of er op de knop geklikt is)
    • moet er gecontroleerd worden of de inlog oké is. Zo ja dan verschijnt er Welkom gebruikersnaam in beeld. In een sessievariabele wordt dan bijgehouden of de bezoeker ingelogd is. Tevens zie je een link 'uitloggen'. Zo nee dan zie je een link die je terugvoert naar het inlogscherm.
  • Klik je op de link 'uitloggen' dan word je ook teruggeleid naar het inlogscherm. Let hierbij spoeciaal op het volgende: na het zien van het inlogscherm mag de bezoeker niet meer in ingelogde toestand mag komen gebruikmakend van de 'vorige'-knop van je browser!. Dat moet je regelen d.m.v. het leegmaken/verwijderen van een sessie(variabele).

Hoe sluit ik een sessie (permanent) af?

- Zelf afsluiten
Je kan een sessie afsluiten (verwijderen) door de volgende code op een pagina te zetten waar je naar verwijst op het moment dat je je sessie wilt verwijderen (let erop dat je ook deze code voor enige HTML-tags zet):

<?php
// Je moet een sessie eerst starten voordat je hem af kan sluiten!
session_start();
$_SESSION = array(); // verwijder alle bestaande sessievariabelen in één keer
session_destroy(); // deze functie verwijdert de sessie zelf
?>

- Met de standaard instellingen: sessie weg wanneer de browser is afgesloten
Als je je browser afsluit, wordt de sessie verwijderd. De browser sluiten is echter een actie die de bezoeker van jouw pagina zelf moet uitvoeren. In principe heb je daar dus geen grip op. Wil je als programmeur dus afdwingen dat in een bepaalde situatie een sessie verwijderd wordt dan zul je dus moeten kiezen voor session_destroy().