Leçon 12 / 12
Leçon 12 · Partie 3 — PHP & le Web

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 :

Arborescence
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.

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

Déroulement
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.

accueil.php
<?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, $_SESSION est 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.

deconnexion.php
<?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

  1. Protection : ouvre accueil.php sans te connecter. Tu dois être redirigé vers login.php.

  2. Mauvais identifiant : tape n'importe quoi. Tu dois voir "Email ou mot de passe incorrect." et rester sur login.php.

  3. Connexion réussie : tape marie@exemple.fr / monmotdepasse. Tu dois arriver sur accueil.php.

  4. Déconnexion : clique "Se déconnecter". Tu dois revenir sur login.php.

  5. Après déconnexion : accède à accueil.php manuellement. 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.

// Félicitations — tu as terminé le module !
  • 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"] = true après vérification
  • Protéger une page = vérifier la session au début, rediriger si absent + exit
  • Déconnexion = vider $_SESSION, appeler session_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