Sessions et cookies
Les cookies
Création
Un cookie s'envoie avec la fonction setcookie(). Les arguments sont les suivants :
• Nom
• Valeur
• date d'expiration (un timestamp unix)
• chemin (validité du cookie suivant le chemin dans l'url)
• domaine (pare défaut, le vôtre)
• secure : flag de sécurité : le cookie n'est accessible que via une connexion sécurisée.
Seul le premier argument est obligatoire. Pour ne pas spécifier une valeur, il suffit de ne rien mettre.
Attention à quelques limitations :
• Un cookie étant envoyé avec les entêtes HTTP, il ne peut pas être envoyé si une sortie a déjà eu
lieu (html, texte, ...)
• Un cookie n'est pas disponible dans la page qui l'a créé. Il faut soit recharger la page, soit pointer
sur une autre.
• Un cookie ne peut être supprimé qu'avec les mêmes paramètres qui ont servi à sa création. C'est
le navigateur qui supprime le cookie.
setcookie("testcookie",session_id(),time()+3600);
if(isset($_COOKIE['testcookie'])) echo $_COOKIE['testcookie'];
Dans l'exemple précédent, au premier chargement rien ne sera affiché car le contenu du cookie n'est
pas encore accessible. Au deuxième chargement la valeur sera réellement affichée, mais attention au
décalage entre la mise à jour et l'accès.
if(!isset($_COOKIE['testcookie'])) {
setcookie("testcookie",'toto',time()+3600);
header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
}
Dans cet exemple, on regarde si le cookie existe, sinon on le créé et on rappelle la page.
13.1.2 Accès
On accède au cookie grâce à la variable globale $_COOKIE qui est un tableau. L'index du tableau
est le nom du cookie.
S. ROHAUT Cours Programmation PHP Page 62/93$valeur=$_COOKIE['testcookie'];
echo $valeur; // par rapport à l'exemple précédent : toto
Note : on peut placer les tableaux avec les cookies. Il suffit de nommer son cookie avec une
notation par crochets.
setcookie("testcookie[1]",'toto',time()+3600);
setcookie("testcookie[2]",'titi',time()+3600);
setcookie("testcookie[3]",'tata',time()+3600);
... (page suivante)
foreach($_COOKIE as $tab) {
if(is_array($tab)) foreach($tab as $key => $value) echo "$key => $value";
}
13.1.3 Suppression
Pour supprimer un cookie, il suffit de donner une date antérieure à la date actuelle à celui-ci.
if(!isset($_COOKIE['testcookie'])) {
setcookie("testcookie",'toto',time()+3600);
} else {
setcookie("testcookie",'',time()-3600);
}
if(isset($_COOKIE['testcookie'])) echo "OK";
else echo "Pas de cookie";
Dans l'exemple précédent, les appels au script vont provoquer successivement l'affichage de « pas
de cookie » et « OK ».
13.2 Identification HTTP
13.2.1 Connexion
Cette possibilité n'est disponible que si PHP est utilisé comme module Apache, et pas en tant que
script CGI. L'identification HTTP permet via l'envoi d'un HEADER HTTP de demander une
identification au client. Dans ce cas le navigateur va ouvrir une fenêtre de connexion demandant une
saisie de login et de mot de passe. PHP récupère bien entendu ces valeurs. Voici l'exemple issu de la
documentation PHP
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="Slyunix"');
header('HTTP/1.0 401 Unauthorized');
echo 'Texte utilisé si le visiteur utilise le bouton d\'annulation';
exit;
} else {
echo "<p>Bonjour, {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>Votre mot de passe est {$_SERVER['PHP_AUTH_PW']}.</p>";
}
Dans cet exemple, on passe en entête une demande d'authentification. En cas d'échec (bouton
annuler) un message d'annulation est affiché. Sinon on peut récupérer les valeurs via les variables :
• $_SERVER['PHP_AUTH_USER'] : login
S. ROHAUT Cours Programmation PHP Page 63/93• $_SERVER['PHP_AUTH_PW'] : mot de passe
13.2.2 Déconnexion
La déconnexion n'est pas si évidente que ça car une fois connecté, les identifiants sont placés dans la
session. La méthode la plus simple consiste à fermer le navigateur et à le relancer.
13.3 Sessions PHP
13.3.1 Principe
Les sessions permettent de préserver des données lors de la visite d'un site. Chaque personne se voit
attribué un identifiant unique appelé identifiant de session, ou SID. Ce SID est soit stocké dans un
cookie, soit passé par URL. On peut ainsi définir un nombre infini de variables qui seront
accessibles durant toute la durée de la session.
Notez que si vous fermez et relancez votre navigateur, vous changez d'identifiant, et donc la
précédente session est perdue, même si elle était nommée.
On peut connaître son SID grâce à la constante de même nom, ou par la fonction session_id().
13.3.2 Utilisation
13.3.2.1 Ouverture
Si dans PHP.INI la valeur « session.auto_start » est activée, les sessions sont démarrées de manière
automatique lors de l'accès à une page. Sinon il faut utiliser explicitement la fonction
session_start(). Son appel créé une session ou restaure une session précédemment stockée sur le
serveur.
ATTENTION : L'ouverture d'une session doit obligatoirement apparaître avant toute
sortie/affichage du script PHP ou de balises HTML, même une ligne vide !
On peut créer ou récupérer une session nommée en précisant un session_name() qui prend comme
paramètre le nom de la session qui doit être créée (premier appel) ou accédée (appels suivants). La
session par défaut se nomme « PHPSESSID » et c'est celle-là qui est chargée si session_name()
n'est pas appelée. Il faut donc appeler session_name() AVANT session_start() pour accéder à une
session nommée.
Une session peut aussi être indirectement créée ou ouverte avec l'utilisation de la fonction
session_register().
13.3.2.2 Variables de session
Il y a deux moyens de créer des variables de session, qui seront accessibles depuis n'importe quelle
page visitée à partir du moment ou session_start() a été appelée. Le premier moyen ne fonctionne ne
fonctionne pas si register_globals est à off dans PHP.INI :
Méthode 1 (déconseillée) :
S. ROHAUT Cours Programmation PHP Page 64/93La fonction session_register() prend comme paramètre un nom de variable et la définit comme
variable de session. Cette variable peut ensuite être accédée par son nom.
$txt='Bonjour les amis';
session_register('txt'); // txt devient une variable de session.
Pour savoir si une variable est enregistrée dans la session courante, on utilise
session_is_registered().
if(session_is_registered('txt')) echo $txt;
Pour supprimer une variable de session, il faut utiliser session_unregister(). Par contre il ne faut
pas oublier d'utiliser unset() pour supprimer la variable globale, car la précédente fonction ne la
supprime pas, elle empêche seulement sa sauvegarde à la fin du script.
if(session_is_registered('txt')) {
session_unregister('txt');
unset($txt);
}
Méthode 2 (La meilleure à utiliser) :
On utilise tout simplement le tableau global $_SESSION. Ainsi :
$_SESSION['txt']="Bonjour les amis";
crée la variable de session txt,
echo $_SESSION['txt']
l'affiche et
unset($_SESSION['txt']);
l'efface. Pour effacer toutes les variables de sessions, il suffit de faire
$_SESSION=array();
13.3.3 Expiration de la session
La durée de vie d'une session PHP dépend de trois paramètres de configuration du fichier PHP.INI :
session.gc_maxlifetime, session.cookie_lifetime et session.cache_expire. Le premier concerne la
durée de vie des données sur le serveur, en nombre de secondes. Il est par défaut de 1440 secondes,
soit 24 minutes. Au delà, les données sont supprimées et elles seront rechargées via le cookie de
session lors du prochain appel.
Le second est la durée de vie du cookie de session, exprimé en secondes. Par défaut la valeur est
zéro (0) ce qui signifie : jusqu'à ce que le navigateur soit éteind.
Le troisième est la durée de vie des données de session, en minutes. Sa valeur par défaut est de 180
minutes, soit trois heures. Ce qui veut dire que dans une même session, on peut rester trois heures
sur la même page, les valeurs ne sont pas perdues. Au delà, il faut rouvrir une nouvelle session et
S. ROHAUT Cours Programmation PHP Page 65/93restaurer de nouvelles valeurs. A chaque chargement de page (ouverture de session), on
recommence le décompte.
On peut modifier le délai d'expiration de la session grâce à la fonction session_cache_expire() qui
prend comme valeur la nouvelle durée en minutes. Sans paramètre elle retourne la valeur actuelle.
13.3.4 Changer l'accès par défaut
PHP sait très bien se débrouiller tout seul mais on peut remplacer la prise en charge par défaut des
sessions par ses propres fonctions, dans le but de gérer l'ouverture et la fermeture ou encore la
sauvegarde des données de session dans un fichier ou une base de données.
Une autre utilisation peut être le traçage via PHP de toutes les ouvertures/fermetures des sessions.
Pour ça on utilise la fonction session_set_save_handler(). Son étude dépasse le cadre du cours
mais voici un exemple tiré de la documentation PHP.
if(!mysql_table_exists("sessions",$DB)) {
$query = 'CREATE TABLE sessions
(
SessionID char(255) not null,
LastUpdated datetime not null,
DataValue text,
PRIMARY KEY ( SessionID ),
INDEX ( LastUpdated )
)';
mysql_query($query);
}
function sessao_open($aSavaPath, $aSessionName){
global $aTime;
sessao_gc( $aTime );
return True;
}
function sessao_close(){
return True;
}
function sessao_read( $aKey ) {
$query = "SELECT DataValue FROM sessions WHERE SessionID='$aKey'";
$busca = mysql_query($query);
if(mysql_num_rows($busca) == 1) {
$r = mysql_fetch_array($busca);
return $r['DataValue'];
} ELSE {
$query = "INSERT INTO sessions (SessionID, LastUpdated, DataValue)
VALUES ('$aKey', NOW(), '')";
mysql_query($query);
return "";
}
}
function sessao_write( $aKey, $aVal ) {
$aVal = addslashes( $aVal );
$query = "UPDATE sessions SET DataValue = '$aVal', LastUpdated = NOW()
WHERE SessionID = '$aKey'";
mysql_query($query);
return True;
S. ROHAUT Cours Programmation PHP Page 66/93}
function sessao_destroy( $aKey ) {
$query = "DELETE FROM sessions WHERE SessionID = '$aKey'";
mysql_query($query);
return True;
}
function sessao_gc( $aMaxLifeTime )
{
$query = "DELETE FROM sessions WHERE UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP
(LastUpdated) > $aMaxLifeTime";
mysql_query($query);
return True;
}
session_set_save_handler("sessao_open", "sessao_close", "sessao_read",
"sessao_write", "sessao_destroy", "sessao_gc");
Les cookies
Création
Un cookie s'envoie avec la fonction setcookie(). Les arguments sont les suivants :
• Nom
• Valeur
• date d'expiration (un timestamp unix)
• chemin (validité du cookie suivant le chemin dans l'url)
• domaine (pare défaut, le vôtre)
• secure : flag de sécurité : le cookie n'est accessible que via une connexion sécurisée.
Seul le premier argument est obligatoire. Pour ne pas spécifier une valeur, il suffit de ne rien mettre.
Attention à quelques limitations :
• Un cookie étant envoyé avec les entêtes HTTP, il ne peut pas être envoyé si une sortie a déjà eu
lieu (html, texte, ...)
• Un cookie n'est pas disponible dans la page qui l'a créé. Il faut soit recharger la page, soit pointer
sur une autre.
• Un cookie ne peut être supprimé qu'avec les mêmes paramètres qui ont servi à sa création. C'est
le navigateur qui supprime le cookie.
setcookie("testcookie",session_id(),time()+3600);
if(isset($_COOKIE['testcookie'])) echo $_COOKIE['testcookie'];
Dans l'exemple précédent, au premier chargement rien ne sera affiché car le contenu du cookie n'est
pas encore accessible. Au deuxième chargement la valeur sera réellement affichée, mais attention au
décalage entre la mise à jour et l'accès.
if(!isset($_COOKIE['testcookie'])) {
setcookie("testcookie",'toto',time()+3600);
header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
}
Dans cet exemple, on regarde si le cookie existe, sinon on le créé et on rappelle la page.
13.1.2 Accès
On accède au cookie grâce à la variable globale $_COOKIE qui est un tableau. L'index du tableau
est le nom du cookie.
S. ROHAUT Cours Programmation PHP Page 62/93$valeur=$_COOKIE['testcookie'];
echo $valeur; // par rapport à l'exemple précédent : toto
Note : on peut placer les tableaux avec les cookies. Il suffit de nommer son cookie avec une
notation par crochets.
setcookie("testcookie[1]",'toto',time()+3600);
setcookie("testcookie[2]",'titi',time()+3600);
setcookie("testcookie[3]",'tata',time()+3600);
... (page suivante)
foreach($_COOKIE as $tab) {
if(is_array($tab)) foreach($tab as $key => $value) echo "$key => $value";
}
13.1.3 Suppression
Pour supprimer un cookie, il suffit de donner une date antérieure à la date actuelle à celui-ci.
if(!isset($_COOKIE['testcookie'])) {
setcookie("testcookie",'toto',time()+3600);
} else {
setcookie("testcookie",'',time()-3600);
}
if(isset($_COOKIE['testcookie'])) echo "OK";
else echo "Pas de cookie";
Dans l'exemple précédent, les appels au script vont provoquer successivement l'affichage de « pas
de cookie » et « OK ».
13.2 Identification HTTP
13.2.1 Connexion
Cette possibilité n'est disponible que si PHP est utilisé comme module Apache, et pas en tant que
script CGI. L'identification HTTP permet via l'envoi d'un HEADER HTTP de demander une
identification au client. Dans ce cas le navigateur va ouvrir une fenêtre de connexion demandant une
saisie de login et de mot de passe. PHP récupère bien entendu ces valeurs. Voici l'exemple issu de la
documentation PHP
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="Slyunix"');
header('HTTP/1.0 401 Unauthorized');
echo 'Texte utilisé si le visiteur utilise le bouton d\'annulation';
exit;
} else {
echo "<p>Bonjour, {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>Votre mot de passe est {$_SERVER['PHP_AUTH_PW']}.</p>";
}
Dans cet exemple, on passe en entête une demande d'authentification. En cas d'échec (bouton
annuler) un message d'annulation est affiché. Sinon on peut récupérer les valeurs via les variables :
• $_SERVER['PHP_AUTH_USER'] : login
S. ROHAUT Cours Programmation PHP Page 63/93• $_SERVER['PHP_AUTH_PW'] : mot de passe
13.2.2 Déconnexion
La déconnexion n'est pas si évidente que ça car une fois connecté, les identifiants sont placés dans la
session. La méthode la plus simple consiste à fermer le navigateur et à le relancer.
13.3 Sessions PHP
13.3.1 Principe
Les sessions permettent de préserver des données lors de la visite d'un site. Chaque personne se voit
attribué un identifiant unique appelé identifiant de session, ou SID. Ce SID est soit stocké dans un
cookie, soit passé par URL. On peut ainsi définir un nombre infini de variables qui seront
accessibles durant toute la durée de la session.
Notez que si vous fermez et relancez votre navigateur, vous changez d'identifiant, et donc la
précédente session est perdue, même si elle était nommée.
On peut connaître son SID grâce à la constante de même nom, ou par la fonction session_id().
13.3.2 Utilisation
13.3.2.1 Ouverture
Si dans PHP.INI la valeur « session.auto_start » est activée, les sessions sont démarrées de manière
automatique lors de l'accès à une page. Sinon il faut utiliser explicitement la fonction
session_start(). Son appel créé une session ou restaure une session précédemment stockée sur le
serveur.
ATTENTION : L'ouverture d'une session doit obligatoirement apparaître avant toute
sortie/affichage du script PHP ou de balises HTML, même une ligne vide !
On peut créer ou récupérer une session nommée en précisant un session_name() qui prend comme
paramètre le nom de la session qui doit être créée (premier appel) ou accédée (appels suivants). La
session par défaut se nomme « PHPSESSID » et c'est celle-là qui est chargée si session_name()
n'est pas appelée. Il faut donc appeler session_name() AVANT session_start() pour accéder à une
session nommée.
Une session peut aussi être indirectement créée ou ouverte avec l'utilisation de la fonction
session_register().
13.3.2.2 Variables de session
Il y a deux moyens de créer des variables de session, qui seront accessibles depuis n'importe quelle
page visitée à partir du moment ou session_start() a été appelée. Le premier moyen ne fonctionne ne
fonctionne pas si register_globals est à off dans PHP.INI :
Méthode 1 (déconseillée) :
S. ROHAUT Cours Programmation PHP Page 64/93La fonction session_register() prend comme paramètre un nom de variable et la définit comme
variable de session. Cette variable peut ensuite être accédée par son nom.
$txt='Bonjour les amis';
session_register('txt'); // txt devient une variable de session.
Pour savoir si une variable est enregistrée dans la session courante, on utilise
session_is_registered().
if(session_is_registered('txt')) echo $txt;
Pour supprimer une variable de session, il faut utiliser session_unregister(). Par contre il ne faut
pas oublier d'utiliser unset() pour supprimer la variable globale, car la précédente fonction ne la
supprime pas, elle empêche seulement sa sauvegarde à la fin du script.
if(session_is_registered('txt')) {
session_unregister('txt');
unset($txt);
}
Méthode 2 (La meilleure à utiliser) :
On utilise tout simplement le tableau global $_SESSION. Ainsi :
$_SESSION['txt']="Bonjour les amis";
crée la variable de session txt,
echo $_SESSION['txt']
l'affiche et
unset($_SESSION['txt']);
l'efface. Pour effacer toutes les variables de sessions, il suffit de faire
$_SESSION=array();
13.3.3 Expiration de la session
La durée de vie d'une session PHP dépend de trois paramètres de configuration du fichier PHP.INI :
session.gc_maxlifetime, session.cookie_lifetime et session.cache_expire. Le premier concerne la
durée de vie des données sur le serveur, en nombre de secondes. Il est par défaut de 1440 secondes,
soit 24 minutes. Au delà, les données sont supprimées et elles seront rechargées via le cookie de
session lors du prochain appel.
Le second est la durée de vie du cookie de session, exprimé en secondes. Par défaut la valeur est
zéro (0) ce qui signifie : jusqu'à ce que le navigateur soit éteind.
Le troisième est la durée de vie des données de session, en minutes. Sa valeur par défaut est de 180
minutes, soit trois heures. Ce qui veut dire que dans une même session, on peut rester trois heures
sur la même page, les valeurs ne sont pas perdues. Au delà, il faut rouvrir une nouvelle session et
S. ROHAUT Cours Programmation PHP Page 65/93restaurer de nouvelles valeurs. A chaque chargement de page (ouverture de session), on
recommence le décompte.
On peut modifier le délai d'expiration de la session grâce à la fonction session_cache_expire() qui
prend comme valeur la nouvelle durée en minutes. Sans paramètre elle retourne la valeur actuelle.
13.3.4 Changer l'accès par défaut
PHP sait très bien se débrouiller tout seul mais on peut remplacer la prise en charge par défaut des
sessions par ses propres fonctions, dans le but de gérer l'ouverture et la fermeture ou encore la
sauvegarde des données de session dans un fichier ou une base de données.
Une autre utilisation peut être le traçage via PHP de toutes les ouvertures/fermetures des sessions.
Pour ça on utilise la fonction session_set_save_handler(). Son étude dépasse le cadre du cours
mais voici un exemple tiré de la documentation PHP.
if(!mysql_table_exists("sessions",$DB)) {
$query = 'CREATE TABLE sessions
(
SessionID char(255) not null,
LastUpdated datetime not null,
DataValue text,
PRIMARY KEY ( SessionID ),
INDEX ( LastUpdated )
)';
mysql_query($query);
}
function sessao_open($aSavaPath, $aSessionName){
global $aTime;
sessao_gc( $aTime );
return True;
}
function sessao_close(){
return True;
}
function sessao_read( $aKey ) {
$query = "SELECT DataValue FROM sessions WHERE SessionID='$aKey'";
$busca = mysql_query($query);
if(mysql_num_rows($busca) == 1) {
$r = mysql_fetch_array($busca);
return $r['DataValue'];
} ELSE {
$query = "INSERT INTO sessions (SessionID, LastUpdated, DataValue)
VALUES ('$aKey', NOW(), '')";
mysql_query($query);
return "";
}
}
function sessao_write( $aKey, $aVal ) {
$aVal = addslashes( $aVal );
$query = "UPDATE sessions SET DataValue = '$aVal', LastUpdated = NOW()
WHERE SessionID = '$aKey'";
mysql_query($query);
return True;
S. ROHAUT Cours Programmation PHP Page 66/93}
function sessao_destroy( $aKey ) {
$query = "DELETE FROM sessions WHERE SessionID = '$aKey'";
mysql_query($query);
return True;
}
function sessao_gc( $aMaxLifeTime )
{
$query = "DELETE FROM sessions WHERE UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP
(LastUpdated) > $aMaxLifeTime";
mysql_query($query);
return True;
}
session_set_save_handler("sessao_open", "sessao_close", "sessao_read",
"sessao_write", "sessao_destroy", "sessao_gc");