Le but de ce TP est d'étudier les différents mécanismes relevant du suivi de sessions.
On se reportera en cas de besoin à la documentation officielle de PHP. Les transparents du cours sont également disponibles.
On utilisera de préférence un navigateur de type Netscape ou Mozilla pour tester les différents scripts. En effet, les navigateurs de type Internet Explorer, en cas de rappel de page, délivrent souvent une version cached, masquant ainsi une éventuelle modification de script.
Un compte-rendu au format HTML est demandé individuellement pour chaque étudiant. Il comportera des extraits pertinents de code PHP, ainsi que des commentaires sur ce code (validité, limitation, améliorations, etc...)
Pendant tout le TP, on considèrera la problématique suivante: un visiteur navigue sur un site de commerce en ligne. Il peut, à partir d'une page d'accueil, visionner une liste de différents articles et, pour chacun, visionner un descriptif. Après chaque description, il a la possibilité soit d'ajouter l'article à son caddie (s'il ne l'a pas déjà fait), soit de retirer l'article de son caddie (s'il l'a déjà sélectionné), soit de revenir à l'accueil sans rien acheter.
En outre, l'utilisateur doit pouvoir, lorqu'il consulte son caddie, disposer d'un lien pointant sur l'accueil
Enfin, la page d'accueil qui liste les différents articles proposés sur le site, doit afficher, en face de chaque article qui a été placé dans le caddie, l'image
L'objectif du TP consiste donc à étudier différentes solutions permettant de conserver de pages en pages le contenu du caddie de l'utilisateur, lui permettant ainsi de visionner ce contenu depuis n'importe quelle page, mais aussi d'offrir des menus contextuels c'est-à-dire dépendant des actions passées de l'utilisateur.
On ne se préoccupera pas de la gestion de plusieurs utilisateurs accédant simultanément au site, ni de l'authentification des utilisateurs.
Enfin, les pages html de site (accueil, et descriptif de 10 produits) sont visionnables à partir d'ici.
Il est évidemment possible de passer d'une page à l'autre via des liens de type <a href=""> mais aussi via des formulaires. Dans ce cas; l'attribut action du formulaire désigne la page suivante. Cette dernière pourra manipuler, via les mécanismes vus en TP 1 les données soumises par le formulaire. Or, il est possible de passer des données "cachées" avec un formulaire, en utilisant un objet du type <input type="hidden" name="nom_de_variable" value="valeur_de_variable">. Une telle balise n'affiche rien à l'écran mais va passer à la page suivante une variable de requête appelée nom_de_variable qui aura pour valeur valeur_de_variable. Ainsi, en mettant en place une navigation de pages en pages par formulaire, et en passent les données relatives au caddie dans des champs de type hidden, il est possible d'avoir accès à tout moment au contenu du caddie de l'utilisateur.
Remarquez que ces attributs "cachés" ne s'affichent pas à l'écran mais sont visibles dans le source HTML et ne garantissent donc pas la confidentialité des données.
Les cookies sont des informations de taille très limitée, déposés par le serveur sur le poste client. Ces informations (non binaires) peuvent permettre de stocker n'importe quelle utilisation pouvant aider un script serveur à propos de l'utilisateur. Dans notre cas, on y stockera sous forme de chaîne de caractères la liste des informations relatives au caddie. Contrairement à une idée couramment admise, les cookies ne constituent pas des failles de sécurité ou une intrusion dans la vie privée des utilisateurs. En effet, leur petite taille empêche d'y dissimuler un script malveillant. Néanmoins, cette solution de suivi de session par cookie ne peut être utilisée de manière générale: en effet, un client peut très bien décider de configurer son navigateur de manière à ne pas accepter les cookies...
PHP permet de gérer de manière transparente les cookies via la fonction setcookie(), qui dépose un cookie sur le poste client. Néanmoins, cette fonction doit être appelée avant l'envoi de tout header HTTP, donc doit être écrite avant toute balise <html>. C'est la même restriction que pour la fonction header().
Une fois le cookie déposé, il est disponible dans la variable autoglobales $_COOKIE ou $HTTP_COOKIE_VARS. Remarquez bien que lorsque vous déposez un cookie sur un poste client grâce à un script PHP, le cookie n'est consultable via la variable $_COOKIE qu'à la page suivante.
Les cookies sont définies par le W3C dans la RFC2965. Néanmoins, les implémentations de ces recommandations ne sont pas toujours fidèles.
Notez qu'il est possible de visualiser directement dans votre navigateur votre cookie et son contenu. Enfin, remarquez que la fonction setcookie() vous permet de paramétrer votre cookie de nombreuses façons, comme par exemple en précisant une date d'expiration.
PHP fournit un mécanisme qui permet d'aider au suivi de sessions tel que nous le souhaitons. L'instruction session_start() en début de script permet d'initialiser une session (en lui affectant un numéro d'identification) ou de rappeler une session en cours si un numéro de session est déjà disponible (cette fonction doit être appelée avant l'envoi de tout header). Les données relatives à la session (pour nous: les informations du caddie) sont stockées côté serveur, sous forme de variables de session, dans un répertoire session.save_path (défini dans le fichier php.ini). Ces variables sont accessibles via la variable auto-globale $_SESSION. Le problème consiste maintenant à passer d'une page à l'autre, non plus les données du caddie, mais le numéro d'identification de session.
Pour ceci, plusieurs solutions sont possibles. La première (valable si session.use_trans_sid est configuré à 1 dans php.ini) consiste à ne rien faire... puisque PHP s'occupe de faire passer le numéro via l'URL (tout en le masquant aux utilisateurs). Néanmoins, ceci ne fonctionne plus si l'on effectue une redirection avec un header.
La deuxième solution consiste à se reposer sur un cookie en y stockant ce fameux numéro. PHP utilise ce mécanisme si l'option session.use_cookies est à 1 dans le fichier php.ini. Evidemment, si l'utilisateur choisi de refuser les cookies, cette solution ne peut être efficace.
Enfin, il est possible de s'occuper soi-même de passer l'identifiant dans l'URL avec une solution du type index.php?".session_name()."=".session_id().
Notez que session_name() est une fonction qui renvoie le nom de la session. Celui-ci peut être initialisé à la main avec session_name(nom_de_dession) ou bien par défaut comme spécifié par session.name dans php.ini.