Chapitre 23 : Requêtes SQL de base (CRUD)
Maîtrisez les opérations fondamentales de création, lecture, mise à jour et suppression de données avec PHP et MySQL.
1. Qu'est-ce que le CRUD ?
CRUD est un acronyme qui désigne les quatre opérations de base que l'on peut effectuer sur une base de données :
- Create : insérer de nouvelles données
- Read : lire ou afficher des données
- Update : modifier des données existantes
- Delete : supprimer des données
2. Préparation de la base de données
Voici une table d'exemple que nous allons utiliser :
CREATE TABLE utilisateurs (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(100),
email VARCHAR(100)
);
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(100),
email VARCHAR(100)
);
3. Connexion à la base de données
Nous utiliserons PDO pour une meilleure sécurité :
<?php
$host = 'localhost';
$dbname = 'ma_base';
$user = 'root';
$password = '';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Erreur de connexion : " . $e->getMessage());
}
?>
$host = 'localhost';
$dbname = 'ma_base';
$user = 'root';
$password = '';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Erreur de connexion : " . $e->getMessage());
}
?>
4. Créer (INSERT)
Insertion de données avec requête préparée :
<?php
$nom = 'Jean Dupont';
$email = 'jean@example.com';
$sql = "INSERT INTO utilisateurs (nom, email) VALUES (?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$nom, $email]);
echo "Utilisateur ajouté !";
?>
$nom = 'Jean Dupont';
$email = 'jean@example.com';
$sql = "INSERT INTO utilisateurs (nom, email) VALUES (?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$nom, $email]);
echo "Utilisateur ajouté !";
?>
5. Lire (SELECT)
Récupération et affichage des données :
<?php
$sql = "SELECT * FROM utilisateurs";
$stmt = $pdo->query($sql);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['id'] . ' - ' . $row['nom'] . ' - ' . $row['email'] . "<br>";
}
?>
$sql = "SELECT * FROM utilisateurs";
$stmt = $pdo->query($sql);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['id'] . ' - ' . $row['nom'] . ' - ' . $row['email'] . "<br>";
}
?>
6. Mettre à jour (UPDATE)
Modification de données existantes :
<?php
$id = 1;
$nouveauNom = 'Jean Martin';
$sql = "UPDATE utilisateurs SET nom = ? WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$nouveauNom, $id]);
echo "Utilisateur mis à jour !";
?>
$id = 1;
$nouveauNom = 'Jean Martin';
$sql = "UPDATE utilisateurs SET nom = ? WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$nouveauNom, $id]);
echo "Utilisateur mis à jour !";
?>
7. Supprimer (DELETE)
Suppression de données :
<?php
$id = 1;
$sql = "DELETE FROM utilisateurs WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$id]);
echo "Utilisateur supprimé !";
?>
$id = 1;
$sql = "DELETE FROM utilisateurs WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$id]);
echo "Utilisateur supprimé !";
?>
8. Bonnes pratiques
- Toujours utiliser
prepare()avecexecute()pour éviter les injections SQL - Valider et assainir toutes les données utilisateurs avec
filter_var() - Utiliser des transactions pour les opérations multiples
- Afficher des messages d'erreur clairs en mode développement seulement
- En production, logger les erreurs plutôt que les afficher
9. Exercice pratique : Gestion des contacts
Création d'une application complète pour gérer des contacts :
Structure de la table
CREATE TABLE contacts (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL
);
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL
);
Formulaire HTML
<form method="post" action="">
<input type="text" name="nom" placeholder="Nom" required>
<input type="email" name="email" placeholder="Email" required>
<button type="submit" name="ajouter">Ajouter</button>
</form>
<input type="text" name="nom" placeholder="Nom" required>
<input type="email" name="email" placeholder="Email" required>
<button type="submit" name="ajouter">Ajouter</button>
</form>
Code PHP
<?php
$pdo = new PDO('mysql:host=localhost;dbname=ma_base;charset=utf8', 'root', '');
if (isset($_POST['ajouter'])) {
$nom = $_POST['nom'];
$email = $_POST['email'];
$stmt = $pdo->prepare("INSERT INTO contacts (nom, email) VALUES (?, ?)");
$stmt->execute([$nom, $email]);
}
if (isset($_GET['supprimer'])) {
$id = $_GET['supprimer'];
$stmt = $pdo->prepare("DELETE FROM contacts WHERE id = ?");
$stmt->execute([$id]);
}
$stmt = $pdo->query("SELECT * FROM contacts");
$contacts = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
$pdo = new PDO('mysql:host=localhost;dbname=ma_base;charset=utf8', 'root', '');
if (isset($_POST['ajouter'])) {
$nom = $_POST['nom'];
$email = $_POST['email'];
$stmt = $pdo->prepare("INSERT INTO contacts (nom, email) VALUES (?, ?)");
$stmt->execute([$nom, $email]);
}
if (isset($_GET['supprimer'])) {
$id = $_GET['supprimer'];
$stmt = $pdo->prepare("DELETE FROM contacts WHERE id = ?");
$stmt->execute([$id]);
}
$stmt = $pdo->query("SELECT * FROM contacts");
$contacts = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
Affichage de la liste
<table border="1">
<tr>
<th>ID</th>
<th>Nom</th>
<th>Email</th>
<th>Action</th>
</tr>
<?php foreach ($contacts as $c): ?>
<tr>
<td><?= $c['id'] ?></td>
<td><?= htmlspecialchars($c['nom']) ?></td>
<td><?= htmlspecialchars($c['email']) ?></td>
<td>
<a href="?supprimer=<?= $c['id'] ?>">Supprimer</a>
</td>
</tr>
<?php endforeach; ?>
</table>
<tr>
<th>ID</th>
<th>Nom</th>
<th>Email</th>
<th>Action</th>
</tr>
<?php foreach ($contacts as $c): ?>
<tr>
<td><?= $c['id'] ?></td>
<td><?= htmlspecialchars($c['nom']) ?></td>
<td><?= htmlspecialchars($c['email']) ?></td>
<td>
<a href="?supprimer=<?= $c['id'] ?>">Supprimer</a>
</td>
</tr>
<?php endforeach; ?>
</table>
10. À retenir
- Les opérations CRUD sont fondamentales pour toute application web
- Utilisez toujours des requêtes préparées pour la sécurité
- PDO offre une interface plus sécurisée et flexible que MySQLi
- Validez et assainissez toujours les données utilisateur
- Structurez votre code pour une meilleure maintenabilité