Créer un CRUD avec PHP et MySQL : Guide Complet
Apprenez à créer une application complète permettant d'effectuer les opérations CRUD : Create, Read, Update, Delete avec PHP et MySQL. Mini-système de gestion d'utilisateurs inclus.
1️⃣ Introduction
Le CRUD (Create, Read, Update, Delete) est un concept fondamental dans le développement web qui représente les quatre opérations de base pour la gestion des données dans une application.
Pourquoi le CRUD est-il essentiel ?
- Base de toute application : La plupart des applications web manipulent des données
- Interface utilisateur standard : Formulaire de création, liste, édition, suppression
- REST API : Les opérations CRUD correspondent aux verbes HTTP (POST, GET, PUT, DELETE)
- Productivité : Une fois maîtrisé, vous pouvez créer n'importe quel module de gestion
Objectif de cet article
Nous allons créer ensemble un mini-système de gestion d'utilisateurs qui nous permettra de :
- Créer de nouveaux utilisateurs
- Lire et afficher la liste des utilisateurs
- Modifier les informations d'un utilisateur existant
- Supprimer des utilisateurs de la base de données
2️⃣ Préparation du projet
Commençons par mettre en place notre environnement de travail.
Structure du dossier
├── index.php # Page principale
├── config.php # Configuration base de données
├── create.php # Ajouter un utilisateur
├── read.php # Afficher les utilisateurs
├── update.php # Modifier un utilisateur
└── delete.php # Supprimer un utilisateur
Configuration de la base de données
Créez le fichier config.php :
<?php
$host = 'localhost';
$dbname = 'crud_php_mysql';
$username = 'root';
$password = '';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
die("Erreur de connexion : " . $e->getMessage());
}
?>
Création de la table utilisateurs
Exécutez cette requête SQL dans phpMyAdmin ou votre gestionnaire de base de données :
CREATE TABLE utilisateurs (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL,
date_creation TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Insertion de données de test
INSERT INTO utilisateurs (nom, email)
VALUES
('Alice Dupont', 'alice.dupont@email.com'),
('Bob Martin', 'bob.martin@email.com');
3️⃣ C — Create (Ajouter des données)
Créons un formulaire pour ajouter de nouveaux utilisateurs dans notre base de données.
Formulaire HTML
<form method="POST" action="">
<div>
<label for="nom">Nom :</label>
<input type="text" id="nom" name="nom" required>
</div>
<div>
<label for="email">Email :</label>
<input type="email" id="email" name="email" required>
</div>
<button type="submit" name="ajouter">Ajouter l'utilisateur</button>
</form>
Traitement PHP
<?php
require_once 'config.php';
if(isset($_POST['ajouter'])) {
$nom = trim($_POST['nom']);
$email = trim($_POST['email']);
// Validation des données
if(!empty($nom) && !empty($email)) {
try {
$sql = "INSERT INTO utilisateurs (nom, email) VALUES (?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$nom, $email]);
$message = "Utilisateur ajouté avec succès !";
} catch(PDOException $e) {
$erreur = "Erreur lors de l'ajout : " . $e->getMessage();
}
} else {
$erreur = "Tous les champs sont obligatoires !";
}
}
?>
💡 Bonne pratique
Utilisez toujours des requêtes préparées avec PDO pour éviter les injections SQL. Les données sont automatiquement échappées et sécurisées.
4️⃣ R — Read (Afficher les données)
Affichons maintenant la liste de tous les utilisateurs dans un tableau HTML.
Récupération et affichage des données
<?php
require_once 'config.php';
try {
$sql = "SELECT * FROM utilisateurs ORDER BY date_creation DESC";
$stmt = $pdo->query($sql);
$utilisateurs = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch(PDOException $e) {
die("Erreur : " . $e->getMessage());
}
?>
<!-- Affichage dans un tableau HTML -->
<table border="1">
<thead>
<tr>
<th>ID</th>
<th>Nom</th>
<th>Email</th>
<th>Date création</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<?php foreach($utilisateurs as $utilisateur): ?>
<tr>
<td><?= $utilisateur['id'] ?></td>
<td><?= htmlspecialchars($utilisateur['nom']) ?></td>
<td><?= htmlspecialchars($utilisateur['email']) ?></td>
<td><?= $utilisateur['date_creation'] ?></td>
<td>
<a href="update.php?id=<?= $utilisateur['id'] ?>">Modifier</a>
<a href="delete.php?id=<?= $utilisateur['id'] ?>"
onclick="return confirm('Êtes-vous sûr de vouloir supprimer cet utilisateur ?')">
Supprimer
</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
🔒 Sécurité importante
Utilisez toujours htmlspecialchars() pour échapper les données avant de les afficher dans le HTML. Cela empêche les attaques XSS (Cross-Site Scripting).
5️⃣ U — Update (Modifier les données)
Créons un formulaire pour modifier les informations d'un utilisateur existant.
Formulaire de modification pré-rempli
<?php
require_once 'config.php';
// Récupération de l'utilisateur à modifier
if(isset($_GET['id'])) {
$id = intval($_GET['id']);
try {
$sql = "SELECT * FROM utilisateurs WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$id]);
$utilisateur = $stmt->fetch(PDO::FETCH_ASSOC);
if(!$utilisateur) {
die("Utilisateur non trouvé");
}
} catch(PDOException $e) {
die("Erreur : " . $e->getMessage());
}
}
// Traitement du formulaire de modification
if(isset($_POST['modifier'])) {
$nom = trim($_POST['nom']);
$email = trim($_POST['email']);
$id = intval($_POST['id']);
if(!empty($nom) && !empty($email)) {
try {
$sql = "UPDATE utilisateurs SET nom = ?, email = ? WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$nom, $email, $id]);
$message = "Utilisateur modifié avec succès !";
header("Location: read.php");
exit();
} catch(PDOException $e) {
$erreur = "Erreur lors de la modification : " . $e->getMessage();
}
} else {
$erreur = "Tous les champs sont obligatoires !";
}
}
?>
<!-- Formulaire pré-rempli -->
<form method="POST" action="">
<input type="hidden" name="id" value="<?= $utilisateur['id'] ?>">
<div>
<label for="nom">Nom :</label>
<input type="text" id="nom" name="nom"
value="<?= htmlspecialchars($utilisateur['nom']) ?>" required>
</div>
<div>
<label for="email">Email :</label>
<input type="email" id="email" name="email"
value="<?= htmlspecialchars($utilisateur['email']) ?>" required>
</div>
<button type="submit" name="modifier">Modifier l'utilisateur</button>
</form>
6️⃣ D — Delete (Supprimer des données)
Implémentons la fonctionnalité de suppression d'utilisateurs.
<?php
require_once 'config.php';
if(isset($_GET['id'])) {
$id = intval($_GET['id']);
// Vérification que l'utilisateur existe
try {
$sql = "SELECT id FROM utilisateurs WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$id]);
$utilisateur = $stmt->fetch();
if($utilisateur) {
// Suppression de l'utilisateur
$sql = "DELETE FROM utilisateurs WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$id]);
$_SESSION['message'] = "Utilisateur supprimé avec succès !";
} else {
$_SESSION['erreur'] = "Utilisateur non trouvé !";
}
} catch(PDOException $e) {
$_SESSION['erreur'] = "Erreur lors de la suppression : " . $e->getMessage();
}
} else {
$_SESSION['erreur'] = "ID utilisateur manquant !";
}
// Redirection vers la liste des utilisateurs
header("Location: read.php");
exit();
?>
⚠️ Attention à la suppression
La suppression est une opération irréversible. En production, envisagez d'implémenter une suppression logique (champ "actif" à false) plutôt qu'une suppression physique.
7️⃣ Améliorations possibles
Notre CRUD fonctionne, mais voici quelques améliorations pour le rendre plus robuste et professionnel.
a. Messages d'erreur et de succès
<?php
session_start();
// Affichage des messages
if(isset($_SESSION['message'])) {
echo '<div class="success">' . $_SESSION['message'] . '</div>';
unset($_SESSION['message']);
}
if(isset($_SESSION['erreur'])) {
echo '<div class="error">' . $_SESSION['erreur'] . '</div>';
unset($_SESSION['erreur']);
}
?>
b. Pagination des résultats
$limit = 10; // Nombre d'éléments par page
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$offset = ($page - 1) * $limit;
$sql = "SELECT * FROM utilisateurs ORDER BY date_creation DESC LIMIT ? OFFSET ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$limit, $offset]);
c. Validation côté serveur avancée
function validerUtilisateur($nom, $email) {
$erreurs = [];
// Validation du nom
if(empty($nom)) {
$erreurs[] = "Le nom est obligatoire";
} elseif(strlen($nom) > 100) {
$erreurs[] = "Le nom ne doit pas dépasser 100 caractères";
}
// Validation de l'email
if(empty($email)) {
$erreurs[] = "L'email est obligatoire";
} elseif(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$erreurs[] = "Format d'email invalide";
}
return $erreurs;
}
🚀 Autres améliorations possibles
- Sécurité CSRF : Ajouter des tokens pour prévenir les attaques
- Interface utilisateur : Utiliser Bootstrap ou Tailwind CSS
- Recherche et filtres : Implémenter une barre de recherche
- Export de données : Exporter en CSV ou PDF
- API REST : Créer une API pour le CRUD
8️⃣ Conclusion
Félicitations ! Vous avez créé un système CRUD complet avec PHP et MySQL. Voici un récapitulatif de ce que vous avez accompli :
✅ Fonctionnalités implémentées :
- Create : Ajout de nouveaux utilisateurs via un formulaire
- Read : Affichage de la liste des utilisateurs dans un tableau
- Update : Modification des informations utilisateur
- Delete : Suppression d'utilisateurs avec confirmation
- Sécurité : Requêtes préparées et échappement HTML
- Validation : Vérification des données côté serveur
Prochaines étapes recommandées :
- Authentification : Ajouter un système de connexion utilisateur
- Rôles et permissions : Gérer les droits d'accès
- Relations entre tables : Créer des tables liées (articles, commandes, etc.)
- Framework PHP : Découvrir Laravel ou Symfony
- JavaScript : Ajouter des interactions AJAX
🚀 Défi du prochain article
Dans notre prochain tutoriel, nous aborderons la gestion des erreurs PHP et les bonnes pratiques de débogage pour rendre vos applications plus robustes et faciles à maintenir !
👉 "Gestion des erreurs PHP et bonnes pratiques de débogage"
Questions Fréquentes sur le CRUD PHP/MySQL
Quelle est la différence entre mysqli et PDO pour un CRUD ?
PDO offre une abstraction permettant de travailler avec différentes bases de données, tandis que mysqli est spécifique à MySQL. Pour un nouveau projet, PDO est généralement recommandé pour sa portabilité et sa meilleure gestion des erreurs.
Comment sécuriser mon CRUD contre les injections SQL ?
Utilisez toujours des requêtes préparées avec PDO ou mysqli. Ne concaténez jamais des variables directement dans vos requêtes SQL. Les requêtes préparées séparent automatiquement les données de la structure de la requête.
Faut-il utiliser des frameworks pour créer un CRUD ?
Pour les petits projets, le PHP natuel est suffisant. Pour les applications complexes, des frameworks comme Laravel ou Symfony fournissent des outils CRUD puissants (Eloquent, Doctrine) qui accélèrent le développement.
Comment gérer les relations entre tables dans un CRUD ?
Utilisez des jointures SQL pour récupérer les données liées. Par exemple, si vous avez des utilisateurs et des articles, vous pouvez faire une jointure pour afficher le nom de l'auteur avec chaque article.