$_GET
, $_POST
, $_FILES
, et $_REQUEST
Je les rappelle ici, mais nous avons déjà abordé ces 3 variables.
On ne s'attardera donc pas plus sur le sujet ;).
$_SESSION
La variable $_SESSION
est très importante car c'est elle qui va vous permettre de conserver
les données utilisateur d'un script à l'autre dans la même session.
Le problème
Comme vous avez du le remarquer, à chaque fois qu'un utilisateur "appelle" un script PHP, le contexte
d'exécution (re)part de zéro: en d'autres termes, toutes les variables, fonctions, etc. n'existent plus et
il faut tout recharger/recréer.
On a aussi vu qu'avec une requête GET ou POST, on arrive à faire passer des données d'une page
(contenant par ex. un formulaire) à une autre (traitant les données reçues par GET ou POST).
Imaginez une page HTML login_form.html
contenant un formulaire qui récupère le
(login
) d'un utilisateur.
login_form.html
<form id="user-infos" class="card" action="login.php">
<input type="text" class="form-control" placeholder="login" name="login">
<button type="submit" class="btn btn-primary">LOGIN</button>
</form>
Ce formulaire a pour action le script login.php
qui traite les données reçues, c.a.d.
la variable $_GET['login']
:
il affiche un message de confirmation reprenant le login
(qu'on vient d'avoir dans $_GET
) + un lien vers l'espace client de l'utilisateur.
login.php
<h1>Bonjour <b><?php echo htmlspecialchars($_GET['login']) ?></b> !</h1>
<p>
Suivez ce lien pour accéder à votre <a href="espace_client.php">espace client</a>.
</p>
Jusque là, tout fonctionne...
On voit que l'espace client est géré par le script espace_client.php
:
on voudrait alors y afficher un message du type
"Espace Client de prénom nom".
Cependant, si vous écrivez naïvement le code :
espace_client.php
<h1>
Espace client de <?php echo htmlspecialchars($_GET['login']) ?>
</h1>
... et bien cela ne fonctionnera pas car $_GET
est vide !
En effet, espace_client.php
n'a pas été appelé par un formulaire et de ce fait, il ne reçoit
pas de données dans $_GET
, $_POST
ou encore $_REQUEST
.
La solution : $_SESSION
Pour résoudre ce type de problème, PHP met à disposition le mécanisme de session qui permet d'enregistrer
et récupérer des données liées à l'utilisateur qui visite le site.
Ces données sont stockées dans la superglobale $_SESSION
.
Il y aura 1 $_SESSION
par utilisateur.
PHP qui gère automatiquement le lien entre un utilisateur et sa session.
Quand un utilisateur "navigue" sur un de vos scripts, PHP lui associe un objet session,
et quand vous faites appel à $_SESSION
dans votre code, PHP fournit
automatiquement le $_SESSION
de l'utilisateur qui a "demandé" ce script.
En d'autres termes, des utilisateurs différents qui naviguent sur le même script n'obtiendront pas
le même résultat puisque le contenu de leur $_SESSION
sera différent.
Démarre ou récupérer une session : session_start()
Pour avoir accès à $_SESSION
au sein d'un script, il faut tout d'abord à chaque fois
faire appel à la fonction
session_start()
: cela démarre ou récupère la session de l'utilisateur connecté.
Pour que notre exemple précédent fonctionne, il aurait fallu enregistrer dans la $_SESSION
de l'utilisateur les données (qu'il a) fournies dans $_GET
au moment où elles étaient disponibles,
c.a.d. ici dans login.php
.
NB: les scripts ci-dessous sont simplifiés pour l'exemple: ils manquent de vérifications!
Le nouveau code est alors :
login.php
<?php
session_start() ; // démarrage/récupération de la sesssion
if (isset($_GET['login'])) {
$login = $_GET['login'];
// on enregistre ce qui nous intéresse dans la session de l'utilisateur
$_SESSION['login'] = $login ;
}
?>
<h1>Bonjour <b><?php echo htmlspecialchars($login) ?></b> !</h1>
<p>
Suivez ce lien pour accéder à votre <a href="espace_client.php">espace client</a>.
</p>
Et on peut maintenant écrire :
espace_client.php
<?php
session_start(); // récupération de la session de l'utilisateur
// récupération des données de cette session :
$login = $_SESSION['login'] ;
?>
<h1>
Espace client de <?php echo htmlspecialchars($login) ?>
</h1>
<hr>
<p>
<a href="logout.php">LOUGOUT</a>
</p>
NB: pour détruire une variable de session, on utilisera le classique
unset
sur
la clé de $_SESSION
visée (ex. unset($_SESSION['login']
).
Détruire une session : session_destroy()
Les données de l'utilisateur stockées dans $_SESSION
sont disponibles
dans tous les scripts du site utilisant session_start()
,
ceci jusqu'à ce que sa session soit détruite
(par exemple suite à la fermeture du navigateur).
La fonction PHP
session_destroy()
permet explicitement de détruire une session.
(elle doit être appelée après avoir récupéré la session avec session_start()
)
Vous avez certainement noté que dans le code de espace_client.php
, il y a un lien vers le script
logout.php
: ce script a pour but de détruire la session de l'utilisateur.
logout.php
<?php
// récupération de la session de l'utilisateur
session_start() ;
// destruction de la session (et donc du contenu de $_SESSION)
session_destroy() ;
?>
<h1>Vous êtes déconnecté.</h1>
<a href="login_form.html">Retour au début.</a>
NB: il est possible de définir un session timeout (une durée maximale de validité des sessions) en utilisant
php.ini
, ou en l'implémentant vous même en PHP par exemple en utilisant la fonction
time
+
vérification adhoc à chaque démarrage de script.
$_COOKIE
Les cookies sont des fichiers textes de petite taille qui peuvent être créés par PHP
sur la machine de l'utilisateur pour y stocker des informations.
Ces informations pourront alors être réutilisées lors d'une future visite du client
sur le site.
A la différence des sessions, les cookies peuvent perdurer d'une session de navigation à l'autre
(i.e. lorsque le navigateur a été fermé ou le timeout a expiré). Ils sont
cependant liés à la machine utilisée pour naviguer sur le site,
et peuvent être détruits par l'utilisateur (dans le menu de son navigateur).
La fonction
setcookie(...)
crée/modifie (envoie) un cookie sur le client.
(le cookie sera envoyé dans les entêtes HTTP : elle doit donc être appelée
avant toute autre sortie)
L'appel à setcookie
nécessite plusieurs paramètres importants :
-
string $name
: le nom du cookie (nom de la variable).
-
string $value
: la valeur du cookie (attention, le client y a accès en clair !).
-
int $expire
: la date d'expiration du cookie (en secondes depuis le 01/01/1970).
Une valeur 0 signifie que le cookie sera détruit à la fin de la session.
-
... d'autres paramètres optionnels sont décrits
ici
.
-
bool $httponly
: rend le cookie invisible aux langages de script comme Javascript.
Il est préférable d'activer cette option pour limiter les attaque XSS avec les cookies ->
NB: "limiter" ne signifie pas exclure, donc n'oubliez pas d'utiliser aussi
htmlspecialchars
.
Remarque :
La date d'expiration du cookie doit correspondre à une "date", exprimée en secondes:
on utilisera la fonction
time() : int
qui retourne
l'heure courante (en secondes à partir
du 1er janvier 1970 GMT), valeur à laquelle on ajoutera la durée de validité voulue (aussi en secondes).
// Exemple de définition d'une duré de validité de 24H
$expire = time() + 24*3600 ;
Une fois le cookie créé, et pendant sa durée de validité, sa valeur est disponible dans
le tableau $_COOKIE
à la clé 'nom' (ex.
$_COOKIE['nom']
).
Exemple :
Dans l'exemple ci-dessous, le script set_cookie.php
envoie le cookie 'color'
sur le navigateur du client avec une durée de validité d'un an.
set_cookie.php
<?php
// on peut imaginer récupérer cette valeur avec un formulaire de préférences...
$preferred_color = "red" ;
// création du cookie 'color'
$expire = time() + 365*24*3600 ; // durée d'un an
$httponly = true ;
$ok = setcookie('color', $preferred_color, $expire, null, null , false, $httponly) ;
// NB: $ok vérifie si le cookie a été envoyé, mais pas si le client l'a accepté
?>
<?php if($ok) : ?>
<h1>Un cookie a été créé.</h1>
<?php endif; ?>
<a href="get_cookie.php">--> tester la récupération du cookie <--</a>
Le script get_cookie.php
récupère et utilise la valeur du cookie 'color'
.
get_cookie.php
<?php
// récupération de la valeur du cookie précédemment enregistré
if (!empty($_COOKIE['color'])){
$preferred_color = $_COOKIE['color'] ;
}
?>
<!-- exemple d'utilisation de la valeur -->
<?php if (isset($preferred_color)) :?>
<style>
body{
color: <?php echo htmlspecialchars($preferred_color) ?>
}
</style>
<h1>J'adore la couleur de cette page</h1>
<a href="destroy_cookie.php">--> cliquer ici pour détruire le cookie <--</a>
<?php else: ?>
<h1>Vos préférences n'ont pas été trouvées.</h1>
<?php endif; ?>
Pour détruire un cookie, il suffit de lui donner une date d'expiration déjà passée.
destroy_cookie.php
<?php
// Destruction d'un cookie :
$expire = time() - 3600 ; // fixer une 'date' passée
setcookie('color', '', $expire) ;
?>
<h1>Le cookie a été détruit.</h1>
<a href="get_cookie.php">--> vérifier la destruction du cookie <--</a>