0 XP
?
PHP : de zéro à la maîtrise/Sessions et cookies
Intermédiaire35 min25 XP

Objectifs de cette leçon

  • Démarrer et gérer des sessions PHP
  • Stocker et lire des données en session
  • Créer et lire des cookies

Sessions et Cookies en PHP 🍪

Les sessions et cookies permettent de conserver les informations d'un utilisateur entre les pages. C'est la base de l'authentification et du personnalisation.

Cookies vs Sessions

CaractéristiqueCookieSession
Stocké surLe navigateur (client)Le serveur
Taille max~4 KoPas de limite
SécuritéMoins sécuriséPlus sécurisé
Durée de vieConfigurableFermeture du navigateur (par défaut)
UsagePrefs, analyticsAuth, panier, user data

Les Cookies

<?php
// Définir un cookie (avant tout output HTML !)
setcookie(
    "utilisateur",           // Nom
    "Alice",                 // Valeur
    time() + (365 * 24 * 3600), // Expiration (1 an)
    "/",                     // Chemin (racine = tout le site)
    "monsite.com",           // Domaine
    false,                   // HTTPS seulement ?
    true                     // HttpOnly (pas accessible en JS)
);

// Lire un cookie
if (isset($_COOKIE['utilisateur'])) {
    echo "Bienvenue " . $_COOKIE['utilisateur'];
}

// Supprimer un cookie
setcookie("utilisateur", "", time() - 3600, "/");
unset($_COOKIE['utilisateur']);
?>

⚠️ Important : Les cookies doivent être définis AVANT tout echo, print ou balise HTML. Sinon, tu auras l'erreur "Headers already sent".

Les Sessions

<?php
// Démarrer la session (en haut de chaque fichier qui en a besoin)
session_start();

// Stocker des données en session
$_SESSION['utilisateur'] = "Alice";
$_SESSION['role'] = "admin";
$_SESSION['panier'] = ["pomme", "banane"];

// Lire des données
echo $_SESSION['utilisateur']; // Alice

// Vérifier si une variable existe
if (isset($_SESSION['role'])) {
    echo "Rôle : " . $_SESSION['role'];
}

// Supprimer une variable
unset($_SESSION['role']);

// Détruire toute la session
session_destroy();
?>

Connexion sécurisée

<?php
// login.php
session_start();

$erreurs = [];

if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
    $mdp = $_POST['mdp'] ?? '';

    if (!$email || empty($mdp)) {
        $erreurs[] = "Email et mot de passe requis";
    } else {
        // Chercher l'utilisateur en BDD
        $stmt = $pdo->prepare("SELECT id, nom, mdp_hash FROM users WHERE email = ?");
        $stmt->execute([$email]);
        $user = $stmt->fetch();

        if ($user && password_verify($mdp, $user['mdp_hash'])) {
            // Connexion réussie
            session_regenerate_id(true); // Sécurité : régénérer l'ID

            $_SESSION['user_id'] = $user['id'];
            $_SESSION['user_nom'] = $user['nom'];
            $_SESSION['connected_at'] = time();

            header("Location: dashboard.php");
            exit;
        } else {
            $erreurs[] = "Email ou mot de passe incorrect";
        }
    }
}
?>

Protection des pages

<?php
// auth_check.php — inclure en haut des pages protégées
session_start();

if (!isset($_SESSION['user_id'])) {
    header("Location: login.php");
    exit;
}

// Vérifier l'inactivité (15 minutes max)
if (time() - ($_SESSION['last_activity'] ?? 0) > 900) {
    session_unset();
    session_destroy();
    header("Location: login.php?timeout=1");
    exit;
}

$_SESSION['last_activity'] = time();
?>

Données flash (messages éphémères)

<?php
// Fonction pour stocker un message flash
function setFlash(string $type, string $message): void {
    $_SESSION['flash'] = ["type" => $type, "message" => $message];
}

// Fonction pour récupérer et afficher le message
function getFlash(): ?string {
    if (isset($_SESSION['flash'])) {
        $type = $_SESSION['flash']['type'];
        $message = $_SESSION['flash']['message'];
        unset($_SESSION['flash']);
        return "<div class="alert alert-$type">$message</div>";
    }
    return null;
}

// Utilisation :
setFlash("success", "Inscription réussie !");
setFlash("error", "Erreur de connexion");
?>

Configuration de session

<?php
// config_session.php — avant session_start()

// Sécurité
ini_set('session.use_strict_mode', 1);
ini_set('session.use_only_cookies', 1);
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_secure', 1);    // HTTPS seulement
ini_set('session.cookie_samesite', 'Strict');

// Cookie d'expiration
ini_set('session.cookie_lifetime', 3600); // 1 heure

// Path du fichier de session (protéger le dossier)
ini_set('session.save_path', '/var/sessions');

session_start();
?>

Déconnexion

<?php
// logout.php
session_start();

// Supprimer toutes les variables de session
$_SESSION = [];

// Détruire le cookie de session
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

// Détruire la session
session_destroy();

header("Location: login.php");
exit;
?>

Exercice pratique

Crée un système de panier d'achat avec sessions :

<?php
session_start();

// Initialiser le panier
if (!isset($_SESSION['panier'])) {
    $_SESSION['panier'] = [];
}

// Ajouter un produit
function ajouterPanier(string $produit, float $prix): void {
    $_SESSION['panier'][] = [
        'nom' => $produit,
        'prix' => $prix,
        'ajoute_le' => time()
    ];
}

// Calculer le total
function totalPanier(): float {
    return array_reduce($_SESSION['panier'], function($total, $item) {
        return $total + $item['prix'];
    }, 0.0);
}

// Utilisation
ajouterPanier("Casque", 79.99);
ajouterPanier("Clavier", 49.99);

echo "Panier : " . count($_SESSION['panier']) . " articles\n";
echo "Total : " . number_format(totalPanier(), 2) . " €\n";
?>

🎯 A retenir : Utilise les sessions pour les données sensibles (auth, panier). Les cookies pour les préférences non-sensibles. Toujours session_regenerate_id() après la connexion pour prévenir le session fixation.


Prochaine leçon : La Programmation Orientée Objet en PHP — crée des classes et des objets !

⚡ Simulateur — Sessions et cookies

Étape 1/5
📝 Pseudo-code
1<?php
2session_start();
3$_SESSION["user"] = "Alice";
4echo $_SESSION["user"];
5?>
⚙️ Exécution
📦 Mémoire
Aucune variable
🔀 Flux d'exécution
<?php
3
Début du script

Ouverture du bloc PHP.