Comment utiliser PDO pour gérer l’interconnexion entre une base de données MySQL et PHP (réalisation d’un CRUD basique)
Dans cet article nous allons voir comment mettre en place PDO pour récupérer, ajouter, modifier et supprimer des éléments dans une base de données MySQL à partir d’un programme écrit dans le langage de programmation PHP.
A cet effet, nous utiliserons la base de données suivante :
Elle utilise 2 tables :
- Cours : contenant la clef primaire idCours en auto-incrément, 3 champs d’informations (libellé, description et le nom de l’image), et une clef étrangère (idType).
- Type : contenant la clef primaire idType en auto-incrément, et 1 champ d’information (libelle)
En cas de difficulté pour créer la base de données, vous pouvez la récupérer à cette adresse :https://ecole.h2prog.com/courses/exercices-php-video/lectures/11254648
Le catalogue de produits et les fonctionnalités de sa gestion (ajout / création / modification) ont été réalisés en vidéos dans un cas pratique dédié et accessible sur youtube :La playlist youtube
Nous vous montrerons ici, comment gérer la table « type » pour réaliser les fonctionnalités de gestion du CRUD (Create / Read / Update / Delete).
Partie 1 : la structure en place
Pour réaliser l’application, nous avons mis en place un « Template » de page HTML basique dans lequel nous avons défini une variable PHP appelée « $content ».
Celle-ci récupère les informations transmises par chacune des pages de notre application et permet d’inclure le code à l’intérieur du « Template » HTML.
La variable « $titre » permet de définir un titre (balise h1) dans nos pages.
Nous ne détaillerons pas plus ce « Template » et le menu de l’application mais sachez que Bootstrap est également inclus, permettant de styliser l’application simplement et rapidement.
En cas de difficulté pour générer la structure de base de l’application, vous pouvez vous référer à la vidéo explicative, gratuite, présente sur la chaîne Youtube de H2PROG :https://youtu.be/hAFi0qTvBE4
L’utilisation du template :
Celui-ci est appelé dans chacune de nos pages, et dans chacune d’elles, la variable « $content » est remplie avec un « buffer ».
Il est ouvert en première ligne avec la fonction « ob_start() ». Le contenu est ainsi temporisé jusqu’à l’appel de la fonction « ob_get_clean() » qui permet de le déverser dans la variable « $content »
Voici le résultat obtenu pour le fichier « types.php » :
Partie 2 : la connexion à la base de données et l’affichage de la liste des « types »
L’objectif de cet article n’est pas de faire un code optimisé, mais de vous démontrer le fonctionnement de PDO.
Pour que le PHP soit capable d’interagir avec la base de données, nous devons rajouter la ligne de code suivante :
Lors de la création d’un objet PDO, le constructeur de la classe PDO doit recevoir les informations suivantes :
- dbname & hosname :
- dbname : qui correspond au nom de la base de données (dans notre cas le nom est « catalogue »)
- hostname : qui correspond au nom de l’hôte, en local ce sera « localhost »
- le nom du user : ici nous n’avons pas défini de user particulier, c’est donc de base « root »
- le password du user : le mot de passe est de base « » (sur Xampp et avec Windows)
Pour améliorer cette connexion vous pouvez encadrer cette ligne d’un try/catch pour capturer les risques d’erreurs et d’exceptions.
Maintenant que la connexion est faite et que nous avons stocké celle-ci dans la variable « $pdo », nous pouvons réaliser notre première requête, permettant de récupérer la liste des « types » de cours :
Nous utilisons la fonction « prepare() » proposée par PDO pour préparer notre requête à son exécution. Cette fonction renvoie un Objet, que nous plaçons dans la variable « $stmt ».
Dans un second temps, nous exécutons la requête avec la fonction « execute() » de PDO, et nous récupérons les données dans la variable « $types » sous forme d’un tableau associatif.
Pour bien comprendre ce que contient « $types », nous pouvons afficher cette variable avec un « print_r() » (un « echo » ne fonctionnant pas sur les tableaux).
On ajoute la balise « pre » au préalable pour avoir un affichage facilement lisible :
Voici le résultat obtenu :
Nous pouvons ainsi utiliser les informations de la variable $types, et nous pouvons par exemple afficher les libellés des cours en les listant un à un :
Nous aurons ainsi à l’écran, le rendu suivant :
Bien entendu cela n’est pas optimisé car nous devons faire la liste « à la main » pour chaque ligne.
Amélioration
Pour améliorer le code, nous pouvons remplacer les chiffres écrits en « dur » par un compteur qui sera utilisé par une boucle « for ». L’utilisation de la boucle « foreach » est également possible pour faire l’affichage souhaité.
Vous pouvez ainsi faire l’une ou l’autre des boucles, même si notre préférence va pour le « foreach » :
Nous rajoutons un peu de design en utilisant un tableau de Bootstrap et nous arrivons à :
Pour cela il suffit d’écrire le code suivant :
Une ligne se génère pour chacun des « types » présents dans la base de données.
Partie 3 : la modification et la suppression en PHP et PDO
Pour gérer la modification et la suppression, nous allons rajouter 2 boutons dans notre tableau à chacun des « types » listés. :
Nous avons simplement généré deux liens et utilisé des classes Bootstrap pour qu’ils aient une apparence de bouton.
Ils enverront leur information au serveur directement dans l’URL (méthode GET).
Celui-ci l’utilisera pour effectuer un traitement spécifique dédié.
La suppression :
Lors du clic sur le bouton « supprimer » d’une des lignes, le serveur vérifie quelle information lui a été transmise dans l’URL avec la méthode GET :
Le serveur peut ainsi capter la demande « supprimer » et l’identifiant du type à supprimer « 2 » :
Il pourra ainsi lancer la requête de suppression en base de données.
Pour préparer la requête et associer l’identifiant du « type » à supprimer, le serveur utilisera la fonction « bindValue() » proposée par PDO.
Cette fonction permet d’associer à la variable « :monType » la valeur reçue dans l’URL : « $_GET[‘supprimer’] ».
La fonction « bindValue() » combinée à celle du « prepare() » permet également de sécuriser notre requête au niveau des injections SQL
Cependant, il est nécessaire que le « type » concerné par la suppression ne soit pas présent dans une autre table (via une clef étrangère).
Par exemple, si nous souhaitons supprimer le type « Jeux Web » alors qu’il est utilisé par un « cours », cela ne fonctionnera pas ! La base de données refusera la suppression pour conserver sa cohérence.
Nous avons deux possibilités :
- Changer la valeur de « idType » de la table « cours » pour les lignes ayant la valeur « jeux web » (dans la clef étrangère)
- Modifier la base de données pour appliquer la suppression en cascade sur la clef étrangère. Ce qui permettra lors de la suppression d’un « type », d’avoir la répercussion directe sur la table « cours », supprimant également au passage les « cours » qui y étaient associés
C’est cette deuxième possibilité que nous choisissons, et nous apportons ainsi la modification au niveau de notre table « cours » dans PHPMYADMIN :
Pour la modification :
Nous allons utiliser le même principe que pour la suppression en récupérant depuis l’URL (et avec la méthode GET), le « type » cliqué.
Dans la boucle permettant d’afficher les types, nous allons comparer l’identifiant du « type » qui est en cours d’itération, avec le « type » cliqué (la valeur présente dans l’URL) :
Nous pouvons ainsi réaliser le test suivant :
Ce test dit littéralement : « si aucun bouton n’a été cliqué, ou que l’élément cliqué ne correspond pas à l’identifiant du type itéré, alors on affiche la ligne du type ».
Lors du « premier » chargement de la page, tous les éléments sont affichés comme précédemment. Mais dès qu’un clic sur un des boutons « modifier » est effectué, la ligne correspondante devient invisible.
Bouton modifier
Exemple avec le clic sur le bouton « modifier » de la ligne 2 :
En réalité, ce que nous souhaitons faire, c’est afficher un formulaire permettant de modifier le libellé du « type » concerné par la modification (au lieu de la cacher).
Nous devons ainsi rajouter un « else » et proposer un formulaire de saisie :
Ce formulaire va transmettre les informations avec la méthode « POST » et rappellera la même page « types.php ».
Le serveur peut ainsi récupérer les informations :
- « type » : champ caché afin d’envoyer l’id du type concerné par la modification.
- « libelle » : champ de type texte, correspondant au nouveau libellé pour le « type » concerné
Bouton « annuler »
Le bouton « annuler » quant à lui, permet de relancer la page « types.php », afin d’annuler le process de modification initié.
Enfin, le serveur peut réaliser les actions de modification en base de données, en suivant le même principe que la suppression :
C’est ici une requête SQL de modification basique. Elle permet de modifier le libellé pour un idType donné. La fonction « bindValue() » s’occupe de faire l’association des éléments récupérés par le serveur avec les variables SQL.
Voici un exemple avec la modification de la deuxième ligne :
Partie 4 : l’ajout en PHP et avec PDO
Pour réaliser l’ajout d’un nouveau « type », nous allons créer un nouveau fichier dédié, que nous appellons « typeAjout.php »
Nous rajoutons un lien pour y accéder sur la page « types.php » grâce à la balise « a »
Ce qui permet d’obtenir le bouton « ajouter » suivant :
Dans ce nouveau fichier, nous réalisons le formulaire permettant de créer un nouveau « type ». Seul le libellé est nécessaire, car l’identifiant d’un « type » est un chiffre en auto-incrément dans la base de données.
Voici le code associé au formulaire permettant d’obtenir l’impression d’écran ci-dessus :
Exemple avec l’ajout du type « python » :
Nous pouvons ajouter un nouveau « type » dans la base de données
Pour cela, lors de la soumission du formulaire, le serveur récupère les informations et réalise la requête SQL d’insertion :
La ligne est ensuite ajoutée dans la table « type », et lorsque l’on revient sur la liste de tous les « types », ce dernier est bien présent :
L’interconnexion PHP / MySQL avec PDO en résumé
Cet article a permis de montrer les étapes nécessaires pour la réalisation des fonctionnalités d’ajout, de modification et de suppression sur une table à partir d’un code en PHP, utilisant PDO.
Le code proposé s’est limité à montrer les lignes de code basiques sans considération de structure ou d’organisation.
Dans le cadre d’un projet réel, il est nécessaire de mieux organiser le code, de sécuriser les accès à la base de données, de gérer les exceptions, etc…
Pour continuer votre apprentissage du développement web
- Le cours PHP : Maîtrisez PHP et devenez autonome en programmation web
- La formation vidéo du CRUD (nécessite la licence membre) Le cas pratique complet en vidéo
Les commentaires sont fermés