vignette PDO

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 :

base de données

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

catalogue produits

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.

template code 1

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 :

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 » :

liste des types

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 :

PDO

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 :

requete select

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 :

balise pre

Voici le résultat obtenu :

resultat balise pre

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 :

affichage a la main

Nous aurons ainsi à l’écran, le rendu suivant :

resultat liste type name

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 » :

boucles foreach et for

Nous rajoutons un peu de design en utilisant un tableau de Bootstrap et nous arrivons à :

resultat navigateur 2

Pour cela il suffit d’écrire le code suivant :

code table

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. :

ajout boutons modifier et supprimer

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é.

Code table

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 :

url navigateur

Le serveur peut ainsi capter la demande « supprimer » et l’identifiant du type à supprimer « 2 » :

code requete delete

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 :

bd foreign key

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

url navigateur 2

Nous pouvons ainsi réaliser le test suivant :

test if

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 :

affichage navigateur 3

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 :

formulaire code name

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é
modification bouton valider

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 :

code requete update

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 :

resultat update

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 »

balise a pour ajout

Ce qui permet d’obtenir le bouton « ajouter » suivant :

resultat bouton ajout

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.

formulaire affichage navigateur

Voici le code associé au formulaire permettant d’obtenir l’impression d’écran ci-dessus :

formulaire method post

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 :

requete ajout bd

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 :

resultat navigateur ajout
CRUD terminé avec PHP et PDO

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…

Accéder à tous les articles

Pour continuer votre apprentissage du développement web

Categories:

Tags:

Les commentaires sont fermés