Maison > développement back-end > tutoriel php > Affichage des données de MySQL sur le Web: une introduction

Affichage des données de MySQL sur le Web: une introduction

Jennifer Aniston
Libérer: 2025-02-08 09:45:09
original
530 Les gens l'ont consulté

Affichage des données de MySQL sur le Web: une introduction

L'article suivant est un extrait de php & mysql: novice to ninja, 7th edition , un guide pratique pour apprendre tous les outils, principes et techniques nécessaires pour créer une application Web professionnelle. Dans ce final tutoriel de la série, vous apprendrez à prendre des informations stockées dans une base de données MySQL et à l'afficher sur une page Web pour que tous les voient.


  • Configuration de votre environnement de développement PHP avec Docker
  • Un guide du débutant sur PHP
  • Présentation de MySQL: Guide d'un débutant
  • Affichage des données de MySQL sur le Web: une introduction

c'est tout - ce que vous avez inscrit! Dans ce chapitre, vous apprendrez à prendre des informations stockées dans une base de données MySQL et à l'afficher sur une page Web pour que tous puissent voir.

Jusqu'à présent, vous avez écrit votre premier code PHP et appris les bases de MySQL, un moteur de base de données relationnel, et PHP, un langage de script côté serveur.

Maintenant, vous êtes prêt à apprendre à utiliser ces outils ensemble pour créer un site Web où les utilisateurs peuvent afficher les données de la base de données et même ajouter la leur.

Remarque: Comme dans le chapitre 3, j'utilise "MySQL" ici pour faire référence au protocole de base de données. Vos scripts PHP feront de même. Il existe de nombreuses références dans ce chapitre - et dans le code PHP que vous écrirez - à "MySQL", même si nous nous connectons réellement à une base de données MARIADB.

Affichage des données de MySQL sur le Web: une introduction

la vue d'ensemble

Avant de sauter en avant, cela vaut la peine de prendre un pas en arrière pour une image claire de notre objectif ultime. Nous avons deux outils puissants à notre disposition: le langage de script PHP et le moteur de base de données MySQL. Il est important de comprendre comment ceux-ci vont se réunir.

Le but d'utiliser MySQL pour notre site Web est de permettre au contenu d'être tiré dynamiquement de la base de données pour créer des pages Web à visualiser dans un navigateur ordinaire. Ainsi, à une extrémité du système, vous avez un visiteur sur votre site à l'aide d'un navigateur Web pour demander une page. Ce navigateur prévoit de recevoir un document HTML standard en retour. À l'autre extrémité, vous avez le contenu de votre site, qui se trouve dans une ou plusieurs tables dans une base de données MySQL qui ne comprend que comment répondre aux requêtes SQL (commandes).

Affichage des données de MySQL sur le Web: une introduction

Comme indiqué dans l'image ci-dessus, le langage de script PHP est le go-intermédiaire qui parle les deux langues. Il traite la demande de page et récupère les données de la base de données MySQL à l'aide de requêtes SQL comme celles que vous avez utilisées pour créer un tableau de blagues au chapitre 3. Il le crache ensuite dynamiquement comme la page HTML bien formatée que le navigateur attend.

juste pour que ce soit clair et frais dans votre esprit, c'est ce qui se passe lorsqu'il y a un visiteur sur une page sur votre site Web:

  1. Le navigateur Web du visiteur demande la page Web de votre serveur Web.
  2. Le logiciel du serveur Web (généralement Apache ou Nginx) reconnaît que le fichier demandé est un script PHP, donc le serveur déclenche l'interprète PHP pour exécuter le code contenu dans le fichier.
  3. Certaines commandes PHP (qui seront au centre de ce chapitre) se connectent à la base de données MySQL et demandent le contenu qui appartient à la page Web.
  4. La base de données MySQL répond en envoyant le contenu demandé au script PHP.
  5. Le script PHP stocke le contenu en une ou plusieurs variables PHP, puis utilise des instructions Echo pour publier le contenu dans le cadre de la page Web.
  6. L'interprète PHP se termine en remettant une copie du HTML qu'il a créé sur le serveur Web.
  7. Le serveur Web envoie le HTML au navigateur Web comme il serait un fichier HTML simple, sauf qu'au lieu de venir directement à partir d'un fichier HTML, la page est la sortie fournie par l'interpréteur PHP. Le navigateur n'a cependant aucun moyen de le savoir. En ce qui concerne le navigateur, il demande et reçoit une page Web comme les autres.

Création d'un compte utilisateur MySQL

Pour que PHP se connecte à votre serveur de base de données MySQL, il devra utiliser un nom d'utilisateur et un mot de passe. Jusqu'à présent, tout ce que contient votre base de données de blagues est un certain nombre de pithy Bon Mots , mais avant longtemps, il peut contenir des informations sensibles comme les adresses e-mail et d'autres détails privés sur les utilisateurs de votre site Web. Pour cette raison, MySQL est conçu pour être très sécurisé, vous donnant un contrôle étroit sur les connexions qu'il acceptera et ce que ces connexions sont autorisées à faire.

L'environnement Docker contient déjà un utilisateur MySQL dans le chapitre 3, que vous avez déjà utilisé pour vous connecter au serveur MySQL.

vous pouvez se connecter à la base de données à partir de votre script PHP en utilisant le même nom d'utilisateur (V.Je) et Mot de passe (V.Je), mais il est utile de créer un nouveau compte - parce que si vous avez un Serveur Web, vous souhaiterez peut-être l'utiliser pour héberger plus d'un site Web. En donnant à chaque site Web son propre compte utilisateur, vous aurez plus de contrôle sur qui a accès aux données pour un site donné. Si vous travaillez avec d'autres développeurs, vous pouvez leur donner accès aux sites sur lesquels ils travaillent, mais pas plus.

Vous devez créer un nouveau compte utilisateur avec uniquement les privilèges spécifiques dont il a besoin pour travailler sur la base de données IJDB dont votre site Web dépend. Faisons cela maintenant.

Pour créer un utilisateur, ouvrez MySQL Workbench et connectez-vous à votre serveur. Ensuite, exécutez les requêtes suivantes:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

La première requête est assez explicite: elle crée un utilisateur appelé ijdbuser avec le mot de passe myPassword. Le% de signe après le nom d'utilisateur indique que la base de données peut être connectée à partir de n'importe quel emplacement. La deuxième requête donne à l'utilisateur des accès complets au schéma IJDB, en conséquence, cet utilisateur peut voir et modifier toutes les tables, colonnes et données dans le schéma IJDB mais n'a pas accès à quoi que ce soit en dehors.

Maintenant que l'utilisateur IJDBUser a été créé, nous pouvons l'utiliser pour se connecter à la base de données. Il est possible de configurer une connexion dans MySQL Workbench avec cet utilisateur, mais comme les autorisations sont limitées, il est préférable de conserver MySQL Workbench en utilisant le compte V.JE. Au lieu de cela, nous allons utiliser le nouvel utilisateur lors de la connexion à partir d'un script PHP.

Connexion à MySQL avec PHP

Avant de pouvoir récupérer le contenu de votre base de données MySQL pour l'inclusion dans une page Web, vous devez savoir comment établir une connexion à MySQL à l'intérieur d'un script PHP. Jusqu'à présent, vous avez utilisé une application appelée MySQL Workbench pour vous connecter à votre base de données. Tout comme MySQL Workbench peut se connecter directement à un serveur MySQL en cours d'exécution, vos propres scripts PHP peuvent également.

Bien que ce chapitre parle entièrement de la connexion à MySQL de PHP, nous nous connectons en fait à la base de données MARIADB discutée dans le chapitre précédent. PHP ne peut voir aucune différence entre MySQL et MARIADB, car ils sont interchangeables. Je me référerai à la base de données comme MySQL partout, car toutes les commandes utilisées pourraient être utilisées pour se connecter à un serveur de base de données MySQL ou MARIADB.

La base de données MySQL d'origine a fourni une méthode standardisée pour les clients

tels que MySQL Workbench et PHP pour communiquer avec le serveur. MariaDB a copié cette norme, et toutes les commandes de PHP utilisent le nom mysql , donc pour garder les choses simples, j'utiliserai le terme mysql tout au long de ce chapitre pour faire référence à la base de données.

Il existe trois méthodes de connexion à un serveur MySQL de PHP:

    La bibliothèque MySQL
  • La bibliothèque MySQLI
  • La bibliothèque PDO
Ceux-ci font essentiellement le même travail - se connecter à la base de données et y envoyer des requêtes - mais elles utilisent un code différent pour y parvenir.

La bibliothèque MySQL est la méthode la plus ancienne de connexion à la base de données et a été introduite dans PHP 2.0. Les fonctionnalités qu'il contient sont minimes, et elle a été remplacée par MySQLI à partir de PHP 5.0 (publié en 2004).

Pour connecter et interroger la base de données à l'aide de l'ancienne bibliothèque MySQL, des fonctions telles que MySQL_Connect () et MySQL_Query () sont utilisées. Ces fonctions ont été obsolètes - ce qui signifie qu'elles doivent être évitées - depuis PHP 5.5, et ont été entièrement retirées de PHP depuis PHP 7.0.

Bien que la plupart des développeurs aient vu la raison du changement dès que PHP 5.0 a été publié, il existe encore des centaines d'articles et d'exemples de code sur le Web en utilisant ces fonctions MySQL_ * * non existantes - malgré le fait que MySQLI a effectivement été la bibliothèque préférée pendant quinze ans.

Si vous rencontrez un exemple de code qui contient la ligne mysql_connect (), vérifiez la date de l'article. C'est probablement à partir du début des années 2000, et dans la programmation, vous ne devriez jamais faire confiance à rien d'ancien. Les choses changent tout le temps - c'est pourquoi ce livre est sur sa septième édition!

Dans PHP 5.0, la bibliothèque MySQLI - debout pour «MySQL Improved» - a été publiée pour répondre à certaines des limites de la bibliothèque MySQL d'origine. Vous pouvez facilement identifier l'utilisation de mysqli, car le code utilisera des fonctions telles que mysqli_connect () et mysqli_query ().

Peu de temps après la sortie de la bibliothèque MySQLI dans PHP 5.0, PHP 5.1 a été publié, avec un nombre important de changements qui ont contribué à façonner la façon dont nous écrivons PHP aujourd'hui (principalement avec la programmation orientée objet, que vous verrez que vous verrez Beaucoup de plus tard dans ce livre). L'un des principaux changements dans PHP 5.1 a été qu'il a introduit une troisième bibliothèque, PDO (PHP Data Objectts), pour se connecter aux bases de données MySQL.

Il existe plusieurs différences entre l'APD et MySQLI, mais le principal est que vous pouvez utiliser la bibliothèque PDO pour vous connecter à presque tous les serveur de base de données - comme un serveur Oracle, ou Microsoft SQL Server. Pour les développeurs, le plus grand avantage de cette approche générique est que, une fois que vous avez appris à utiliser la bibliothèque pour interagir avec une base de données MySQL, il est très simple d'interagir avec un autre serveur de base de données.

sans doute, il est plus simple d'écrire du code pour l'OPD, et il y a des nuances qui peuvent rendre le code PDO plus lisible - des paramètres nommés dans les instructions préparées étant le principal avantage. (Ne vous inquiétez pas, je vais expliquer ce que cela signifie plus tard.)

Pour ces raisons, les projets PHP les plus récents utilisent la bibliothèque PDO, et c'est la bibliothèque que je vais vous montrer comment utiliser dans ce livre. Pour plus d'informations sur les différences, jetez un œil à l'article SitePoint «réintroduire l'OPD - la bonne façon d'accéder aux bases de données en php».

Après cette petite leçon d'histoire, vous êtes probablement impatient de recommencer à écrire du code. Voici comment vous utilisez PDO pour établir une connexion à un serveur MySQL:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Pour l'instant, pensez à la nouvelle APD comme une fonction intégrée, tout comme la fonction Rand que nous avons utilisée dans le chapitre 2. Si vous pensez "Hé, les fonctions ne peuvent pas avoir Espaces dans leur Noms! », Vous êtes plus intelligent que l'ours moyen, et je vais expliquer exactement ce qui se passe ici dans un instant. En tout cas, il faut trois arguments:

  • une chaîne spécifiant le type de base de données (mysql :), le nom d'hôte du serveur (host = hostname;), et le nom de la base de données (dbname = base de données)
  • le nom d'utilisateur mysql que vous souhaitez que PHP utilise
  • le mot de passe mysql pour ce nom d'utilisateur

Vous vous souvenez peut-être du chapitre 2 que les fonctions PHP renvoient généralement une valeur lorsqu'elles sont appelées. Cette nouvelle «fonction» PDO renvoie une valeur appelée un objet PDO qui identifie la connexion établie. Puisque nous avons l'intention d'utiliser la connexion, nous devons conserver cette valeur en la stockant dans une variable. Voici à quoi cela ressemble, avec les valeurs nécessaires pour vous connecter à votre base de données:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Vous pouvez probablement voir ce qui se passe avec les deux derniers arguments: ils sont le nom d'utilisateur et le mot de passe que vous avez créé plus tôt dans ce chapitre.

Le premier argument est un peu plus compliqué. La partie DBName = IJDB indique à PDO d'utiliser la base de données (également appelée un schéma ) appelé ijdb. Toute requête exécutée à partir de PHP sera par défaut aux tables de ce schéma. Sélectionner * From Joke sélectionnera les enregistrements dans la table de blague dans le schéma IJDB.

Même si vous connaissez déjà PHP, PDO et MySQL, la partie host = mysql semble déroutante. Normalement, ce serait host = localHost (se référant à l'ordinateur local, la même machine exécutant PHP) ou pointant vers un nom de domaine spécifique où la base de données est hébergée, telle que host = sitepoint.com.

Pourquoi est-ce hôte = mysql, et à quoi MySQL fait-il ici? Dans Docker, chaque service reçoit un nom. Si vous examinez le fichier docker-compose.yml qui configure le serveur, le service de base de données est appelé mysql, et dans Docker, un service peut se connecter à un autre en utilisant le nom de l'autre service.

Arguments Mis à part, ce qui est important à voir ici, c'est que la valeur renvoyée par le nouveau PDO est stockée dans une variable nommée $ PDO.

Le serveur MySQL est un logiciel complètement séparé du serveur Web. Par conséquent, nous devons considérer la possibilité que le serveur soit indisponible ou inaccessible en raison d'une panne de réseau, ou parce que la combinaison de nom d'utilisateur / mot de passe que vous avez fourni est rejetée par le serveur, ou parce que vous avez simplement oublié de démarrer votre serveur MySQL! Dans de tels cas, le nouveau PDO ne fonctionnera pas et lancera une exception PHP.

Remarque: Au moins par défaut, PHP peut être configuré afin qu'aucune exception ne soit lancée et qu'elle ne se connecte tout simplement pas. Ce n'est généralement pas un comportement souhaitable, car il est beaucoup plus difficile de déterminer ce qui n'a pas fonctionné.

Si vous vous demandez ce que cela signifie de «lancer une exception PHP», accumulez-vous! Vous êtes sur le point de découvrir d'autres fonctionnalités du langage PHP.

Une exception PHP est ce qui se passe lorsque vous dites à PHP d'effectuer une tâche et qu'il est incapable de le faire. PHP essaiera de faire ce qu'il a dit, mais échouera; Et pour vous parler de l'échec, il vous lancera une exception. Une exception n'est guère plus que PHP qui se bloque avec un message d'erreur spécifique. Lorsqu'une exception est lancée, PHP s'arrête. Aucune ligne de code après l'erreur ne sera exécutée.

En tant que développeur responsable, c'est votre travail d'attraper cette exception et de faire quelque chose afin que le programme puisse continuer.

Remarque: Si vous n'atteignez pas une exception, PHP cessera d'exécuter votre script PHP et affichera un message d'erreur spectaculairement laid. Ce message d'erreur révèlera même le code de votre script qui a lancé l'erreur. Dans ce cas, ce code contient votre nom d'utilisateur et votre mot de passe MySQL, il est donc particulièrement important d'éviter que le message d'erreur soit vu par les utilisateurs!

Pour prendre une exception, vous devez entourer le code qui pourrait lancer une exception avec une déclaration d'essai… Catch:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Vous pouvez penser à une déclaration d'essai… Catch comme une instruction if… else, sauf que le deuxième bloc de code est ce qui se passe si le premier bloc de code ne fonctionne pas.

confus encore? Je sais que je lance (sans jeu de mots) beaucoup de nouveaux concepts, mais cela aura plus de sens si je met tout ensemble et que je vous montre ce que nous avons:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Comme vous pouvez le voir, ce code est une instruction Try… Catch. Dans le bloc d'essai en haut, nous essayons de nous connecter à la base de données à l'aide de nouveaux APD. Si cela réussit, nous stockons l'objet PDO résultant dans $ PDO afin que nous puissions travailler avec notre nouvelle connexion de base de données. Si la connexion est réussie, la variable de sortie $ est définie sur un message qui sera affiché plus tard.

Surtout, à l'intérieur d'une instruction Try… Catch, tout code après une exception a été lancé ne sera pas exécuté. Dans ce cas, si la connexion à la base de données lance une exception (peut-être que le mot de passe est mauvais ou que le serveur ne répond pas), la variable de sortie $ ne sera jamais définie sur «la connexion de la base de données établie».

Si la tentative de connexion de la base de données échoue, PHP lancera un PDOException, qui est le type d'exception que le nouveau PDO lance. Notre bloc de capture, par conséquent, dit qu'il attrapera un PDOException (et le stockera dans une variable nommée $ e). À l'intérieur de ce bloc, nous définissons la puissance de la variable pour contenir un message sur ce qui n'a pas fonctionné.

Cependant, ce message d'erreur n'est pas particulièrement utile. Tout ce qu'il nous dit, c'est que l'APD ne pourrait pas se connecter au serveur de base de données. Il serait préférable d'avoir des informations sur les raisons pour lesquelles c'était - par exemple, parce que le nom d'utilisateur et le mot de passe n'étaient pas valides.

La variable $ E contient des détails sur l'exception qui s'est produite, y compris un message d'erreur décrivant le problème. Nous pouvons l'ajouter à la variable de sortie en utilisant la concaténation:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Remarque: la variable $ E n'est pas une chaîne, mais un objet. Nous viendrons à ce que cela signifie sous peu. Pour l'instant, cependant, tout ce que vous devez savoir est que le code $ e-> getMessage () obtient le message d'erreur en fonction de l'exception spécifique qui s'est produite.

comme une déclaration if… else, l'une des deux branches d'une instruction Try… Catch est garantie pour fonctionner. Soit le code dans le bloc d'essai s'exécutera avec succès, soit le code du bloc Catch s'exécutera. Que la connexion de la base de données ait été réussie, il y aura un message dans la variable de sortie $ - soit le message d'erreur, soit le message disant que la connexion a été réussie.

Enfin, que le bloc d'essai ait réussi ou que le bloc de capture fonctionne, la sortie de modèle.html.php est incluse. Ceci est un modèle générique qui affiche simplement du texte à la page:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Le code complet peut être trouvé dans l'exemple: MySQL-Connect.

Lorsque le modèle est inclus, il affichera le message d'erreur ou le message «Connexion de la base de données établi».

J'espère que le code susmentionné vous donne maintenant un sens. N'hésitez pas à revenir au début de cette section et à tout revoir si vous êtes perdu, car il y avait des concepts délicats là-dedans. Une fois que vous avez une prise ferme sur le code, vous vous rendrez probablement compte que j'ai encore laissé un mystère inexpliqué: PDOS. Quel est exactement le nouveau PDO, et quand j'ai dit qu'il renvoie un «objet PDO», quel est exactement un objet?

Remarque: Tous les exemples de code téléchargés incluent un schéma appelé ijdb_sample et un utilisateur appelé ijdb_sample, afin que vous puissiez l'exécuter indépendamment de ce que vous avez appelé votre schéma et votre utilisateur. Un fichier contenant la base de données est fourni sous forme de base de données.sql, que vous pouvez importer.

Si vous utilisez l'exemple de visière de code basée sur le Web, la base de données IDBJ_SAMPLE sera créée à mesure que vous chargez un échantillon, mais toute modification de ce schéma sera perdu lorsque vous consultez un autre échantillon. (Vous pouvez gâcher les choses et passer à un autre échantillon et le dos le réinitialisera, mais si vous voulez conserver les modifications que vous apportez, faites-les dans le schéma que vous avez créé.)

Si vous souhaitez charger les exemples de données dans votre schéma à l'aide de MySQL Workbench, Importer Database.SQL à partir du répertoire de projet en sélectionnant Import / restauration de données. Sélectionnez ensuite l'importation dans un fichier autonome, accédez à Database.SQL et sélectionnez votre nom de schéma dans le schéma cible par défaut. Si vous avez créé des tables avec le même nom, elles seront écrasées et tous les enregistrements perdus.

un cours intensif dans la programmation orientée objet

Vous avez peut-être remarqué le mot «objet» commençant à se glisser dans mon vocabulaire dans la section précédente. PDO est l'extension PHP Data objets , et un nouveau PDO renvoie un objet PDO . Dans cette section, je voudrais expliquer ce que sont les objets.

Peut-être que vous avez rencontré le terme programmation orientée objet (POO) dans vos propres explorations de PHP ou de programmation en général. La POO est un style de programmation avancé qui convient particulièrement à la création de programmes vraiment complexes avec beaucoup de pièces. La plupart des langages de programmation en usage actif prennent aujourd'hui en charge OOP. Certains d'entre eux exigent que vous travaillez dans un style OOP. PHP est un peu plus facile à vivre à ce sujet et laisse le développeur à décider s'il faut écrire leurs scripts dans le style OOP.

Jusqu'à présent, nous avons écrit notre code PHP dans un style plus simple appelé programmation procédurale, et nous continuerons à le faire pour le moment, avec un regard plus détaillé sur les objets plus tard. Le style de procédure est bien adapté aux projets relativement simples que nous abordons pour le moment. Cependant, presque tous les projets complexes que vous rencontrerez utilisent OOP, et je le couvrirai plus en détail plus tard dans ce livre.

Cela dit, l'extension PDO que nous allons utiliser pour nous connecter et travailler avec une base de données MySQL est conçue dans le style de programmation orienté objet. Cela signifie que, plutôt que d'appeler simplement une fonction pour se connecter à MySQL, puis d'appeler d'autres fonctions qui utilisent cette connexion, nous devons d'abord créer un objet PDO qui représentera notre connexion de base de données, puis utiliser les fonctionnalités de Cet objet fonctionne avec la base de données.

Créer un objet, c'est un peu comme appeler une fonction. En fait, vous avez déjà vu comment le faire:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Le nouveau mot-clé indique à PHP que vous souhaitez créer un nouvel objet. Vous laissez ensuite un espace et spécifiez un nom de classe, qui indique à PHP quel type d'objet vous souhaitez créer. Une classe est un ensemble d'instructions que PHP suivra pour créer un objet. Vous pouvez penser à une classe comme étant une recette, comme pour un gâteau, et un objet étant le gâteau réel qui est produit à partir de la recette. Différentes classes peuvent produire différents objets, tout comme différentes recettes peuvent produire des plats différents.

Tout comme PHP est livré avec un tas de fonctions intégrées que vous pouvez appeler, PHP est livré avec une bibliothèque de classes à partir desquelles vous pouvez créer des objets. Le nouveau PDO dit donc à PHP de créer un nouvel objet PDO - c'est-à-dire un nouvel objet de la classe APDI intégrée.

Dans PHP, un objet est une valeur, tout comme une chaîne, un numéro ou un tableau. Vous pouvez stocker un objet dans une variable ou le transmettre à une fonction comme un argument - tout le même truc que vous pouvez faire avec d'autres valeurs PHP. Cependant, les objets ont des fonctionnalités supplémentaires utiles.

Tout d'abord, un objet se comporte beaucoup comme un tableau, en ce qu'il agit comme un conteneur pour d'autres valeurs. Comme nous l'avons vu dans le chapitre 2, vous pouvez accéder à une valeur à l'intérieur d'un tableau en spécifiant son index (par exemple, $ anniversaires ['kevin']). En ce qui concerne les objets, les concepts sont similaires mais les noms et le code sont différents. Plutôt que d'accéder à la valeur stockée dans un index de tableau, nous disons que nous accédons à une propriété de l'objet. Au lieu d'utiliser des crochets pour spécifier le nom de la propriété à laquelle nous voulons accéder, nous utilisons la notation de flèche (->) - par exemple, $ myObject-> Someproperty:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Alors que les tableaux sont normalement utilisés pour stocker une liste de valeurs similaires (comme un tableau d'anniversaires), les objets sont utilisés pour stocker une liste de valeurs liées (par exemple, les propriétés d'une connexion de base de données). Pourtant, si ce sont tous les objets, il n'y aurait pas beaucoup de points: nous pourrions tout aussi bien utiliser un tableau pour stocker ces valeurs, non? Bien sûr, les objets font plus.

En plus de stocker une collection de propriétés et leurs valeurs, les objets peuvent contenir un groupe de fonctions conçues pour nous apporter des fonctionnalités plus utiles. Une fonction stockée dans un objet est appelée méthode (l'un des noms les plus déroutants dans le monde de la programmation, si vous me demandez). Une méthode n'est qu'une fonction à l'intérieur d'une classe. Plus confus, lorsque nous arrivons à écrire nos propres classes, les méthodes sont définies en utilisant le mot-clé de fonction! Même les développeurs expérimentés utilisent souvent à tort fonction et méthode interchangeable.

Pour appeler une méthode, nous utilisons à nouveau la notation des flèches - $ myObject-> SomeMethod ():

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Tout comme les fonctions autonomes, les méthodes peuvent prendre des arguments et des valeurs de retour.

À ce stade, tout cela sonne probablement un peu compliqué et inutile, mais croyez-moi: rassembler les collections de variables (propriétés) et les fonctions (méthodes) en petits faisceaux appelés objets se traduit par beaucoup de plus triste et plus facile à lire Code pour certaines tâches - Travailler avec une base de données n'est que l'un d'entre eux. Un jour, vous pouvez même développer des classes personnalisées que vous pouvez utiliser pour créer des objets de votre propre conception.

Pour l'instant, cependant, nous nous en tiendrons aux cours qui viennent avec PHP. Continuons à travailler avec l'objet PDO que nous avons créé et voyons ce que nous pouvons faire en appelant l'une de ses méthodes.

Configuration de la connexion

Jusqu'à présent, je vous ai montré comment créer un objet PDO pour établir une connexion avec votre base de données MySQL, et comment afficher un message d'erreur significatif lorsque quelque chose ne va pas:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

En supposant que la connexion réussit, cependant, vous devez le configurer avant utilisation. Vous pouvez configurer votre connexion en appelant certaines méthodes de votre nouvel objet PDO.

Avant d'envoyer des requêtes à la base de données, nous devrons configurer le codage des caractères de notre connexion de base de données. Comme je l'ai mentionné brièvement dans le chapitre 2, vous devez utiliser le texte encodé UTF-8 sur vos sites Web pour maximiser la gamme de personnages que les utilisateurs ont à leur disposition lors de la remplissage de formulaires sur votre site. Par défaut, lorsque PHP se connecte à MySQL, il utilise le codage ISO-8859-1 (ou Latin-1) plus simple au lieu de UTF-8. Si nous devions le quitter tel quel, nous ne pourrions pas facilement insérer des personnages chinois, arabe ou non anglaise.

Même si vous êtes sûr à 100% que votre site Web ne sera utilisé que par les anglophones, il y a d'autres problèmes causés par le fait de ne pas définir le jeu de caractères. Si votre page Web n'est pas définie sur UTF-8, vous rencontrerez des problèmes lorsque les gens écrivent certains caractères tels que des citations bouclées "dans une zone de texte, car ils apparaîtront dans la base de données comme un caractère différent.

Par conséquent, nous devons maintenant définir notre nouvel objet PDO pour utiliser le codage UTF-8.

Nous pouvons demander à PHP d'utiliser UTF-8 lors de la question de l'interrogation de la base de données en ajoutant; charset = UTF8MB4 à la chaîne de connexion. Il n'y a pas de inconvénients à le faire, à condition que votre script PHP soit également envoyé au navigateur en tant que UTF-8 (qui est la valeur par défaut des versions PHP récentes):

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Remarque: Si vous allez rechercher, vous trouverez différentes façons de définir le Charset, et les éditions antérieures de ce livre vous ont demandé d'utiliser ce code:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

En effet, jusqu'à PHP 5.3.6, l'option Charset n'a pas été correctement appliquée par PHP. Étant donné que cela est corrigé dans n'importe quelle version PHP que vous allez réellement utiliser, la définition du Charset dans le cadre de la chaîne de connexion est l'option préférée.

Le code complet que nous utilisons pour nous connecter à MySQL, puis configurer cette connexion, donc, est illustré ci-dessous.

Exemple: MySQL-Connect-Complete

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

lancez cet exemple dans votre navigateur. (Si vous avez placé votre code de base de données dans index.php dans le répertoire public et le fichier Output.html.php Dans le répertoire des modèles, l'URL de la page sera https://v.je/.)

Si votre serveur est opérationnel et que tout fonctionne correctement, vous devriez voir un message indiquant le succès.

Affichage des données de MySQL sur le Web: une introduction

Si PHP n'est pas en mesure de se connecter à votre serveur MySQL, ou si le nom d'utilisateur et le mot de passe que vous avez fourni sont incorrects, vous verrez plutôt un écran similaire à celui ci-dessous. Pour vous assurer que votre code de gestion des erreurs fonctionne correctement, vous voudrez peut-être mal orthographier votre mot de passe intentionnellement pour le tester.

Affichage des données de MySQL sur le Web: une introduction

Grâce à notre bloc de capture, le message d'erreur de la base de données a été inclus sur la page:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

La méthode getMessage () renvoie un message décrivant l'exception qui s'est produite. Il existe d'autres méthodes - y compris getFile () et getLine () - pour renvoyer le nom de fichier et le numéro de ligne sur lequel l'exception a été lancée. Vous pouvez générer un message d'erreur très détaillé comme celui-ci:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ceci est incroyablement utile si vous avez un grand site Web avec des dizaines de fichiers inclués. Le message d'erreur vous indiquera exactement quel fichier consulter et sur quelle ligne l'erreur s'est produite.

Si vous êtes curieux, essayez d'insérer d'autres erreurs dans votre code de connexion de base de données (par exemple, un nom de base de données mal orthographié) et observez les messages d'erreur détaillés qui en résultent. Lorsque vous avez terminé et que votre connexion de base de données fonctionne correctement, revenez au message d'erreur simple. De cette façon, vos visiteurs ne seront pas bombardés de gobbledygook techniques si un véritable problème émerge avec votre serveur de base de données.

Avec une connexion établie et une base de données sélectionnée, vous êtes prêt à commencer à utiliser les données stockées dans la base de données.

Vous vous demandez peut-être ce qui arrive à la connexion avec le serveur MySQL une fois le script terminé l'exécution. Si vous le souhaitez vraiment, vous pouvez forcer PHP à se déconnecter du serveur en jetant l'objet PDO qui représente votre connexion. Vous le faites en définissant la variable contenant l'objet sur null:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Cela dit, PHP fermera automatiquement toutes les connexions de base de données ouvertes lorsque cela termine l'exécution de votre script, vous pouvez donc généralement laisser PHP nettoyer après vous.

Envoi de requêtes SQL avec PHP

Dans le chapitre 3, nous nous sommes connectés au serveur de base de données MySQL à l'aide de MySQL Workbench, qui nous a permis de saisir immédiatement les requêtes SQL (commandes) et afficher les résultats de ces requêtes. L'objet PDO offre un mécanisme similaire - la méthode exec:

try {
  ⋮ do something risky
}
catch (ExceptionType $e) {
  ⋮ handle the exception
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ici, $ Query est une chaîne contenant la requête SQL que vous souhaitez exécuter.

Comme vous le savez, s'il y a un problème pour exécuter la requête (par exemple, si vous avez fait une erreur de frappe dans votre requête SQL), cette méthode vous lancera un PDOException à attraper.

Considérons l'exemple suivant, qui tente de produire le tableau des blagues que nous avons créé au chapitre 3.

Exemple: mysql-créate

try {
  $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
    ’mypassword’);
  $output = 'Database connection established.';
}
catch (PDOException $e) {
  $output = 'Unable to connect to the database server.';
}

include  __DIR__ . '/../templates/output.html.php';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Notez que nous utilisons la même technique d'essai… Catch pour gérer les erreurs possibles produites par la requête. Il serait possible d'utiliser plusieurs blocs d'essai… Catchs pour afficher différents messages d'erreur - un pour la connexion et un pour la requête - mais cela peut entraîner une quantité considérable de code supplémentaire.

Au lieu de cela, j'ai choisi d'utiliser la même instruction TRY pour contenir à la fois la connexion et la requête. Le bloc d'essai… Catch arrêtera d'exécuter du code une fois qu'une erreur se produira, donc si une erreur se produit pendant la connexion de la base de données, la ligne $ PDO-> EXEC ($ run) ne s'exécutera jamais, garantissant que si une requête est envoyée à la base de données , une connexion doit avoir été établie.

Cette approche nous donne un peu moins de contrôle sur le message d'erreur qui est affiché, mais enregistre la saisie d'une instruction Try… Catch pour chaque opération de base de données. Plus tard dans ce livre, nous les diviserons en différents blocs, mais pour l'instant, conserver toutes les opérations de base de données dans le même bloc d'essai.

Cet exemple utilise également la méthode GetMessage pour récupérer un message d'erreur détaillé du serveur MySQL. L'image suivante montre l'erreur qui s'affiche lorsque, par exemple, le tableau des blagues existe déjà.

Affichage des données de MySQL sur le Web: une introduction

Pour supprimer, insérer et mettre à jour les requêtes (qui servent à modifier les données stockées), la méthode EXEC renvoie le nombre de lignes de table (entrées) qui ont été affectées par la requête. Considérez la commande SQL suivante, que nous avons utilisée dans le chapitre 3 pour définir les dates de toutes les blagues qui contenaient le mot «programmeur».

Exemple: mysql-update

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

En stockant la valeur renvoyée de la méthode EXEC dans $ affecté, nous pouvons utiliser la variable dans la variable de sortie $ pour l'impression dans le modèle.

L'image ci-dessous montre la sortie de cet exemple, en supposant qu'il n'y a qu'une seule blague "programmeur" dans votre base de données.

Affichage des données de MySQL sur le Web: une introduction

Si vous actualisez la page pour exécuter à nouveau la même requête, vous devriez voir le message changer, comme indiqué dans l'image suivante. Cela indique qu'aucune ligne n'a été mise à jour, car la nouvelle date appliquée aux blagues est la même que la date existante.

Affichage des données de MySQL sur le Web: une introduction

Les requêtes de sélection sont traitées un peu différemment, car elles peuvent récupérer beaucoup de données, et PHP fournit des moyens de gérer ces informations.

Gestion des ensembles de résultats de sélection de sélection

Pour la plupart des requêtes SQL, la méthode EXEC fonctionne très bien. La requête fait quelque chose dans votre base de données et vous obtenez le nombre de lignes affectées (le cas échéant) de la valeur de retour de la méthode. Sélectionnez les requêtes, cependant, nécessitent quelque chose d'un peu plus sophistiqué que Exec. Vous vous rappelez que des requêtes de sélection sont utilisées pour afficher les données stockées dans la base de données. Au lieu d'affecter uniquement la base de données, les requêtes sélectionnées ont des résultats - et nous avons besoin d'une méthode pour les renvoyer.

La méthode de requête ressemble à un exec, en ce sens qu'il accepte une requête SQL comme un argument à envoyer au serveur de base de données. Ce qu'il renvoie, cependant, est un objet Pdostation, qui représente un ensemble de résultats contenant une liste de toutes les lignes (entrées) renvoyées de la requête:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

à condition qu'aucune erreur n'a été rencontrée dans le traitement de la requête, ce code stockera un ensemble de résultats (sous la forme d'un objet de pdostatement) dans le résultat de la variable. Cet ensemble de résultats contient le texte de toutes les blagues stockées dans le tableau des blagues. Comme il n'y a pas de limite pratique sur le nombre de blagues dans la base de données, l'ensemble de résultats peut être assez important.

J'ai mentionné dans le chapitre 2 que la boucle While est une structure de contrôle utile lorsque nous devons boucler mais je ne sais pas combien de fois. Nous ne pouvons pas utiliser une boucle pour une boucle, car nous ne savons pas combien d'enregistrements la requête a renvoyé. En effet, vous pouvez utiliser une boucle de temps ici pour traiter les lignes dans le résultat définit une à la fois:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

La condition pour la boucle while est probablement différente des conditions auxquelles vous êtes habitué, alors laissez-moi expliquer comment cela fonctionne. Considérez la condition comme une déclaration en soi:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

La méthode Fetch de l'objet PDOSTAT renvoie la ligne suivante dans l'ensemble de résultats en tant que tableau (nous avons discuté des tableaux au chapitre 2). Lorsqu'il n'y a plus de lignes dans l'ensemble de résultats, Fetch Renvoie False à la place. (C'est un cas où demander à un objet PDO de faire quelque chose qu'il ne peut pas faire - car Fetch ne peut pas retourner la ligne suivante lorsqu'il n'y a plus de lignes dans le jeu de résultats - sera pas Jetez un PDOException PDO .

Maintenant, l'instruction ci-dessus attribue une valeur à la variable $ Row, mais, en même temps, l'instruction dans son ensemble prend cette même valeur. C'est ce qui vous permet d'utiliser l'instruction comme condition dans la boucle while. Étant donné qu'une boucle de temps continuera de boucler jusqu'à ce que son état évalue à False, cette boucle se produira autant de fois qu'il y a des lignes dans l'ensemble de résultats, avec $ Row prenant la valeur de la ligne suivante chaque fois que la boucle s'exécute. Tout ce qui reste à comprendre, c'est comment récupérer les valeurs de la variable Row chaque fois que la boucle fonctionne.

Les lignes d'un ensemble de résultats renvoyées par Fetch sont représentées comme des tableaux associatifs, avec les indices nommés d'après les colonnes de table dans l'ensemble de résultats. Si $ row est une ligne dans notre ensemble de résultats, $ row ['JokeText'] est la valeur de la colonne Joketext de cette ligne.

Notre objectif dans ce code est de stocker le texte de toutes les blagues afin que nous puissions les afficher dans un modèle PHP. La meilleure façon de le faire est de stocker chaque blague comme un nouvel article dans un tableau, $ blagues:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Avec les blagues retirées de la base de données, nous pouvons maintenant les transmettre à un modèle PHP blagues.html.php.

Pour résumer, voici le code du contrôleur de cet exemple jusqu'à présent:

try {
  ⋮ do something risky
}
catch (ExceptionType $e) {
  ⋮ handle the exception
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
La variable de blagues $ est un tableau qui stocke une liste de blagues. Si vous écrivez le contenu du tableau en PHP, cela ressemblerait à ceci:

try {
  $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
    ’mypassword’);
  $output = 'Database connection established.';
}
catch (PDOException $e) {
  $output = 'Unable to connect to the database server.';
}

include  __DIR__ . '/../templates/output.html.php';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Cependant, les données ont été récupérées de la base de données plutôt que d'être tapées manuellement dans le code.

Vous aurez remarqué qu'il existe deux variables différentes en cours de définition - $ blagues et $ error - selon que le bloc d'essai exécuté avec succès.

Dans le modèle de blagues.html.php, nous devons afficher le contenu du tableau de blagues $ ou le message d'erreur contenu dans la variable d'erreur $.

Pour vérifier si une variable a été attribuée ou non une valeur, nous pouvons utiliser la fonction ISSET que nous avons utilisée plus tôt pour vérifier si un formulaire a été soumis. Le modèle peut inclure une instruction IF pour déterminer s'il faut afficher l'erreur ou la liste des blagues:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Il n'y a rien de nouveau ici, mais pour afficher les blagues, nous devons afficher le contenu du tableau de blagues $. Contrairement aux autres variables que nous avons utilisées jusqu'à ce point, le tableau de blagues $ contient plus qu'une simple valeur.

La façon la plus courante de traiter un tableau en PHP est d'utiliser une boucle. Nous avons déjà vu pendant des boucles et pour des boucles. La boucle foreach est particulièrement utile pour le traitement des tableaux:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Au lieu d'une condition, les parenthèses en haut d'une boucle foreach contiennent un tableau, suivi du mot-clé AS, puis le nom d'une nouvelle variable qui sera utilisée pour stocker chaque élément du tableau à son tour. Le corps de la boucle est ensuite exécuté une fois pour chaque élément du tableau. Chaque fois que cet élément est stocké dans la variable spécifiée, afin que le code puisse y accéder directement.

Il est courant d'utiliser une boucle foreach dans un modèle PHP pour afficher chaque élément d'un tableau tour à tour. Voici comment cela pourrait rechercher notre tableau de blagues $:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Avec ce mélange de code PHP pour décrire la boucle et le code HTML pour l'afficher, le code semble plutôt en désordre. Pour cette raison, il est courant d'utiliser une autre façon d'écrire la boucle foreach lorsqu'elle est utilisée dans un modèle:

try {
  ⋮ do something risky
}
catch (ExceptionType $e) {
  ⋮ handle the exception
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Les deux pièces de code sont fonctionnellement identiques, mais ce dernier semble plus convivial lorsqu'il est mélangé avec du code HTML. Voici à quoi ressemble cette forme du code dans un modèle:

try {
  $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
    ’mypassword’);
  $output = 'Database connection established.';
}
catch (PDOException $e) {
  $output = 'Unable to connect to the database server.';
}

include  __DIR__ . '/../templates/output.html.php';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

La même chose peut être faite avec l'instruction IF, ce qui rend plus agréable de regarder à l'intérieur des modèles HTML en évitant les accolades:

try {
  $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
    'mypassword');
   $output = 'Database connection established.';
}
catch (PDOException $e) {
  $output = 'Unable to connect to the database server: ' . $e->getMessage();
}

include  __DIR__ . '/../templates/output.html.php';
Copier après la connexion
Copier après la connexion
Copier après la connexion

Avec ces nouveaux outils en main, nous pouvons écrire notre modèle pour afficher la liste des blagues.

Exemple: mysql-listJokes

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Script Output</title>
  </head>
  <body>
      <?php echo $output; ?>
  </body>
</html>
Copier après la connexion

Soit le texte d'erreur $ s'affiche sur la page ou chaque blague s'affiche dans un paragraphe (

) contenu dans une citation de blocs (), car nous citons efficacement l'auteur de chaque blague dans ce page.

Parce que les blagues pourraient contenir de manière éventuellement interprétée comme du code HTML (par exemple, ou &), nous devons utiliser HTMLSpecialChars pour nous assurer qu'ils sont traduits en entités de caractères HTML (c'est-à-dire & lt; & gt; ;, et & amp;) de sorte qu'ils seront affichés correctement.

L'image suivante montre à quoi ressemble cette page une fois que vous avez ajouté quelques blagues à la base de données.

Affichage des données de MySQL sur le Web: une introduction

Rappelez-vous comment nous avons utilisé une boucle de temps dans notre contrôleur pour récupérer les lignes hors du résultat de pdostatement définir une à la fois?

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Il s'avère que les objets de pdostatement sont conçus pour se comporter comme des tableaux lorsque vous les transmettez à une boucle foreach. Vous pouvez donc simplifier légèrement votre code de traitement de la base de données à l'aide d'une boucle foreach au lieu d'une boucle while:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

J'utiliserai cette forme Foralie Trime dans le reste de ce livre.

Un autre outil soigné propose par PHP est une façon raccourci d'appeler la commande Echo - qui, comme vous l'avez déjà vu, nous devons utiliser fréquemment. Nos déclarations d'écho ressemblent à ceci:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Au lieu de cela, nous pouvons utiliser ceci:

try {
  ⋮ do something risky
}
catch (ExceptionType $e) {
  ⋮ handle the exception
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Cela fait exactement la même chose. = signifie écho et vous donne un moyen légèrement plus court d'imprimer des variables. Il y a une limitation à cela, cependant: si vous utilisez =, Vous ne pouvez que imprimer. Vous ne pouvez pas inclure si les déclarations, pour les déclarations, etc., bien que vous puissiez utiliser la concaténation, et elle peut être suivie d'un appel de fonction.

voici un modèle mis à jour en utilisant l'écho du raccourci.

Exemple: mysql-listjokes-shorthand

try {
  $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
    ’mypassword’);
  $output = 'Database connection established.';
}
catch (PDOException $e) {
  $output = 'Unable to connect to the database server.';
}

include  __DIR__ . '/../templates/output.html.php';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

J'utiliserai la notation du raccourci lorsqu'elle sera applicable à partir de ce point.

Remarque: Dans les versions de PHP avant 5.4, cette notation scolarisée a nécessité un paramètre PHP assez rare, il a donc été découragé pour des raisons de compatibilité. L'utilisation de la notation des sténographies a peut-être entraîné un arrêt de votre code lors du déménagement d'un serveur qui l'avait activé à celui qui ne l'a pas fait.

à partir de PHP 5.4 (donc toute version que vous allez réaliser de nos jours), l'écho scolarisé fonctionne indépendamment des paramètres PHP, vous pouvez donc l'utiliser en toute sécurité sans vous soucier qu'il ne fonctionne pas sur tous les serveurs .

penser à l'avance

Dans l'exemple que nous venons de regarder, nous avons créé un modèle, Jokes.html.php, qui contient tout le HTML requis pour afficher la page. Cependant, à mesure que notre site Web se développe, nous ajouterons plus de pages. Nous voudrons certainement une page pour que les gens puissent ajouter des blagues au site Web, et nous aurons également besoin d'une page d'accueil avec du texte d'introduction, une page avec les coordonnées du propriétaire et, à mesure que le site se développe, peut-être même Une page où les gens peuvent se connecter au site Web.

Je saute un peu de l'avant ici, mais cela vaut toujours la peine de considérer comment un projet se développera. Si nous appliquons l'approche que nous venons d'utiliser pour Jokes.html.php au reste des modèles - addjoke.html.php, home.html.php, contact.html.php, login.html.php et ainsi de suite - nous 'nous' LL se retrouve avec beaucoup de code répété.

Chaque page du site Web nécessitera un modèle qui ressemblera à ceci:

try {
  $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
    'mypassword');
   $output = 'Database connection established.';
}
catch (PDOException $e) {
  $output = 'Unable to connect to the database server: ' . $e->getMessage();
}

include  __DIR__ . '/../templates/output.html.php';
Copier après la connexion
Copier après la connexion
Copier après la connexion

En tant que programmeur, la répétition du code est l'une des pires choses que vous puissiez faire. En fait, les programmeurs se réfèrent souvent au principe sec, qui signifie «Ne vous répétez pas». Si vous vous retrouvez à répéter des sections de code, il y a presque certainement une meilleure solution.

Tous les meilleurs programmeurs sont paresseux et le code répétitif signifie répéter le travail. L'utilisation de cette approche de copie / coller pour les modèles rend le site Web très difficile à maintenir. Imaginons qu'il y a un pied de page et une section de navigation que nous voulons apparaître sur chaque page. Nos modèles ressembleraient maintenant à ceci:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Nous rencontrerons un problème en 2022! Si les modèles pour toutes les pages du site Web - par exemple, Jokes.html.php addjoke.html.php, home.html.php, contact.html.php etlogin.html.php - contiennent du code dans la structure ci-dessus, pour Mettez à jour l'année dans l'avis de droit d'auteur à «2022» Vous devez ouvrir chacun des modèles et modifier la date.

Nous pourrions être intelligents et avoir la date à lire dynamiquement à partir de l'horloge du serveur (date d'écho ('y'); si vous êtes curieux!) qui a été inclus sur chaque page? Ou ajouter un nouveau lien au menu? Nous aurions encore besoin d'ouvrir chaque fichier de modèle et de le modifier!

Changer cinq ou six modèles peut être légèrement ennuyeux, mais cela ne posera pas beaucoup de problème. Cependant, que se passe-t-il si le site Web devenait des dizaines ou des centaines de pages? Chaque fois que vous vouliez ajouter un lien au menu, vous devez ouvrir chaque modèle et le modifier.

Ce problème pourrait être résolu avec une série d'inclusion inclue. Par exemple:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Mais cette méthode nécessite une clairvoyance: nous devons anticiper exactement les modifications qui pourraient être apportées à l'avenir et utiliser les instructions pertinentes dans les endroits où nous prévoyons que les modifications se produiront.

Dans l'exemple ci-dessus, par exemple, il est facile d'ajouter de nouvelles entrées de menu en les ajoutant à nav.html.php, mais en ajoutant une balise à chaque page, ou même quelque chose d'aussi trivial que l'ajout d'une classe CSS à L'élément NAV, signifie toujours ouvrir chaque modèle pour faire le changement.

Il n'y a aucun moyen de prédire avec précision tous les changements qui pourraient être nécessaires au cours de la durée de vie du site Web, donc à la place, l'approche que je vous ai montrée au début de ce chapitre est en fait meilleure:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Si nous incluons toujours ce modèle, que nous appellerons la mise en page.html.php, il est possible de définir la variable de sortie $ sur certains HTML Code et de faire apparaître sur la page avec la navigation et pied de page. L'avantage de cela est que, pour modifier la date à chaque page du site Web, nous n'aurons qu'à le changer en un seul endroit.

Je me suis également glissé dans une variable de titre $ afin que chaque contrôleur puisse définir une valeur qui apparaît entre les balises

et avec certains CSS (disponibles sous forme de blagues.css dans l'exemple de code) pour faire la page un peu plus jolie.

Affichage des données de MySQL sur le Web: une introduction

Tout contrôleur peut désormais utiliser inclut __dir__. '/../Templates/Layout.html.php'; et fournir des valeurs pour $ la sortie et le titre $.

Nos blagues.php à l'aide de layout.html.php sont codées comme indiqué ci-dessous.

Exemple: mysql-listJokes-Layout-1

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Mais attendez! Que se passe-t-il avec $ la sortie dans le bloc d'essai? La variable de sortie $ contient en fait du code HTML: la boucle construit une chaîne contenant le code HTML pour la liste des blagues.

En principe, c'est ce que nous voulons arriver: la variable de sortie $ contient le code HTML qui sera inséré entre la navigation et le pied de page dans la mise en page.html.php, mais je pense que vous conviendrez que le code est incroyablement moche.

Je vous ai déjà montré comment éviter de mélanger le code HTML et PHP via l'instruction Inclut. Comme nous l'avons fait plus tôt, il serait bon de déplacer le HTML pour afficher les blagues dans son propre fichier - mais cette fois, seulement le code HTML qui est unique à la page de liste de blagues.

jokes.html.php dans le répertoire des modèles doit contenir ce code:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Surtout, ce n'est que le code pour afficher les blagues. Il ne contient pas la navigation, le pied de page, la balise ou tout ce que nous voulons répéter sur chaque page; Ce n'est que le code HTML qui est unique à la page de liste de blagues.

Pour utiliser ce modèle, vous pouvez essayer ce qui suit:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

ou si vous êtes très intelligent:

try {
  ⋮ do something risky
}
catch (ExceptionType $e) {
  ⋮ handle the exception
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Avec cette approche, votre logique serait entièrement solide. Nous devons inclure des blagues.html.php. Malheureusement, l'instruction Inclut exécute simplement le code du fichier inclus au point qu'il s'appelle. Si vous exécutez le code ci-dessus, la sortie sera en fait quelque chose comme ceci:

try {
  $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
    ’mypassword’);
  $output = 'Database connection established.';
}
catch (PDOException $e) {
  $output = 'Unable to connect to the database server.';
}

include  __DIR__ . '/../templates/output.html.php';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Parce que Jokes.html.php est inclus en premier, il est envoyé au navigateur en premier. Ce que nous devons faire, c'est charger des blagues.html.php, mais au lieu d'envoyer la sortie directement au navigateur, nous devons le capturer et le stocker dans la variable de sortie $ afin qu'il puisse être utilisé plus tard par la mise en page.html.php .

L'instruction Inclut ne renvoie pas de valeur, donc $ output = inclue 'jokes.html.php'; N'a pas l'effet souhaité et PHP n'a pas de déclaration alternative pour ce faire. Cependant, cela ne signifie pas que ce n'est pas possible.

PHP a une fonctionnalité utile appelée «tampon de sortie». Cela peut sembler compliqué, mais le concept est en fait très simple: lorsque vous utilisez Echo pour imprimer quelque chose, ou inclure pour inclure un fichier contenant du HTML, il est généralement envoyé directement au navigateur. En utilisant la mise en mémoire tampon de sortie, au lieu d'avoir la sortie envoyée directement au navigateur, le code HTML est stocké sur le serveur dans un «tampon», qui n'est essentiellement qu'une chaîne contenant tout ce qui a été imprimé jusqu'à présent.

Encore mieux, PHP vous permet d'allumer le tampon et de lire son contenu à tout moment.

Il y a deux fonctions dont nous avons besoin:

  • ob_start (), qui démarre le tampon de sortie. Après avoir appelé cette fonction, tout ce qui est imprimé via Echo ou HTML imprimé via include sera stocké dans un tampon plutôt que envoyé au navigateur.
  • ob_get_clean (), qui renvoie le contenu du tampon et le nettoie.

Comme vous l'avez probablement deviné, "OB" dans les noms de fonction signifie "Tuffer de sortie".

Pour capturer le contenu d'un fichier inclus, nous avons juste besoin d'utiliser ces deux fonctions:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Lorsque ce code s'exécute, la variable de sortie $ contiendra le HTML généré dans le modèle de blagues.html.php.

Nous utiliserons cette approche à partir de maintenant. Chaque page sera composée de deux modèles:

  • Layout.html.php, qui contient tous les HTML communs nécessaires à chaque page
  • un modèle unique qui ne contient que le code HTML unique à cette page particulière

les blagues complètes.php ressemble à ceci:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Faisons fonctionner le lien «Accueil» en ajoutant un fichier index.php. Nous pourrions tout mettre sur cette page: les dernières blagues, la meilleure blague du mois ou tout ce que nous aimons. Pour l'instant, cependant, nous resterons simples et avons simplement un message qui dit «Bienvenue dans la base de données de blagues sur Internet».

Créez un fichier appelé home.html.php dans le dossier des modèles:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Notre index.php est considérablement plus simple que Jokes.html.php. Il n'obtient aucune information de la base de données, il n'a donc pas besoin d'une connexion de base de données et nous n'avons pas besoin d'une instruction d'essai… donc, nous allons donc charger les deux modèles et définir les variables de title $ et $ de sortie .

Exemple: mysql-listJokes-Layout-3

try {
  ⋮ do something risky
}
catch (ExceptionType $e) {
  ⋮ handle the exception
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

REMARQUE: il est de bonne pratique de se connecter uniquement à la base de données si vous en avez besoin. Les bases de données sont le goulot d'étranglement des performances les plus courantes sur de nombreux sites Web, donc établir le moins de connexions possible est préféré.

Testez que les deux pages fonctionnent dans votre navigateur. Vous devriez avoir une liste de blagues visibles lorsque vous visitez https://v.je/jokes.php et le message de bienvenue sur https://v.je/jokes.php. Les deux pages doivent contenir la navigation et le pied de page.

Essayez de modifier la mise en page.html.php. Les modifications que vous apportez apparaîtront sur les deux pages. Si le site avait des dizaines de pages, les modifications de la mise en page affecteraient chaque page.

Insertion de données dans la base de données

Dans cette section, je vais montrer comment utiliser les outils à votre disposition pour permettre aux visiteurs du site d'ajouter leurs propres blagues à la base de données.

Si vous souhaitez laisser les visiteurs de votre site entrer dans de nouvelles blagues, vous aurez évidemment besoin d'un formulaire. Voici un modèle pour un formulaire qui conviendra à la facture:

try {
  $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
    ’mypassword’);
  $output = 'Database connection established.';
}
catch (PDOException $e) {
  $output = 'Unable to connect to the database server.';
}

include  __DIR__ . '/../templates/output.html.php';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Enregistrez ceci sous AddJoke.html.php dans le répertoire des modèles.

La partie la plus importante de l'élément

est l'attribut d'action. L'attribut d'action indique au navigateur où envoyer les données une fois le formulaire soumis. Cela peut être le nom d'un fichier, tel que "addjuke.php".

Cependant, si vous laissez l'attribut vide en le définissant sur "", les données fournies par l'utilisateur seront renvoyées à la page que vous consultez actuellement. Si l'URL du navigateur affiche la page comme addJoke.php, c'est-à-dire que les données seront envoyées lorsque l'utilisateur appuyer sur le bouton Ajouter.

Attachez ce formulaire à l'exemple précédent, qui affichait la liste des blagues dans la base de données. Ouvrez la mise en page.html.php et ajoutez une URL au lien "Ajouter une nouvelle blague" qui va à addjuke.php:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Bien que vous ayez la mise en page.html.php ouverte, incluez la feuille de style Form.css du chapitre 2 comme je l'ai ci-dessus. Maintenant, toute forme affichée à l'intérieur de la disposition aura les styles que nous avons utilisés auparavant.

Lorsque ce formulaire est soumis, la demande comprendra une variable - Joketext - qui contient le texte de la blague tel que tapé dans la zone de texte. Cette variable apparaîtra ensuite dans le tableau $ _POST créé par Php.

Créons AddJoke.php dans le répertoire public. La logique de base de ce contrôleur est:

  • Si aucune variable de post Joketext n'est définie, affichez un formulaire.
  • Sinon, insérez la blague fournie dans la base de données.

Créez ce squelette addjoke.php:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Cette instruction d'ouverture si le tableau $ _POST contient une variable appelée Joketext. S'il est défini, le formulaire a été soumis. Sinon, le formulaire de addJoke.html.php est chargé dans la variable de sortie $ pour afficher dans le navigateur.

Si vous ouvrez addjoke.php dans votre navigateur à ce stade, vous verrez le formulaire, mais taper une blague et appuyer sur ADD ne fonctionnera pas, car nous n'avons rien fait avec les données contenues dans $ _Post ['Joketext'].

Pour insérer la blague soumise dans la base de données, nous devons exécuter une requête d'insertion en utilisant la valeur stockée dans $ _post ['Joketext'] pour remplir la colonne Joketext de la table de blague. Cela pourrait vous amener à écrire du code comme ceci:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Il y a cependant un problème grave avec ce code: le contenu de $ _post ['Joketext'] est entièrement sous le contrôle de l'utilisateur qui a soumis le formulaire. Si un utilisateur malveillant devait taper un code SQL désagréable dans le formulaire, ce script l'alimenterait sans question à votre serveur MySQL. Ce type d'attaque est appelé une attaque par injection SQL, et au début de PHP, c'était l'un des trous de sécurité les plus courants que les pirates ont trouvé et exploité dans des sites Web basés sur PHP. (Dans de nombreuses niches de programmation, les attaques d'injection SQL sont toujours étonnamment efficaces, car les développeurs ne s'y attendent pas. Considérez cette tentative remarquable pour faire en sorte que les caméras de circulation abandonnent leurs bases de données: «La plaque d'immatriculation d'injection SQL espère que les caméras de circulation Euro».)

Un utilisateur peut le saisir dans la zone de texte:

try {
  ⋮ do something risky
}
catch (ExceptionType $e) {
  ⋮ handle the exception
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

La requête envoyée à la base de données serait la suivante:

try {
  $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
    ’mypassword’);
  $output = 'Database connection established.';
}
catch (PDOException $e) {
  $output = 'Unable to connect to the database server.';
}

include  __DIR__ . '/../templates/output.html.php';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Mais que se passe-t-il si l'utilisateur tape dans ce qui suit:

try {
  $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
    'mypassword');
   $output = 'Database connection established.';
}
catch (PDOException $e) {
  $output = 'Unable to connect to the database server: ' . $e->getMessage();
}

include  __DIR__ . '/../templates/output.html.php';
Copier après la connexion
Copier après la connexion
Copier après la connexion

Dans ce cas, la requête envoyée à la base de données sera la suivante:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Parce que la blague contient un caractère de devis, MySQL renvoie une erreur, car elle verra la citation avant «Get» comme la fin de la chaîne.

Pour en faire une requête valide, nous devons échapper à toutes les citations du texte afin que la requête envoyée à la base de données devienne la suivante:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Les données qui ne sont pas insérées si elles contient un devis est un problème ennuyeux pour les utilisateurs. Ils perdront tout ce qu'ils ont tapé. Mais les utilisateurs malveillants peuvent en abuser. Dans les versions plus anciennes de PHP, il a été possible d'exécuter plusieurs requêtes de PHP en les séparant avec un point-virgule (;).

Imaginez si l'utilisateur devait taper ceci dans la case:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Cela enverrait les requêtes suivantes à la base de données:

try {
  ⋮ do something risky
}
catch (ExceptionType $e) {
  ⋮ handle the exception
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

- est un commentaire à ligne unique dans MySQL, donc la dernière ligne serait ignorée, et la requête d'insertion s'exécuterait, suivie de la requête de suppression que l'utilisateur avait tapé dans la boîte. En fait, l'utilisateur pourrait taper n'importe quelle requête qu'il aimait dans la case et elle serait exécutée sur la base de données!

Magic Quotes

Au début de PHP, les attaques par injection SQL étaient tellement craint que l'équipe derrière PHP ait ajouté des protections intégrées contre les injections SQL à la langue. Premièrement, ils ont désactivé la possibilité d'envoyer plusieurs requêtes à la fois. Deuxièmement, ils ont ajouté quelque chose appelé Magic Quotes. Cette caractéristique protectrice de PHP a automatiquement analysé toutes les valeurs soumises par le navigateur et insérées () devant tout caractères "dangereux" comme les apostrophes - qui peuvent causer des problèmes s'ils sont inclus dans une requête SQL par inadvertance.

Le problème avec la fonctionnalité Magic Quotes est qu'il a causé autant de problèmes qu'il a empêché. Tout d'abord, les personnages qu'il a détectés et la méthode qu'il utilisait pour les désinfecter (les préfixant avec une barre oblique inverse) n'étaient valables que dans certaines circonstances. Selon le codage des caractères de votre site et du serveur de base de données que vous utilisiez, ces mesures pourraient être complètement inefficaces.

Deuxièmement, lorsqu'une valeur soumise a été utilisée à des fins Autre que la création d'une requête SQL, ces bombardements pourraient être vraiment gênants. La fonction de citations magiques insérait une barre arrière parasite dans le nom de famille de l'utilisateur s'il contenait une apostrophe.

En bref, la fonction de citations magiques était une mauvaise idée - à tel point qu'elle a été supprimée de PHP de la version 5.4. Cependant, en raison de l'âge de PHP et de la quantité de code, vous pourriez y avoir des références, il vaut donc la peine d'avoir une compréhension de base de ce que la fonctionnalité Magic Quotes était censée faire.

Une fois que les citations magiques ont été identifiées comme une mauvaise idée, les conseils des développeurs PHP étaient de l'éteindre. Cependant, cela signifiait qu'il y avait des serveurs Web avec cela et d'autres avec ça. C'était un casse-tête pour les développeurs: ils devaient soit instruire tous ceux qui allaient utiliser leur code pour l'éteindre - ce qui n'était pas possible sur certains serveurs partagés - ou écrire du code supplémentaire pour le rendre compte.

La plupart des développeurs ont choisi ce dernier, et vous pouvez rencontrer un code comme celui-ci:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Si vous voyez une instruction IF comme celle-ci dans le code hérité avec lequel vous avez été donné pour travailler, vous pouvez supprimer en toute sécurité le bloc entier, car aucun code à l'intérieur de l'instruction IF ne sera jamais exécuté sur les versions PHP récentes.

Si vous voyez du code comme celui-ci, cela signifie que le développeur original a compris les problèmes avec les citations magiques et faisait de son mieux pour l'empêcher. À partir de PHP 5.4 (que vous ne devriez jamais rencontrer, car il n'est plus pris en charge), get_magic_quotes_gpc () reviendra toujours faux et le code ne sera jamais exécuté.

Tout ce que vous devez vraiment savoir sur les citations magiques, c'est que c'était une mauvaise solution au problème à accomplir. Bien sûr, sans citations magiques, vous devez trouver une solution différente au problème. Heureusement, la classe PDO peut faire tout le travail acharné pour vous, en utilisant quelque chose appelé «instructions préparées».

Instructions préparées

Une instruction préparée est une requête SQL spéciale que vous avez envoyée à votre serveur de base de données à l'avance, donnant au serveur une chance de le préparer à l'exécution - mais ne l'exécute pas réellement. Pensez-y comme l'écriture d'un script .php. Le code est là, mais il n'est pas exécuté avant de visiter la page de votre navigateur Web. Le code SQL dans les instructions préparés peut contenir des espaces réservés que vous fournissez les valeurs pour plus tard, lorsque la requête est à exécuter. Lorsque vous remplissez ces espaces réservés, l'APD est assez intelligente pour se prémunir contre les caractères «dangereux» automatiquement.

Voici comment préparer une requête d'insertion, puis l'exécuter en toute sécurité avec $ _post ['Joketext'] comme le texte de la blague:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Décomposons cela, une déclaration à la fois. Tout d'abord, nous écrivons notre requête SQL en tant que chaîne PHP et la stockons dans une variable ($ SQL) comme d'habitude. Ce qui est inhabituel à propos de cette requête d'insertion, cependant, c'est qu'aucune valeur n'est spécifiée pour la colonne Joketext. Au lieu de cela, il contient un espace réservé pour cette valeur (: Joketext). Ne vous inquiétez pas du champ de blagues tout à l'heure; Nous allons y retourner dans un instant.

Ensuite, nous appelons la méthode de préparation de notre objet PDO ($ PDO), en le faisant passer notre requête SQL comme argument. Cela envoie la requête au serveur MySQL, le demandant à préparer pour exécuter la requête. MySQL ne peut pas encore l'exécuter, car il n'y a aucune valeur pour la colonne Joketext. La méthode de préparation renvoie un objet PDOSTATION (oui, le même type d'objet qui nous donne les résultats d'une requête sélectionnée), que nous stockons dans $ stmt.

Maintenant que MySQL a préparé notre instruction pour l'exécution, nous pouvons lui envoyer la valeur manquante en appelant la méthode BindValue de notre objet PDOSTAT ($ stmt). Nous appelons cette méthode une fois pour que chaque valeur soit fournie (dans ce cas, nous n'avons besoin que de fournir une seule valeur - le texte de la blague), passant comme arguments dans l'espace réservé que nous voulons remplir (': Joketext') et la valeur que nous Je veux le remplir avec ($ _post ['Joketext']). Parce que MySQL sait que nous lui envoyons une valeur discrète, plutôt que le code SQL qui doit être analysé, il n'y a aucun risque de caractères dans la valeur interprétée comme du code SQL. Lorsque vous utilisez des instructions préparées, les vulnérabilités d'injection SQL ne sont tout simplement pas possibles!

Enfin, nous appelons la méthode EXECUTE de l'objet Pdostatement pour dire à MySQL d'exécuter la requête avec la ou les valeurs que nous avons fournies. (Oui, cette méthode de pdostatement est appelée EXECUTE, contrairement à la méthode similaire des objets PDO, qui est appelé Exec. PHP a de nombreuses forces, mais la cohérence n'en fait pas!)

Une chose intéressante que vous remarquerez sur ce code est que nous n'avons jamais placé des citations autour du texte de la blague. : Joketext existe à l'intérieur de la requête sans aucun devis, et lorsque nous avons appelé BindValue, nous l'avons passé, le texte de la blague simple du tableau $ _post. Lorsque vous utilisez des instructions préparées, vous n'avez pas besoin de devis car la base de données (dans notre cas, MySQL) est assez intelligente pour savoir que le texte est une chaîne et qu'il sera traité comme tel lorsque la requête est exécutée.

La question persistante de ce code est de savoir comment attribuer la date d'aujourd'hui au champ Jokedate. Nous pourrions écrire du code PHP fantaisie pour générer la date d'aujourd'hui dans le format Yyyy-mm-dd dont MySQL a besoin, mais il s'avère que MySQL a une fonction pour le faire - cumdate:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

La fonction MySQL Croundate est utilisée ici pour attribuer la date en cours comme valeur de la colonne de blague. MySQL a en fait des dizaines de ces fonctions, mais je les présenterai uniquement comme requis.

Maintenant que nous avons notre requête, nous pouvons terminer la déclaration IF que nous avons commencé plus tôt pour gérer les soumissions du formulaire "Ajouter une blague":

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Mais attendez! Cette déclaration si a encore une astuce dans sa manche. Une fois que nous avons ajouté la nouvelle blague à la base de données, au lieu d'afficher le modèle PHP comme précédemment, nous voulons rediriger le navigateur de l'utilisateur à la liste des blagues. De cette façon, les utilisateurs peuvent voir la blague nouvellement ajoutée parmi eux. C'est ce que font les deux lignes à la fin de l'instruction if ci-dessus.

Afin d'atteindre le résultat souhaité, votre premier instinct pourrait être de permettre au contrôleur de simplement récupérer la liste des blagues de la base de données après avoir ajouté la nouvelle blague et afficher la liste à l'aide du modèle de blagues.html.php comme d'habitude. Le problème de cela est que la liste des blagues, du point de vue du navigateur, serait le résultat d'avoir soumis le formulaire «Ajouter une blague». Si l'utilisateur devait alors actualiser la page, le navigateur soumettrait ce formulaire, provoquant l'ajout d'une autre copie de la nouvelle blague à la base de données! C'est rarement le comportement souhaité.

Au lieu de cela, nous voulons que le navigateur traite la liste mise à jour des blagues comme une page Web normale qui peut être rechargée sans soumettre la soumission du formulaire. La façon de le faire est de répondre à la soumission du formulaire du navigateur avec une redirection HTTP - une réponse spéciale qui indique au navigateur de naviguer vers une page différente. (HTTP signifie Hypertext Transfer Protocol et est la langue qui décrit les communications de demande / réponse qui sont échangées entre le navigateur Web du visiteur et votre serveur Web.)

La fonction d'en-tête PHP fournit les moyens d'envoyer des réponses de serveur spécial comme celle-ci, en vous permettant d'insérer des en-têtes spécifiques dans la réponse envoyée au navigateur. Afin de signaler une redirection, vous devez envoyer un en-tête d'emplacement avec l'URL de la page à laquelle vous souhaitez diriger le navigateur:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Dans ce cas, nous voulons envoyer le navigateur sur Jokes.php. Voici les deux lignes qui redirigent le navigateur vers notre contrôleur après avoir ajouté la nouvelle blague à la base de données:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Vous trouverez ci-dessous le code complet du contrôleur addjuke.php.

Exemple: mysql-addjoke

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Au fur et à mesure que vous révisez cela pour vous assurer que tout est logique pour vous, notez que le code qui se connecte à la base de données en créant un nouvel objet PDO doit être précédé devant l'un des code qui exécute les requêtes de base de données. Mais une connexion à la base de données n'est pas requise pour afficher le formulaire «Ajouter une blague». La connexion n'est établie que lorsque le formulaire a été soumis.

Chargez cela et ajoutez une nouvelle blague ou deux à la base de données via votre navigateur.

Là, vous l'avez: vous pouvez voir les blagues existantes - et ajouter de nouvelles blagues à - votre base de données MySQL.

Suppression des données de la base de données

Dans cette section, nous ferons une amélioration finale de notre site de base de données de blagues. À côté de chaque blague sur la page de blagues (Jokes.php), nous placerons un bouton étiqueté Supprimer. Une fois cliqué, il supprimera cette blague de la base de données et affichera la liste des blagues mises à jour.

Si vous aimez un défi, vous voudrez peut-être vous débarrasser de cette fonctionnalité vous-même avant de lire la suite pour voir ma solution. Bien que nous mettions en œuvre une toute nouvelle fonctionnalité, nous utiliserons principalement les mêmes outils que utilisés dans les exemples précédents de ce chapitre. Voici quelques conseils pour vous déclencher:

  • Vous aurez besoin d'un nouveau contrôleur (DeleteJoke.php).
  • La commande SQL Delete sera requise, que j'ai introduite dans le chapitre 3.
  • Pour supprimer une blague particulière dans votre contrôleur, vous devrez l'identifier de manière unique. La colonne ID dans la table des blagues a été créée pour servir cet objectif. Vous allez devoir passer l'ID de la blague pour être supprimé avec la demande de supprimer une blague. La façon la plus simple de le faire est d'utiliser un champ de forme caché.

à tout le moins, prenez quelques instants pour réfléchir à la façon dont vous abordez cela. Lorsque vous êtes prêt à voir la solution, lisez la suite!

Pour commencer, nous devons modifier la requête sélectionnée qui récupère la liste des blagues dans la base de données. En plus de la colonne JokeText, nous devons également récupérer la colonne ID afin que nous puissions identifier chaque blague uniquement:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Nous devons également modifier la boucle while qui stocke les résultats de la base de données dans le tableau $ blagues. Au lieu de simplement stocker le texte de chaque blague comme un élément dans le tableau, nous stockons à la fois l'ID et le texte de chaque blague. Une façon de le faire est de faire de chaque article dans le tableau $ blagues un tableau à part entière:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Remarque: Si vous êtes déjà passé à l'utilisation d'une boucle foreach pour traiter vos lignes de résultats de la base de données, cela fonctionnera également très bien:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Une fois que cette boucle suivra son cours, nous aurons le tableau $ blagues, dont chaque article est un tableau associatif avec deux éléments: l'ID de la blague et son texte. Pour chaque blague ($ blagues [n]), nous pouvons donc récupérer son identifiant ($ blagues [n] ['id']) et son texte ($ blagues [n] ['texte']).

Notre prochaine étape consiste à mettre à jour le modèle de blagues.html.php pour récupérer le texte de chaque blague de cette nouvelle structure de tableau, ainsi que de fournir un bouton de suppression pour chaque blague:

try {
  ⋮ do something risky
}
catch (ExceptionType $e) {
  ⋮ handle the exception
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Voici les points forts de ce code mis à jour:

  • Chaque blague sera affichée avec un formulaire qui, s'il est soumis, supprimera cette blague. Nous le signalons à un nouveau contrôleur, DeleteJoke.php, en utilisant l'attribut d'action du formulaire.
  • Étant donné que chaque blague du tableau $ blagues est maintenant représentée par un tableau à deux éléments au lieu d'une simple chaîne, nous devons mettre à jour cette ligne pour récupérer le texte de la blague. Nous faisons cela en utilisant $ blague ['text'] au lieu de simplement $ blague.
  • Lorsque nous soumettons le formulaire pour supprimer cette blague, nous envoyons le jeu de la blague à supprimer. Pour ce faire, nous avons besoin d'un champ de formulaire contenant l'ID de la blague, mais nous préférerions garder ce champ caché à l'utilisateur; C’est pourquoi nous utilisons un champ de formulaire caché (Type d'entrée = "Hidden"). Le nom de ce champ est ID, et sa valeur est l'ID de la blague à supprimer ($ blague ['id']). Contrairement au texte de la blague, l'ID n'est pas une valeur soumise à l'utilisateur, donc il n'y a pas Besoin de s'inquiéter de la rendre HTML-SAFE avec HTMLSpecialChars. Nous pouvons être assurés que ce sera un nombre, car il est automatiquement généré par MySQL pour la colonne ID lorsque la blague est ajoutée à la base de données.
  • Le bouton Soumettre (Type d'entrée = "soumission") soumet le formulaire lorsque vous cliquez sur. Son attribut de valeur lui donne une étiquette de suppression.
  • Enfin, nous fermons la forme de cette blague.

Remarque: Si vous connaissez votre HTML, vous pensez probablement que les balises de formulaire et d'entrée appartiennent en dehors de l'élément Blockquote, car ils ne font pas partie du texte cité (la blague).

STRICMENT SPEAUX, c'est vrai: la forme et ses entrées devraient vraiment être avant ou après le Blockquote. Malheureusement, faire cet affichage de la structure de balises nécessite clairement un petit code CSS (feuilles de style en cascade) qui dépasse vraiment la portée de ce livre.

Plutôt que de vous apprendre des techniques de mise en page CSS dans un livre sur PHP et MySQL, j'ai décidé de suivre ce balisage imparfait. Si vous prévoyez d'utiliser ce code dans le monde réel, vous devez investir un peu de temps dans l'apprentissage du CSS (ou du moins sécuriser les services d'un gourou CSS). De cette façon, vous pouvez prendre le contrôle total de votre balisage HTML sans vous soucier du CSS nécessaire pour le rendre joli. Si vous voulez en savoir plus sur les dispositions CSS, jetez un œil à CSS Master, 3e édition , par Tiffany Brown.

Ajoutez le CSS suivant à Jokes.css pour faire apparaître les boutons à droite des blagues et tracer une ligne entre elles:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

L'image suivante montre à quoi ressemble la liste des blagues avec les boutons de suppression ajoutés.

Affichage des données de MySQL sur le Web: une introduction

Mais attendez! Avant de passer à la mise en œuvre du bouton de suppression, prenons brièvement du recul et examinons attentivement cette ligne:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ici, nous boucons sur l'objet Pdostatement, qui nous donne une variable de ligne $ contenant l'ID de touches et Joketext avec des valeurs correspondantes, et nous l'utilisons pour construire un autre tableau avec les mêmes touches et valeurs.

Vous avez peut-être déjà réalisé que c'était terriblement inefficace. Nous pourrions réaliser la même chose en utilisant ce code:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Mais comme nous le savons, cela peut également être réalisé avec une boucle FORESC:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Dans ce cas, nous utilisons ForEach pour parcourir les enregistrements de la base de données et construire un tableau. Nous enroulons ensuite sur le tableau avec une autre boucle FOREAK dans le modèle. Nous pourrions simplement écrire ceci:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Maintenant, lorsque $ blagues est itéré dans le modèle, ce n'est pas un tableau mais un objet de pdostatement. Cependant, cela n'a aucun effet sur la sortie et nous enregistre du code. En fait, nous pouvons omettre complètement la variable de résultat et charger l'objet PDOSTATION directement dans la variable $ blagues. Le contrôleur complet de blagues.php ressemble maintenant à ceci:

try {
  ⋮ do something risky
}
catch (ExceptionType $e) {
  ⋮ handle the exception
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Maintenant, nous n'avons même pas une boucle de temps en itérant sur les enregistrements du contrôleur, mais il suffit d'idérer les enregistrements directement dans le modèle, en enregistrant un code et en faisant l'exécution de la page légèrement plus rapide, car il ne fait que boucler sur le enregistre une fois.

Retour à notre nouveau bouton de suppression: Tout ce qui reste pour que cette nouvelle fonctionnalité fonctionne est d'ajouter un deleteJoke.php pertinent pour émettre une requête de suppression à la base de données:

try {
  $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
    ’mypassword’);
  $output = 'Database connection established.';
}
catch (PDOException $e) {
  $output = 'Unable to connect to the database server.';
}

include  __DIR__ . '/../templates/output.html.php';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Le code complet pour les blagues mis à jour.php et DeleteJoke.php est disponible comme exemple: MySQL-DeleteJoke.

Ce morceau de code fonctionne exactement comme celui que nous avons ajouté pour traiter le code «Ajouter une blague» plus tôt dans le chapitre. Nous commençons par préparer une requête de suppression avec un espace réservé pour l'ID de blague que nous voulons supprimer.

Astuce: vous pourriez penser qu'une déclaration préparée n'est pas nécessaire dans ce cas pour protéger notre base de données contre les attaques d'injection SQL, car l'ID de blague est fourni par un champ de formulaire caché invisible à l'utilisateur. En fait, tous les champs de forme - même cachés - sont finalement sous le contrôle de l'utilisateur. Il existe des modules complémentaires de navigateur largement distribués, par exemple, qui rendront les champs de formulaire cachés visibles et disponibles pour l'édition par l'utilisateur. N'oubliez pas: toute valeur soumise par le navigateur est finalement suspecte en matière de protection de la sécurité de votre site.

Nous lions ensuite la valeur soumise de $ _post ['id'] à cet espace réservé et exécutons la requête. Une fois cette requête réalisée, nous utilisons la fonction d'en-tête PHP pour demander au navigateur d'envoyer une nouvelle demande pour afficher la liste mise à jour des blagues.

Remarque: Si vous avez abordé cet exemple vous-même, votre premier instinct pourrait avoir été de fournir un hyperlien de suppression pour chaque blague, au lieu d'aller à la peine d'écrire un formulaire HTML entier contenant un bouton de suppression pour chaque blague sur la page. En effet, le code pour un tel lien serait beaucoup plus simple:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

En bref, les hyperliens ne doivent jamais être utilisés pour effectuer des actions (comme supprimer une blague). Ils ne doivent être utilisés que pour fournir un lien vers certains contenus connexes. Il en va de même pour les formulaires avec méthode = "get", qui ne devraient être utilisés que pour effectuer des requêtes des données existantes. Les actions ne doivent jamais être effectuées à la suite d'un formulaire avec méthode = "post" en cours de soumission.

La raison en est que les formulaires avec méthode = "post" sont traités différemment par les navigateurs et les logiciels connexes. Si vous deviez soumettre un formulaire avec méthode = "post", puis cliquez sur le bouton Actualiser dans votre navigateur, par exemple, le navigateur demanderait si vous êtes certain de vouloir soumettre le formulaire. Les navigateurs n'ont pas de protection similaire contre la remise en remise en ce qui concerne les liens et les formulaires avec méthode = "get".

Les moteurs de recherche et autres robots Web suivront également tous les liens de votre site afin de déterminer quand afficher les pages de votre site dans les résultats de recherche.

Si votre site a supprimé une blague à la suite d'un lien hypertexte suivi, vous pouvez trouver vos blagues supprimées chaque fois qu'un moteur de recherche trouve votre site.

Mission accomplie

Dans ce chapitre, vous avez tout appris sur les objets de données PHP (PDO), une collection de classes PHP intégrées (APD, PDOException et Pdostament) qui vous permettent d'interfacer avec un serveur de base de données MySQL en créant des objets puis en appelant les méthodes qu'ils fournissent. Pendant que vous y étiez, vous avez également ramassé les bases de la programmation orientée objet (OOP) - ce qui n'est pas une mince affaire pour un débutant PHP!

À l'aide d'objets PDO, vous avez construit votre premier site Web axé sur la base de données, qui a publié la base de données IJDB en ligne et a permis aux visiteurs d'ajouter et de supprimer des blagues.

D'une certaine manière, vous pourriez dire que ce chapitre a réalisé la mission déclarée de ce livre: pour vous apprendre à créer un site Web axé sur la base de données. Bien sûr, l'exemple de ce chapitre ne contenait que l'essentiel nu. Dans le reste du livre, je vais vous montrer comment étoffer le squelette que vous avez appris à construire dans ce chapitre.

Dans le chapitre 5, nous reviendrons à la fenêtre de requête SQL dans MySQL Workbench. Nous apprendrons à utiliser les principes de la base de données relationnels et les requêtes SQL avancées pour représenter des types d'informations plus complexes et donner à nos visiteurs le crédit pour les blagues qu'ils ajoutent!

Nous espérons que vous avez apprécié cet extrait de php & mysql: novice to ninja, 7th edition . Le livre complet est disponible sur SitePoint Premium et à partir de vos détaillants préférés de livre et de livre électronique.

FAQ sur l'affichage des données de MySQL sur le Web

Comment puis-je me connecter à une base de données MySQL à l'aide d'un navigateur Web?

La connexion à une base de données MySQL à l'aide d'un navigateur Web nécessite une interface Web comme PhpMyAdmin. PHPMyAdmin est un outil logiciel libre écrit en PHP, destiné à gérer l'administration de MySQL sur le Web. Pour l'utiliser, vous devez l'installer sur votre serveur, puis y accéder via votre navigateur Web en tapant l'adresse IP de votre serveur suivie de «/ phpmyadmin». Vous serez invité à entrer vos informations d'identification MySQL, et une fois authentifié, vous pourrez gérer vos bases de données directement à partir de votre navigateur.

Qu'est-ce que le shell mysql et comment puis-je l'utiliser?

MySQL Shell est un client avancé et éditeur de code pour MySQL. Il fournit des capacités de script pour JavaScript et Python et comprend des API pour travailler avec MySQL. Vous pouvez l'utiliser pour effectuer des requêtes de données et des mises à jour, ainsi que diverses opérations d'administration. Le shell MySQL peut être installé sur votre machine locale, et vous pouvez le connecter à votre serveur MySQL en utilisant les informations d'identification appropriées.

Puis-je utiliser les données MySQL sur mon site Web?

Oui, vous pouvez utiliser Données MySQL sur votre site Web. Cela se fait généralement via un langage de script côté serveur comme PHP. Vos scripts PHP se connecteront à votre base de données MySQL, effectueront des requêtes pour récupérer des données, puis afficher ces données sur votre site Web. Ceci est une approche commune pour les sites Web dynamiques qui doivent afficher des changements de contenu, comme un blog ou un site d'actualités.

Comment puis-je sécuriser ma base de données MySQL?

La sécurisation de votre base de données MySQL implique plusieurs étapes . Tout d'abord, assurez-vous que votre serveur MySQL s'exécute dans un environnement sécurisé, avec un pare-feu et d'autres mesures de sécurité appropriées. Deuxièmement, utilisez des mots de passe solides et uniques pour vos comptes MySQL. Troisièmement, limitez les privilèges de vos comptes MySQL afin qu'ils aient uniquement les autorisations dont ils ont besoin pour effectuer leurs tâches. Enfin, mettre à jour et corriger régulièrement votre serveur MySQL pour protéger contre les vulnérabilités connues.

Comment puis-je sauvegarder ma base de données MySQL?

La sauvegarde de votre base de données MySQL peut être effectuée en utilisant l'utilitaire de ligne de commande MySQLDump MySQLDump . Cet outil crée un fichier SQL avec des commandes qui peuvent recréer la base de données à partir de zéro. Vous pouvez exécuter cet outil à partir de la ligne de commande de votre serveur, en spécifiant le nom de la base de données que vous souhaitez sauvegarder et le nom du fichier que vous souhaitez créer.

Comment puis-je optimiser ma base de données MySQL?

L'optimisation de votre base de données MySQL peut impliquer plusieurs étapes. Tout d'abord, vous pouvez utiliser la commande Optimize Table pour réorganiser le stockage physique des données de la table et réduire l'espace disque. Deuxièmement, vous pouvez utiliser l'optimiseur de requête MySQL pour améliorer l'efficacité de vos requêtes. Troisièmement, vous pouvez utiliser l'indexation pour accélérer la récupération des données.

Comment puis-je importer des données dans ma base de données MySQL?

Vous pouvez importer des données dans votre base de données MySQL à l'aide de la commande de chargement Infile. Cette commande lit les lignes d'un fichier texte dans une table à une vitesse très élevée. Le nom de fichier doit être donné en tant que chaîne littérale.

Comment puis-je exporter des données à partir de ma base de données MySQL?

Vous pouvez exporter des données à partir de votre base de données MySQL à l'aide de la commande SELECT… dans OutFile. Cette commande écrit le résultat d'une instruction SELECT dans un fichier sur l'hôte du serveur.

Comment puis-je mettre à jour les données dans ma base de données MySQL?

Vous pouvez mettre à jour les données dans votre base de données MySQL à l'aide de la mise à jour commande. Cette commande modifie les lignes existantes dans un tableau. Vous spécifiez le nom de la table, la colonne à mettre à jour, et la nouvelle valeur, ainsi qu'une clause où sélectionner les lignes à mettre à jour.

Comment puis-je supprimer les données de ma base de données MySQL?

Vous pouvez supprimer les données de votre base de données MySQL à l'aide de la commande delete. Cette commande supprime les lignes existantes d'une table. Vous spécifiez le nom du tableau et une clause où sélectionner les lignes à supprimer. Soyez prudent avec cette commande, car les données supprimées ne peuvent pas être récupérées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal