Leçon 8 / 8
Leçon 08 · Partie 2 — Modifier les données

Mini-projet : todo list avec BDD

Ce qu'on va construire

Une todo list complète avec :

  • Afficher toutes les tâches (SELECT)
  • Ajouter une tâche via formulaire (INSERT)
  • Marquer une tâche comme faite (UPDATE)
  • Supprimer une tâche (DELETE)

Étape 1 : créer la table

CREATE TABLE taches (
  id        INT AUTO_INCREMENT PRIMARY KEY,
  titre     VARCHAR(255) NOT NULL,
  faite     TINYINT(1) DEFAULT 0,   -- 0 = non, 1 = oui
  creee_le  DATETIME DEFAULT CURRENT_TIMESTAMP
);

Étape 2 : index.php — afficher et ajouter


require_once 'connexion.php';

// Ajouter une tâche si formulaire soumis
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['titre'])) {
    $titre = trim($_POST['titre']);
    $stmt  = $pdo->prepare("INSERT INTO taches (titre) VALUES (:titre)");
    $stmt->execute([':titre' => $titre]);
    header('Location: index.php');
    exit;
}

// Lire toutes les tâches, non-faites en premier
$taches = $pdo->query(
    "SELECT * FROM taches ORDER BY faite ASC, creee_le DESC"
)->fetchAll(PDO::FETCH_ASSOC);
?>

<!DOCTYPE html>
<html lang="fr">
<head>
  <meta charset="UTF-8"/>
  <title>Ma Todo List</title>
</head>
<body>

<h1>Ma Todo List</h1>

<!-- Formulaire d'ajout -->
<form method="post">
  <input type="text" name="titre"
         placeholder="Nouvelle tâche..." required/>
  <button>Ajouter</button>
</form>

<!-- Liste des tâches -->
<ul>
<?php foreach ($taches as $t): ?>
  <li style="<?= $t['faite'] ? 'opacity:.5;text-decoration:line-through' : '' ?>">
    <?= htmlspecialchars($t['titre']) ?>

    <!-- Marquer comme faite -->
    <form method="post" action="terminer.php" style="display:inline">
      <input type="hidden" name="id"   value="<?= $t['id'] ?>"/>
      <input type="hidden" name="etat" value="<?= $t['faite'] ? 0 : 1 ?>"/>
      <button><?= $t['faite'] ? '↩ Rouvrir' : '✓ Fait' ?></button>
    </form>

    <!-- Supprimer -->
    <form method="post" action="supprimer.php"
          style="display:inline"
          onsubmit="return confirm('Supprimer ?')">
      <input type="hidden" name="id" value="<?= $t['id'] ?>"/>
      <button></button>
    </form>
  </li>
<?php endforeach; ?>
</ul>

</body>
</html>

Étape 3 : terminer.php et supprimer.php

// terminer.php

require_once 'connexion.php';
$stmt = $pdo->prepare("UPDATE taches SET faite = :etat WHERE id = :id");
$stmt->execute([':etat' => (int)$_POST['etat'], ':id' => (int)$_POST['id']]);
header('Location: index.php');

// supprimer.php

require_once 'connexion.php';
$stmt = $pdo->prepare("DELETE FROM taches WHERE id = :id");
$stmt->execute([':id' => (int)$_POST['id']]);
header('Location: index.php');

Structure finale du projet

todo/
├── connexion.php
├── index.php       ← affichage + ajout
├── terminer.php    ← marquer comme faite
└── supprimer.php   ← suppression

Pour aller plus loin : ajoute des catégories avec une table categories liée par clé étrangère. Ou des dates d'échéance. Ou un système de comptes utilisateurs avec les sessions PHP.

// À retenir
  • CRUD complet : SELECT (lire), INSERT (ajouter), UPDATE (modifier), DELETE (supprimer)
  • Toujours requêtes préparées pour les données utilisateur
  • Pattern PRG : POST → traitement → redirect
  • htmlspecialchars() sur tout ce qu'on affiche venant de la BDD
  • (int) $var pour caster les IDs en entier avant d'utiliser
  • Ce projet = base de presque toutes les applis web