Formation DWWM - Gestion d'état en PHP — 2025/2026
$_SESSION, $_COOKIE et les autres NOUVEAULa mémoire de PHP à portée de variable
<?php
function maFonction() {
// ❌ $nom défini hors de la
// fonction : inaccessible
echo $nom; // Warning: Undefined
}
$nom = "Marie";
maFonction();
<?php
function maFonction() {
// ✅ $_SESSION accessible
// partout, même ici !
echo $_SESSION['nom']; // Marie
}
session_start();
$_SESSION['nom'] = "Marie";
maFonction();
$_ (dollar + underscore) identifie toutes les superglobales PHP. Elles sont toujours écrites en MAJUSCULES.🔶 Les cases orangées = superglobales du cours d'aujourd'hui
<?php
// $_GET — Récupérer une valeur dans l'URL
// URL : monsite.com/page.php?couleur=bleu
$couleur = $_GET['couleur']; // → "bleu"
// $_POST — Récupérer un champ de formulaire (method="POST")
$email = $_POST['email']; // → valeur du champ email
// $_SERVER — Infos sur la requête en cours
$url = $_SERVER['REQUEST_URI']; // → "/page.php?couleur=bleu"
$methode = $_SERVER['REQUEST_METHOD']; // → "GET" ou "POST"
$ip = $_SERVER['REMOTE_ADDR']; // → "192.168.1.1"
// $_COOKIE — Lire un cookie (créé par setcookie() lors d'une visite précédente)
$theme = $_COOKIE['theme']; // → "dark"
// $_SESSION — Lire une donnée de session (après session_start())
session_start();
$nom = $_SESSION['nom']; // → "Marie"
// Ce sont tous des tableaux associatifs : clé => valeur
?>
$_VAR['cle'].$_GET, $_POST, $_COOKIE = données contrôlées par l'utilisateur = potentiellement dangereuses
<?php
// ❌ DANGEREUX : afficher directement une superglobale
echo $_GET['nom']; // Faille XSS ! L'utilisateur peut injecter du JS
// ✅ SÉCURISÉ : Nettoyer avant d'afficher
echo htmlspecialchars($_GET['nom']); // Échappe < > & " '
// ✅ SÉCURISÉ : Vérifier que la clé existe avant d'y accéder
$nom = $_POST['nom'] ?? ''; // Si absent → chaîne vide
$age = (int)($_GET['age'] ?? 0); // Cast en entier pour sécuriser
// ✅ SÉCURISÉ : Valider les valeurs acceptables (liste blanche)
$languesValides = ['fr', 'en', 'es'];
if (in_array($_GET['lang'] ?? '', $languesValides)) {
$langue = $_GET['lang'];
}
?>
$_SESSION sont plus sûres (stockées côté serveur), mais doivent tout de même être validées avant insertion en base de données.Pourquoi garder des données ?
| Critère | 🍪 Cookie | 📦 Session |
|---|---|---|
| Stockage | Navigateur (client) | Serveur |
| Taille max | ~4 Ko par cookie | Illimitée (RAM serveur) |
| Durée de vie | Configurable (jours/mois) | Fin de navigation |
| Sécurité | ⚠️ Moins sûr (côté client) | 🛡️ Plus sûr (côté serveur) |
| Accessible JS | Oui (sauf HTTP Only) | Non |
| Bande passante | Envoyé à chaque requête | Juste l'ID envoyé |
| Usage | Préférences, "Se souvenir" | Authentification, panier |
Stocker des données sur le serveur
$_SESSION en détail 🔷session_start().
<?php
session_start(); // ← PHP charge $_SESSION depuis le fichier serveur
// $_SESSION se comporte exactement comme un tableau PHP classique
$_SESSION['nom'] = 'Marie'; // Écrire une valeur
echo $_SESSION['nom']; // Lire → "Marie"
unset($_SESSION['nom']); // Supprimer une clé
echo isset($_SESSION['nom']); // Vérifier → false
// On peut stocker n'importe quel type PHP
$_SESSION['age'] = 25; // Entier
$_SESSION['connecte'] = true; // Booléen
$_SESSION['panier'] = [1, 2, 3]; // Tableau
// PHP sérialise automatiquement les données complexes
?>
$_SESSION dans un fichier sur le serveur à la fin de l'exécution du script. Rien à faire manuellement !session_start() 🚀PHPSESSID est déjà présent dans la requête. PHP charge alors automatiquement les données dans $_SESSION.
<?php
// ⚠️ TOUJOURS en tout début de fichier, AVANT tout HTML ou echo
session_start();
// $_SESSION est maintenant disponible !
$_SESSION['nom'] = 'Marie';
$_SESSION['role'] = 'admin';
?>
<!DOCTYPE html>
<html>
<body>
<h1>Bonjour <?= $_SESSION['nom'] ?></h1>
<!-- Affiche : Bonjour Marie -->
</body>
</html>
session_start() doit être appelé AVANT tout echo, HTML, ou espace avant <?php. Sinon → erreur "Cannot modify header information - headers already sent".$_SESSION 💾<?php
session_start();
// Valeurs simples
$_SESSION['prenom'] = 'Marie';
$_SESSION['age'] = 25;
$_SESSION['connecte'] = true;
// Tableau (panier d'achat)
$_SESSION['panier'] = [
['id' => 1, 'nom' => 'Ordinateur', 'prix' => 899],
['id' => 2, 'nom' => 'Souris', 'prix' => 25]
];
// Tableau imbriqué (infos utilisateur)
$_SESSION['utilisateur'] = [
'id' => 42,
'nom' => 'Dupont',
'email' => '[email protected]',
'role' => 'admin'
];
// Compteur de visites — opérateur ?? (coalescence null)
// Si 'visites' n'existe pas → 0, sinon valeur existante + 1
$_SESSION['visites'] = ($_SESSION['visites'] ?? 0) + 1;
?>
$_SESSION 📖<?php
session_start();
// Toujours vérifier avec isset() avant de lire
if (isset($_SESSION['prenom'])) {
echo "Bonjour " . $_SESSION['prenom'];
} else {
echo "Vous n'êtes pas connecté";
}
// Version courte avec l'opérateur ?? (valeur par défaut)
$prenom = $_SESSION['prenom'] ?? 'Visiteur';
echo "Bonjour $prenom"; // "Bonjour Visiteur" si clé absente
// Accès à un tableau imbriqué
$nbArticles = count($_SESSION['panier'] ?? []);
echo "Panier : $nbArticles article(s)";
// Vérifier le rôle
if (isset($_SESSION['utilisateur'])) {
echo "Bienvenue " . $_SESSION['utilisateur']['nom'];
if ($_SESSION['utilisateur']['role'] === 'admin') {
echo " (Administrateur)";
}
}
?>
isset() ou ?? avant de lire une clé. Sans ça → Warning "Undefined index" si la clé n'existe pas.<?php
session_start();
// 1. Modifier une valeur simple
$_SESSION['theme'] = 'dark'; // Remplace 'light' par 'dark'
// 2. Ajouter un article au panier (tableau)
$nouvelArticle = ['id' => 3, 'nom' => 'Clavier', 'prix' => 45];
if (!isset($_SESSION['panier'])) {
$_SESSION['panier'] = []; // Initialiser si absent
}
$_SESSION['panier'][] = $nouvelArticle; // [] = ajouter à la fin
// 3. Supprimer un élément du tableau (par index)
unset($_SESSION['panier'][1]); // Supprime l'index 1
// 4. Modifier une valeur dans un tableau imbriqué
$_SESSION['utilisateur']['email'] = '[email protected]';
// 5. Incrémenter un compteur
$_SESSION['compteur_connexions']++;
// 6. Ajouter à un historique
$_SESSION['historique'][] = "Page consultée à " . date('H:i:s');
?>
<?php
session_start();
// 1. Supprimer UNE variable de session
unset($_SESSION['panier']);
// → La clé 'panier' n'existe plus dans $_SESSION
// 2. Vider TOUTES les variables (la session continue d'exister)
$_SESSION = [];
// → Le tableau est vide, mais le fichier session existe encore
// 3. Détruire la session sur le serveur
session_destroy();
// ⚠️ Attention : le cookie PHPSESSID existe encore dans le navigateur !
// ✅ DÉCONNEXION COMPLÈTE (les 3 étapes obligatoires)
$_SESSION = []; // 1. Vider les données
session_destroy(); // 2. Supprimer le fichier serveur
setcookie('PHPSESSID', '', time()-3600, '/'); // 3. Supprimer le cookie navigateur
?>
<?php // login.php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = $_POST['email'] ?? '';
$password = $_POST['password'] ?? '';
// Vérification BDD (simulée ici)
if ($email === '[email protected]' && $password === '123456') {
session_regenerate_id(true); // ← Sécurité : nouveau ID de session
$_SESSION['utilisateur'] = [
'id' => 1,
'nom' => 'Marie Dupont',
'email' => $email,
'role' => 'admin'
];
header('Location: dashboard.php');
exit;
} else {
$erreur = "Identifiants incorrects";
}
}
?>
<form method="POST">
<?php if (isset($erreur)): ?>
<p style="color:red;"><?= $erreur ?></p>
<?php endif; ?>
<input type="email" name="email" required>
<input type="password" name="password" required>
<button type="submit">Connexion</button>
</form>
<?php // dashboard.php
session_start();
// Vérifier si l'utilisateur est connecté
if (!isset($_SESSION['utilisateur'])) {
header('Location: login.php'); // Non connecté → redirection
exit;
}
$user = $_SESSION['utilisateur'];
?>
<!DOCTYPE html>
<html>
<body>
<h1>Dashboard de <?= htmlspecialchars($user['nom']) ?></h1>
<p>Email : <?= htmlspecialchars($user['email']) ?></p>
<?php if ($user['role'] === 'admin'): ?>
<h2>Panel Administration</h2>
<?php endif; ?>
<a href="logout.php">Déconnexion</a>
</body>
</html>
htmlspecialchars() est indispensable pour éviter les failles XSS lors de l'affichage de données.<?php // logout.php
session_start();
// 1. Vider toutes les variables de session
$_SESSION = [];
// 2. Supprimer le cookie de session dans le navigateur
if (isset($_COOKIE['PHPSESSID'])) {
setcookie('PHPSESSID', '', time() - 3600, '/');
}
// 3. Détruire la session sur le serveur
session_destroy();
// 4. Rediriger
header('Location: login.php');
exit;
?>
$_SESSION = [] → données effacées en mémoiresession_destroy() → fichier de session supprimé sur le serveursetcookie(…) → cookie PHPSESSID supprimé du navigateur
<?php
// Tout ceci AVANT session_start()
ini_set('session.cookie_lifetime', 86400); // Cookie dure 24h
ini_set('session.gc_maxlifetime', 86400); // Fichier session dure 24h
session_name('MON_SITE_SESSION'); // Renommer PHPSESSID
ini_set('session.cookie_httponly', 1); // Pas accessible en JS
ini_set('session.cookie_secure', 1); // HTTPS uniquement
ini_set('session.cookie_samesite', 'Strict'); // Protection CSRF
session_start();
// Régénérer l'ID de session régulièrement (anti-hijacking)
session_regenerate_id(true); // Nouveau ID + supprime l'ancien
?>
Stocker des données dans le navigateur
$_COOKIE en détail 🔷setcookie().
<?php
// $_COOKIE contient les cookies REÇUS du navigateur
// (ceux créés lors d'une visite précédente avec setcookie())
var_dump($_COOKIE);
// Exemple de résultat :
// array(3) {
// ["langue"] => string(2) "fr"
// ["theme"] => string(4) "dark"
// ["PHPSESSID"] => string(26) "abc123xyz..."
// }
// Lire un cookie avec valeur par défaut si absent
$langue = $_COOKIE['langue'] ?? 'fr';
?>
setcookie(), il n'apparaît dans $_COOKIE qu'au prochain chargement de page (le navigateur doit d'abord le recevoir, puis le renvoyer).setcookie() 🍪<?php
// ⚠️ AVANT tout HTML (comme session_start)
// Syntaxe simple (déconseillée en production)
setcookie('nom', 'valeur');
// Syntaxe tableau recommandée (PHP 7.3+)
setcookie('nom_cookie', 'valeur', [
'expires' => time() + 3600, // Dans 1 heure
'path' => '/', // Tout le site
'secure' => true, // HTTPS uniquement
'httponly' => true, // Pas accessible en JS
'samesite' => 'Lax' // Protection CSRF
]);
// Exemples concrets
setcookie('langue', 'fr', time() + 86400 * 30); // 30 jours
setcookie('theme', 'dark', time() + 86400 * 365); // 1 an
?>
time() retourne le timestamp UNIX actuel (secondes depuis le 1er janvier 1970). On y ajoute des secondes pour définir l'expiration du cookie.<?php
// Mémo des durées en secondes :
// 60 = 1 minute
// 3600 = 1 heure (60 × 60)
// 86400 = 1 jour (60 × 60 × 24)
setcookie('test', 'val', time() + 3600); // 1 heure
setcookie('test', 'val', time() + 86400); // 1 jour
setcookie('test', 'val', time() + (86400 * 7)); // 1 semaine
setcookie('test', 'val', time() + (86400 * 30)); // 30 jours (~1 mois)
setcookie('test', 'val', time() + (86400 * 365)); // 1 an
// Cookie de session = supprimé à la fermeture du navigateur
setcookie('test', 'valeur', 0);
// Ou sans 3e paramètre :
setcookie('test', 'valeur');
?>
$_COOKIE 📖<?php
// Lire avec vérification
if (isset($_COOKIE['langue'])) {
$langue = $_COOKIE['langue'];
echo "Langue : $langue";
} else {
echo "Cookie 'langue' non défini";
}
// Version courte avec opérateur ??
$langue = $_COOKIE['langue'] ?? 'fr';
$theme = $_COOKIE['theme'] ?? 'light';
// Compteur de visites
$visites = (int)($_COOKIE['compteur_visites'] ?? 0);
$visites++;
setcookie('compteur_visites', $visites, time() + 86400 * 30);
echo "Vous avez visité ce site $visites fois";
// Debug : afficher tous les cookies reçus
var_dump($_COOKIE);
?>
<?php
// MODIFIER : recréer avec le même nom, nouvelle valeur
setcookie('theme', 'dark', time() + 86400 * 30);
// ⚠️ Nouvelle valeur visible seulement au prochain chargement
// Exemple : changement de langue via un lien
if (isset($_GET['lang'])) {
$lang = $_GET['lang'];
if (in_array($lang, ['fr', 'en', 'es'])) {
setcookie('langue', $lang, time() + 86400 * 365);
header('Location: ' . $_SERVER['PHP_SELF']);
exit;
}
}
// SUPPRIMER : timestamp dans le passé (time() - 3600)
setcookie('nom_cookie', '', time() - 3600);
// ⚠️ Utiliser les MÊMES paramètres que lors de la création
// Créé avec path='/'
setcookie('test', 'val', time() + 3600, '/');
// Supprimé avec le même path
setcookie('test', '', time() - 3600, '/');
?>
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = $_POST['email'] ?? '';
$password = $_POST['password'] ?? '';
$remember = isset($_POST['remember']);
if ($email === '[email protected]' && $password === '123456') {
$_SESSION['utilisateur'] = ['email' => $email, 'nom' => 'Marie'];
if ($remember) {
// Générer un token aléatoire sécurisé
$token = bin2hex(random_bytes(32));
// saveDansLaBDD($email, $token); ← à implémenter
setcookie('remember_token', $token, [
'expires' => time() + 86400 * 30,
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict'
]);
}
header('Location: dashboard.php');
exit;
}
}
?>
<form method="POST">
<input type="email" name="email" required>
<input type="password" name="password" required>
<label><input type="checkbox" name="remember"> Se souvenir de moi</label>
<button type="submit">Connexion</button>
</form>
Protection contre les attaques
Cookie jamais envoyé depuis un autre site → Sessions, authentification
Envoyé sur les liens, pas les formulaires → Valeur par défaut recommandée
<?php
// ❌ MAUVAIS : Cookie sans sécurité
setcookie('user_pref', 'dark_mode', time() + 86400 * 30);
// ✅ BON : Cookie sécurisé avec tableau d'options (PHP 7.3+)
setcookie('user_pref', 'dark_mode', [
'expires' => time() + 86400 * 30,
'path' => '/',
'secure' => true, // HTTPS uniquement
'httponly' => true, // Pas de JavaScript
'samesite' => 'Lax' // Protection CSRF
]);
// ✅ HELPER RÉUTILISABLE : Fonction helper pour cookies sécurisés
function setCookieSecure(string $name, string $value, int $days = 30): void {
setcookie($name, $value, [
'expires' => time() + (86400 * $days),
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax'
]);
}
setCookieSecure('langue', 'fr', 365);
setCookieSecure('theme', 'dark', 30);
?>
<?php // config.php — À inclure en tête de chaque page
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_secure', 1);
ini_set('session.cookie_samesite', 'Strict');
ini_set('session.use_strict_mode', 1);
ini_set('session.cookie_lifetime', 0);
ini_set('session.gc_maxlifetime', 3600);
session_name('SECURE_SESSION_ID');
session_start();
// Régénérer l'ID toutes les 30 minutes
if (!isset($_SESSION['created'])) {
$_SESSION['created'] = time();
} elseif (time() - $_SESSION['created'] > 1800) {
session_regenerate_id(true);
$_SESSION['created'] = time();
}
// Vérifier IP + User-Agent (anti session hijacking)
if (!isset($_SESSION['ip'])) {
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['ua'] = $_SERVER['HTTP_USER_AGENT'];
} elseif ($_SESSION['ip'] !== $_SERVER['REMOTE_ADDR']) {
session_destroy();
die('Session invalide — reconnectez-vous');
}
?>
<?php
session_start();
// 1. Régénérer l'ID après chaque action sensible
if (isset($_POST['login'])) {
session_regenerate_id(true); // Nouveau ID, supprime l'ancien
}
// 2. Timeout de session (30 min d'inactivité)
$timeout = 1800;
if (isset($_SESSION['last_activity'])) {
if (time() - $_SESSION['last_activity'] > $timeout) {
session_destroy();
header('Location: login.php?timeout=1');
exit;
}
}
$_SESSION['last_activity'] = time();
// 3. Token CSRF dans la session
if (!isset($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
// 4. Vérifier le token CSRF sur les formulaires POST
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$token = $_POST['csrf_token'] ?? '';
if (!hash_equals($_SESSION['csrf_token'], $token)) {
die('CSRF token invalide');
}
}
?>
Culture juridique des cookies
| Type | Consentement | Description | Exemples |
|---|---|---|---|
| Essentiels | ❌ Non requis | Nécessaires au fonctionnement | Session, panier, sécurité |
| Fonctionnels | ✅ Requis | Améliore l'expérience | Langue, préférences |
| Analytics / Pub | ✅ Requis | Tracking, publicité | Google Analytics, FB Pixel |
<?php
session_start();
$consentement = $_COOKIE['cookie_consent'] ?? null;
?>
<?php if ($consentement === null): ?>
<div id="cookie-banner"
style="position:fixed;bottom:0;width:100%;background:#222;color:#fff;padding:15px;text-align:center;">
<p>🍪 Ce site utilise des cookies.
<a href="politique.php" style="color:#f0ad4e;">En savoir plus</a></p>
<button onclick="acceptCookies()">Accepter</button>
<button onclick="refuseCookies()">Refuser</button>
<button onclick="location.href='preferences.php'">Personnaliser</button>
</div>
<script>
function acceptCookies() {
document.cookie = "cookie_consent=all; max-age=31536000; path=/; secure; samesite=lax";
document.getElementById('cookie-banner').style.display = 'none';
}
function refuseCookies() {
document.cookie = "cookie_consent=essential; max-age=31536000; path=/; secure; samesite=lax";
document.getElementById('cookie-banner').style.display = 'none';
}
</script>
<?php endif; ?>
Login / Logout sécurisé
auth/
├── config.php → Configuration sécurité + PDO
├── login.php → Formulaire de connexion
├── logout.php → Déconnexion
├── register.php → Inscription (optionnel)
├── dashboard.php → Page protégée
└── auth_functions.php → Fonctions réutilisables
<?php // auth_functions.php
function isLoggedIn(): bool {
return isset($_SESSION['user_id']);
}
function requireLogin(): void {
if (!isLoggedIn()) {
header('Location: login.php');
exit;
}
}
function logout(): void {
$_SESSION = [];
if (isset($_COOKIE['AUTH_SESSION'])) {
setcookie('AUTH_SESSION', '', time() - 3600, '/');
}
session_destroy();
}
function hashPassword(string $password): string {
return password_hash($password, PASSWORD_DEFAULT);
}
function verifyPassword(string $password, string $hash): bool {
return password_verify($password, $hash);
}
?>
<?php // login.php
require 'config.php';
require 'auth_functions.php';
if (isLoggedIn()) { header('Location: dashboard.php'); exit; }
$error = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = trim($_POST['email'] ?? '');
$password = $_POST['password'] ?? '';
if (empty($email) || empty($password)) {
$error = "Tous les champs sont obligatoires";
} else {
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
$stmt->execute([$email]);
$user = $stmt->fetch();
if ($user && verifyPassword($password, $user['password'])) {
session_regenerate_id(true); // ← OBLIGATOIRE après login
$_SESSION['user_id'] = $user['id'];
$_SESSION['user_email'] = $user['email'];
$_SESSION['user_name'] = $user['name'];
$_SESSION['user_role'] = $user['role'];
header('Location: dashboard.php');
exit;
} else {
$error = "Email ou mot de passe incorrect";
}
}
}
?>
<?php // dashboard.php
require 'config.php';
require 'auth_functions.php';
requireLogin(); // Redirige si non connecté
$userName = $_SESSION['user_name'];
$userRole = $_SESSION['user_role'];
?>
<h1>Bienvenue, <?= htmlspecialchars($userName) ?> !</h1>
<?php if ($userRole === 'admin'): ?>
<h2>Administration</h2>
<?php endif; ?>
<a href="logout.php">Se déconnecter</a>
<?php // logout.php
require 'config.php';
require 'auth_functions.php';
if (isLoggedIn()) {
// Supprimer le remember_token en BDD
$stmt = $pdo->prepare("UPDATE users SET remember_token=NULL WHERE id=?");
$stmt->execute([$_SESSION['user_id']]);
}
if (isset($_COOKIE['remember_token'])) {
setcookie('remember_token', '', time() - 3600, '/');
}
logout();
header('Location: login.php?logout=1');
exit;
?>
password_hash()session_regenerate_id() après loginhtmlspecialchars() à l'affichageMettre en pratique
langue.php qui :$_GET + $_COOKIE + setcookie()<?php
$traductions = [
'fr' => ['bonjour' => 'Bonjour', 'bienvenue' => 'Bienvenue sur notre site'],
'en' => ['bonjour' => 'Hello', 'bienvenue' => 'Welcome to our website'],
'es' => ['bonjour' => 'Hola', 'bienvenue' => 'Bienvenido a nuestro sitio']
];
if (isset($_GET['lang'])) {
$lang = $_GET['lang'];
if (in_array($lang, ['fr', 'en', 'es'])) {
setcookie('langue', $lang, time() + 86400 * 30, '/');
header('Location: langue.php');
exit;
}
}
$langue = $_COOKIE['langue'] ?? 'fr';
$textes = $traductions[$langue];
?>
<h1><?= $textes['bonjour'] ?> !</h1>
<p><?= $textes['bienvenue'] ?></p>
<a href="?lang=fr">🇫🇷 Français</a> |
<a href="?lang=en">🇬🇧 English</a> |
<a href="?lang=es">🇪🇸 Español</a>
compteur.php qui :$_COOKIE + $_GET + setcookie()<?php
if (isset($_GET['reset'])) {
setcookie('compteur_visites', '', time() - 3600, '/');
header('Location: compteur.php');
exit;
}
$visites = (int)($_COOKIE['compteur_visites'] ?? 0) + 1;
setcookie('compteur_visites', $visites, time() + 86400 * 7, '/');
?>
<h1>Compteur de visites</h1>
<?php if ($visites === 1): ?>
<p>🎉 Bienvenue ! C'est votre première visite.</p>
<?php else: ?>
<p>C'est votre visite n°<strong><?= $visites ?></strong></p>
<?php endif; ?>
<a href="?reset=1">Réinitialiser le compteur</a>
panier.php qui :$_SESSION + $_GET + session_start()<?php
session_start();
$produits = [
1 => ['nom' => 'Ordinateur', 'prix' => 899],
2 => ['nom' => 'Souris', 'prix' => 25],
3 => ['nom' => 'Clavier', 'prix' => 45]
];
if (!isset($_SESSION['panier'])) $_SESSION['panier'] = [];
if (isset($_GET['add'])) {
$id = (int)$_GET['add'];
if (isset($produits[$id])) {
if (isset($_SESSION['panier'][$id])) {
$_SESSION['panier'][$id]['quantite']++;
} else {
$_SESSION['panier'][$id] = [
'nom' => $produits[$id]['nom'],
'prix' => $produits[$id]['prix'],
'quantite' => 1
];
}
}
header('Location: panier.php'); exit;
}
if (isset($_GET['clear'])) {
$_SESSION['panier'] = [];
header('Location: panier.php'); exit;
}
$total = array_sum(array_map(
fn($i) => $i['prix'] * $i['quantite'],
$_SESSION['panier']
));
?>
<h1>Boutique</h1>
<h2>Produits disponibles</h2>
<?php foreach ($produits as $id => $p): ?>
<div>
<h3><?= $p['nom'] ?></h3>
<p><?= $p['prix'] ?> €</p>
<a href="?add=<?= $id ?>">Ajouter au panier</a>
</div>
<?php endforeach; ?>
<h2>Mon panier (<?= count($_SESSION['panier']) ?> article(s))</h2>
<?php if (empty($_SESSION['panier'])): ?>
<p>Votre panier est vide.</p>
<?php else: ?>
<table border="1">
<tr><th>Produit</th><th>Prix</th><th>Qté</th><th>Sous-total</th></tr>
<?php foreach ($_SESSION['panier'] as $item): ?>
<tr>
<td><?= $item['nom'] ?></td>
<td><?= $item['prix'] ?> €</td>
<td><?= $item['quantite'] ?></td>
<td><?= $item['prix'] * $item['quantite'] ?> €</td>
</tr>
<?php endforeach; ?>
<tr><td colspan="3"><strong>TOTAL</strong></td><td><?= $total ?> €</td></tr>
</table>
<a href="?clear=1">Vider le panier</a>
<?php endif; ?>
$_isset() avant de lirehtmlspecialchars() avant d'affichersession_start() AVANT tout HTMLsetcookie() AVANT tout HTML🔷 Superglobales · 🍪 Cookies · 📦 Sessions
= La mémoire du Web !