TD8 - PHP/MySQL : Connexion des membres à un site web, variables de session
Objectif
Ce TD a deux objectifs
Nous allons apprendre comment authentifier un utilisateur enregistré. Pour cela, nous allons créer un formulaire de connexion, et vérifier si l’utilisateur existe et si son mot de passe correspond à celui crypté dans une table de base de données.
Nous allons apprendre comment garder l’information si et quel utilisateur est connecté à travers de plusieurs pages web d’un site web en utilisant des variables de session. De cette façon, nous pouvons montrer certaines pages uniquement aux utilisateurs connectés, ou même qu’à un ou plusieurs utilisateurs spécifiques.
Vous disposez de trois façons de passer des paramètres d’une page PHP à une autre page PHP:
Vous passez les paramètres directement dans l’URL en construisant une URL indiquant la page cible PHP ainsi que les paramètres, de type
sondage.php?id=...
. La récupération des paramètres dans la pagesondage.php
se fait donc avec GET.Vous créez un formulaire. Dans ce cas là, dans la balise
<form>
de la page contenant le formulaire, la page cible qui traitera les informations soumises par le formulaire est spécifiée dans la propriétéaction
, en spécifiant la méthode dans la propriétémethod
(soitget
oupost
). Vous récupérez donc le résultat dans la page cible avec la méthode GET ou POST.Vous utilisez des variables de session qui seront utilisables pour plusieurs pages : c’est ce que nous allons apprendre dans le présent TD.
Projet
Avant le mercredi 19 mars 2025, 23h59, vous devez inscrire votre projet dans la plateforme collaborative FRAMATEAM, le lien se trouvent sur moodle. Choisissez un pseudo qui me permet de vous identifier, p.ex. prenom_nom, ou initialeprenom_nom.
Créez un canal (et non pas une “équipe”) pour votre groupe de projet s’appelant p.ex. “les-meilleurs-proverbes”, (prenez le nom de votre projet). Choisissez canal privé, et ajoutez tous les membres de votre projet, et ajoutez aussi moi (“preuter”). Editez la description de votre canal, et mettez une courte description de votre idée de projet, je vous ferai un retour sur la faisabilité.
Variables de session
Dans ce TD, vous allez apprendre à utiliser les variables de session. Le tableau associatif des variables de session $_SESSION
permet d’enregistrer des informations qui pourront être utilisé tout au long d’une session d’un utilisateur donné, et en particulier sur différentes pages web d’un site web, sans passer à chaque fois par des paramètres dans l’URL ou par des formulaires.
Pour cela, en tout début de chaque page PHP qui utilise les variables de session (aucun caractère doit être devant la balise php, même pas un espace ou un retour à la ligne), mettez le code suivant :
<?php session_start(); ?>
Encore une fois, pour que cela soit clair, il ne faut aucun caractère devant l’ouverture de la balise php appelant la fonction session_start()
, même pas un espace ou un retour à la ligne.
Et maintenant que cela vous intrigue: il ne faut vraiment aucun caractère devant.
Exercice 8.1 Environnement de travail
- Démarrer dans votre environnement de travail habituel (éditeur de texte, …). Aujourd’hui, nous travaillons dans le dossier
td8
. Copiez votre fichierconnexion_base.php
dans ce dossiertd8
.
Exercice 8.2 Page pour la connexion (sign in)
Créez une page PHP
connexion.php
qui permet à un membre de se connecter au site. Cette page doit contenir les balises classiques HTML<html>, <head>, <body>
etc., (rappelez-vous p.ex. du raccourci!
proposé par VSCode).Ajoutez un formulaire avec un champ texte s’appelant
pseudo
(attributname
) et un champ mot de passe s’appelantmotdepasse
, ainsi qu’un bouton valider, et qui renvoie à la pageverifier-connexion.php
avec la méthodepost
.
Exercice 8.3 Page pour vérifier la connexion
- Créez la page PHP
verifier-connexion.php
. Pour que cette page utilise les variables de session et aussi la base de données, cette page doit donc être comme suit :
<?php
session_start();
require_once("connexion_base.php");
?>
<!DOCTYPE html>
<html lang="fr">
<head>
.
....
....
...</head>
<body>
.
....
...</body>
</html>
- Dans cette page, en début de page et après l’inclusion du fichier de connexion à la base de données, vérifiez que le membre avec le pseudo donné existe dans la base de données. Vous pouvez utiliser la requête suivante, qui utilise la clause “WHERE”. Notez que si un membre existe, le nombre de réponses est égal à 1, et le tableau des enregistrements contiendra un seul élément, à savoir les données du membre renseigné dans un tableau associatif, qu’on accédera plus tard avec
$enregistrements[0]
.
Notez de nouveau que la méthode fetchAll()
de l’objet $reponse
retourne un tableau des enregistrements. Nous aurions pu aussi utiliser la méthode fetch()
qui ne retournerait qu’un seul enregistrement (dans un tableau associatif).
$nombreReponses = 0;
if (!empty($_POST['pseudo']) && !empty($_POST['motdepasse']))
{$pseudo = $_POST['pseudo'];
$motdepasse = $_POST['motdepasse'];
// exécuter une requete MySQL de type SELECT .. WHERE
$requete = "SELECT * FROM membre WHERE pseudo = ?";
$reponse = $pdo->prepare($requete);
$reponse->execute(array($pseudo));
// récupérer tous les enregistrements dans un tableau
$enregistrements = $reponse->fetchAll();
// connaitre le nombre d'enregistrements
$nombreReponses = count($enregistrements);
}
- Toujours dans cette page, p.ex. dans la partie
<body>
, ajoutez les instructions suivantes que nous allons compléter dans les questions après :
// tester si un enregistrement existe
// (on suppose qu'un même pseudo n'existe qu'une seule fois !)
if ($nombreReponses > 0)
{// on vérifie si le mot de passe de la base de données corespond au mot de passe du formulaire
$motdepasse_crypte = $enregistrements[0]['motdepasse'];
if (password_verify($motdepasse, $motdepasse_crypte))
{// pseudo et mot de passe correspondent
// ...
}else
{ // pseudo existe mais mot de passe ne correspond pas
// ...
}
}else
{// le membre n'existe pas
// ...
}
Lisez le code attentivement et essayez de le comprendre, et notamment les 3 possibilités de correspondance pseudo/mdp avec ce qu’il y a dans la base de données !
Si le membre n’existe pas (donc si la variable
$nombreReponses
n’est pas supérieur à 0), affichez un message disant que le membre n’existe pas, ainsi qu’un lien hypertexte qui renvoie vers la pageconnexion.php
.Si le membre existe, et si son mot de passe ne correspond pas à celui stocké dans la base de données, affichez un message que le mot de passe est incorrect, ainsi qu’un lien hypertexte qui renvoie vers la page
connexion.php
.Si le membre existe et le mot de passe correspond, afficher un message de bienvenu et un lien vers une page
article-pour-les-membres.php
. De plus, affectez les deux variables de session$_SESSION['pseudo']
ainsi que$_SESSION['id_membre']
avec le pseudo du membre et son identifiant, respectivement, comme suit :
$_SESSION['pseudo'] = $enregistrements[0]['pseudo'];
$_SESSION['id_membre'] = $enregistrements[0]['id'];
Nous utilisons donc ces variables de session pour “retenir que le membre est connecté au site”.
Rappelez-vous que ces deux variables de session resteront affecté même si l’internaute change de page web, et ce jusqu’à expiration de la session (qui intervient après un certain temps prédéfini dans les réglages PHP, ou si la session est explicitement détruite).
Exercice 8.4 Informations uniquement pour les membes, p.ex. un article
Dans cet exercice, nous allons créer une page web que vous ne voulez uniquement rendre accessible pour les membre inscrit et connecté d’un site, comme par exemple un article précieux.
Créer une nouvelle page
article-pour-les-membres.php
. Cette page doit contenir les balises HTML classiques ()<html>, <head>, <body>
, etc.).Cette page doit
afficher des informations accessibles uniquement pour les membres du site (p.ex. un titre
<h1>Les dernières nouvelles</h1>
),afficher un paragraphe avec le message “Accès uniquement pour les membres !” pour les internautes non-connectés, ainsi qu’un lien hypertexte qui renvoie vers la page
connexion.php
.
Pour réaliser ceci, il suffit simplement de tester si la variable de session existe, en utilisant une condition if (isset($_SESSION['id_membre']))
…
- Testez cette page.
Exercice 8.5 Déconnexion
- Créez une nouvelle page
deconnexion.php
qui permet au membre de se déconnecter. Ceci se fait en deux lignes de code :
unset($_SESSION['id_membre']);
unset($_SESSION['pseudo']);
Dans cette page HTML, en plus des balises habituels pour une page HTML, affichez également un message “Vous avez été déconnecté”.
- Testez cette page. Vérifiez également que vous ne pouvez plus accéder à la page
article-pour-les-membres.php
de l’exercice précédent !
Exercice 8.6 Page info du membre
Imaginez que votre site web permet de consulter le profil de chaque membre, comme par exemple le pseudo, prénom et nom. Si le profil consulté est celui du membre connecté, nous affichons également les informations confidentielles, telle que l’adresse email dans cet exemple.
Ecrire une nouvelle page
membre-infos.php
que vous pouvez appeler avecmembre-infos.php?id=1
par exemple, et qui permet d’afficher les informations relatives au membre avec l’identifiantid
spécifié dans l’URL, telles que son pseudo, son nom, et son prénom.Par contre, afficher uniquement les informations confidentielles, telle que l’adresse email, pour le membre connecté lui-même ! **Il suffit de tester si la variable de session
$_SESSION['id_membre']
existe, et si elle est égal à l’identifiantid
passé en paramètre dans l’URL….
Notez que vous pouvez utiliser un tel fonctionnement aussi si vous voulez permettre aux membres de changer leur profil - mais bien évidemment non pas le profil des autres membres !}
Exercice 8.7 Modifiez la page connexion.php
- Modifiez la page
connexion.php
pour qu’elle affiche le formulaire de connexion uniquement si un membre n’est pas connecté. Il suffit donc de tester si la variable de session existe, en utilisant une condition `if (isset($_SESSION[‘id_membre’]))
Exercices optionnels
Exercice 8.10 Afficher tous les pseudos
Créer une page PHP
membres.php
, qui permet d’afficher les pseudos de tous les membres de votre site, dans une liste HTML de type<ul>
. Bien sûr, ces informations doivent uniquement être accessibles pour les membres connectés !Pour chaque pseudo, ajoutez un lien hypertexte permettant d’accéder à la page info du membre correspondant (
membre-infos.php
, en passant le bon identifiant du membre en paramètre).
Exercice 8.11 “Mur” pour les membres
Dans cet exercice un peu plus long, vous allez étendre le résultat de ce TD afin de mettre en place un mur pour chaque membre, sur lesquelles tous les membres peuvent écrire.
Pour cela, il vous suffit de créer une seule table dans la base de données s’appelant
mur
. Quels champs doit contenir cette table pour permettre aux membres décrire un text sur le mur d’un autre membre (ou sur son propre mur) ? Créez cette table avec au moins deux enregistrements en exemple.Créez une page PHP
mur.php
, accessible uniquement pour les membres, qui prend en paramètre un identifiantid
, et qui permet d’afficher tous les éléments du mur d’un membre avec l’identifiant correspondant. Testez !Complétez cette page avec un formulaire permettant d’écrire un texte nommée
texte
sur le mur, et qui renvoie vers la pagemur.php
elle-même avec la méthodepost
.Au début de cette page, ajoutez le texte
texte
dans la tablemur
de la base de données.
Comme d’habitude, les exercices sont à rendre sur moodle jusqu’à mercredi prochain, 23h59.