Apprendre PHP (19/19) - Connexion à une base de données MySQL avec MySQLi

Cette leçon vidéo explique comment, en PHP procédural, se connecter à une base de données MySQL à l'aide de l'extension mysqli et réaliser les opérations CRUD (Create, Read, Update, Delete). Le présentateur décrit d'abord le rôle des bases de données dans les sites dynamiques et compare brièvement mysqli à PDO, en justifiant le choix de mysqli pour cet exemple. Il montre la création d'une connexion avec mysqliconnect, la gestion d'erreurs (or die, @), la sélection de la base avec mysqliselectdb ou en passant le nom de la base directement à mysqliconnect. Ensuite, il détaille l'exécution de requêtes SQL via mysqliquery : insertion d’enregistrements, mise à jour ciblée avec WHERE, suppression sécurisée, et sélection de toutes les lignes. Pour la lecture, il présente les fonctions de récupération de résultats (mysqlinumrows, mysqlifetchrow, mysqlifetchassoc, mysqlifetch_array) et montre comment parcourir le jeu de résultats avec une boucle while, afficher les données sous forme de tableau associatif ou concaténée. Le cours se conclut par un rappel que, bien que mysqli reste fonctionnel, PDO est recommandé pour la programmation orientée objet, et que la maîtrise du SQL reste indispensable.
Chapters
Bonjour à tous et bienvenue dans cette nouvelle leçon de PHP où nous allons voir comment communiquer avec une base de données à l'aide de l'extension mysqli. Comme vous le savez déjà, les sites web dynamiques et les applications intranet et extranet reposent généralement sur des bases de données. Pour un site par exemple, une partie des données qui sont affichées sur la page peut provenir d'une base de données et n'est pas forcément intégrée manuellement à l'aide du langage HTML. Il n'y a pas que les bases de données comme support de stockage, mais on peut aussi se servir de fichiers texte, fichiers XML ou JSON, etc. Cependant, les bases de données restent le support le plus populaire vu la manière avec laquelle les informations y sont rangées, ce qui permet de mieux les manipuler, en l'occurrence à l'aide du langage de requête SQL qui est célèbre pour sa richesse fonctionnelle. En PHP, pour communiquer avec une base de données, 2 extensions sont les plus utilisées: MySQLi et l'objet PDO. Il existe aussi une extension MySQL originale, mais elle est rendue obsolète depuis bien longtemps. L'extension mysqli qui est l'objet de cette leçon permet de communiquer exclusivement avec les bases de données MySQL. Par contre, l'objet PDO que l'on verra dans la série consacrée à la programmation orientée objet en PHP est bien plus performant du fait qu'il prend en charge d'autres SGBD et pas seulement MySQL. Mais ce n'est pas tout, car le mode même de fonctionnement de l'objet PDO le rend nettement mieux que mysqli. Puisque l'objet PDO est bien meilleur que mysqli, alors je vais pas trop détailler cette leçon et je vous montrerai juste comment communiquer avec une base de données en exécutant les opérations CRUD, à savoir l'insertion, la sélection, la modification et la suppression, en mode procédural et non pas objet. Sachez que l'extension mysqli est supportée par défaut par les versions courantes de PHP. Donc aucune configuration spéciale n'est requise. Alors la première chose à faire c'est de créer déjà une base de données. J'ai déjà fait cette opération. En fait le serveur qui contient la base est bien le serveur local, localhost, et la base de données s'appelle tuto-php qui contient une seule table qui s'appelle langage. La table contient 3 colonnes avec les attributs ID, langage et exécution. L'attribut ID est de type SMALLINT et il s'agit de la clé primaire de la table qui s'incrémente automatiquement. Les attributs langage et exécution sont de type VARCHAR et ils permettent respectivement de contenir le nom du langage et le mode d'exécution, c'est-à-dire est-ce que c'est le client ou bien le serveur. Maintenant dans le code PHP, la première chose à faire c'est la création d'une connexion. On va donc faire appel à la fonction mysqli_connect. Cette fonction contient 3 ou 4 arguments, ça dépend de comment vous voulez appréhender ceci. Premier argument, c'est le nom du serveur. En tant que chaîne de caractères, je mettrai localhost. C'est-à-dire le serveur de la base de données. Deuxième argument, c'est le nom de l'utilisateur. Dans ce cas, c'est root. Et le dernier argument, c'est le mot de passe de cet utilisateur sur ce serveur de base de données. Dans mon cas, c'est toujours root. La fonction mysqli_connect retourne un identifiant de connexion en cas de succès et false en cas d'échec. On mettra donc ici par exemple id. Bon, déjà avec ça, on va exécuter pour voir s'il y a une erreur. Ça va se manifester automatiquement. Donc jusqu'ici il n'y a aucune erreur. Mais imaginez par exemple que je me suis trompé du mot de passe, j'ai mis un s. Donc quand j'exécute, j'ai bien une erreur qui s'affiche de cette manière. Le problème c'est que c'est une erreur de type warning, donc il va pas mettre fin à l'exécution du script, mais tout ce qui va suivre va forcément générer des erreurs successives parce que pratiquement les instructions qui vont suivre dépendent de la connexion. Donc ce que nous allons faire, c'est un truc du genre, or die, et je mettrai ici par exemple erreur de connexion. C'est-à-dire que soit la connexion réussit, dans ce cas je vais récupérer mon ID, ou bien j'exécute un arrêt prématuré du script en affichant le message erreur de connexion. Donc quand j'exécute, donc ça m'affiche dans ce cas donc erreur de connexion. Et bien sûr, si vous voulez masquer cette erreur, il suffit de mettre un@ comme on fait toujours. Comme ceci. Donc l'erreur est masquée, il y a juste le message personnalisé qui s'affiche. La deuxième opération maintenant, c'est la sélection de la base de données. Parce que le serveur peut contenir plusieurs bases, il faut bien en distinguer une sur laquelle on va travailler. On mettra donc mysqli_select_db. Et on mettra le nom de la base de données qui est dans ce cas tuto-php. Il ne faut pas oublier de mettre l'identifiant de la connexion ID en tant que premier argument. Exécutons encore. J'ai toujours l'erreur, c'est normal parce que je n'ai pas rectifié le mot de passe. Il n'y a aucune erreur. Là encore on peut mettre All die error de base de données par exemple, etc. Sinon on peut faire mieux, c'est-à-dire au lieu de mettre des instructions qui permettent la connexion au serveur et la sélection de la base de données. On va ranger tous ces arguments dans la même fonction qui est mysqli_connect. Alors j'enlève ceci et j'ajoute le dernier argument qui est dans ce cas le nom de la base de données tuto-php. Voilà, j'exécute et ça marche toujours de la même manière. Donc là c'est une méthode qui est plus abrégée et qui permet de se connecter au serveur et de sélectionner la base de données souhaitée. La deuxième opération maintenant c'est de exécution de la requête. Bon, on va commencer par la requête d'insertion, c'est-à-dire imaginez que je veux insérer quelque chose dans ma table parce que la table que j'ai créée est dans un premier temps vide, ça contient rien. Bon, si je veux intégrer quelque chose dedans, alors j'exécuterai une requête SQL que je vais passer à travers la fonction mysqli_query comme ceci. La fonction mysqli_query permet d'exécuter une requête SQL sur la base de données. Il contient 2 arguments. Le premier, c'est l'identifiant de la connexion ID, et le deuxième, ce n'est rien d'autre que la requête que je souhaite exécuter. C'est une chaîne de caractères qui contient de la syntaxe SQL. Alors j'imagine que vous êtes à l'aise avec les bases de la syntaxe SQL. Alors je mettrai ici INSERT INTO, bon, la table s'appelle langages avec un S, et je vais spécifier les attributs souhaités, par exemple langage et exécution. Bon, pas la peine de mentionner ID parce qu'il s'incrémente automatiquement. Je mettrai ici VALUES. Par exemple, la première valeur c'est, on mettra HTML. Et niveau d'exécution c'est CLIENT, ça veut dire c'est un langage côté client. On va exécuter maintenant ceci pour voir ce qui va se passer. Bon, maintenant c'est exécuté. Je vais maintenant consulter le contenu de la table. Et voilà, j'ai bien l'enregistrement qui vient de s'ajouter. Donc c'est HTML avec le niveau d'exécution côté client et le ID vaut automatiquement la valeur 1 parce que j'ai spécifié qu'il est non nul et non signé. Du coup, je n'aurai que des valeurs positives qui commencent de la valeur 1. Bon, on va insérer une autre valeur, par exemple CSS, et c'est toujours côté client. Exécutons. Maintenant dans la table, il y a la ligne du CSS qui vient de s'ajouter. JavaScript, même chose. Ensuite on mettra PHP, dans ce cas c'est server. Voilà, maintenant je vais consulter la table. Il contient bien tous les enregistrements que j'ai prévus. Alors c'est comme ça qu'on fait l'insertion. Maintenant pour la modification, il suffit de changer la requête. Bon, ce n'est plus INSERT INTO, bon j'enlève ça. Je mettrai UPDATE, la table langage, SET, et je vais spécifier les valeurs que je veux changer. Par exemple, imaginez que JavaScript, je vais le mettre en majuscule entièrement. Donc je mettrai l'attribut langage parce que dans ce cas l'attribut que je veux changer c'est langage égal et la nouvelle valeur c'est JavaScript en majuscule. Si je ne fais que ça, alors toutes les lignes seront affectées et j'aurai JavaScript partout. Alors il faut bien spécifier quelle est la ligne souhaitée. Dans ce cas je pourrais par exemple me référer à la clé primaire du tableau et je mettrai la clause WHERE id= 3. Alors dans ce cas, je suis sûr que seule la ligne identifiée par id= 3 sera affectée par cette modification. Bon, j'exécute maintenant pour voir le résultat. Je vais actualiser cette page et ça m'affiche bien JavaScript en majuscules. Et pour la suppression, c'est la même chose. Bon, imaginez que je veux supprimer toujours la ligne 3, c'est du JavaScript. Alors je mettrai la requête suivante: DELETE FROM la table langage, toujours donc WHERE id= 3 dans ce cas. Parce que si vous ne mettez pas la clause WHERE, dans ce cas tous les enregistrements seront supprimés. J'exécute. Et maintenant la ligne 3 a disparu. Alors ça, c'est ce qui concerne l'insertion, la modification et la suppression. Maintenant nous allons voir la sélection. Ça veut dire si je veux afficher des informations qui sont dans ma table. Alors la requête, c'est la requête de sélection comme ceci. Je mettrai par exemple SELECT* FROM langage. Dans ce cas, il va tout sélectionner, c'est-à-dire tous les champs dans l'ordre automatique. Alors j'ai pas mis de restrictions et j'ai pas mis de conditions particulières, alors ça va sélectionner tout d'une manière brute. Sauf que dans ce cas, la fonction MySQL query, ça va me renvoyer un identifiant parce que j'en ai besoin. Fonction mysqli_query renvoie toujours un identifiant, mais jusqu'ici je n'en ai pas eu besoin. Mais quand j'aurai affaire à la sélection, j'aurai bien besoin de cet identifiant. Bon, je l'appellerai par exemple $res pour dire résultat. Première chose à faire déjà, c'est afficher combien de lignes j'ai dans ma table, ça veut dire combien de lignes cette requête m'a envoyées. Et c'est à l'aide de la fonction mysqli_num_rows. Et comme argument, il va accepter identifiant reste. Bon, je mettrai juste echo pour qu'elle m'affiche ce nombre. Et elle m'affiche 3, ça veut dire que j'ai bien 3 enregistrements dans ma table. Par exemple, je mettrai ici concaténer avec enregistrement dans la table. Bon, ça va m'afficher 3 enregistrements dans la table. Bon, après je vais mettre une ligne de séparation, donc juste écho la balise HTML HR qui va insérer une ligne comme ça. Après, je vais afficher tous les enregistrements de ma table. Il faut savoir que la table est structurée de cette manière, elle contient des lignes et des colonnes. Alors je vais parcourir la table ligne par ligne et chaque ligne sera versée dans une variable de type tableau PHP. Comme ceci. Par exemple, tab, la variable tableau que je vais créer, qui contiendra la valeur de la ligne courante. Et pour y verser la valeur de la ligne, je mettrai juste la fonction mysqli_fetch_row. Comme ça. Et comme argument, il contiendra l'identifiant de la requête, res. Donc ce que je viens de faire, c'est récupérer la ligne courante du tableau et la mettre dans tab. Maintenant je vais afficher la valeur du tableau. Je mettrai par exemple println comme ceci. Exécutons pour voir le résultat. Alors ça m'affiche ceci. Donc là c'est l'index, donc l'index 0 qui contient la valeur 1, l'index 1 contient la valeur HTML, l'index 2 contient la valeur client. C'est-à-dire il m'affiche bien la première ligne. Et le plus important c'est que vous avez remarqué que c'est un tableau indexé qui m'a été renvoyé. C'est indexé avec les valeurs 0, 1 et 2. Mais si je veux avoir un tableau associatif qui contiendra comme clé les noms des attributs qui sont respectivement ID, langage et exécution, alors je vais remplacer row par assoc. Ça veut dire c'est un tableau associatif. Exécutons maintenant. Alors ça m'affiche bien des clés à la place des index. Dans ce cas, ce sont les clés respectives de ma table, à savoir ID, langage et exécution. Ici, je vais récupérer les deux, ça veut dire les index et les clés en même temps, alors je mettrai mysqli_fetch_array. Dans ce cas, ça va me renvoyer un tableau qui contient des clés et des index, c'est-à-dire je vais avoir le double du nombre de colonnes. Et voilà donc ce que ça m'affiche. Donc l'index 0, la valeur 1, la clé ID, la valeur 1, l'index 1, HTML, la clé langage, HTML, etc. Ça veut dire c'est doublé, vous avez l'index et la clé en même temps. Mais pratiquement, on préfère les tableaux associatifs, donc on mettra ici fetch_assos comme ceci. Du coup, on récupérera juste un tableau associatif qui a plus de signification. Et comme vous l'avez remarqué, j'ai récupéré juste la première ligne alors que l'objectif c'est de parcourir le tableau entier. Je veux bien qu'il me retourne tout. D'ailleurs, c'est le résultat de la requête SQL que j'ai passée. La solution, c'est de programmer une boucle. Je mettrai juste quelque chose du genre while Ça veut dire tant que je n'ai pas atteint la fin, ça veut dire tant qu'il y a des lignes, parce que mysqli_fetch_assoc dans ce cas va me renvoyer soit une variable de type tableau ou bien false s'il n'y a plus aucun enregistrement à retourner. Et maintenant je peux afficher les informations qui sont stockées dans mon tableau $tab. Par exemple, echo tab . Ça veut dire je vais récupérer juste la valeur qui correspond à la clé langage. Il m'affiche bien les 3 valeurs sur la même ligne. Donc je mettrai ici un retour à la ligne, echo $br comme ceci. Maintenant il m'affiche HTML, CSS, PHP. Sinon je peux mettre facilement la fonction implode. Je mettrai par exemple le séparateur 3 tirets. Ici tab. Dans ce cas je vais convertir mon tableau en une chaîne de caractères. En espaçant les différentes entrées avec 3 tirets. Donc quand j'exécute, bon, ça m'affiche bien les informations suivantes qui ne représentent rien d'autre que les données qui sont stockées dans ma table langage. Alors vous avez vu que c'est tellement simple comme opération, ça veut dire on peut maintenant programmer n'importe quel type d'application qui sollicite les services d'une base de données. Comme j'ai dit, la seule condition c'est qu'il faut que vous soyez à l'aise avec la syntaxe SQL. Comme ça donc vous aurez une panoplie de fonctions et de possibilités devant vous. Mais comme je l'ai dit au début de la séance, même si l'extension mysqli est d'actualité, c'est-à-dire elle est toujours valable et ça fonctionne toujours bien, mais il est préférable d'utiliser l'objet PDO que l'on verra dans une séance prochaine dans la série consacrée à la programmation orientée objet en PHP. Alors ça sera tout pour cette séance, 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









