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 :

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 :

  1. Commencez par créer deux nouvelles pages, connexion.php et deconnexion.php.

  2. 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).

  3. 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 fonction include_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 page connexion.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 fonction session_destroy() (comme toutes les autres actions relatives aux sessions, l'appel de cette fonction requiert que la fonction session_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 fonction header.

    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 fonction array_key_exists(key,array) ou isset(variable).

  4. 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 :