Programmation Web - séance 6
M2 MIASHS parcours Web Analyst (2020 - 2021)
Gestion des sessions et cookies
Variables "superglobales"
Les variables superglobales sont des tableaux associatifs chargés automatiquement par PHP sur chaque page. Ces tableaux ne sont donc pas déclarés dans le code. On les reconnait à leur nom en majuscule commencant par un underscore ($_GET
, $_POST
, $_SESSION
, $_COOKIE
, etc.)
Sessions
Les sessions en PHP permettent de personnaliser les pages web du site en fonction du visiteur. Concrètement, une session consiste simplement en un tableau associatif nommé $_SESSION
dédié au stockage d'informations qui ne sont propres qu'à la session en cours. Par exemple on pourra y ajouter un couple clé/valeur associé au login du visiteur $_SESSION['login']='merlin78'
qui permettra de récupérer cette valeur sur chaque page visitée du site afin de la faire apparaitra dans une zone dédiée permettant d'informer le visiteur qu'il est bien authentifié.
Le tableau $_SESSION
est accessible sur n'importe quelle page du site à condition de faire appel en haut de la page à la fonction PHP session_start()
(attention, cette fonction doit être appelée avant même la balise <!DOCTYPE html>
). Autrement dit, cette fonction devra être appelée en haut de chaque page faisant intervenir la notion de session (ouverture, fermeture, modification de $_SESSION
), autrement PHP vous retournera l'erreur suivante :
Notice: Undefined variable: \_SESSION
Le but de cet exercice est d'ajouter un système de sessions utilisateurs à un site internet existant. Téléchargez ce template de site et visualisez-le dans un navigateur.
Visuellement, le seul changement devra avoir lieu dans le bandeau d’entête (visible sur la partie haute de toutes les pages du site). La partie droite de ce dernier devra inclure un espace dont le contenu variera selon si le visiteur est connecté ou pas :
- si le visiteur n’est pas connecté, on lui propose de se loguer via des zones de saisie "login" et "mot de passe" et un bouton de validation.
- si le visiteur est déjà connecté, son login est affiché et un lien lui permet à tout moment de se déconnecter.
La feuille de style style.css
inclut un ensemble de règles associé à l'identifiant logright
que vous utiliserez pour la mise en forme de cette portion de page. Il vous suffira donc d'ajouter, à l'endroit convenable de la structure HTML, un élément div
avec cet identifiant.
Voici comment nous procéderons :
Commencez par créer deux nouvelles pages,
connexion.php
etdeconnexion.php
.Dans
connexion.php
, créez un tableau associatif dans lequel vous inclurez quatre login/mots de passes (les logins/mot de passes sont généralement stockés dans une base de données mais dans un premier temps nous nous contenterons d'un tableau PHP).Modifiez la zone d'entête (=ajout de
div
mentionné plus haut) afin que, selon si le visiteur est connecté ou pas, elle fasse apparaître la fonctionnalité appropriée (utilisez la fonctioninclude_once(xxx.php)
afin de ne pas avoir à copier/coller le code ajouté dans chaque page du site):- Si le visiteur n'est pas connecté, un formulaire lui permet de saisir un login et un mot de passe puis de valider. La validation redirige vers la page
connexion.php
, dans laquelle ces identifiants sont vérifiés. Les identifiants doivent être transmis à la pageconnexion.php
à l'aide d'un formulaire PHP (mais surtout pas via l'URL : votre visiteur ne serait sûrement pas très content de voir apparaître son mot de passe dans son URL !). Si l'utilisateur a rentré des identifiants valides (i.e. qui appartiennent au tableau stocké dans la page), alors on "ouvre une session" (dans le cadre de cet exercice, cette ouverture consistera simplement à stocker le login du visiteur à l'aide d'une clé dédiée dans le tableau associatif$_SESSION
). Si les identifiants ne sont pas valides, on en avertit simplement le visiteur par un message. - Si le visiteur est connecté, son login est affiché ainsi qu'un lien lui permettant de se déconnecter à tout moment. Ce lien redirigera le visiteur vers la page
deconnexion.php
qui fermera la session à l'aide de la fonctionsession_destroy()
(comme toutes les autres actions relatives aux sessions, l'appel de cette fonction requiert que la fonctionsession_start()
ait été appelée en premier lieu sur la page). À la suite d'une déconnexion, l'utilisateur peut être automatiquement redirigé vers une page du site à l'aide de la fonctionheader
.
Afin de tester si l'utilisateur est connecté (i.e. si une session est ouverte), on testera la présence du login dans le tableau
$_SESSION
à l'aide de la fonctionarray_key_exists(
key,
array)
ouisset(
variable)
.- Si le visiteur n'est pas connecté, un formulaire lui permet de saisir un login et un mot de passe puis de valider. La validation redirige vers la page
- Faites en sorte que les données utilisateurs soient stockées dans une base de données (et non dans un tableau PHP).
Cookies
Un cookie est un petit fichier dans lequel sont enregistrés des informations sur le visiteur d'un site. Ces fichiers son stockés sur la machine du visiteur par le navigateur. Ils permettent ainsi de se souvenir d'informations sur le visiteur d'une visite à l'autre (contrairement au tableau $_SESSION
qui ne permet de retenir des informations sur le visiteur qu'au cours de la visite courante).
Un cookie possède une date d'expiration afin d'effacer ces informations si le visiteur ne se rend pas sur le site durant une certaine durée. Observez la liste de cookies retenu par Firefox sur votre machine ainsi que leur "date d'expiration" dans le menu Préférences/Vie privée/supprimer des cookies spécifiques.
Votre code PHP peut créer un cookie sur la machine de votre visiteur avec la fonction setcookie
. Cette fonction prend différents paramètres dont les trois premiers sont la "clé" permettant d'identifier l'information (comme une clé dans un tableau associatif), l'information elle même, et sa date d'expiration (c'est à dire la date à laquelle le cookie s'effacera automatiquement de la machine de votre visiteur). Par exemple, pour stocker sur la machine du visiteur un login, on écriera :
setcookie('login','Nicolas',time()+7*24*60*60,null,null,false,true);
La date d'expiration du cookie, en troisième paramètre, est spécifiée en secondes. Dans cet exemple, le cookie sera programmé pour disparaître de la machine du visiteur dans 7x24x60x60 secondes à partir de la date courante (retournée par la fonction time()
), autrement dit dans une semaine. Attention, comme c'était le cas pour la fonction session_start()
, la fonction setcookie
doit être appelée avant la première balise HTML de votre page.
Lorsqu'un visiteur se rend sur un site pour lequel sa machine a enregistrée des cookies, les cookies sont envoyées avec la requête de la page et PHP récupère ces informations à travers le tableau associatif $_COOKIE
qui, tout comme le tableau $_SESSION
, est accessible depuis n'importe quelle page du site.
Reprenez le site téléchargée dans la section précédente et :
- ajoutez un cookie permettant d'afficher sur la page d'accueil de votre site la date et l'heure de la dernière visite effectuée depuis cette machine.
- ajoutez un "cookie de session" permettant à un utilisateur enregistré de ne pas avoir à se loguer lorsqu'il se rend sur le site depuis sa machine. Il vous faudra pour cela générer un "ID de session", chaine de caractère unique qui sera stockée dans le cookie de session (et dans une base de données).