Aller au contenu

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.

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.

VisitesMessage
1Bienvenue !
2 à 4Bon retour !
5 à 9Te revoilà !
10 et plusCoucou, 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.

Créez une page boutique.php, qui présente cette liste de produits :

idnomprix
1Sirop d’érable 540 ml14,50 $
2Beurre d’érable 250 g9,95 $
3Tire sur la neige6,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 :

Aperçu : carte de produit
Chaque carte présente une image, le nom, le prix et un bouton d'ajout.
Sirop d'érable 540 ml
14,50 $
Beurre d'érable 250 g
9,95 $
Tire sur la neige
6,00 $

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.

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 :

  1. une classe est un modèle qui décrit des attributs (les données) et des méthodes (le comportement) ;
  2. 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.

<?php
class 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(); // 150

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

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

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 :

Aperçu : administration des produits
Lister, ajouter, modifier et supprimer (CRUD).
idNomPrixActions
1Sirop d'érable 540 ml14,50 $
2Beurre d'érable 250 g9,95 $
3Tire sur la neige6,00 $
Démonstration : « Ajouter » et « Supprimer » ne modifient que cet aperçu. Dans le projet, ces actions passent par la base de données.

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

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.

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.

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.