Exercices — Préserver les données
Quatre parties : manipuler les sessions à travers une boutique, un rappel de la programmation orientée objet, une page d’administration pour gérer les produits, puis une synthèse qui rend le TP1 durable avec une base de données.
Partie 1 : Utilisation de session
Section intitulée « Partie 1 : Utilisation de session »Exercice 1 – Un compteur de visites
Section intitulée « Exercice 1 – Un compteur de visites »Créez une page (par exemple accueil.php) qui compte combien de fois le visiteur l’a chargée pendant sa session, et affiche un message d’accueil personnalisé selon des paliers de visite.
Exemple de paliers
Section intitulée « Exemple de paliers »| Visites | Message |
|---|---|
| 1 | Bienvenue ! |
| 2 à 4 | Bon retour ! |
| 5 à 9 | Te revoilà ! |
| 10 et plus | Coucou, habitué ! |
Vérification Indice
Appelez session_start() avant toute sortie. Au premier passage, la clé n’existe pas encore : $_SESSION['visites'] ?? 0 donne la valeur de départ (0), à laquelle on ajoute 1. Après cet ajout, la première visite vaut donc 1, ce qui déclenche le premier palier.
Exercice 2 – Un panier en session
Section intitulée « Exercice 2 – Un panier en session »Créez une page boutique.php, qui présente cette liste de produits :
| id | nom | prix |
|---|---|---|
| 1 | Sirop d’érable 540 ml | 14,50 $ |
| 2 | Beurre d’érable 250 g | 9,95 $ |
| 3 | Tire sur la neige | 6,00 $ |
Chaque produit s’affiche dans une carte présentant son image, son nom, son prix et un bouton « Ajouter au panier » (?ajouter=<id>) qui l’ajoute au panier conservé en session.
Les cartes pourraient ressembler à ceci :
Une page panier.php affiche les produits du panier et le total:
- chaque ligne a un lien « Supprimer » permettant de supprimer le produit du panier,
- Un lien « Vider » (
?vider=1) retire tout du panier.
Vérification Indice
Rangez les produits dans un fichier de données commun aux deux pages, indexé par id. Le panier ne conserve que des id dans $_SESSION['panier'] ; le total se calcule en retrouvant chaque prix. Pour supprimer un article, array_splice retire l’élément à une position donnée. Échappez tout affichage avec htmlspecialchars.
Exercice 3 – Ajouter une base de données
Section intitulée « Exercice 3 – Ajouter une base de données »Placez la liste des produits dans une base de données et servez-la dans la boutique de l’exercice précédent, à la place du fichier de données.
Vérification Indice 1
Créez une table produits (id en AUTO_INCREMENT, nom, prix) et remplissez-la. Puis réécrivez data/produits.php : au lieu de return [...], il ouvre une connexion PDO, fait un SELECT, et reconstruit le même tableau id => produit avant de le retourner. La boutique et le panier n’ont alors rien à changer.
Vérification Indice 2
Script de création de table et pour l’insertion de données
CREATE TABLE produits ( id INT AUTO_INCREMENT PRIMARY KEY, nom VARCHAR(100) NOT NULL, prix DECIMAL(6, 2) NOT NULL);
INSERT INTO produits (nom, prix) VALUES ('Sirop d''érable 540 ml', 14.50), ('Beurre d''érable 250 g', 9.95), ('Tire sur la neige', 6.00);Partie 2 : Premiers pas en programmation orientée objet
Section intitulée « Partie 2 : Premiers pas en programmation orientée objet »Jusqu’ici, les données vivaient dans des tableaux et le comportement dans des fonctions. La programmation orientée objet réunit les deux :
- une classe est un modèle qui décrit des attributs (les données) et des méthodes (le comportement) ;
- un objet est une instance concrète créée à partir de ce modèle avec
new.
Une classe en PHP réunit quatre éléments : le mot-clé class, des attributs, un constructeur et des méthodes.
<?phpclass CompteBancaire // 1. le mot-clé class et un nom{ private float $solde; // 2. un attribut (donnée), ici privé
public function __construct(float $depart) // 3. le constructeur { $this->solde = $depart; // $this désigne l'objet courant }
public function deposer(float $montant): void // 4. une méthode (comportement) { $this->solde += $montant; }
public function solde(): float { return $this->solde; }}
$compte = new CompteBancaire(100); // créer un objet avec new$compte->deposer(50); // appeler une méthode avec ->echo $compte->solde(); // 150La visibilité public ou private contrôle l’accès : un attribut private ne se manipule que par les méthodes de la classe. On parle d’encapsulation : l’objet protège ses données et n’expose que ce qu’il choisit.
Exercice 4 – Une première classe : Produit
Section intitulée « Exercice 4 – Une première classe : Produit »Écrivez une classe Produit avec deux attributs, nom et prix, un constructeur qui les reçoit, et une méthode prixFormate() qui retourne le prix à la québécoise. Créez ensuite un produit et affichez-le.
Vérification Indice
Le constructeur __construct reçoit les valeurs et les range dans l’objet courant avec $this->nom = $nom. Une méthode est une fonction déclarée dans la classe ; elle accède aux attributs par $this->. On instancie avec new Produit(...) et on appelle avec la flèche ->.
Exercice 5 – Une classe avec comportement : Panier
Section intitulée « Exercice 5 – Une classe avec comportement : Panier »Écrivez une classe Panier qui contient une liste de produits dans un attribut privé. Ajoutez trois méthodes : ajouter(Produit $produit), nombre() qui retourne le nombre d’articles, et total() qui retourne la somme des prix.
Vérification Indice
Déclarez l’attribut private array $articles = [];. Étant privé, il ne se manipule que par les méthodes de la classe. ajouter ajoute au tableau, nombre renvoie count(...), et total parcourt les produits en additionnant leur prix.
Partie 3 : Une page d’administration (CRUD)
Section intitulée « Partie 3 : Une page d’administration (CRUD) »Les produits sont maintenant en base de données (partie 1, exercice 3). Une page d’administration permet de les gérer directement, sans passer par phpMyAdmin. Elle réunit les quatre opérations de base, résumées par l’acronyme CRUD : créer (Create), lire (Read), modifier (Update) et supprimer (Delete).
Voici à quoi la liste d’administration pourrait ressembler :
| id | Nom | Prix | Actions |
|---|---|---|---|
| 1 | Sirop d'érable 540 ml | 14,50 $ | |
| 2 | Beurre d'érable 250 g | 9,95 $ | |
| 3 | Tire sur la neige | 6,00 $ |
Exercice 6 – Lister les produits (Read)
Section intitulée « Exercice 6 – Lister les produits (Read) »Créez admin/produits.php : la page liste tous les produits dans un tableau, avec un lien « Modifier » et « Supprimer » par ligne, et un lien pour ajouter un produit.
Vérification Indice
Placez la connexion PDO dans un db.php que toutes les pages d’administration incluront. La lecture est un simple SELECT ... FROM produits. Chaque lien d’action transporte l’id de la ligne : modifier.php?id=... et supprimer.php?id=....
Exercice 7 – Ajouter un produit (Create)
Section intitulée « Exercice 7 – Ajouter un produit (Create) »Créez admin/ajouter.php : un formulaire (nom et prix) qui, à l’envoi, valide les données et insère le produit, puis redirige vers la liste.
Vérification Indice
Sur POST, validez le nom (non vide) et le prix (nombre positif), puis exécutez un INSERT préparé. Après l’insertion, header('Location: produits.php') renvoie vers la liste, suivi de exit.
Exercice 8 – Modifier un produit (Update)
Section intitulée « Exercice 8 – Modifier un produit (Update) »Créez admin/modifier.php?id=... : la page charge le produit visé, affiche un formulaire prérempli, puis enregistre les changements à l’envoi.
Vérification Indice
En GET, lisez le produit par son id (requête préparée) et préremplissez les champs avec l’attribut value, échappé. En POST, exécutez un UPDATE ... WHERE id = :id, puis redirigez vers la liste.
Exercice 9 – Supprimer un produit (Delete)
Section intitulée « Exercice 9 – Supprimer un produit (Delete) »Créez admin/supprimer.php?id=... : la page demande d’abord une confirmation, et supprime le produit seulement à l’envoi du formulaire.
Vérification Indice
Une suppression modifie l’état du système : elle ne doit pas se faire par une simple requête GET (une lecture doit rester sans effet). Affichez donc une confirmation, et exécutez le DELETE ... WHERE id = :id uniquement sur l’envoi POST, avant de rediriger.