login  Naam:   Wachtwoord: 
Registreer je!
 Tutorials

Tutorials > PHP


Gegevens:
Geschreven door:
Thomas
Moeilijkheidsgraad:
Moeilijk
Hits:
59178
Punten:
Aantal punten:
 (4.37)
Aantal stemmen:
27
Stem:
Niet ingelogd
Nota's:
 Lees de nota's (6)
 


Tutorial:

Sessies in PHP

1. Wat is een sessie (session) ?
2. Wat kan ik met een sessie ?
3. Hoe maak ik een sessie aan ?
4. Hoe gebruik ik sessie-variabelen ?
5. Hoe sluit ik een sessie (permanent) af ?
6. Hoe geef ik een sessie een naam ?
7. Het pad waar je sessies worden opgeslagen instellen
8. Configuratie
9. Voorbeeld van gebruik
10. FAQ - veel gestelde vragen
11. Tips


1. 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 dus). 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).

Er zijn twee manieren om de verwijzing naar je sessie te onthouden als je binnen zo'n website rondsurft:
1. Via de URL, die is dan van de vorm pagina.php?PHPSESSID=f18d2f3ed63e032d0d13bd53c386451a
2. Via een cookie, waarin dit sessie-id (het lange getal achter het =-teken in de bovenstaande URL) wordt opgeslagen.

Beide methoden hebben voor- en nadelen:
Nadeel van methode 1:
Als je een URL van deze site doorstuurt naar iemand anders, kan deze persoon je sessie 'overnemen'. De webserver kijkt niet van wie een kloppende verwijzing afkomstig is. Je zult hier dus zelf voorzieningen voor in moeten bouwen om ervoor te zorgen dat je sessie-id niet gekaapt wordt.
Voordeel van methode 1:
Je hoeft geen gebruik te maken van cookies.

Nadeel van methode 2:
De browser waarin je de pagina bekijkt, dient het gebruik van cookies te ondersteunen en ingeschakeld hebben staan.
Voordeel van methode 2:
Het is nu lastiger een sessie van iemand over te nemen.

We gaan in deze tutorial verder uit van cookie-based sessies (methode 2), tenzij anders vermeld.
Bij het maken van deze tutorial is gebruik gemaakt van Apache (v2.0.44) en PHP (v4.3.2), draaiend op een Windows machine.


top

2. 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 et cetera.
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 resources (diskruimte, geheugen) op de webserver - en hier dient zuinig mee omgesprongen te worden.


top

3. Hoe maak ik een sessie aan ?


Zelf aanmaken

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(). Als je (zoals hier) van een op cookies gebaseerde sessie gebruik maakt (methode 2), moet je 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 vr je <HEAD> of <!DOCTYPE ...> tags, anders zal je pagina errors genereren.

Automatisch starten
- in je php.ini file onder je windows directory, in het [Session] gedeelte:
session.auto_start = 1;
Nu krijgt elke bezoeker die je pagina bekijkt een eigen sessie toegewezen.

- wanneer je geen beheerder van een webserver bent, kun je sessies automatisch starten met
ini_set("session.auto_start", 1);
Zie ook ini_set() op PHP.net. Dit moet elke pagina waar je sessies wilt gebruiken opnieuw. De instelling wordt namelijk maar gedurende de uitvoer van de pagina onthouden, daarna schakelt deze weer naar de default (0) terug (je kan dus eigenlijk net zo goed session_start() gebruiken als je deze servervariabele niet kunt aanpassen). Wanneer je een sessie automatisch laat starten is het commando session_start(); niet meer nodig.


top

4. Hoe gebruik ik sessie-variabelen ?

Een sessie (die je -vanaf PHP versie 4.1.0- aanspreekt via $_SESSION) is in principe een speciaal array (net als $_POST, $_GET en $_COOKIE). Je kan de volgende bewerkingen op sessievariabelen uitvoeren:

Een variabele in een sessie zetten
Je kan een variabele in een sessie zetten zoals je ook toekenningen (assignments) van waarden aan (gewone) variabelen doet:

<?php
$_SESSION
['mijn_string'] = "Dit is een tekst.";
$_SESSION['mijn_integer'] = 10;
?>


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

<?php
// $_SESSION['mijn_string'] heeft de waarde "Dit is een tekst."
$_SESSION['mijn_string'] = "Dit is een andere tekst.";
// $_SESSION['mijn_string'] heeft nu de waarde "Dit is een andere tekst."
?>


Een variabele uit een sessie verwijderen
Je kan een sessievariabele (en -waarde) verwijderen uit je sessie met behulp van de unset() functie.

<?php
// $_SESSION['mijn_integer'] bestaat en heeft de waarde 10
unset($_SESSION['mijn_integer']);
// nu is de sessievariabele 'mijn_integer' verwijderd uit de sessie.
?>


Controleren op het bestaan van een sessie-variabele
Je kan controleren op het bestaan van een sessievariabele met de functie isset(). Deze functie retourneert True wanneer de gezochte variabele bestaat, en anders (wanneer deze niet bestaat OF is ge-unset OF deze de speciale waarde NULL heeft) False.

<?php
// $_SESSION['var1'] bestaat wel, $_SESSION['var2'] niet
if(isset($_SESSION['var1'])) { // levert True op
  
echo "var1 bestaat.<br>";
} else {
// dit levert dus False op
  
echo "var1 bestaat niet!<br>";
}

if(isset(
$_SESSION['var2'])) { // levert False op
  
echo "var2 bestaat.<br>";
} else {
// dit levert dus True op
  
echo "var2 bestaat niet!<br>";
}
?>

De bovenstaande code zal dus de volgende output produceren:
var1 bestaat.
var2 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 OF is ge-unset OF is gelijk aan NULL
  
echo "Je gebruikersrol is op dit moment onbekend.";
}
?>



top

5. 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 omdat je nog steeds met cookies werkt):

<?php
// net als bij Windows, moet je een sessie eerst starten voordat je hem af kan sluiten ;)
session_start();
$_SESSION = array(); // gooi het hele sessie-array in n keer leeg
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 het sessiecookie verwijderd en daarmee is de verwijzing naar je sessie weg en is je sessie zelf in feite ook 'weg' (in ieder geval onbereikbaar en deze zal op den duur worden opgeruimd).


top

6. Hoe geef ik een sessie een naam ?

Als je een sessie een aparte naam wilt geven dan kan dit. Standaard heeft je sessie de naam 'PHPSESSID', dit is de naam van je sessie-id zoals deze in je URL wordt doorgegeven of (zoals in ons geval) de naam van je cookie waarin je sessie-id staat opgeslagen.
Een zelfgedefinieerde sessienaam mag alleen bestaan uit alfanumerieke karakters (letters en cijfers). Met de functie session_name() kun je zowel kijken wat de naam van een sessie is (returnwaarde van de functie), maar ook je sessie een naam geven (nieuwe naam als parameter). session_name() mag alleen aangeroepen worden voordat je sessie is gestart.

<?php
// haal de huidige naam van je sessie op
$huidige_naam = session_name();
?>


<?php
// noem je huidige sessie "gewenste_naam"
session_name("gewenste_naam");
// je sessie heet nu "gewenste_naam"
?>


Je kunt ook de standaard sessienaam zelf veranderen (op een soortgelijke wijze als het automatisch starten van sessies - zie hierboven) door middel van het aanpassen van de configuratievariabele 'session.name' met behulp van de functie ini_set().

Wanneer je je sessie zelf een naam geeft moet je er goed op letten dat je altijd deze naam selecteert (met session_name("je_sessienaam");) voordat je je sessie start - ook (en vooral) wanneer je je sessie weer AFsluit.


top

7. Het pad waar je sessies worden opgeslagen instellen
Ook dit is weer een instelling die je telkens moet aanroepen in de pagina waarin je sessies gebruikt (tenzij je deze instellingen op je server zelf kunt veranderen). LET EROP dat de directory waarin je je sessies opslaat BUITEN je webdirectory staat, anders kan IEDEREEN bij AL je sessie(gegeven)s, en dat wil je niet.
Gebruikers die onder Windows Apache draaien, moeten zelf een directory (folder) aanmaken. De standaard naam van het save-path van je sessies is "/tmp". Deze instelling kun je (telkens) veranderen door het volgende commando:

ini_set("session.save_path", "een_of_andere_directory");
Dit commando dient, net als alle andere ini_set commando's, aangeroepen te worden voordat de sessie wordt gestart.


top

8. Configuratie
Er kunnen nog een heleboel dingen meer ingesteld worden aan sessies. Het zou erg ver voeren om al deze configuratie-opties hier te bespreken. Wanneer de besproken onderdelen tekort schieten, loont het waarschijnlijk de moeite de sessie manual op PHP.net eens door te lezen.


top

9. Voorbeeld van gebruik

Het volgende script maakt gebruik van sessies: loginscript mbv sessies v1.2.


top

10. FAQ - veel gestelde vragen

(Q) waarom krijg ik de eerste keer dat ik de pagina open wel een sessie-id in mijn URL te zien terwijl ik cookies gebruik?
(A) de webserver 'weet' nog niet of de browser van de client het gebruik van cookies ondersteunt en ingeschakeld heeft. Wanneer je zeker weet dat de gebruiker zo'n browser heeft, kun je met de volgende instelling aangeven dat je alleen van cookies gebruik wilt maken (dit commando moet op elke pagina waar je een sessie gebruikt aangeroepen worden, nog voordat je je sessie start):
ini_set("session.use_only_cookies", 1); // vanaf PHP 4.3.0
(Q) Ik krijg de foutmelding "Headers already sent" ?
(A) Deze foutmelding krijg je wanneer je sessie van cookies gebruik maakt, en je de sessie probeert te starten nadat er al HTML verstuurd is (HTML in je script staat nog voordat je met sessies aan de gang gaat). Zet session_start(); en alle overige sessie-configuratievariabelen voor enige HTML.


top

11. Tips

Maak een aparte PHP-file aan voor het instellen en starten van je sessie

Dit maakt eea een stuk overzichtelijker. Deze file kun je dan aan het begin van je pagina includen.

Spreek sessievariabelen altijd aan met $_SESSION['je_var']
Zodat je weet waar een variabele vandaan komt.

top

« Vorige tutorial : Cookies in PHP Volgende tutorial : PHP in *.html »

© 2002-2020 Sitemasters.be - Regels - Laadtijd: 0.018s