POO en PHP (10) - Opérations CRUD à l'aide de l'objet PDO

Dans cette leçon de programmation orientée objet en PHP, l'instructeur montre comment utiliser l'objet PDO pour interagir avec une base de données MySQL. Il commence par créer une connexion PDO en construisant le DSN (sgbdmysql, host, dbname) et en passant les identifiants root/root, en expliquant la possibilité de spécifier le port. Il introduit la gestion des erreurs via un bloc try‑catch et la classe PDOException, affichant les messages d’erreur avec getMessage(). Ensuite, il détaille les requêtes préparées : utilisation de marqueurs positionnels (?), exécution avec execute() en passant un tableau indexé, puis utilisation de marqueurs nommés (:fc, :rl) avec un tableau associatif. Il illustre chaque type d’opération CRUD – INSERT, UPDATE, DELETE, SELECT – en préparant la requête, en l’exécutant avec les paramètres appropriés, et en montrant les résultats dans la table « fonctions ». Pour la sélection, il configure le mode de récupération FETCHASSOC, utilise fetchAll() pour obtenir un tableau associatif à deux dimensions, puis parcourt les résultats avec une boucle for pour les afficher. L’instructeur souligne que la séparation des données et du traitement via les requêtes préparées protège contre les injections SQL. La vidéo se conclut en annonçant un futur exercice complet.
Chapters
Bonjour à tous et bienvenue dans cette nouvelle leçon de programmation orientée objet en PHP. Aujourd'hui, nous allons voir comment manipuler l'objet PDO afin d'interroger des bases de données. Lors de la dernière vidéo, nous avons pu voir quelques avantages de l'objet PDO et nous avons également vu comment l'activer sur le serveur afin que ses différentes méthodes soient implémentées correctement par le compilateur PHP. Pour cela, je dispose d'une base de données qui s'appelle tuto-php dans laquelle j'ai créé une table qui s'appelle fonctions. Cette table contiendra 3 champs, à savoir ID qui est l'identifiant de l'enregistrement et qui représente aussi la clé primaire de ma table, l'attribut fonction dans laquelle je vais lister quelques fonctions PHP en spécifiant leur rôle dans le troisième champ. Dans ma page qui s'appelle index.php, je vais commencer par créer une instance de la classe PDO de la manière suivante: Donc l'instance s'appellera elle aussi PDO. Puis je vais passer en constructeur les arguments suivants. Le premier argument est une chaîne de caractères qui a la forme suivante. Donc je commence par déclarer ce que l'on appelle le DSN qui commence par le préfixe qui n'est rien d'autre que la base de données sur laquelle je vais agir. Dans ce cas, il s'agit de sgbd_mysql. DSN signifie Data Source Name. Ensuite, je vais mettre le mot-clé HOST suivi du nom du serveur de base de données qui est dans ce cas localhost. Point-virgule, le mot-clé DB_NAME suivi du nom de la base de données qui est dans mon cas tuto-php. Alors ça, c'est ce qui concerne le premier argument. Le deuxième argument, c'est le login ou bien le nom de l'utilisateur qui va agir sur la base de données. Dans ce cas, je mettrai root. Et le troisième argument, c'est le mot de passe qui est aussi root. On appelle cette expression la chaîne de connexion. Elle renferme tous les paramètres nécessaires afin d'établir une connexion à la base de données. Notez que dans le premier argument, notedsn, on peut aussi spécifier le numéro de port s'il s'agit d'un port spécial différent du port par défaut de connexion à la base de données. Mais dans ce cas je vais tout conserver par défaut. Exécutons d'abord cette ligne pour voir ce que ça donne sur le navigateur. Je n'ai rien, ça veut dire que mon code est correct, alors je n'ai aucune erreur. Maintenant je vais essayer d'implanter une erreur. Par exemple je vais me tromper du nom de la base de données. Maintenant quand j'exécute, ça m'affiche une belle erreur qui contient un grand message et ça me mentionne aussi que je n'ai pas rattrapé l'exception qui s'appelle PDOException. Ce que je vais faire maintenant, c'est gérer les erreurs éventuelles avec les exceptions. Alors je vais mettre ici le mot-clé try et ensuite je mettrai catch afin de rattraper mon exception qui est de type PDOException. Il s'agit en fait d'une classe qui accompagne la classe PDO et qui permet de gérer les différentes erreurs que l'on peut commettre en manipulant cette classe-là. Je vais déclarer la variable e qui n'est rien d'autre que l'instance de la classe PDOException. Et dedans je vais afficher l'erreur. Je mettrai par exemple echo l'objet e et j'appelle la méthode getMessage qui va afficher le message d'erreur. Exécutons maintenant pour voir ce que ça donne. Donc maintenant l'erreur c'est beaucoup plus explicite. Alors ça me donne directement que la base de données tuto_ph n'est pas reconnue. Donc maintenant je vais rectifier, je réexécute, l'erreur a disparu. Alors il faut avoir l'habitude de mettre les instructions qui ont un rapport avec l'objet PDO dans le bloc de gestion des exceptions try-catch. Notez que dans le cas de PDO exception, les exceptions ne sont pas lancées manuellement dans le code mais c'est le compilateur PHP qui va se charger de la lancer automatiquement en cas d'erreur. Maintenant que notre chaîne de connexion est initialisée, ce que je vais faire c'est passer mes requêtes et on va commencer par la requête basique d'insertion. Bon, rappelons un peu le schéma de notre table. Alors il contient le ID qui va s'incrémenter automatiquement donc on va pas l'insérer. Je vais juste insérer les 2 champs fonction et rôle. Alors on exécutera la requête INSERT. Mais pour faire ceci, on va exploiter l'une des puissantes méthodes de DropGpdo qui est la requête préparée. Donc voilà ce que je vais faire. Je vais créer la méthode prepare comme ça, donc PDO, et dedans je vais mettre ma requête SQL qui est dans ce cas INSERT INTO fonction, par exemple les attributs fonction et rôle, VALUES, et je mettrai les valeurs que je souhaite. Par exemple, bon, juste en guise d'exemple, je mettrai A et B. Notez qu'au moment de l'exécution, cette instruction ça va me retourner un autre objet qui est de type PDO Statement. Alors je vais le nommer par exemple req pour dire requête. Alors avec cette ligne, ce que je viens de faire c'est préparer la requête. Alors celle-ci ne va pas s'exécuter. Mais la manière avec laquelle j'ai appréhendé cette instruction n'est pas tout à fait correcte parce que l'idée de la préparation des requêtes c'est séparer le traitement des données. Et comme vous l'avez constaté, les données sont insérées dans la requête elle-même et ça c'est déconseillé. Donc ce que je vais faire c'est quoi? C'est remplacer mes arguments avec des points d'interrogation que l'on appelle des marqueurs interrogatifs. C'est-à-dire que ça, c'est le traitement que je souhaite exécuter, mais les données ça viendra après. Et c'est justement le rôle de la méthode suivante qui est execute. Donc je prendrai toujours mon objet req avec la méthode execute et dans ce cas je vais passer des arguments à la méthode execute. Dans ce cas j'en ai 2, mais c'est possible d'avoir un nombre différent, par exemple 3 voire 5, etc. Donc la meilleure manière qui permet de spécifier ces arguments c'est de les mettre dans un tableau. Alors je mettrai array, ensuite je liste les arguments ici. Par exemple le premier argument c'est une chaîne de caractères où je mettrai echo pour dire la fonction echo. Deuxième argument je vais mettre le rôle de cette fonction, par exemple affichage d'un message ou bien afficher une chaîne de caractères. Donc ce qui va se passer maintenant, c'est qu'au moment de l'exécution, le premier marqueur interrogatif sera remplacé par la première entrée de mon tableau, le deuxième marqueur interrogatif sera remplacé par le deuxième élément du tableau, dans l'ordre. Alors exécutons pour voir ce que ça donne. Je n'ai aucun message. Maintenant je vais consulter ma table pour voir si les enregistrements ont bien été intégrés. Et voilà, donc ça affiche bien donc la fonction echo avec le rôle qui lui est attribué. Donc maintenant je vais déclarer une autre fonction, par exemple preg_match. Et là je vais mettre spécifier une expression régulière, une regex comme ça. Je réexécute. Donc c'est intégré. Ensuite, check date. Je mettrai par exemple vérifier la validité d'une date. Je réexécute. Et voilà, ça marche toujours. Il faut noter qu'il n'y a pas que des marqueurs interrogatifs, mais je peux aussi spécifier ce qu'on appelle des marqueurs nommés. Par exemple ici pour le premier argument je mettrai fonction, on va mettre par exemple fc, préfixé par deux points. Ensuite je mettrai rl pour dire le rôle, toujours préfixé par deux points. On appelle ceci des marqueurs nommés. Et maintenant au moment de l'exécution je vais plus spécifier un tableau indexé mais un tableau associatif. Qui a comme clé les noms des marqueurs nommés. Dans ce cas, je mettrai fc qui pointe sur la valeur, par exemple, strlen. Et la deuxième entrée, c'est rl qui pointe sur la valeur retourner la longueur d'une chaîne. Comme ça, exécutons maintenant. Et voilà, ça marche toujours de la même manière. Alors il y a plusieurs solutions qui permettent de spécifier vos paramètres, soit les marqueurs interrogatifs ou bien les marqueurs nommés. Mais ce n'est pas tout, il y a d'autres méthodes, mais personnellement ce sont les deux méthodes que je préfère. Mais le plus important, c'est qu'il faut toujours préparer la requête et ensuite l'exécuter en lui passant les arguments. Et c'est justement ceci ce qui donne à l'objet son immunité native contre les injections SQL, puisque les données sont séparées des traitements. Maintenant, nous allons voir la requête de modification. Par exemple, imaginez que je vais modifier la deuxième entrée parce que j'ai commis une erreur de saisie. Bon, j'ai mis un V au lieu d'un F, alors on va rectifier ça. On mettra donc la requête UPDATE fonction SET, le champ c'est role égal, et je mettrai un marqueur interrogatif. Dont la valeur sera communiquée plus tard au moment de l'exécution. Mais il faut mettre la clause WHERE ID égal, là encore un marqueur interrogatif, et comme valeur, puisque j'ai utilisé des marqueurs interrogatifs, donc je vais me servir d'un tableau indexé, comme ça, et l'ID qui va avec c'est la valeur 2. Bon, je peux la passer en tant qu'entier. Exécutons. Alors ça a bien changé. Maintenant on va voir la suppression. Par exemple, imaginez que je veux supprimer la dernière entrée. str_len, la requête c'est DELETE FROM fonction WHERE id, même chose je mettrai un marqueur interrogatif. Que je vais spécifier ici. Bon, je n'ai qu'un seul paramètre qui vaut dans ce cas la valeur 4. Alors remarquez qu'on met toujours un tableau, vous mettez autant de paramètres que vous souhaitez. Bien sûr, ça dépend du nombre de marqueurs que vous avez spécifiés. Alors exécutons. Et voilà, maintenant le 4e enregistrement a disparu. Il nous reste maintenant la requête de sélection. Alors de la même manière, je vais mettre SELECT par exemple* FROM fonction. Alors je ferai que ça. Donc vous avez remarqué qu'il n'y a pas vraiment de marqueur. Alors on imagine qu'au moment de l'exécution je n'ai aucun paramètre à passer. D'ailleurs je vais enlever cet élément. Mais le plus important c'est qu'entre la préparation de la requête et l'exécution de celle-ci, on va intercaler une nouvelle ligne où je mettrai l'instruction suivante. SetFetchMode, c'est une méthode qui permet de spécifier la manière avec laquelle on va récupérer les éléments du tableau. Alors je vais mentionner que je vais récupérer les éléments sous forme d'un tableau associatif. Alors je mettrai ici la classe PDO avec la constante de classe FETCH_ASSOC comme ça. Bon, il y a beaucoup de constantes de classe qui sont prédéfinies, mais moi je préfère utiliser celle-ci pour dire que je vais récupérer les résultats ou bien le jeu de données sous forme de tableau associatif. Ensuite on exécute et comme j'ai mentionné donc il n'y a aucun paramètre à passer puisque je n'ai aucun marqueur dans la requête. Et juste après je vais récupérer les éléments sous forme d'un tableau PHP. Par exemple, le tab égal, je prends toujours l'objet req avec la méthode fetchAll. La méthode fetchAll permet de retourner l'ensemble des résultats de la requête. Dans ce cas c'est la table entière. Alors si on regarde de plus près, je vais récupérer tout ça. Alors on imagine que la variable tab que j'ai déclarée sera un tableau à 2 dimensions qui contient des lignes et des colonnes. Bon, je vais d'abord afficher la longueur de ce tableau, je mettrai echo $countTab. On est censé avoir la valeur 3 parce que j'ai 3 lignes. Voilà. Maintenant imaginez que je veux récupérer cette valeur, par exemple echo. Alors n'oubliez pas que la variable $tab est un tableau à 2 dimensions qui contient des lignes et des colonnes, donc je vais spécifier les index. L'index de la ligne et l'index de la colonne. Alors je mettrai ici echo tab avec 2 crochets. Le premier crochet contient le numéro de la ligne, dans ce cas c'est 0 parce que c'est la première ligne. Voilà. Et le deuxième crochet, ça contiendra le numéro de la colonne. Mais n'oubliez pas que j'ai spécifié un tableau associatif, donc au lieu de mettre un index, je vais mettre le nom de l'attribut qui est dans ce cas fonction. Exécutons et ça m'affiche bien écho. Autrement dit, si je veux afficher que le résultat, alors je vais programmer une boucle, par exemple for i= 0, i< countTab, i++. Je mettrai écho. Ici il faut spécifier 2 dimensions, donc je mettrai $i pour le numéro de la ligne, ensuite ID concaténé par exemple avec un espace, concaténé avec tab $i ici par exemple fonction, et à la fin c'est role. Je mettrai un retour à la ligne avec la balise br. Donc maintenant je suis censé avoir tous les enregistrements un par ligne. Et voilà, donc ça m'affiche ceci. Donc vous avez remarqué, ce n'est pas trop compliqué de se servir de l'objet PDO. D'ailleurs, on a fait un exemple des opérations CRUD qui constituent les opérations les plus couramment utilisées dans des projets web. Et il ne s'agit là que d'une démonstration afin de voir comment se servir de cet objet. Mais dans la vidéo prochaine, nous allons faire un exercice intégral qui nous permettra de mettre en pratique l'interrogation des bases de données dans des vrais projets. Merci pour votre attention et à la vidéo prochaine.
More from Yamossoun

Algorithme de calcule de la racine carrée par dichotomie #dichotomy #squareroot #algorithm









