Der folgende Artikel ist ein Auszug aus Php & MySQL: Novice nach Ninja, 7. Ausgabe , eine praktische Anleitung zum Erlernen aller Tools, Prinzipien und Techniken, die zum Erstellen einer professionellen Webanwendung erforderlich sind. In diesem letzten Tutorial in der Serie erfahren Sie, wie Sie Informationen in einer MySQL -Datenbank aufnehmen und auf einer Webseite anzeigen, damit alle sehen können.
Das ist es - das Zeug, für das Sie sich angemeldet haben! In diesem Kapitel erfahren Sie, wie Sie Informationen in einer MySQL -Datenbank aufnehmen und auf einer Webseite anzeigen, damit alle sehen können.
Bisher haben Sie Ihren ersten PHP-Code geschrieben und die Grundlagen von MySQL, einer relationalen Datenbank-Engine und PHP, einer serverseitigen Skriptsprache gelernt.
Jetzt können Sie lernen, wie Sie diese Tools gemeinsam verwenden, um eine Website zu erstellen, auf der Benutzer Daten aus der Datenbank anzeigen und sogar ihre eigenen hinzufügen können.
Hinweis: Wie in Kapitel 3 verwende ich hier "MySQL", um auf das Datenbankprotokoll zu verweisen. Ihre PHP -Skripte werden dasselbe tun. In diesem Kapitel gibt es zahlreiche Referenzen - und im PHP -Code, den Sie schreiben - auf "MySQL", obwohl wir uns tatsächlich mit einer MariADB -Datenbank verbinden.
Bevor wir nach vorne springen, lohnt es sich, einen Schritt zurück zu machen, um ein klares Bild unseres ultimativen Ziels zu erzielen. Wir haben zwei leistungsstarke Tools zur Verfügung: die Php -Skriptsprache und die MySQL -Datenbank -Engine. Es ist wichtig zu verstehen, wie diese zusammenpassen.
Der Zweck der Verwendung von MySQL für unsere Website besteht darin, dass der Inhalt dynamisch aus der Datenbank gezogen wird, um Webseiten für das Anzeigen in einem regulären Browser zu erstellen. An einem Ende des Systems haben Sie also einen Besucher auf Ihrer Website über einen Webbrowser, um eine Seite anzufordern. Dieser Browser erwartet, dass er ein Standard -HTML -Dokument im Gegenzug erhält. Am anderen Ende haben Sie den Inhalt Ihrer Website, der sich in einer oder mehreren Tabellen in einer MySQL -Datenbank befindet, in der nur versteht, wie man auf SQL -Abfragen (Befehle) reagiert.
Wie im obigen Bild gezeigt, ist die PHP-Skriptsprache die Aufgabe, die beide Sprachen spricht. Es verarbeitet die Seitenanforderung und holt die Daten aus der MySQL -Datenbank mithilfe von SQL -Abfragen genau wie diejenigen ab, mit denen Sie in Kapitel 3 eine Witze Tabelle erstellt haben. Sie spuckt sie dann dynamisch als die schön formatierte HTML -Seite aus, die der Browser erwartet.
Nur damit es klar und frisch in Ihrem Kopf ist. Dies passiert, wenn es einen Besucher einer Seite auf Ihrer Website gibt:
Damit PHP eine Verbindung zu Ihrem MySQL -Datenbankserver herstellen kann, muss ein Benutzername und ein Kennwort verwendet werden. Bisher enthält alles, was Ihre Witzdatenbank enthält, eine Reihe von markigen -Bon -Mots , aber es kann zu kurzer Zeit sensible Informationen wie E -Mail -Adressen und andere private Details zu den Benutzern Ihrer Website enthalten. Aus diesem Grund ist MySQL so konzipiert, dass es sehr sicher ist und Ihnen eine enge Kontrolle darüber gibt, welche Verbindungen es akzeptieren und welche Verbindungen dies tun dürfen.
Die Docker -Umgebung enthält bereits einen MySQL -Benutzer in Kapitel 3, mit dem Sie sich bereits beim MySQL -Server angemeldet haben.
Sie könnten mit demselben Benutzernamen (v.je) und Passwort (v.je) eine Verbindung zur Datenbank aus Ihrem PHP -Skript herstellen, aber es ist nützlich, ein neues Konto zu erstellen - denn wenn Sie eine haben Webserver, Sie möchten es möglicherweise an mehr als eine Website hosten. Indem Sie jeder Website ein eigenes Benutzerkonto geben, haben Sie mehr Kontrolle darüber, wer Zugriff auf die Daten für eine bestimmte Website hat. Wenn Sie mit anderen Entwicklern zusammenarbeiten, können Sie ihnen Zugriff auf die Websites gewähren, an denen sie arbeiten, aber nicht mehr.
Sie sollten ein neues Benutzerkonto mit nur den spezifischen Berechtigungen erstellen, die es benötigt, um in der IJDB -Datenbank zu arbeiten, von der Ihre Website abhängt. Lass uns das jetzt tun.
Um einen Benutzer zu erstellen, MySQL Workbench zu öffnen und eine Verbindung zu Ihrem Server herzustellen. Führen Sie dann die folgenden Fragen aus:
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Die erste Abfrage ist ziemlich selbsterklärend: Sie erstellt einen Benutzer namens IJDBUSER mit dem Passwort myPassword. Das % Zeichen nach dem Benutzernamen zeigt an, dass die Datenbank von jedem Ort aus angeschlossen werden kann. Die zweite Abfrage gibt dem Benutzer dem IJDB -Schema vollständige Einsätze. Dadurch kann dieser Benutzer alle Tabellen, Spalten und Daten im IJDB -Schema sehen und ändern, hat jedoch keinen Zugriff auf irgendetwas außerhalb.
Jetzt, da der Benutzer ijdbuser erstellt wurde, können wir sie verwenden, um eine Verbindung zur Datenbank herzustellen. Es ist möglich, eine Verbindung in MySQL Workbench mit diesem Benutzer aufzubauen. Da die Berechtigungen begrenzt sind, ist es besser, MySQL Workbench mit dem V.JE -Konto zu halten. Stattdessen werden wir den neuen Benutzer verwenden, wenn wir eine Verbindung aus einem PHP -Skript herstellen.
Bevor Sie Inhalte aus Ihrer MySQL -Datenbank für die Aufnahme in eine Webseite abrufen können, müssen Sie wissen, wie Sie eine Verbindung zu MySQL in einem PHP -Skript herstellen. Bisher haben Sie eine Anwendung namens MySQL Workbench verwendet, um eine Verbindung zu Ihrer Datenbank herzustellen. So wie MySQL Workbench direkt zu einem laufenden MySQL -Server eine Verbindung herstellen kann, kann auch Ihre eigenen PHP -Skripte.
Obwohl dieses Kapitel vollständig über die Verbindung zu MySQL von PHP gesprochen wird, stellen wir uns tatsächlich mit der MariADB -Datenbank her, die im vorherigen Kapitel diskutiert wurde. PHP kann keinen Unterschied zwischen MySQL und Mariadb sehen, da sie austauschbar sind. Ich werde die Datenbank als MySQL durchgehend bezeichnen, da alle verwendeten Befehle verwendet werden können, um eine Verbindung zu einem MySQL- oder MariADB -Datenbankserver herzustellen.
Die ursprüngliche MySQL -Datenbank lieferte eine standardisierte Methode für Clients wie MySQL Workbench und PHP, um mit dem Server zu kommunizieren. Mariadb kopierte diesen Standard, und alle Befehle in PHP verwenden den Namen mysql , um die Dinge einfach zu halten, werde ich den Begriff mysql in diesem Kapitel verwenden, um auf die Datenbank zu verweisen.
Es gibt drei Methoden zur Verbindung zu einem MySQL -Server von PHP:
Diese alle machen im Wesentlichen den gleichen Job - eine Verbindung zur Datenbank und das Senden von Abfragen - aber sie verwenden unterschiedliche Code, um sie zu erreichen.
Die MySQL -Bibliothek ist die älteste Methode zur Verbindung zur Datenbank und wurde in PHP 2.0 eingeführt. Die Merkmale, die es enthält, sind minimal und wurden ab Php 5.0 (veröffentlicht im Jahr 2004) von MySQLI abgelöst.
Um die Datenbank mit der alten MySQL -Bibliothek zu verbinden und abzufragen, werden Funktionen wie MySQL_Connect () und MySQL_Query () verwendet. Diese Funktionen wurden veraltet - was bedeutet, dass sie vermieden werden sollten - seit Php 5.5 und seit Php 7.0 vollständig aus PHP entfernt wurden.
Obwohl die meisten Entwickler den Grund für die Änderung sahen, sobald PHP 5.0 veröffentlicht wurde, gibt es immer noch Hunderte von Artikeln und Code-Beispielen im Web, die diese jetzt nicht existierende MySQL_* -Funktionen verwenden-obwohl MySQLI effektiv war die bevorzugte Bibliothek seit fünfzehn Jahren.
Wenn Sie auf ein Code -Beispiel stoßen, das die Zeile mysql_connect () enthält, überprüfen Sie das Datum des Artikels. Es ist wahrscheinlich aus den frühen 2000er Jahren, und im Programmieren sollten Sie niemals etwas so Altem vertrauen. Die Dinge ändern sich ständig - weshalb dieses Buch in seiner siebten Ausgabe ist!
In PHP 5.0 wurde die MySQLI -Bibliothek - standardmäßig für „MySQL Agresved“ - freigegeben, um einige der Einschränkungen in der ursprünglichen MySQL -Bibliothek anzugehen. Sie können die Verwendung von MySQLI leicht identifizieren, da der Code Funktionen wie MySQLi_Connect () und MySQLi_Query () verwendet.
Kurz nach der Veröffentlichung der MySQLI-Bibliothek in PHP 5.0, PHP 5.1, wurde mit einer erheblichen Anzahl von Änderungen veröffentlicht, die die Art und Weise, wie wir heute PHP schreiben viele später in diesem Buch). Eine der Hauptänderungen in PHP 5.1 war, dass eine dritte Bibliothek, PDO (PHP -Datenobjekte), zur Verbindung zu MySQL -Datenbanken eingeführt wurde.
Es gibt verschiedene Unterschiede zwischen PDO und MySQLI, aber die wichtigste ist, dass Sie die PDO -Bibliothek verwenden können, um eine Verbindung zu nahezu jedem Datenbankserver herzustellen - z. B. einen Oracle -Server oder Microsoft SQL -Server. Für Entwickler besteht der größte Vorteil dieses generischen Ansatzes darin, dass es sehr einfach ist, mit der Bibliothek zu interagieren, wenn Sie gelernt haben, wie Sie mit der Bibliothek mit einer MySQL -Datenbank interagieren, mit einem anderen Datenbankserver zu interagieren.
wohl ist es einfacher, Code für PDO zu schreiben, und es gibt einige Nuancen, die den PDO -Code lesbarer machen können - benannte Parameter in vorbereiteten Aussagen, die der Hauptvorteil sind. (Keine Sorge, ich werde später erklären, was das später bedeutet.)
Aus diesen Gründen verwenden die neuesten PHP -Projekte die PDO -Bibliothek, und es ist die Bibliothek, die ich Ihnen zeigen werde, wie Sie in diesem Buch verwendet werden. Weitere Informationen zu den Unterschieden finden Sie im SitePoint-Artikel „PDO erneut steigern-den richtigen Weg, um auf Datenbanken in PHP zuzugreifen“.
Nach dieser kleinen Geschichtsstunde sind Sie wahrscheinlich bestrebt, wieder Code zu schreiben. So verwenden Sie PDO, um eine Verbindung zu einem MySQL -Server herzustellen:
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Stellen Sie sich vorerst neue PDO als eine integrierte Funktion vor, genau wie die Rand-Funktion, die wir in Kapitel 2 verwendet haben. Wenn Sie denken: „Hey, Funktionen können nicht Räume in ihrer Namen! ", Du bist schlauer als der durchschnittliche Bär und ich werde genau erklären, was hier gleich los ist. In jedem Fall sind drei Argumente erforderlich:
Sie können sich aus Kapitel 2 erinnern, dass PHP -Funktionen normalerweise einen Wert zurückgeben, wenn sie aufgerufen werden. Diese neue PDO -Funktion gibt einen Wert zurück, der als PDO -Objekt bezeichnet wird, das die hergestellte Verbindung identifiziert. Da wir beabsichtigen, die Verbindung zu verwenden, sollten wir diesen Wert festhalten, indem wir ihn in einer Variablen speichern. So sieht das aus, wobei die erforderlichen Werte ausgefüllt werden, um eine Verbindung zu Ihrer Datenbank herzustellen:
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Sie können wahrscheinlich sehen, was mit den letzten beiden Argumenten los ist: Sie sind der Benutzername und das Passwort, das Sie früher in diesem Kapitel erstellt haben.
Das erste Argument ist etwas komplizierter. Der Teil dbname = ijdb fordert PDO an, die Datenbank (auch als iJDB als Schema
zu verwenden. Jede Abfrage, die von PHP ausgeführt wird, standardmäßig in Tabellen in diesem Schema. Wählen Sie * Aus dem Witz werden Datensätze aus der Witztabelle im IJDB -Schema ausgewählt.Auch wenn Sie bereits mit PHP, PDO und MySQL vertraut sind, sieht der Host = Mysql -Teil verwirrend aus. Normalerweise wäre dies Host = localhost (in Bezug auf den lokalen Computer, der gleiche Computer, der PHP ausführt) oder auf einen bestimmten Domänennamen hinweist, in dem die Datenbank gehostet wird, wie z. B. Host = sitePoint.com.
Warum ist es Host = Mysql und worauf bezieht sich MySQL hier? In Docker erhält jeder Service
einen Namen. Wenn Sie die Datei docker-compose.yml untersuchen, die den Server konfiguriert, heißt der Datenbankdienst MySQL und in Docker kann ein Dienst mit dem Namen des anderen Dienstes eine Verbindung zu einem anderen herstellen..
Abgesehen vonArgumenten ist es wichtig zu sehen, dass der von neue PDO zurückgegebene Wert in einer Variablen namens $ pdo gespeichert ist.
Der MySQL -Server ist eine völlig separate Software vom Webserver. Daher müssen wir die Möglichkeit berücksichtigen, dass der Server aufgrund eines Netzwerkausfalls nicht verfügbar oder unzugänglich ist oder weil die von Ihnen angegebene Benutzername/Kennwort -Kombination vom Server abgelehnt wird oder weil Sie nur vergessen haben, Ihren MySQL -Server zu starten! In solchen Fällen wird neuer PDO nicht laufen und eine PHP -Ausnahme auswerfen.
Hinweis: Zumindest standardmäßig kann PHP so konfiguriert werden, dass keine Ausnahme ausgelöst wird und es einfach keine Verbindung herstellt. Dies ist im Allgemeinen nicht wünschenswertes Verhalten, da es viel schwieriger ist, herauszufinden, was schief gelaufen ist.Wenn Sie sich fragen, was es bedeutet, "eine PHP -Ausnahme zu werfen", machen Sie sich selbst! Sie sind dabei, einige weitere Funktionen der PHP -Sprache zu entdecken.
Eine PHP -Ausnahme ist das, was passiert, wenn Sie PHP sagen, eine Aufgabe auszuführen, und sie kann dies nicht tun. PHP wird versuchen, das zu tun, was es gesagt hat, wird aber scheitern. Und um Ihnen von dem Fehler zu erzählen, wird Sie eine Ausnahme auf Sie auswerfen. Eine Ausnahme ist kaum mehr als PHP, der nur mit einer bestimmten Fehlermeldung abstürzt. Wenn eine Ausnahme ausgelöst wird, stoppt PHP. Es werden keine Codezeilen nach dem Fehler ausgeführt.
Als verantwortungsbewusster Entwickler ist es Ihre Aufgabe, diese Ausnahme zu fangen und etwas dagegen zu tun, damit das Programm fortgesetzt werden kann.
Hinweis: Wenn Sie keine Ausnahme abrufen, stellt PHP Ihr PHP -Skript nicht mehr aus und zeigt eine spektakulär hässliche Fehlermeldung an. Diese Fehlermeldung enthält sogar den Code Ihres Skripts, der den Fehler geworfen hat. In diesem Fall enthält dieser Code Ihren MySQL -Benutzernamen und Ihr Kennwort. Daher ist es besonders wichtig, dass die Fehlermeldung von Benutzern gesehen wird!
Um eine Ausnahme zu erheben, sollten Sie den Code umgeben, der eine Ausnahme mit einem Versuch ausgeben könnte… Catch -Anweisung:
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Sie können sich einen Versuch vorstellen ... Catch -Anweisung wie eine IF… sonst, außer dass der zweite Codeblock passiert, wenn der erste Codeblock nicht ausgeführt wird.
noch verwirrt? Ich wissen
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')
Wichtig ist, dass innerhalb eines Versuchs… Catch -Anweisung nach einer Ausnahme nicht ausgeführt wurde. In diesem Fall wird die $ Ausgangsvariable niemals auf "Datenbankverbindung festgelegt" festgelegt, wenn die Verbindung zu der Datenbank eine Ausnahme ausgelöst hat (möglicherweise ist das Kennwort falsch, oder der Server nicht antwortet).
.
Wenn unser Datenbankverbindungsversuch fehlschlägt, wirft PHP eine PDOException aus, die die Art von Ausnahme ist, die neue PDO auswirken. Unser Catch -Block besagt daher, dass er eine PDOException aufnehmen wird (und ihn in einer Variablen namens $ e speichern wird). In diesem Block setzen wir die Variable $ Ausgabe so, dass eine Nachricht darüber enthält, was schief gelaufen ist.Diese Fehlermeldung ist jedoch nicht besonders nützlich. Alles, was uns sagt, ist, dass PDO keine Verbindung zum Datenbankserver herstellen konnte. Es wäre besser, einige Informationen darüber zu haben, warum das war - zum Beispiel, weil der Benutzername und das Passwort ungültig waren.
Die Variable $ e enthält Details zur Ausnahme, die aufgetreten ist, einschließlich einer Fehlermeldung, die das Problem beschreibt. Wir können dies der Ausgangsvariablen unter Verwendung von Verkettung hinzufügen:
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Hinweis: Die $ E -Variable ist keine Zeichenfolge, sondern ein Objekt. Wir werden zu dem kommen, was das in Kürze bedeutet. Im Moment müssen Sie jedoch nur noch wissen, dass der Code $ e-> getMessage () die Fehlermeldung basierend auf der spezifischen Ausnahme erhält.
Wie eine if… sonst Aussage, einer der beiden Zweige eines Versuchs… wird garantiert ausgeführt. Entweder wird der Code im Try -Block erfolgreich ausgeführt, und der Code im Catch -Block wird ausgeführt. Unabhängig davon, ob die Datenbankverbindung erfolgreich war, gibt es eine Nachricht in der Variablen $ Ausgabe - entweder die Fehlermeldung oder die Nachricht, dass die Verbindung erfolgreich war.
Schließlich ist die Vorlagenausgabe, unabhängig davon, ob der Try -Block erfolgreich war, oder der Fangblock, der Vorlagenausgang.html.php. Dies ist eine generische Vorlage, die nur einen Text auf der Seite anzeigt:
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')
Der vollständige Code kann in Beispiel gefunden werden: Mysql-connect.
Wenn die Vorlage enthalten ist, wird entweder die Fehlermeldung oder die Meldung „Datenbankverbindung festgelegt“ angezeigt.
Ich hoffe, der oben genannte Code macht jetzt einen Sinn. Fühlen Sie sich frei, zum Beginn dieses Abschnitts zurückzukehren und alles erneut zu lesen, wenn Sie verloren sind, da es dort einige schwierige Konzepte gab. Sobald Sie den Code jedoch fest im Griff haben, werden Sie wahrscheinlich erkennen, dass ich immer noch ein Mysterium ungeklärt gelassen habe: PDOs. Was genau ist neuer PDO und als ich sagte, gibt es ein „PDO -Objekt“ zurück, was genau ist ein Objekt?
Hinweis: Alle heruntergeladenen Beispielcode enthält ein Schema namens IJDB_Sample und ein Benutzer namens IJDB_Sample, damit Sie es ausführen können, unabhängig davon, was Sie Ihr Schema und Benutzer genannt haben. Eine Datei mit der Datenbank wird als Datenbank.SQL bereitgestellt, die Sie importieren können.
Wenn Sie den bereitgestellten webbasierten Beispielcode-Viewer verwenden, wird die Datenbank idbj_sampase erstellt, wenn Sie ein Beispiel geladen haben. Bei einem anderen Beispiel werden jedoch alle Änderungen an diesem Schema verloren gegangen. (Sie können die Dinge durcheinander bringen und zu einem anderen Beispiel und zurück wechseln, wird es zurückgesetzt, aber wenn Sie alle von Ihnen vorgenommenen Änderungen beibehalten möchten, machen Sie sie in dem von Ihnen erstellten Schema.)
Wenn Sie die Beispieldaten mithilfe von MySQL Workbench in Ihr Schema laden möchten, importieren Sie die Datenbank.SQL aus dem Projektverzeichnis, indem Sie Datenimport/Wiederherstellung auswählen. Wählen Sie dann aus der in sich geschlossenen Datei importieren, durchsuchen Sie die Datenbank.SQL und wählen Sie Ihren Schema-Namen im Standard-Zielschema aus. Wenn Sie Tabellen mit demselben Namen erstellt haben, werden diese überschrieben und alle Datensätze verloren.
Sie haben möglicherweise bemerkt, dass das Wort „Objekt“ im vorherigen Abschnitt in mein Wortschatz eingeschlichen wird. PDO ist die PHP -Daten Objekte , und neuer PDO gibt ein PDO -Objekt zurück. In diesem Abschnitt möchte ich erklären, worum es bei Objekten geht.
Vielleicht sind Sie auf den Begriff objektorientierte Programmierung (OOP) in Ihren eigenen Erkundungen von PHP oder der Programmierung im Allgemeinen gestoßen. OOP ist ein fortschrittlicher Programmstil, der besonders für den Aufbau von wirklich komplexen Programmen mit vielen Teilen geeignet ist. Die meisten Programmiersprachen im aktiven Gebrauch heute unterstützen OOP. Einige von ihnen erfordern sogar Sie, um in einem OOP -Stil zu arbeiten. PHP ist etwas lockerer und überlässt es dem Entwickler, zu entscheiden, ob sie ihre Skripte im OOP -Stil schreiben oder nicht.
Bisher haben wir unseren PHP -Code in einem einfacheren Stil mit dem Namen Procedural Programing geschrieben, und wir werden dies vorerst weiterhin tun, mit einem detaillierteren Blick auf Objekte später. Der prozessuale Stil ist gut für die relativ einfachen Projekte geeignet, die wir momentan angehen. Fast alle komplexen Projekte, die Sie mit OOP verwenden, werde ich später in diesem Buch detaillierter behandelt.
, dass die PDO-Erweiterung, mit der wir eine MySQL-Datenbank herstellen und mit einer MySQL-Datenbank arbeiten werden, im objektorientierten Programmierstil entwickelt wurde. Dies bedeutet, dass wir zunächst ein PDO -Objekt erstellen müssen, das unsere Datenbankverbindung darstellt, und dann die Funktionen von verwenden dieses Objekt, mit der Datenbank zu arbeiten.
Erstellen eines Objekts ähnelt dem Aufruf einer Funktion. Tatsächlich haben Sie bereits gesehen, wie es geht:
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Das neue Schlüsselwort sagt PHP, dass Sie ein neues Objekt erstellen möchten. Anschließend hinterlassen Sie einen Speicherplatz und geben einen Klassennamen an, der PHP mitteilt, welche Art von Objekt Sie erstellen möchten. Eine Klasse ist eine Reihe von Anweisungen, die PHP befolgen wird, um ein Objekt zu erstellen. Sie können sich eine Klasse als ein Rezept vorstellen, z. B. für einen Kuchen und ein Objekt, das der eigentliche Kuchen ist, der aus der Befolgung des Rezepts hergestellt wird. Verschiedene Klassen können unterschiedliche Objekte produzieren, ebenso wie verschiedene Rezepte unterschiedliche Gerichte produzieren.
So wie PHP mit einer Reihe von integrierten Funktionen ausgestattet ist, die Sie aufrufen können, verfügt PHP mit einer Bibliothek von Klassen, aus denen Sie Objekte erstellen können. Neues PDO fordert PHP daher an, ein neues PDO-Objekt zu erstellen-dh ein neues Objekt der integrierten PDO-Klasse.
In PHP ist ein Objekt ein Wert, genau wie eine Zeichenfolge, Zahl oder ein Array. Sie können ein Objekt in einer Variablen speichern oder es an eine Funktion als Argument übergeben - das gleiche Zeug, das Sie mit anderen PHP -Werten tun können. Objekte haben jedoch einige nützliche zusätzliche Funktionen.
Zuallererst verhält sich ein Objekt wie ein Array sehr ähnlich, da es als Container für andere Werte fungiert. Wie wir in Kapitel 2 gesehen haben, können Sie in einem Array auf einen Wert zugreifen, indem Sie seinen Index angeben (z. B. $ Geburtstage ['Kevin']). Wenn es um Objekte geht, sind die Konzepte ähnlich, aber die Namen und der Code sind unterschiedlich. Anstatt auf den in einem Array -Index gespeicherten Wert zugreifen zu können, greifen wir zu, dass wir auf eine Eigenschaft des Objekts zugreifen. Anstatt quadratische Klammern zu verwenden, um den Namen der Eigenschaft anzugeben, auf die wir zugreifen möchten, verwenden wir Arrow Notation (->)-beispielsweise $ myObject-> seltsamer:
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
, während Arrays normalerweise verwendet werden, um eine Liste von ähnlichen -Werten (z. die Eigenschaften einer Datenbankverbindung). Wenn dies alles sind, gäbe es nicht viel auf sie: Wir könnten genauso gut ein Array verwenden, um diese Werte zu speichern, oder? Natürlich tun Objekte mehr. Zusätzlich zur Speicherung einer Sammlung von Eigenschaften und ihren Werten können Objekte eine Gruppe von Funktionen enthalten, die uns nützlichere Funktionen bieten. Eine in einem Objekt gespeicherte Funktion wird als Methode bezeichnet (einer der verwirrenderen Namen in der Programmierwelt, wenn Sie mich fragen). Eine Methode ist nur eine Funktion in einer Klasse. Wenn wir unsere eigenen Klassen schreiben, werden Methoden mit dem Schlüsselwort der Funktion definiert! Sogar erfahrene Entwickler verwenden oft fälschlicherweise
Funktionund Methode austauschbar. Um eine Methode aufzurufen, verwenden wir erneut die Arrow-Notation-$ myObject-> somemethod ():
Genau wie eigenständige Funktionen können Methoden Argumente annehmen und Werte zurückgeben.
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')
In diesem Stadium klingt dies wahrscheinlich alles etwas kompliziert und sinnlos, aber vertrauen Sie mir: Zusammenlegen von Variablensammlungen (Eigenschaften) und Funktionen (Methoden) in kleine Bündel, die als Objekte bezeichnet werden, führt zu viel ordentlicher und leichter zu lesen Code für bestimmte Aufgaben - Arbeiten mit einer Datenbank nur einer davon. Eines Tages möchten Sie sogar benutzerdefinierte Klassen entwickeln, mit denen Sie Objekte für Ihre eigene Entwicklung erstellen können.
Im Moment bleiben wir jedoch bei den Klassen, die in PHP enthalten sind. Arbeiten wir weiter mit dem von uns erstellten PDO -Objekt zusammen und sehen, was wir tun können, indem wir eine seiner Methoden aufrufen.
Konfigurieren der Verbindung
Unter der Annahme, dass die Verbindung erfolgreich ist, müssen Sie sie jedoch vor der Verwendung konfigurieren. Sie können Ihre Verbindung konfigurieren, indem Sie einige Methoden Ihres neuen PDO -Objekts aufrufen.
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser', 'mypassword');
Bevor Sie Abfragen an die Datenbank senden, müssen wir die Zeichencodierung unserer Datenbankverbindung konfigurieren. Wie ich in Kapitel 2 kurz erwähnt habe, sollten Sie in Ihren Websites den utf-8-codierten Text verwenden, um den Bereich der Charaktere zu maximieren, die Benutzer beim Ausfüllen von Formularen auf Ihrer Website zur Verfügung stehen. Wenn PHP eine Verbindung zu MySQL herstellt, wird standardmäßig die einfachere ISO-8859-1 (oder Latin-1) -Codierung anstelle von UTF-8 verwendet. Wenn wir es so lassen würden, wie es ist, können wir nicht leicht chinesische, arabische oder nicht englische Charaktere einfügen.
Auch wenn Sie zu 100% sicher sind, dass Ihre Website nur von englischen Sprechern verwendet wird, gibt es andere Probleme, indem Sie den Zeichensatz nicht festlegen. Wenn Ihre Webseite nicht auf UTF-8 eingestellt ist, werden Sie Probleme begegnen, wenn Leute bestimmte Zeichen wie lockige Zitate in ein Textfeld schreiben, da sie in der Datenbank als anderes Zeichen angezeigt werden.
Daher müssen wir jetzt unser neues PDO-Objekt so festlegen, dass die UTF-8-Codierung verwendet wird.
Wir können PHP anweisen, UTF-8 zu verwenden, wenn Sie die Datenbank abfragen, indem Sie anhängen; charSet = utf8mb4 in die Verbindungszeichenfolge. Dies gibt keine Nachteile, vorausgesetzt, Ihr PHP-Skript wird auch als UTF-8 an den Browser gesendet (was in den letzten PHP-Versionen die Standardeinstellung ist):
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Hinweis: Wenn Sie suchen, finden Sie verschiedene Möglichkeiten, den Charset festzulegen, und frühere Ausgaben dieses Buches haben Sie angewiesen, diesen Code zu verwenden:
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')
Dies liegt daran, dass die Zeichenoption bis zum Php 5.3.6 nicht korrekt von PHP angewendet wurde. Da dies in einer PHP -Version festgelegt ist, die Sie tatsächlich verwenden werden, ist das Einstellen des Zeichensets als Teil der Verbindungszeichenfolge die bevorzugte Option.
Der vollständige Code, mit dem wir eine Verbindung zu MySQL herstellen und diese Verbindung anschließend konfigurieren, ist daher unten angezeigt.
Beispiel: Mysql-Connect-Complete
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser', 'mypassword');
starten Sie dieses Beispiel in Ihrem Browser. (Wenn Sie Ihren Datenbankcode in index.php im öffentlichen Verzeichnis und in der Datei output.html.php im Vorlagenverzeichnis platziert haben, ist die URL für die Seite https://v.je/.)
Wenn Ihr Server in Betrieb ist und alles ordnungsgemäß funktioniert, sollten Sie eine Nachricht sehen, die den Erfolg anzeigt.
Wenn PHP keine Verbindung zu Ihrem MySQL -Server herstellen kann oder wenn der von Ihnen angegebene Benutzername und Kennwort falsch sind, sehen Sie stattdessen einen ähnlichen Bildschirm wie unten gezeigt. Um sicherzustellen, dass Ihr Fehlerhandlingscode ordnungsgemäß funktioniert, möchten Sie Ihr Passwort möglicherweise absichtlich falsch geschrieben, um ihn zu testen.
Dank unseres Fangblocks wurde die Fehlermeldung aus der Datenbank auf der Seite enthalten:
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Die Methode getMessage () gibt eine Nachricht zurück, die die Ausnahme beschreibt. Es gibt einige andere Methoden - einschließlich GetFile () und getline () -, um den Dateinamen und die Zeilennummer zurückzugeben, die die Ausnahme ausgelöst wurde. Sie können eine sehr detaillierte Fehlermeldung wie folgt erstellen:
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')
Dies ist unglaublich nützlich, wenn Sie eine große Website mit Dutzenden von Include -Dateien haben. In der Fehlermeldung wird genau angegeben, in welcher Datei Sie nachsehen sollen und in welcher Zeile der Fehler aufgetreten ist.
Wenn Sie neugierig sind, geben Sie einige andere Fehler in Ihren Datenbankverbindungscode ein (z. B. einen falsch geschriebenen Datenbanknamen) und beobachten Sie die detaillierten Fehlermeldungen, die Ergebnis sind. Wenn Sie fertig sind und Ihre Datenbankverbindung korrekt funktioniert, kehren Sie zur einfachen Fehlermeldung zurück. Auf diese Weise werden Ihre Besucher nicht mit technischem Gobbledygook bombardiert, wenn ein echtes Problem mit Ihrem Datenbankserver auftritt.
Mit einer festgelegten Verbindung und einer ausgewählten Datenbank können Sie mit den in der Datenbank gespeicherten Daten beginnen.
Sie fragen sich vielleicht, was mit der Verbindung mit dem MySQL -Server passiert, nachdem das Skript ausgeführt wurde. Wenn Sie wirklich möchten, können Sie PHP zum Trennen des Servers zwingen, indem Sie das PDO -Objekt abwerfen, das Ihre Verbindung darstellt. Sie tun dies, indem Sie die Variable mit dem Objekt auf null einstellen:
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser', 'mypassword');
, so heißt es, dass PHP alle offenen Datenbankverbindungen automatisch schließt, wenn es ausgeführt wird, dass Ihr Skript ausgeführt wird, sodass Sie normalerweise nur PHP nach Ihnen aufräumen können.
In Kapitel 3 haben wir mit dem MySQL -Datenbankserver mithilfe von MySQL Workbench verbunden, mit der wir SQL -Abfragen (Befehle) eingeben und die Ergebnisse dieser Abfragen sofort anzeigen konnten. Das PDO -Objekt bietet einen ähnlichen Mechanismus - die Exec -Methode:
try { ⋮ do something risky } catch (ExceptionType $e) { ⋮ handle the exception }
$ query ist eine Zeichenfolge, die die SQL -Abfrage enthält, die Sie ausführen möchten.
Wie Sie wissen, wird diese Methode eine PDOException, damit Sie in Ihrer SQL -Abfrage einen Schreibfehler gemacht haben, wenn Sie ein Problem mit der Ausführung der Abfrage ausführen (z.
Betrachten Sie das folgende Beispiel, in dem versucht wird, die in Kapitel 3 erstellte Witztabelle zu produzieren,Beispiel: Mysql-create
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';
Stattdessen habe ich mich für die gleiche Versuchsanweisung entschieden, sowohl die Verbindung als auch die Abfrage zu enthalten. Der Versuch… Catch Block hört auf, Code auszuführen, sobald ein Fehler auftritt. Wenn also während der Datenbankverbindung ein Fehler auftritt Eine Verbindung muss hergestellt worden sein.
Dieser Ansatz gibt uns etwas weniger Kontrolle über die angezeigte Fehlermeldung, speichert jedoch eine Versuch, die Anweisung für jeden Datenbankvorgang zu tippen. Später in diesem Buch werden wir diese in verschiedene Blöcke zerlegen, aber im Moment alle Datenbankvorgänge im selben Try -Block behalten.
In diesem Beispiel wird auch die GetMessage -Methode verwendet, um eine detaillierte Fehlermeldung aus dem MySQL -Server abzurufen. Das folgende Bild zeigt den Fehler, der angezeigt wird, wenn beispielsweise die Witztabelle bereits vorhanden ist.
Für das Löschen, Einfügen und Aktualisieren von Abfragen (die zur Änderung gespeicherter Daten dienen) gibt die EXEC -Methode die Anzahl der von der Abfrage betroffenen Tabellenzeilen (Einträge) zurück. Betrachten Sie den folgenden SQL -Befehl, den wir in Kapitel 3 verwendet haben, um die Daten aller Witze festzulegen, die das Wort „Programmierer“ enthielten.
Beispiel: Mysql-update
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Durch Speichern des von der EXEC -Methode in $ betroffenen ROWS zurückgegebenen Wert können wir die Variable in der $ -Ausgangsvariablen für das Drucken in der Vorlage verwenden.
Das Bild unten zeigt die Ausgabe dieses Beispiels, vorausgesetzt, es gibt nur einen „Programmierer“ -Witz in Ihrer Datenbank.
Wenn Sie die Seite aktualisieren, um dieselbe Abfrage erneut auszuführen, sollten Sie die Nachrichtenänderung sehen, wie im folgenden Bild gezeigt. Es zeigt an, dass keine Zeilen aktualisiert wurden, da das neue Datum, das auf die Witze angewendet wird
Ausgewählte Abfragen werden etwas anders behandelt, da sie viele Daten abrufen können, und PHP bietet Möglichkeiten, diese Informationen zu bewältigen.
Handhabung Auswählen von Ergebnismengen
Die Abfragemethode sieht genau wie EXEC aus, als sie eine SQL -Abfrage als Argument akzeptiert, das an den Datenbankserver gesendet werden soll. Was es jedoch zurückgibt, ist ein Pdostatement -Objekt, das eine Ergebnismenge mit einer Liste aller Zeilen (Einträge) darstellt, die aus der Abfrage zurückgegeben wurden:
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')
Ich habe in Kapitel 2 bereits erwähnt, dass die while -Schleife eine nützliche Kontrollstruktur ist, wenn wir schleifen müssen, aber nicht wie oft wissen. Wir können keine für die Schleife verwenden, da wir nicht wissen, wie viele Aufzeichnungen die Abfrage zurückgegeben haben. In der Tat könnten Sie hier eine Weile Schleife verwenden, um die Zeilen im Ergebnis einzelnen einzeln zu verarbeiten:
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Die Bedingung für die while -Schleife unterscheidet sich wahrscheinlich von den Bedingungen, an die Sie gewohnt sind. Lassen Sie mich also erklären, wie es funktioniert. Betrachten Sie die Bedingung als eine Aussage von selbst:
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')
Die Fetch -Methode des Pdostatement -Objekts gibt die nächste Zeile im Ergebnis als Array zurück (wir haben Arrays in Kapitel 2 besprochen). Wenn die Ergebnismenge keine Zeilen mehr gibt, gibt Fetch stattdessen false zurück. (Dies ist ein Fall, in dem ein PDO -Objekt auffordert . Nun, die obige Anweisung weist der $ row -Variablen einen Wert zu, aber gleichzeitig nimmt die Anweisung als Ganzes denselben Wert an. Mit diesem können Sie die Anweisung als Bedingung in der while -Schleife verwenden. Da eine Weile die Schleife weiterhin schleifen, bis deren Zustand auf False bewertet wird, tritt diese Schleife so oft auf, wie es Zeilen im Ergebnis -Set gibt, wobei $ row den Wert der nächsten Zeile jedes Mal annimmt, wenn die Schleife ausgeführt wird. Es bleibt nur noch herauszufinden, wie die Werte bei jedem Ausführen der Schleife aus der Variablen $ row abgerufen werden können.
Zeilen eines von Fetch zurückgegebenen Ergebniszeilens werden als assoziative Arrays dargestellt, wobei die nach den Tabellenspalten benannten Indizes im Ergebnissatz benannt sind. Wenn $ row eine Zeile in unserem Ergebnis -Set ist, ist $ row ['jokeText'] der Wert in der Spalte von Joketext dieser Zeile.Unser Ziel in diesem Code ist es, den Text aller Witze zu speichern, damit wir sie in einer PHP -Vorlage anzeigen können. Der beste Weg, dies zu tun, besteht darin, jeden Witz als neuer Artikel in einem Array zu speichern, $ Witze:
Wenn die Witze aus der Datenbank herausgezogen sind, können wir sie jetzt an eine PHP -Vorlagen -Witze übergeben.html.php.
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser', 'mypassword');
Die Variable $ witze ist ein Array, das eine Liste von Witzen speichert. Wenn Sie den Inhalt des Arrays in PHP ausgeschrieben haben, würde es ungefähr so aussehen:
try { ⋮ do something risky } catch (ExceptionType $e) { ⋮ handle the exception }
Die Daten wurden jedoch aus der Datenbank abgerufen, anstatt manuell in den Code tippt.
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';
In der Vorlage von wokes.html.php müssen wir den Inhalt des $ -Cookes -Array oder die in der $ -Fehlervariablen enthaltene Fehlermeldung anzeigen.
Um zu überprüfen, ob eine Variable ein Wert zugewiesen wurde oder nicht, können wir die ISSET -Funktion verwenden, die wir zuvor zur Überprüfung verwendet haben, ob ein Formular eingereicht wurde. Die Vorlage kann eine IF -Anweisung enthalten, um festzustellen, ob der Fehler oder die Liste der Witze angezeigt werden soll:
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Hier gibt es nichts Neues, als die Witze anzuzeigen, wir müssen den Inhalt des $ -Cookes -Arrays anzeigen. Im Gegensatz zu anderen Variablen, die wir bis zu diesem Zeitpunkt verwendet haben, enthält das $ -Cokes -Array mehr als nur einen einzelnen Wert.
Die häufigste Möglichkeit, ein Array in PHP zu verarbeiten, besteht darin, eine Schleife zu verwenden. Wir haben bereits während Schleifen und für Schleifen gesehen. Die Foreach -Schleife ist besonders hilfreich für die Verarbeitung von Arrays:
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')
Anstelle einer Bedingung enthalten die Klammern oben in einer Foreach -Schleife ein Array, gefolgt vom Schlüsselwort AS und dann des Namens einer neuen Variablen, mit der jedes Element des Arrays nacheinander gespeichert wird. Der Körper der Schleife wird dann für jedes Element im Array einmal ausgeführt. Jedes Mal, wenn dieses Element in der angegebenen Variablen gespeichert ist, damit der Code direkt darauf zugreifen kann.
Es ist üblich, eine Foreach -Schleife in einer PHP -Vorlage zu verwenden, um jedes Element eines Arrays nacheinander anzuzeigen. So könnte dies nach unserem $ -Cokes -Array suchen:
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser', 'mypassword');
Mit dieser Mischung aus PHP -Code, um den Loop- und HTML -Code zum Anzeigen zu beschreiben, sieht der Code ziemlich unordentlich aus. Aus diesem Grund ist es üblich, eine alternative Art zum Schreiben der Foreach -Schleife zu verwenden, wenn sie in einer Vorlage verwendet wird:
try { ⋮ do something risky } catch (ExceptionType $e) { ⋮ handle the exception }
Die beiden Code -Teile sind funktional identisch, aber letzteres sieht beim Mischen mit HTML -Code freundlicher aus. So sieht diese Form des Codes in einer Vorlage aus:
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';
Das Gleiche kann mit der IF -Anweisung erfolgen, so
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';
Beispiel: Mysql-listJokes
<!doctype html> <html> <head> <meta charset="utf-8"> <title>Script Output</title> </head> <body> <?php echo $output; ?> </body> </html>
) angezeigt, der in einem Block -Zitat (
) enthalten ist, da wir den Autor eines jeden Witzes in diesem Witz effektiv zitieren Seite.Weil Witze möglicherweise möglicherweise Zeichen enthalten, die als HTML -Code interpretiert werden könnten (z. B. oder &), müssen wir HTMLSpecialChars verwenden, um sicherzustellen ; und & amp;) damit sie richtig angezeigt werden.
Das folgende Bild zeigt, wie diese Seite aussieht, wenn Sie der Datenbank ein paar Witze hinzugefügt haben.
Erinnern Sie sich, wie wir eine Weile in unserem Controller eine Weile verwendet haben, um die Zeilen aus dem PDOSTATEMENT -Ergebnis herauszuholen.
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenEs stellt sich heraus, dass Pdostatement -Objekte so konzipiert sind, dass sie sich genauso wie Arrays verhalten, wenn Sie sie an einen Foreach -Schleifen übergeben. Sie können Ihren Datenbankverarbeitungscode daher mit einer Foreach -Schleife anstelle einer Weile -Schleife geringfügig vereinfachen:
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenIch werde diese ordinere Foreach -Form im Rest dieses Buches verwenden.
Ein weiteres ordentliches Werkzeug, das PHP bietet, ist eine Abkürzung, um den Echo -Befehl anzurufen - was wir, wie Sie bereits gesehen haben, häufig verwenden müssen. Unsere Echo -Aussagen sehen so aus:
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser', 'mypassword');Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenStattdessen können wir dies verwenden:
try { ⋮ do something risky } catch (ExceptionType $e) { ⋮ handle the exception }Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenDas tut genau dasselbe. = bedeutet Echo und gibt Ihnen eine etwas kürzere Möglichkeit, Variablen zu drucken. Dies ist jedoch eine Einschränkung: Wenn Sie = Verwenden, können Sie nur drucken. Sie können nicht einfügen, ob Aussagen, für Aussagen usw., obwohl Sie eine Verkettung verwenden können, und dies kann von einem Funktionsaufruf folgen.
Hier ist eine aktualisierte Vorlage mit dem Shorthand Echo.
Beispiel: Mysql-listJokes-rot.
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';Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenIch werde die Kurznotation verwenden, wenn sie ab diesem Zeitpunkt anwendbar ist.
Hinweis: In Versionen von PHP vor 5.4 erforderte diese Kurzbeschreibung eine ziemlich ungewöhnliche PHP -Einstellung, um dies zu aktivieren, sodass sie aus Kompatibilitätsgründen entmutigt wurde. Die Verwendung der Kurznotation hat möglicherweise dazu geführt, dass Ihr Code nicht mehr funktioniert, wenn Sie sich von einem Server bewegt, der ihn aktiviert hat, der dies nicht getan hat.
Ab PHP 5.4 (also jede Version, auf die Sie heutzutage realistisch begegnen werden), funktioniert das Kurzstift -Echo unabhängig von PHP .
Voraus denken
In dem Beispiel, das wir uns gerade angesehen haben, haben wir eine Vorlage erstellt, jokes.html.php, die alle HTML enthält, die für die Anzeige der Seite erforderlich sind. Wenn unsere Website wächst, werden wir jedoch weitere Seiten hinzufügen. Wir möchten auf jeden Fall eine Seite, damit die Leute der Website Witze hinzufügen können, und wir benötigen auch eine Homepage mit Einführungstext, eine Seite mit den Kontaktdetails des Besitzers und, wenn die Website wächst, vielleicht sogar Eine Seite, auf der Personen sich an der Website anmelden können.
Ich springe hier einiges voran, aber es lohnt sich immer, darüber nachzudenken, wie ein Projekt wachsen wird. Wenn wir den Ansatz anwenden, den wir gerade für jokes.html.php auf den Rest der Vorlagen verwendet haben - addjoke.html.php, home.html.php, contact.html.php, login.html.php usw. ll endet mit vielen wiederholten Code.
Auf jeder Seite auf der Website ist eine Vorlage erforderlich, die ungefähr so aussieht:
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';Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenAls Programmierer ist es eines der schlimmsten Dinge, die Sie tun können. Tatsächlich beziehen sich Programmierer oft auf das Trockenprinzip, das für "nicht wiederholt" steht. Wenn Sie die Codeabschnitte wiederholen, gibt es mit ziemlicher Sicherheit eine bessere Lösung.
Alle besten Programmierer sind faul, und der Wiederholungscode bedeutet, die Arbeit zu wiederholen. Durch die Verwendung dieses Kopier-/Einfügen -Ansatzes für Vorlagen ist die Website sehr schwierig zu warten. Stellen wir uns vor, es gibt eine Fußzeile und einen Navigationsbereich, den wir auf jeder Seite erscheinen möchten. Unsere Vorlagen würden jetzt so aussehen:
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenwir werden 2022 auf ein Problem stoßen! Wenn die Vorlagen für alle Seiten auf der Website - beispielsweise jokes.html.php addjoke.html.php, home.html.php, contact.html.php andlogin.html.php - enthalten Code in der obigen Struktur enthalten Aktualisieren Sie das Jahr in der Copyright -Mitteilung auf „2022“, die Sie jeden Vorlagen öffnen und das Datum ändern müssen.
Wir könnten klug sein und das Datum dynamisch aus der Uhr des Servers (Echo -Datum ('Y') lesen; wenn Sie neugierig sind!), Um dieses Problem zu vermeiden, aber was ist, wenn wir ein
-Tag hinzufügen wollten das war auf jeder Seite enthalten? Oder fügen Sie einen neuen Link zum Menü hinzu? Wir müssten noch jede Vorlagendatei öffnen und sie ändern! fünf oder sechs Vorlagen ändern, kann etwas ärgerlich sein, aber es wird kein großes Problem darstellen. Was ist jedoch, wenn die Website auf Dutzende oder Hunderte von Seiten wächst? Jedes Mal, wenn Sie einen Link zu dem Menü hinzufügen möchten, müssen Sie jede einzelne Vorlage öffnen und ändern.
Dieses Problem könnte mit einer Reihe von Include -Aussagen gelöst werden. Zum Beispiel:
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenAber diese Methode erfordert Hellseherdienste: Wir müssen genau vorhersehen, welche Änderungen möglicherweise in Zukunft vorgenommen werden müssen, und relevante Einfügungsanweisungen an den Orten, die von uns vorhersehen, werden vorhersehen.
In dem obigen Beispiel ist es beispielsweise einfach, neue Menüeinträge hinzuzufügen, indem sie nav.html.php hinzugefügt werden. Hinzufügen eines <script> -Tags zu jeder Seite oder sogar etwas so Triviales wie das Hinzufügen einer CSS -Klasse zu Hinzufügen zu Das NAV -Element bedeutet immer noch, jede Vorlage zu öffnen, um die Änderung vorzunehmen. </script>
Es gibt keine Möglichkeit, alle Änderungen, die möglicherweise im Laufe der Lebensdauer der Website benötigt werden, genau vorherzusagen. Stattdessen ist der Ansatz, den ich Ihnen zu Beginn dieses Kapitels gezeigt habe
Wenn wir diese Vorlage immer einfügen, die wir layout.html.php aufrufen werden, ist es möglich, die $ Ausgangsvariable auf einige$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser', 'mypassword');Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenHTML -Code festzulegen und sie mit der Navigation und der Navigation und auf der Seite erscheinen zu lassen. Fußzeile. Der Vorteil davon ist, dass wir es nur an einem Ort ändern müssen, um das Datum auf jeder Seite der Website zu ändern.
Ich habe mich auch in eine $ -Tit -Variable geschlichen, sodass jeder Controller einen Wert definieren kann, der zwischen den Tagsund zusammen mit einigen CSS (verfügbar als Witze.css im Beispielcode) zum Erstellen von CSS erscheint die Seite ein wenig schöner.
Jeder Controller kann jetzt verwenden, einschließlich __dir__. '/../templates/layout.html.php'; und Werte für $ output und $ title.
unsere jokes.php mit layout.html.php wird wie unten gezeigt codiert.
Beispiel: Mysql-listJokes-layout-1
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenAber warte! Was ist mit $ Output im Try -Block los? Die Variable $ output enthält tatsächlich einen HTML -Code: Die Schleife erstellt eine Zeichenfolge, die den HTML -Code für die Jokes -Liste enthält.
Grundsätzlich möchten wir das passieren: Die $ Ausgangsvariable enthält den HTML -Code, der zwischen der Navigation und der Fußzeile im Layout.html.php eingefügt wird, aber ich denke, Sie werden zustimmen, dass der Code der Code ist unglaublich hässlich.
Ich habe Ihnen bereits gezeigt, wie Sie das Mischen von HTML- und PHP -Code über die Anweisung vermischen. Wie wir zuvor waren es gut, die HTML für die Anzeige der Witze in seine eigene Datei zu verschieben - diesmal jedoch nur der HTML -Code, der für die Seite der Witzliste eindeutig ist.
jokes.html.php im Vorlagenverzeichnis sollte diesen Code enthalten:
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenWichtig ist, dass dies nur der Code für die Anzeige der Witze ist. Es enthält nicht die Navigation, die Fußzeile,
Tag oder irgendetwas, das wir auf jeder Seite wiederholen möchten. Es ist nur der HTML -Code, der für die Seite der Witzliste eindeutig ist.Um diese Vorlage zu verwenden, können Sie Folgendes versuchen:
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser', 'mypassword');Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenoder wenn Sie sehr klug sind:
try { ⋮ do something risky } catch (ExceptionType $e) { ⋮ handle the exception }Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenMit diesem Ansatz wäre Ihre Logik völlig gesund. Wir müssen Witze einbeziehen.html.php. Leider führt die Include -Anweisung nur den Code aus der enthaltenen Datei an dem angerufenen Punkt aus. Wenn Sie den obigen Code ausführen, ist die Ausgabe tatsächlich so etwas:
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';Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenWeil Witze.html.php zuerst enthalten sind, wird es zuerst an den Browser gesendet. Was wir tun müssen, ist das Laden von Witzen.html.php, aber anstatt die Ausgabe direkt an den Browser zu senden, müssen wir sie erfassen und in der $ -Ausgangsvariablen speichern, damit sie später durch Layout.html.php verwendet werden kann .
Die Include -Anweisung gibt keinen Wert zurück, daher $ output = include 'jokes.html.php'; hat nicht den gewünschten Effekt und PHP hat keine alternative Aussage dazu. Das bedeutet jedoch nicht, dass es nicht möglich ist.
PHP verfügt über eine nützliche Funktion namens "Ausgangspufferung". Es mag kompliziert klingen, aber das Konzept ist tatsächlich sehr einfach: Wenn Sie Echo verwenden, um etwas zu drucken oder eine Datei mit HTML einzuschließen, wird es normalerweise direkt an den Browser gesendet. Durch die Verwendung der Ausgabepufferung wird der HTML -Code in einem "Puffer" auf dem Server auf dem Server gespeichert, der im Grunde genommen nur eine Zeichenfolge enthält, die bisher gedruckt wurde.
Noch besser, mit PHP können Sie den Puffer einschalten und seinen Inhalt jederzeit lesen.Es gibt zwei Funktionen, die wir brauchen:
- ob_start (), das den Ausgangspuffer startet. Nach dem Aufrufen dieser Funktion wird alles, was über Echo oder HTML gedruckt wird, das über Include gedruckt wird, in einem Puffer und nicht an den Browser gesendet.
- ob_get_clean (), der den Inhalt des Puffers zurückgibt und es löscht.
Wie Sie wahrscheinlich vermutet haben, steht "OB" in den Funktionsnamen für "Ausgabepuffer".
Um den Inhalt einer enthaltenen Datei zu erfassen, müssen wir nur diese beiden Funktionen verwenden:
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenWenn dieser Code ausgeführt wird, enthält die $ Ausgangsvariable die HTML, die in der Witze.html.php -Vorlage generiert wurde.
Wir werden diesen Ansatz von nun an verwenden. Jede Seite besteht aus zwei Vorlagen:
- layout.html.php, das alle gemeinsamen HTML enthält, die von jeder Seite
benötigt werden.- Eine eindeutige Vorlage, die nur den HTML -Code enthält, der für diese bestimmte Seite eindeutig ist
Die kompletten Witze.php sieht so aus:
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenLassen Sie uns den Link "Home" durch Hinzufügen einer Index.Php -Datei funktionieren. Wir könnten alles auf diese Seite setzen: die neuesten Witze, der beste Witz des Monats oder was auch immer wir mögen. Im Moment halten wir es einfach und haben nur eine Nachricht mit der Aufschrift "Willkommen in der Internet -Witz -Datenbank".
Erstellen Sie eine Datei namens Home.html.php im Vorlagenordner:
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser', 'mypassword');Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenunser index.php ist wesentlich einfacher als witze.html.php. Es wird keine Informationen aus der Datenbank enthält, daher benötigt sie keine Datenbankverbindung und wir benötigen keine Versuch ... Catch -Anweisung, daher laden wir einfach die beiden Vorlagen und setzen die Variablen $ title und $ output .
Beispiel: Mysql-listJokes-layout-3
try { ⋮ do something risky } catch (ExceptionType $e) { ⋮ handle the exception }Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenHinweis: Es ist eine gute Praxis, nur dann eine Verbindung zur Datenbank herzustellen. Datenbanken sind auf vielen Websites der häufigste Leistungs Engpass. Daher ist es bevorzugt, so wenige Verbindungen wie möglich herzustellen.
Test, dass beide Seiten in Ihrem Browser arbeiten. Sie sollten eine Liste von Witzen sichtbar lassen, wenn Sie https://v.je/jokes.php und die Begrüßungsnachricht unter https://v.je/jokes.php besuchen. Beide Seiten sollten die Navigation und die Fußzeile enthalten.
Versuchen Sie, das Layout zu ändern. Die Änderungen, die Sie vornehmen, werden auf beiden Seiten angezeigt. Wenn die Website Dutzende von Seiten hätte, würde sich Änderungen am Layout auf jede Seite auswirken.
Daten in die Datenbank einfügen
In diesem Abschnitt werde ich demonstrieren, wie Sie die Ihnen zur Verfügung stehenden Tools verwenden, damit die Site -Besucher der Datenbank ihre eigenen Witze hinzufügen können.
Wenn Sie Ihre Website -Besucher neue Witze eingeben lassen möchten, benötigen Sie offensichtlich ein Formular. Hier ist eine Vorlage für ein Formular, das zur Rechnung passt:
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';Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenspeichern Sie dies als addjoke.html.php im Vorlagenverzeichnis.
Der wichtigste Teil des
Das obige ist der detaillierte Inhalt vonAnzeigen von Daten von MySQL im Web: Eine Einführung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!