Tutorials

Sessions in PHP4

Het gebruik van sessions met PHP 4!

Pagina 1

Inleiding

Ruim anderhalf jaar geleden schreef ik mijn eerste artikel voor de website PHPFreakz, waar ik toentertijd nog webmaster van was. In dat artikel beschreef ik de sessions die met de komst van PHP4 geïntroduceerd werden. Kort na het plaatsen van mijn artikel op PHPFreakz kwam er een nieuw artikel over sessions binnen dat het hele verhaal al zo uitgebreid vertelde dat er weinig ‘nieuws’ overbleef. Tot op de dag van vandaag heb ik mijn session-artikel willen herschrijven, niet alleen omdat het session systeem van PHP veranderd / verbeterd is, maar ook omdat ikzelf meer inzicht heb gekregen in sessions en het nu dus hopelijk eenvoudiger uit te leggen is. Omdat PHPHulp.nl nog geen artikelen had over sessions leek het mij een goed idee om een ‘nieuwe’ versie van het artikel in te sturen.

Sessions, WTF?!
-------------------------------------------------------------
Goed… eerst maar eens beginnen met het uitleggen wat sessions (of op z’n Nederlands: sessies) nou precies zijn, aangezien sommige mensen dit nog steeds niet begrijpen en / of weten. Sessions zijn min of meer te vergelijken met cookies, met als belangrijkste verschil dat ze serverside worden bewaard, en dus niet zomaar aangepast kunnen worden. Bij een bezoek aan je website zal PHP controleren of er een session_id meegestuurd is, mits de instelling session.auto_start op 1 staat of als de session_start() functie aangeroepen is aan het begin van je pagina. Als dit het geval is en er inderdaad een session_id is meegestuurd zal PHP afhankelijk van het feit op de sessie al bestaat een nieuwe sessie registeren of een bestaande sessie inlezen.
Pagina 2

Hoe worden sessions doorgegeven?

Als een sessie eenmaal is gestart is het natuurlijk handig dat ook de andere pagina’s van je website deze sessie kennen. De sessie zal dus op de een op andere manier doorgegeven moeten worden aan de andere pagina’s. Dit kan op twee manieren gebeuren:

- via de zgn. cookie-based sessions: hierbij wordt de session_name en de session_id opgeslagen in een cookie.
- of via de URL-based sessions: hierbij wordt de session_name en de session_id meegestuurd in de adresbalk. Afhankelijk van de session.use_trans_sid instelling in php.ini wordt dit ‘transparant’ gedaan, zodat het voor de gebruiker onzichtbaar blijft.

Als de session.auto_start instelling uitgeschakeld is, dien je er wel bij elke pagina voor te zorgen dat de session_start() functie wordt aangeroepen. LET OP: aanroepen vóórdat er output naar de browser wordt gestuurd. Om foutmeldingen zoals onderstaande te voorkomen kun je de session_start() functie het beste aanroepen in de allereerste regel van je php file.

Warning: Cannot send session cookie - headers already sent by (output started at file.php:1) in file.php on line 1
Pagina 3

Session variabelen

Okeej, nu de basis hopelijk duidelijk is gaan we verder met het belangrijkste gedeelte: de sessie variabelen. Zoals al eerder gezegd is de session min of meer te vergelijken met een cookie, je kunt er dus variabelen in opslaan. Het registreren van deze variabelen kan op 2 manieren gebeuren: via de session_register() functie of via de (auto)global variabele $_SESSION of $HTTP_SESSION_VARS.

Let wel op bij het gebruik van de (auto)globals, $_SESSION en $HTTP_SESSION_VARS zijn namelijk niet exact gelijk aan elkaar. $_SESSION is een zogenaamde superglobal in tegenstelling tot de ‘normale’ global $HTTP_SESSION_VARS.

Zo… genoeg theorie! Een voorbeeldje:

<?

// manier 1:
$naam = “Daniel Bakker”;
session_register(“naam”); // <-- session_start() wordt automatisch uitgevoerd!

// manier 2:
$_SESSION[“naam”] = “Daniel Bakker”;
// manier 3: (gebruik manier 2 voor PHP >= 4.1.0)
$HTTP_SESSION_VARS[“naam”] = “Daniel Bakker”;

?>
Pagina 4

Wat extraatjes… (de FAQ)

In de tijd dat mijn artikel op PHPFreakz geplaatst werd kreeg ik veel vragen over bepaalde zaken. Een van veelvoorkomende vragen was ‘het uitloggen’, oftewel: het destroy()-en van de session.

Het eerste dat moet gebeuren als je een sessie wilt verwijderen is het unset()-en van de (globale) session variabelen. Dit kan op twee manieren gebeuren:

- via de session_unset() functie
- of, als je de (super)global $_SESSION of $HTTP_SESSION_VARS hebt gebruikt, via de unset() functie. Of gewoon door de hele global leeg te gooien:

$_SESSION = array();
$HTTP_SESSION_VARS = array();

Nadat de globale variabelen ge-unset() zijn kun je de sessiondata zelf destroy()-en. Dit kun je doen met de session_destroy() functie.

Goed, tot zover het destroy gedeelte! Een andere veelgestelde vraag was ‘hoe kan ik de naam van de session veranderen’. Het antwoord is vrij simpel: session_name(“naam”);

Toch zitten er nog wat addertjes onder het gras… php gebruikt namelijk bij ELK request de standaard opgegeven session name (in de meeste gevallen PHPSESSID). Dit betekent dat je de session_name(“naam”) functie ELKE keer moet aanroepen voordat je de session_start() functie aanroept! De naam van de sessie mag trouwens alleen alfanummerieke karakter bevatten.

Tot slot nog het antwoord op een veelvoorkomende foutmelding ‘Warning: open(/tmp\sess_54005c2826f51ea77bc91627293a3544, O_RDWR) failed: No such file or directory (2) in myfile.php on line x’.

Bovenstaande foutmelding wordt veroorzaakt door het feit dat PHP geen session kan wegschrijven naar de directory /tmp. In de meeste gevallen verschijnt deze foutmelding op lokale windows machines. De oplossing is ook voor dit probleem simpel.

Open php.ini in je apache/php directory. Zoek dan naar de regel: session.save_path = /tmp
En verander /tmp in een BESTAANDE directory, bijvoorbeeld: c:/apache/sessions
Pagina 5

Functie overzicht

De belangrijkste functies voor het gebruik van sessions.


int session_cache_expire( [int new_cache_expire] )
php 4 >= 4.2
Geeft de huidig ingestelde waarde van session_cache_expire terug, zoals deze is ingesteld in php.ini. Als new_cache_expire opgeven is wordt de instelling overschreven door de nieuwe opgeven vervaltijd.

bool session_destroy( void )
php 4
Verwijderd de data opgeslagen in de huidge session. Deze functie zorgt er echter niet voor dat de globale sessionvariabelen ge-unset() worden. Geeft TRUE of FALSE terug, afhankelijk van het feit of het destroyen gelukt is.

string session_name( [string name] )
php 4
Geeft de huidige naam van de session terug. Als name opgeven is wordt de naam van de session overschreven door de nieuwe opgeven naam. Indien je de naam van de session wijzigt, let er dan op dat je deze functie ELKE keer opnieuw VOOR session_start() aanroept.

bool session_register( mixed name [, mixed ...] )
php 4
Registreert een of meer variabelen in een session. Het wordt echter aangeraden om gebruik te maken van de globals $_SESSION en $HTTP_SESSION_VARS. Zie: ‘Session variabelen’

bool session_start( void )
php 4
Creëert een nieuwe session of gaat verder met de huidige session indien de session_id en session_name bekend zijn. Zie: ‘Hoe worden sessions doorgegeven?’

bool session_unregister( string name )
php 4
Verwijderd de globale session variabele name. Gebruik de ‘gewone’ unset() indien je gebruikt maakt van de (super)globals $_SESSION of $HTTP_SESSION_VARS. Geeft TRUE terug indien de variabelen succesvol verwijderd is.

void session_unset( void )
php 4
Min of meer te vergelijken met de session_unregister functie, met als verschil dat deze functie ALLE session variabelen unset. Gebruik ook hier de ‘gewone’ unset() indien je gebruikt maakt van de (super)globals $_SESSION of $HTTP_SESSION_VARS.

Reacties

0
Nog geen reacties.