Projet guidé : Créer une application PHP pour gérer une liste d’utilisateurs (CRUD)
À travers cette activité, tu vas apprendre à :
utilisateurs :CREATE TABLE utilisateurs (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(100),
email VARCHAR(100)
);
Crée un dossier nommé projet_crud. Il contiendra les fichiers suivants :
/projet_crud
│
├── config/
│ └── db.php ← Fichier de connexion centralisé
│
├── index.php ← Liste des utilisateurs
├── ajouter.php ← Formulaire + traitement d’ajout
├── modifier.php ← Formulaire + traitement de modification
├── supprimer.php ← Suppression
config/db.php)Crée un fichier db.php dans un dossier config/ et écris ce code :
<?php
$host = 'localhost';
$dbname = 'gestion_utilisateurs';
$username = 'root';
$password = '';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Erreur de connexion : " . $e->getMessage());
}
?>
try/catch permet de gérer les erreurs de connexion. Si la connexion échoue, on affiche un message clair.index.php)Crée un fichier index.php et ajoute le code suivant :
<?php
require_once 'config/db.php';
$sql = "SELECT * FROM utilisateurs";
$stmt = $pdo->query($sql);
$utilisateurs = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<h1>Liste des utilisateurs</h1>
<a href="ajouter.php">➕ Ajouter un utilisateur</a>
<ul>
<?php foreach ($utilisateurs as $u): ?>
<li>
<?= htmlspecialchars($u['nom']) ?> (<?= htmlspecialchars($u['email']) ?>)
- <a href="modifier.php?id=<?= $u['id'] ?>">✏️</a>
- <a href="supprimer.php?id=<?= $u['id'] ?>" onclick="return confirm('Confirmer la suppression ?')">❌</a>
</li>
<?php endforeach; ?>
</ul>
require_once inclut le fichier de connexion.$pdo->query() exécute la requête SQL.fetchAll(PDO::FETCH_ASSOC) récupère les résultats sous forme de tableau associatif.foreach parcourt chaque utilisateur et l’affiche.htmlspecialchars() évite les attaques XSS (injections de code HTML/JS).ajouter.php)Crée un fichier ajouter.php. Ce fichier contient le formulaire et le traitement des données.
<?php
require_once 'config/db.php';
if (!empty($_POST['nom']) && !empty($_POST['email'])) {
$stmt = $pdo->prepare("INSERT INTO utilisateurs (nom, email) VALUES (:nom, :email)");
$stmt->execute([
':nom' => $_POST['nom'],
':email' => $_POST['email']
]);
header("Location: index.php"); // Redirection vers la page d’accueil
exit;
}
?>
<h1>Ajouter un utilisateur</h1>
<form method="post">
<input type="text" name="nom" placeholder="Nom" required>
<input type="email" name="email" placeholder="Email" required>
<button type="submit">Ajouter</button>
</form>
!empty().prepare() et execute() pour éviter les injections SQL.header("Location: index.php") redirige l’utilisateur après l’ajout.modifier.php)Crée un fichier modifier.php. Ce fichier permet de pré-remplir le formulaire et de le mettre à jour.
<?php
require_once 'config/db.php';
// 1. On récupère l’utilisateur à modifier
if (!empty($_GET['id'])) {
$stmt = $pdo->prepare("SELECT * FROM utilisateurs WHERE id = :id");
$stmt->execute([':id' => $_GET['id']]);
$utilisateur = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$utilisateur) {
die("Utilisateur introuvable.");
}
}
// 2. On traite la mise à jour
if (!empty($_POST['nom']) && !empty($_POST['email'])) {
$stmt = $pdo->prepare("UPDATE utilisateurs SET nom = :nom, email = :email WHERE id = :id");
$stmt->execute([
':nom' => $_POST['nom'],
':email' => $_POST['email'],
':id' => $_POST['id']
]);
header("Location: index.php");
exit;
}
?>
<h1>Modifier un utilisateur</h1>
<form method="post">
<input type="hidden" name="id" value="<?= $utilisateur['id'] ?>">
<input type="text" name="nom" value="<?= htmlspecialchars($utilisateur['nom']) ?>" required>
<input type="email" name="email" value="<?= htmlspecialchars($utilisateur['email']) ?>" required>
<button type="submit">Enregistrer les modifications</button>
</form>
modifier.php?id=3).hidden permet de conserver l’id de l’utilisateur à modifier.supprimer.php)Crée un fichier supprimer.php :
<?php
require_once 'config/db.php';
if (!empty($_GET['id'])) {
$stmt = $pdo->prepare("DELETE FROM utilisateurs WHERE id = :id");
$stmt->execute([':id' => $_GET['id']]);
}
header("Location: index.php");
exit;
id dans l’URL (ex: supprimer.php?id=4)| Action | Fichier | Fonction |
|---|---|---|
| Créer | ajouter.php |
Formulaire + ajout |
| Lire | index.php |
Liste les utilisateurs |
| Mettre à jour | modifier.php |
Formulaire pré-rempli + update |
| Supprimer | supprimer.php |
Supprime un utilisateur |
Voici l'étape supplémentaire à ajouter à ton exercice CRUD pour afficher un message de confirmation après une modification (ou une autre action) à l’aide de messages flash :

flash.php avec ce petit morceau de code :<?php
session_start();
function set_flash($message) {
$_SESSION['flash'] = $message;
}
function get_flash() {
if (!empty($_SESSION['flash'])) {
$msg = $_SESSION['flash'];
unset($_SESSION['flash']); // Supprimé après affichage
return $msg;
}
return null;
}
?>
index.php), ajoute ceci juste après require_once :require_once 'flash.php';
if ($msg = get_flash()) {
echo "<p style='background: #d4edda; color: #155724; padding: 10px;'>$msg</p>";
}
ajouter.php, modifier.php, et supprimer.php, juste avant chaque redirection, ajoute :set_flash("Action réussie !");
Exemples :
set_flash("Utilisateur modifié !");
header("Location: index.php");
exit;
$_SESSION pour le stocker entre deux pages.Très bien ! Voici comment intégrer un message flash avec un composant Toast Bootstrap 5, qui s’affiche automatiquement et disparaît au bout de quelques secondes.
Dans le <head> de ton fichier index.php (et éventuellement dans les autres), ajoute :
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
Avant la balise </body> :
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
Dans le haut de index.php (ou autre page), juste après require_once 'flash.php', ajoute ceci :
<?php if ($msg = get_flash()): ?>
<div class="toast-container position-fixed top-0 end-0 p-3" style="z-index: 1055;">
<div class="toast align-items-center text-bg-success border-0 show" role="alert" aria-live="assertive" aria-atomic="true" data-bs-delay="3000" data-bs-autohide="true" id="toastFlash">
<div class="d-flex">
<div class="toast-body">
<?= htmlspecialchars($msg) ?>
</div>
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
</div>
<script>
const toastLive = document.getElementById('toastFlash');
if (toastLive) {
const toastBootstrap = bootstrap.Toast.getOrCreateInstance(toastLive);
toastBootstrap.show();
}
</script>
<?php endif; ?>
flash.php :<?php
session_start();
function set_flash($message) {
$_SESSION['flash'] = $message;
}
function get_flash() {
if (!empty($_SESSION['flash'])) {
$msg = $_SESSION['flash'];
unset($_SESSION['flash']);
return $msg;
}
return null;
}
ajouter.php, modifier.php, supprimer.php :Juste avant le header(...), ajoute un message :
set_flash("Utilisateur ajouté !");
ou
set_flash("Utilisateur supprimé !");
data-bs-delay="3000").