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éristique | Cookie | Session |
|---|---|---|
| Stocké sur | Le navigateur (client) | Le serveur |
| Taille max | ~4 Ko | Pas de limite |
| Sécurité | Moins sécurisé | Plus sécurisé |
| Durée de vie | Configurable | Fermeture du navigateur (par défaut) |
| Usage | Prefs, analytics | Auth, 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,
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.