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)
);

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());
  }
?>

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é !";
?>

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>";
  }
?>

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 !";
?>

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é !";
?>

8. Bonnes pratiques

  • Toujours utiliser prepare() avec execute() 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
);

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>

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);
?>

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>

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é