Maison >développement back-end >tutoriel php >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.
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.
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).
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:
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'@'%';
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.
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 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'@'%';
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:
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'@'%';
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'@'%';
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')
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'@'%';
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')
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.
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'@'%';
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'@'%';
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')
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.
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');
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'@'%';
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')
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');
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.
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.
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'@'%';
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')
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');
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.
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 }
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';
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à.
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'@'%';
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.
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.
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.
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')
à 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'@'%';
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')
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');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 }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';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'@'%';
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')
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');
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 }
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';
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';
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>
Soit le texte d'erreur $ s'affiche sur la page ou chaque blague s'affiche dans un paragraphe (
) contenu dans une citation de blocs (
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.
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'@'%';
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')
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');
Au lieu de cela, nous pouvons utiliser ceci:
try { ⋮ do something risky } catch (ExceptionType $e) { ⋮ handle the exception }
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';
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 .
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';
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'@'%';
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')
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
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');
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
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'@'%';
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')
Surtout, ce n'est que le code pour afficher les blagues. Il ne contient pas la navigation, le pied de page, la balise
Pour utiliser ce modèle, vous pouvez essayer ce qui suit:
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser', 'mypassword');
ou si vous êtes très intelligent:
try { ⋮ do something risky } catch (ExceptionType $e) { ⋮ handle the exception }
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';
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:
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'@'%';
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:
les blagues complètes.php ressemble à ceci:
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')
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');
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 }
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.
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';
Enregistrez ceci sous AddJoke.html.php dans le répertoire des modèles.
La partie la plus importante de l'élément
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!