Try   HackMD

CRUD PHP avec MySQL et PDO

Qu'est-ce qu'un CRUD

En programmation, spécialement dans le domaine du développement web, CRUD est un acronyme qui représente les quatre opérations de base pour la gestion des données. CRUD signifie :

  1. Create (Créer) : Cette opération consiste à ajouter de nouvelles données. Dans le contexte d'une base de données, cela correspond généralement à l'insertion de nouvelles lignes dans une table.

  2. Read (Lire) : Cette opération implique la lecture et la récupération des données. Cela peut impliquer la lecture de l'intégralité des données ou seulement une partie, selon certains critères de recherche ou de filtrage.

  3. Update (Mettre à jour) : Cette opération concerne la modification des données existantes. Cela peut impliquer la modification d'une ou de plusieurs valeurs dans une ou plusieurs lignes d'une table de base de données.

  4. Delete (Supprimer) : Cette dernière opération est utilisée pour supprimer des données. Cela peut être la suppression d'une ligne spécifique dans une table ou de plusieurs lignes en fonction de certains critères.

Le concept de CRUD est fondamental dans le développement web car il définit les interactions de base entre l'utilisateur et les données. Presque toutes les applications web ont une forme de gestion de données, et les opérations CRUD représentent les actions les plus élémentaires et essentielles que ces applications doivent pouvoir effectuer.

En comprenant et en mettant en œuvre correctement les opérations CRUD, les développeurs peuvent s'assurer que les utilisateurs sont capables de gérer efficacement les données dans l'application, que ce soit pour ajouter de nouvelles informations, afficher des données existantes, mettre à jour des informations obsolètes ou supprimer des informations inutiles.

Créer un CRUD avec PHP / MySQL et PDO

Introduction

PDO, ou PHP Data Objects, est une extension de PHP qui offre une interface uniforme pour accéder à divers systèmes de bases de données. Voici quelques points clés à propos de PDO :

  1. Indépendance vis-à-vis de la base de données : PDO fournit une couche d'abstraction qui permet aux développeurs de se connecter à divers types de bases de données (comme MySQL, PostgreSQL, SQLite) avec le même code PHP. Cela rend le code plus portable.

  2. Préparation des requêtes : PDO permet de préparer des requêtes SQL, ce qui peut aider à prévenir les injections SQL. Les requêtes préparées séparent la création de la requête de l'insertion des données, rendant le processus plus sécurisé.

  3. Exécution des requêtes : Après la préparation, les requêtes peuvent être exécutées avec différents paramètres sans avoir besoin d'être recompilées, ce qui améliore les performances.

  4. Gestion des erreurs : PDO offre des options flexibles pour la gestion des erreurs. Il peut fonctionner en mode "silencieux", "avertissement" ou "exception".

  5. Transactions : PDO supporte les transactions, ce qui permet de regrouper plusieurs opérations en une seule unité de travail.

Comparaison avec MySQLi
  • API spécifique vs API générique : MySQLi est spécifique à MySQL, tandis que PDO est conçu pour fonctionner avec de nombreux types de bases de données.
  • API procédurale et orientée objet : MySQLi offre les deux options, tandis que PDO est uniquement orienté objet.
  • Fonctionnalités liées à MySQL : MySQLi peut utiliser certaines fonctionnalités spécifiques à MySQL qui ne sont pas disponibles avec PDO.
  • Performances : MySQLi peut être légèrement plus rapide pour les opérations avec MySQL, mais PDO offre une plus grande flexibilité et sécurité, en particulier pour les applications qui peuvent nécessiter la connexion à différentes bases de données.

En résumé, PDO est un excellent choix si vous cherchez une solution plus flexible et sécurisée pour travailler avec divers systèmes de bases de données en PHP, tandis que MySQLi peut être préféré pour des projets spécifiquement liés à MySQL, en particulier si vous avez besoin de fonctionnalités qui ne sont pas prises en charge par PDO.

Pour accéder à une base de données en utilisant PDO dans PHP et effectuer les opérations CRUD (Create, Read, Update, Delete), suivez ces étapes :

Connexion à la Base de Données avec PDO

Vous devez d'abord établir une connexion à votre base de données. Remplacez dbname, username, et password par vos propres informations de connexion.

<?php
$host = 'localhost';
$dbname = 'nom_de_la_base';
$username = 'utilisateur';
$password = 'mot_de_passe';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
    // Définit le mode d'erreur PDO sur exception
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    echo "Erreur de connexion : " . $e->getMessage();
}
?>
Utilité du try...catch
  • Gestion des erreurs : Le bloc try...catch permet de gérer les erreurs de manière élégante. Au lieu de laisser une erreur de base de données potentiellement arrêter brutalement le script ou exposer des informations sensibles, vous pouvez contrôler ce qui se passe lorsqu'une erreur survient.
  • Sécurité et robustesse : Cela rend le code plus sûr et robuste. Vous pouvez décider de la manière de réagir en cas d'erreur (afficher un message d'erreur personnalisé, enregistrer l'erreur dans un fichier log, etc.) sans exposer des détails sensibles comme les informations de connexion à la base de données.
  • Débogage : Cela facilite le débogage en vous fournissant des informations précises sur la nature de l'erreur (via $e->getMessage()).

En résumé, l'utilisation de try...catch dans ce contexte est une bonne pratique pour une gestion d'erreur efficace lors de la connexion à une base de données.

Create (Créer)

Pour insérer des données dans une table :

try {
    $stmt = $pdo->prepare("INSERT INTO nom_de_la_table (colonne1, colonne2) VALUES (:colonne1, :colonne2)");
    $stmt->bindParam(':colonne1', $valeur1);
    $stmt->bindParam(':colonne2', $valeur2);

    // Remplacer les valeurs
    $valeur1 = 'valeur1';
    $valeur2 = 'valeur2';
    $stmt->execute();
} catch(PDOException $e) {
    echo "Erreur d'insertion : " . $e->getMessage();
}
Explications complémentaires
  • Structure Générale

    • Préparation de la requête : $pdo->prepare() prépare une requête SQL pour l'exécution. Cette méthode est utile pour éviter les injections SQL. Les valeurs :colonne1 et :colonne2 sont des marqueurs nommés utilisés pour lier les valeurs ultérieurement.
    • Bloc try...catch : La gestion des erreurs est assurée par ce bloc. En cas d'erreur lors de l'exécution de la requête, le bloc catch capture l'exception et affiche le message d'erreur.
  • Utilisation de bindParam

    • bindParam : Cette méthode lie une variable PHP à un marqueur nommé dans la requête SQL.
      • ':colonne1', ':colonne2' sont les marqueurs nommés dans la requête SQL.
      • $valeur1, $valeur2 sont les variables PHP qui contiendront les valeurs à insérer dans la base de données.
    • Caractéristiques de bindParam :
      • Liaison par référence : bindParam lie la variable par référence. Cela signifie que la valeur de la variable n'est pas lue au moment de l'appel à bindParam, mais au moment de l'exécution de la requête ($stmt->execute()). Donc, si la variable change entre l'appel à bindParam et execute, c'est la dernière valeur qui sera utilisée.
      • Flexibilité : Cette méthode est utile pour exécuter plusieurs fois la même requête avec différentes valeurs, en changeant simplement les valeurs des variables liées avant chaque appel à execute.
  • Exécution de la Requête

    • Assignation des valeurs : Les variables $valeur1 et $valeur2 sont définies après l'appel à bindParam. Ces valeurs seront celles insérées dans la base de données.
    • execute : La méthode execute lance la requête préparée. Comme bindParam a été utilisé, les valeurs actuelles de $valeur1 et $valeur2 sont insérées dans la base de données.
  • Gestion des Erreurs

    • catch(PDOException $e) : Si une erreur survient pendant l'exécution de la requête (comme une violation de contrainte dans la base de données), elle est capturée et traitée ici.

    En résumé, bindParam est une méthode de liaison de variable dans PDO qui permet une programmation flexible et sécurisée des requêtes SQL, en évitant les injections SQL et en permettant une réutilisation facile des requêtes préparées.

Read (Lire)

Pour lire des données :

try {
    $stmt = $pdo->prepare("SELECT * FROM nom_de_la_table");
    $stmt->execute();

    // Récupérer les résultats
    $resultats = $stmt->fetchAll(PDO::FETCH_ASSOC);
    foreach ($resultats as $row) {
        // Traiter chaque ligne de résultat
    }
} catch(PDOException $e) {
    echo "Erreur de lecture : " . $e->getMessage();
}

Update (Mettre à Jour)

Pour mettre à jour des données :

try {
    $stmt = $pdo->prepare("UPDATE nom_de_la_table SET colonne1 = :colonne1 WHERE condition = :condition");
    $stmt->bindParam(':colonne1', $nouvelleValeur);
    $stmt->bindParam(':condition', $condition);

    // Remplacer les valeurs
    $nouvelleValeur = 'nouvelle valeur';
    $condition = 'valeur de condition';
    $stmt->execute();
} catch(PDOException $e) {
    echo "Erreur de mise à jour : " . $e->getMessage();
}

Delete (Supprimer)

Pour supprimer des données :

try {
    $stmt = $pdo->prepare("DELETE FROM nom_de_la_table WHERE condition = :condition");
    $stmt->bindParam(':condition', $condition);

    // Remplacer la condition
    $condition = 'valeur de condition';
    $stmt->execute();
} catch(PDOException $e) {
    echo "Erreur de suppression : " . $e->getMessage();
}

Ces exemples de base vous montrent comment utiliser PDO pour effectuer des opérations CRUD sur une base de données MySQL. Assurez-vous de remplacer nom_de_la_table, colonne1, colonne2, etc., par vos propres noms de tables et de colonnes. De plus, gérez toujours les exceptions pour capturer et traiter les erreurs potentielles lors de l'exécution de vos requêtes.