Mini-projet : se connecter
Ce qu'on va construire — et pourquoi
Les leçons précédentes t'ont donné les briques. On les assemble ici. On crée un système de connexion complet : login, page privée, déconnexion.
C'est le même mécanisme que Gmail, Netflix, ta banque. PHP vérifie les identifiants, crée une session, protège les pages.
Pour rester simple, les identifiants sont dans le code PHP — sans base de données. En vrai projet, ils seraient en BDD avec mots de passe hashés. Mais le mécanisme des sessions est exactement identique.
Les 3 fichiers du projet
3 fichiers. Chacun a un rôle précis :
mon-login/
├── login.php ← affiche le formulaire ET vérifie les identifiants
├── accueil.php ← page privée, accessible uniquement si connecté
└── deconnexion.php ← efface la session et redirige vers login
Étape 1 — login.php : le formulaire et la vérification
Ce fichier fait deux choses :
- Page ouverte sans formulaire → affiche le formulaire de connexion.
- Formulaire soumis (POST) → vérifie les identifiants et agit.
C'est le pattern "une page qui se gère elle-même" — très courant en PHP.
<?php
// ── ÉTAPE 1 : démarrer la session ──────────────────────────────
// Obligatoire en toute première ligne sur chaque page qui utilise $_SESSION
session_start();
// ── ÉTAPE 2 : si déjà connecté, pas la peine d'être ici ────────
// L'utilisateur est renvoyé directement vers la page privée
if (!empty($_SESSION["connecte"])) {
header("Location: accueil.php");
exit;
}
// ── ÉTAPE 3 : les identifiants autorisés ───────────────────────
// En production : stockés en base de données, mots de passe hashés
// Ici : hardcodés pour simplifier et comprendre le mécanisme
$identifiants = [
"marie@exemple.fr" => "monmotdepasse",
"thomas@exemple.fr" => "secret123",
];
$erreur = ""; // contiendra le message d'erreur si la connexion échoue
// ── ÉTAPE 4 : traiter le formulaire si soumis ──────────────────
if ($_SERVER["REQUEST_METHOD"] === "POST") {
// Récupérer et nettoyer les données du formulaire
$email = trim($_POST["email"] ?? "");
$mdp = $_POST["mot_de_passe"] ?? "";
// Question 1 : cet email existe-t-il dans notre liste ?
if (isset($identifiants[$email])) {
// Question 2 : le mot de passe est-il correct ?
if ($identifiants[$email] === $mdp) {
// ✅ Les deux correspondent — connexion réussie !
// On note dans la session que l'utilisateur est connecté
$_SESSION["connecte"] = true;
$_SESSION["email"] = $email;
// On envoie vers la page privée
header("Location: accueil.php");
exit;
} else {
// Mauvais mot de passe
$erreur = "Email ou mot de passe incorrect.";
}
} else {
// Email inconnu — SÉCURITÉ : on dit la même chose que pour
// un mauvais mot de passe. On ne révèle pas si l'email existe.
$erreur = "Email ou mot de passe incorrect.";
}
}
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Connexion</title>
</head>
<body>
<h1>Se connecter</h1>
<!-- Afficher l'erreur si elle existe -->
<?php if ($erreur): ?>
<p style="color: red"><?= htmlspecialchars($erreur) ?></p>
<?php endif; ?>
<form method="post">
<label>Email</label><br>
<input type="email" name="email" required><br><br>
<label>Mot de passe</label><br>
<input type="password" name="mot_de_passe" required><br><br>
<button>Me connecter</button>
</form>
</body>
</html>
Comprendre le déroulement exact
Ce qui se passe quand quelqu'un remplit le formulaire :
1. L'utilisateur tape son email et son mot de passe dans le formulaire
2. Il clique "Me connecter"
3. Le navigateur envoie ces données en POST à login.php
4. PHP reçoit les données
5. PHP cherche l'email dans le tableau $identifiants
→ Email introuvable : $erreur = "Email ou mot de passe incorrect."
Formulaire réaffiché avec le message d'erreur
→ Email trouvé :
→ Mot de passe incorrect : $erreur = "Email ou mot de passe incorrect."
Formulaire réaffiché avec le message d'erreur
→ Mot de passe correct :
→ $_SESSION["connecte"] = true
→ $_SESSION["email"] = $email
→ header("Location: accueil.php")
→ exit
→ Le navigateur charge accueil.php
Le message d'erreur dit toujours "Email ou mot de passe incorrect" — jamais l'un ou l'autre séparément. Pourquoi ? Sinon, un attaquant saurait quels emails sont enregistrés sur le site.
Étape 2 — accueil.php : la page protégée
Page privée. Les premières lignes PHP font le garde à l'entrée : sans session, retour au login immédiatement.
<?php
session_start(); // obligatoire pour accéder à $_SESSION
// Garde à l'entrée : si pas connecté, retour au login immédiatement
if (empty($_SESSION["connecte"])) {
header("Location: login.php");
exit; // TOUJOURS exit après header Location !
}
// Si on arrive ici, l'utilisateur est bien connecté
// On sécurise la valeur avant de l'afficher
$email = htmlspecialchars($_SESSION["email"]);
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Mon espace</title>
</head>
<body>
<h1>Bienvenue dans ton espace !</h1>
<p>Tu es connecté avec : <strong><?= $email ?></strong></p>
<p>Cette page n'est visible que par les membres connectés.</p>
<a href="deconnexion.php">Se déconnecter</a>
</body>
</html>
Points clés :
session_start()— charge la session. Sans ça,$_SESSIONest vide.if (empty($_SESSION["connecte"]))— si absent ou faux, on redirige.htmlspecialchars()avant l'affichage — même les données de session, toujours protéger.
Étape 3 — deconnexion.php : vider le casier
L'utilisateur clique "Se déconnecter". Ce fichier efface tout et renvoie au login.
<?php
session_start(); // nécessaire pour accéder à la session à effacer
// Étape 1 : vider toutes les variables de session
$_SESSION = [];
// Étape 2 : détruire la session côté serveur
session_destroy();
// Étape 3 : renvoyer vers le formulaire de connexion
header("Location: login.php");
exit;
Pourquoi vider ET détruire ? $_SESSION = [] vide la mémoire. session_destroy() supprime le fichier côté serveur. Sans les deux, des données peuvent rester accessibles.
Tester ton projet
-
Protection : ouvre
accueil.phpsans te connecter. Tu dois être redirigé verslogin.php. -
Mauvais identifiant : tape n'importe quoi. Tu dois voir "Email ou mot de passe incorrect." et rester sur
login.php. -
Connexion réussie : tape
marie@exemple.fr/monmotdepasse. Tu dois arriver suraccueil.php. -
Déconnexion : clique "Se déconnecter". Tu dois revenir sur
login.php. -
Après déconnexion : accède à
accueil.phpmanuellement. Tu dois être renvoyé au login.
Tous ces tests passent ? Le système fonctionne. C'est le même mécanisme que les vrais sites.
Pour aller plus loin : en vrai projet, les mots de passe ne se stockent jamais en clair. Utilise password_hash($mdp, PASSWORD_DEFAULT) pour stocker, et password_verify($mdp, $hash) pour vérifier. Le mécanisme des sessions reste identique.
- Tu sais créer un système de connexion complet avec PHP et les sessions
- La règle absolue :
session_start()en toute première ligne sur chaque page - Connexion = stocker
$_SESSION["connecte"] = trueaprès vérification - Protéger une page = vérifier la session au début, rediriger si absent +
exit - Déconnexion = vider
$_SESSION, appelersession_destroy(), rediriger - Ne jamais révéler si un email existe ou non dans les messages d'erreur
- Prochaine étape : PHP & MySQL — stocker les utilisateurs en base de données, hasher les mots de passe