Les array $_GET et $_POST sont des variables un peu particulières : leur nom est écrit en majuscules et commence par un underscore, mais surtout ces variables sont générées automatiquement par PHP. Ce sont ce qu'on appelle des variables superglobales.
Il existe d'autres types de variables superglobales que nous allons découvrir. Parli elles, certaines permettent de stocker des informations pendant la durée d'une visite (c'est le principe des sessions), mais aussi de stocker des informations sur l'ordinateur de nos visiteurs pendant plusieurs mois (c'est le principe des cookies).
Sommaire
Les variables superglobales
Les variables superglobales sont des variables un peu particulières pour 3 raisons :
- Elles sont écrites en majuscules et commencent toutes, à une exception près, par un underscore (_) (le trait de soulignement). Comme
$_GET
et $_POST
qu'on a vu.
- Les superglobales sont des
array
car elles contiennent généralement de nombreuses informations.
- Enfin, ces variables sont automatiquement créées par PHP à chaque fois qu'une page est chargée. Ces variables existent donc sur toutes les pages et sont accessibles partout : au milieu de notre code, au début, dans les fonctions, etc.
Pour afficher le contenu d'une superglobale et voir ce qu'elle contient, le plus simple est d'utiliser la fonction
print_r
puisqu'il s'agit d'un array. Exemple :
Code PHP
<pre>
<?php
print_r($_GET);
?>
</pre>
Faisons le tour des principales variables superglobales que nous n'utiliserons pas toutes :
$_SERVER
: ce sont des valeurs renvoyées par le serveur. Elles sont nombreuses et quelques-unes d'entre elles peuvent nous être d'une grande utilité. Retenons au moins $_SERVER['REMOTE_ADDR']
qui nous donne l'adresse IP du client qui a demandé à voir la page. Cela peut être utile pour l'identifier.
$_ENV
: ce sont des variables d'environnement, toujours données par le serveur. C'est le plus souvent sous des serveurs Linux que l'on retrouve des informations dans cette superglobale. Généralement, on ne trouvera rien de bien utile là-dedans pour notre site web.
$_SESSION
: on y retrouve les variables de session. Ce sont des variables qui restent stockées sur le serveur le temps de la visite d'un visiteur. Nous allons apprendre à nous en servir ici.
$_COOKIE
: contient les valeurs des cookies enregistrés sur l'ordinateur du visiteur. Cela nous permet de stocker des informations sur l'ordinateur du visiteur pendant plusieurs mois par exemple pour se souvenir de son nom.
$_GET
: contient les données envoyées en paramètre dans l'URL
$_POST
: variable qui contient les informations qui viennent d'être envoyées par un formulaire.
$_FILES
: contient la liste des fichiers qui ont été envoyés via le formulaire précédent.
On a déjà vu une partie de ces variables superglobales. On va voir plus en détail les sessions et les cookies.
Les sessions
Les sessions sont un moyen de conserver des variables sur toutes les pages de notre site. Jusqu'ici, on était parvenu à passer des variables de page en page via la méthode GET (en modifiant l'url : page.php?variable=valeur
) et via la méthode POST (à l'aide d'un formulaire).
Maintenant, si on souhaite transmettre des variables sur toutes les pages de notre site pendant la durée de la visite d'un visiteur. Ce ne serait pas facile avec GET et POST plutôt faits pour transmettre les informations en une seule fois, d'une page à une autre.
On sait envoyer d'une page à une autre le nom et prénom du visiteur, mais dès qu'on charge une autre page, ces informations sont "oubliées". C'est pour cela que les sessions ont été inventées.
Fonctionnement des sessions
Comment sont gérées les sessions en PHP ? Voici les 3 étapes à connaître :
- Un visiteur arrive sur notre site. On demande à créer une session pour lui. PHP génère alors un numéro unique. Ce numéro est souvent très gros et écrit en hexadécimal. Par exemple : a02bbffc6198e6e0cc2715047bc3766f.
 |
Ce numéro sert d'identifiant et est appelé "ID de session" (ou PHPSESSID). PHP transmet automatiquement cet ID de page en page en utilisant un cookie en règle générale. |
- Une fois la session créée, on peut créer une infinité de variables de session pour nos besoins. Par exemple, on peut créer une variable
$_SESSION['nom']
qui contient le nom du visiteur, $_SESSION['prenom']
qui contient le prénom, etc. Le serveur conserve ces variables même lorsque la page PHP a fini d'être générée. Cela veut dire que, quelle que soit la page de notre site, on peut récupérer par exemple le nom et le prénom du visiteur via la superglobale $_SESSION
!
- Lorsque le visiteur se déconnecte du site, alors la session est fermée et PHP "oublie" toutes les variables de sessions qu'on a créées. Il est en fait difficile de savoir précisément quand un visiteur quitte le site. En effet, lorsqu'il ferme son navigateur ou va sur un autre site, notre site n'en est pas informé. Soit le visiteur clique sur un bouton "Déconnexion" (qu'on aurait créé) avant de s'en aller, soit on attend quelques minutes d'inactivité pour le déconnecter automatiquement (on parle de timeout). Le plus souvent, le visiteur est déconnecté par un timeout.
Tout ceci en apparence un peu compliqué est en fait très simple à utiliser. On doit connaître 2 fonctions :
session_start()
: démarre le système de sessions. Si le visiteur vient d'arriver sur le site, alors un numéro de session est généré pour lui. On doit appeler cette fonction au tout début de chacune des pages où on a besoin des variables de session.
session_destroy()
: ferme la session du visiteur. Cette fonction est automatiquement appelée lorsque le visiteur ne charge plus de page de notre site pendant plusieurs minutes (c'est le timeout), mais on peut aussi créer une page "Déconnexion" si le visiteur souhaite se déconnecter manuellement.
 |
Il y a un petit piège : il faut appeler session_start() sur chacune de nos pages AVANT d'écrire le moindre code HTML (avant même la balise <!DOCTYPE>).
Si on oublie de lancer session_start() , on ne pas accéder aux varaibles superglobales $_SESSION . |
Exemple d'utilisation des sessions
Etudions un exemple concret :
Code PHP
<?php
// On démarre la session AVANT d'écrire du code HTML
session_start();
// On s'amuse à créer quelques variables de session dans $_SESSION
s_SESSION['prenom'] = 'Jean';
s_SESSION['nom'] = 'Dupont';
s_SESSION['age'] = 24;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>Titre de ma page</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<p>
Salut <?php
echo $_SESSION['prenom']; ?>
!<br />
Tu es à l'accueil de mon site (index.php). Tu veux aller sur une autre page ?
</p>
<p>
<a href="mapage.php">Lien vers mapage.php</a><br />
<a href="monscript.php">Lien vers monscript.php</a><br />
<a href="informations.php">Lien vers informations.php</a>
</p>
</body>
</html>
Remarque : on peut créer les variables de session n'importe où dans le code (pas seulement au début comme ici). La seule chose importante, c'est que
session_start()
soit indiqué en tout début de page.
Noter aussi que les liens sont tout simples et ne transmettent aucune information. PHP gè tout pour nous et s'occupe de transmettre les variables.
Maintenant, sur toutes les pages du site, on peut retrouver les variables
$_SESSION['prenom']
,
$_SESSION['nom']
et
$_SESSION['age']
. Bien sur, il faudra démarrer le système de session sur toutes les pages avec
session_start()
.
Par exemple le code de la page
informations.php
:
Code PHP
<?php
session_start();// On démarre la session AVANT tout
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>Titre de ma page</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<p>Re-bonjour !</p>
<p>
Je me souviens de toi ! Tu t'appelles <?php
echo $_SESSION['prenom'] . ' ' . $_SESSION['nom']; ?>
!<br />
Et ton âge… Tu as <?php
echo $_SESSION['age']; ?>
ans, c'est ça ? :-D
</p>
</body>
</html>
On a juste fait que démarrer la session avec
session_start()
, puis on a affiché les valeurs des variables de session.
En résumé, on peut créer des variables de session comme on crée des variables, à condition de les écrire dans l'array
$_SESSION
et d'avoir lancé le système de sessions avec
session_start()
.
Ces variables seront conservées de page en page pendant toute la durée de la visite du visiteur.
 |
Si on veut détruire manuellement le session du visiteur, on peut faire un lien "Déconnexion" qui mène vers une page qui fait appel à la fonction session_destroy() .
Néanmoins, sa session sera détruite automatiquement au bout d'un certain temps d'inactivité. |
L'utilité des sessions en pratique
Quelques exemples de l'utilité des sessions :
- Imaginons un script qui demande un login et un mot de passe pour qu'un visiteur puisse se éconnecteré (s'authentifier). On peut enregistrer ces informations dans des variables de session et se souvenir du login du visiteur sur toutes les pages du site !
- Puisqu'on retient son login et que la variable de session n'est créée que s'il a réussi à s'authentifier, on peut utiliser pour restreindre certaines pages de son site à certains visiteurs uniquement. Cela permet de créer toute une zone d'administration sécurisée : si la variable de session login existe, on affiche le contenu, sinon on affiche une erreur. Cela rappele le TP "page protégée par mot de passe", sauf qu'ici on peut se servir des sessions pour protéger automatiquement plusieurs pages.
- On se sert activement des sessions sur les sites de vente en ligne. Cela permet de gérer un "panier" : on retient les produits que commande le client, quelle que soit la page où il est. Lorsqu'il valide sa commande, on récupère ces informations et… on le fait payer.
 |
Si le site est hébergé chez Free.fr, on doit créer un dossier appelé "sessions" à la racine de son FTP pour activer les sessions. |
Les cookies
Travailler avec des cookies fonctionne à peu près de la mê:me façon qu'avec des sessions, à quelques petites différences près qu'on va voir. Voici ce que nous allons faire pour découvrir les cookies :
- D'abord, qu'est-ce exactement qu'un cookie ?
- Puis comment écrire un cookie. C'est facile à condition de respecter quelques règles.
- Et enfin, comment récupérer le contenu d'un cookie. C'est le plus simple.
qu'est-ce qu'un cookie ?
Un cookie, c'est un petit fichier que l'on enregistre sur l'ordinateur du visiteur.
Ce fichier contient du texte et permet de "retenir" des informations sur le visiteur. Par exemple, on inscrit dans un cookie le pseudo du visiteur, comme ça la prochaine fois qu'il viendra sur notre site on pourra lire son pseudo en allant regarder ce que son cookie contient.
Parfois les cookies ont une mauvaise image. On fait souvent l'erreur de penser que les cookies sont "dangereux". Non, ce ne sont pas des virus, juste des petits fichiers textes qui permettent de retenir des informations. Au pire, un site marchand peut retenir qu'on aime les appareils photos numériques et nous afficher uniquement des pubs pour des appareils photos, mais c'est tout, ces petites bêtes sont inoffensives pour notre ordinateur.
Chaque cookie stocke généralement une information à la fois. Si on veut stocker le pseudonyme du visiteur et sa date de naissance, il est donc recommandé de créer 2 cookies.
 |
Où sont stockés les cookies sur le disque dur ? |
Cela dépend du navigateur web. Généralement on ne touche pas directement à ces fichiers, mais on peut afficher à l'intérieur du navigateur la liste des cookies qui sont stockés. On peut choisir de les supprimer à tout moment.
Avec Mozilla Firefox, on va dans "Outils / Options / Vie privée".
Les cookies sont classés par site web. Chaque cookie a un nom et une valeur. Tout cookie a une date d'expiration, après cette date, il est automatiquement supprimé du navigateur.
Les cookies sont donc des informations temporaires que l'on stocke sur l'ordinateur des visiteurs. La taille est limitée à quelques Ko.
Ecrire un cookie
Comme une variable, un cookie a un nom et une valeur. Par exemple, le cookie
pseudo
aurait chez moi la valeur
alain33
.
Pour écrire un cookie, on utilise la fonction PHP
setcookie
(qui signifie "placer un cookie")
On lui donne en général, dans l'ordre, 3 paramètres :
- Un nom (ex.:
pseudo
)
- Sa valeur (ex.:
alain33
)
- La date d'expiration du cookie, sous forme de timestamp (ex : 1090521508).
Le paramètre correspondant à la date d'expiration du cookie mérite quelques explications. Il s'agit d'un timestamp, c'est-à-dire du nombre de scondes écoulées depuis le 1
er janvier 1970. Le timestamp est une valeur qui augmente de 1 toutes les secondes.
Pour obtenir le timestamp correspondant à maintenant, on fait appel à la fonction
time()
. Pour définir une date d'expiration du cookie, il faut ajouter au "moment actuel" le nombre de secondes au bout duquel il doit expirer.
Si on veut supprimer le cookie dans un an, il faudra donc écrire :
time() + 365*24*3600
.
Voici donc comment on peut créer un cookie :
Code PHP
<?php
setcookie('pseudo', 'alain33', time() + 365*24*3600); ?>
Sécuriser son cookie avec le mode httpOnly
Il est toutefois recommandé d'activer l'option
httpOnly
sur le cookie. Sans entrer dans les détails, cela rendra le cookie inaccessible en javascript sur tous les navigateurs qui supportent cette option (cas de tous les navigateurs récents).
cette option permet de réduire drastiquement les risques de faille XSS sur notre site, au cas où on aurait oublié d'utiliser
htmlspecialchars
à un moment.
Il est donc
recommandé de créer le cookie comme cela :
Code PHP
<?php
setcookie('pseudo', 'alain33', time() + 365*24*3600, null, null, false, true); ?>
Le dernier paramètre
true
permet d'activer le mode httpOnly sur le cookie et donc de le rendre en quelque sorte plus sécurisé. Ça ne coûte rien et on diminue le risque qu'un de nos visiteurs puisse se faire voler le contenu d'un cookie un jour à cause d'une faille XSS.
 |
Les paramètres au milieu sont des paramètres que nous n'utilisons pas, on leur a donc envoyé null . |
Créer le cookie avant d'écrire du HTML
Il y a un petit problème avec
setcookie
… Comme pour
session_start
, cette fonction ne marche QUE si on l'appelle avant tout code HTML (donc avant la balise
).
 |
Donc, ne JAMAIS placer le moindre code HTML avant d'utiliser setcookie . La plupart des gens qui ont des problèmes avec setcookie font cette erreur, donc s'en souvenir ! |
Voyons maintenant comment faire pour inscrire 2 cookies : un qui retient mon pseudo pendant un an, et un autre qui retient le nom de mon pays :
Code PHP
<?php
setcookie('pseudo', 'alain33', time() + 365*24*3600, null, null, false, true);// On écrit un cookie
setcookie('pays', 'France', time() + 365*24*3600, null, null, false, true);// On écrit un autre cookie…
// Et SEULEMENT MAINTENANT, on peut commencer à écrire du code html
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>Ma super page PHP</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
… etc, etc…
Pour écrire 2 cookies, il faut appeler 2 fois
setcookie
.
Afficher un cookie
C'est la partie la plus simple. Avant de commencer à travailler sur une page, PHP lit les cookies du client pour récupérer toutes les informations qu'ils contiennent.
Ces informations sont placées dans la superglobale
$_COOKIE
, sous forme d'array comme d'habitude.
De ce fait, si on veut ressortir le pseudo du visiteur que j'avais inscrit dans un cookie, il suffit d'écrire :
$_COOKIE['pseudo']
.
Ce qui donne comme code PHP pour réafficher le pseudo du visiteur :
Code PHP
<p>
hé ! Je me souviens de toi !<br />
Tu t'appelles <?php
echo $_COOKIE['pseudo']; ?>
et tu viens de <?php
echo $_COOKIE['pays']; ?>
c'est bien ça ?
</p>
Le gros avantage, c'est que les superglobales sont accessibles partout.
On a besoin de savoir ce que contient le cookie
pseudo
? Il suffit d'afficher le contenu de la superglobale
$_COOKIE['pseudo']
.
A noter que si le cookie n'existe pas, la variable superglobale n'existe pas. Il faut donc faire un
isset
pour vérifier si le cookie existe ou non.
 |
Les cookies viennent du visiteur. Comme toute information venant du visiteur, elle n'est pas sûre. N'importe quel visiteur peut créer des cookies et envoyer ainsi de fausses informations à notre site. S'en souvenir lorsqu'on lit les cookies du visiteur : il peut les avoir modifiés, donc prudence et ne pas avoir une confiance aveugle au contenu de ces cookies ! |
Modifier un cookie existant
Comment modifier un cookie déjà existant ? C'est très simple. Il faut refaire appel à
setcookie
en gardant le même nom de cookie.
Cela "écrasera" l'ancien cookie.
Par exemple, si j'habite maintenant en Chine, je ferai :
Code PHP
<?php
setcookie('pays', 'Chine', time() + 365*24*3600, null, null, false, true); ?>
A noter que le temps d'expiration du cookie est remis à zéro pour un an.