Grundlagen der PHP Programmierung von Jan Teriete Art.-Nr. 011744130 Version 3.1.2 vom 18.10.2013 Autorisiertes Curriculum für das Webmasters Europe Ausbildungs- und Zertifizierungsprogramm © 2012 by Webmasters Press www.webmasters-press.de Nordostpark 7, 90411 Nürnberg, Germany Das vorliegende Fachbuch ist urheberrechtlich geschützt. Alle Rechte vorbehalten. Die Verwendung der Texte und Abbildungen, auch auszugsweise, ist ohne schriftliche Genehmigung des Verlags urheberrechtswidrig und daher strafbar. Dies gilt insbesondere für die Vervielfältigung, Übersetzung oder Verwendung in elektronischen Systemen sowie für die Verwendung in Schulungsveranstaltungen. Die Informationen in diesem Fachbuch wurden mit größter Sorgfalt erarbeitet. Trotzdem können Fehler nicht vollständig ausgeschlossen werden. Autoren und Herausgeber übernehmen keine juristische Verantwortung oder irgendeine Haftung für eventuell verbliebene fehlerhafte Angaben und deren Folgen. Informationen zu dieser Buchreihe Dieses Buch ist Teil unserer Buchreihe zum Zertifizierungsprogramm des Europäischen Webmasterverbandes, Webmasters Europe e.V. (WE). Das Webmasters Europe Ausbildungs- und Zertifizierungsprogramm ist modular aufgebaut und bietet Abschlüsse und Zertifizierungen auf verschiedenen Ebenen an – von der ExpertenZertifizierung für einzelne Themen bis hin zu Diploma-Abschlüssen für Webdesigner, WebEntwickler, Webmaster und Online Marketing Manager. Nähere Informationen dazu finden Sie unter http://de.webmasters-europe.org/bildungsprogramm Unsere Buchreihe bietet Ihnen nicht nur eine fundierte und praxisnahe Einführung in das jeweilige Thema, sondern ist von Webmasters Europe e.V. offiziell autorisiert zur Vorbereitung auf die WE-Zertifikatsprüfungen. Damit haben Sie die Garantie, dass alle prüfungsrelevanten Themen behandelt werden. Inhaltsverzeichnis 1 2 3 Einführung 17 1.1 1.2 1.3 1.3.1 1.3.2 1.3.3 1.3.4 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.5 17 Für wen dieses Lernheft gedacht ist Vorkenntnisse Aufbau des Lernhefts Code-Listings im Text Testen Sie Ihr Wissen Aufgaben zur Selbstkontrolle Optionale Aufgaben Formale Anforderungen Windows-PC PHP-fähiger Webserver Code-Editor Webbrowser Zusammenfassung 17 18 18 18 18 19 19 19 19 19 20 20 Dynamische Webseiten mit PHP 21 2.1 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.2 2.2.1 2.2.2 2.3 21 Was sind dynamische Webseiten? Statische Webseiten Dynamische Webseiten Vorteile dynamischer Webseiten Nachteile dynamischer Webseiten Die Auslieferung von Webseiten PHP Stärken von PHP Geschichte von PHP Zusammenfassung 21 21 22 22 23 24 24 24 26 HTML und PHP 27 3.1 3.2 3.2.1 3.2.2 3.2.3 3.3 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.4 3.4.1 3.4.2 3.5 3.5.1 27 Das Problem PHP in eine HTML-Seite einbetten Eine statische HTML-Seite erstellen PHP-Code einfügen PHP erzeugt HTML Die sechs berühmten Fehler PHP-Code im HTML-Bereich schreiben HTML-Code im PHP-Bereich schreiben Die PHP-Datei hat die Endung .html Die PHP-Datei liegt nicht im Zugriff des Webservers Die PHP-Datei wurde direkt im Browser geöffnet Die echo-Anweisung fehlt Mehrzeilige PHP-Anweisungen Das Semikolon Mehrzeilige PHP-Anweisungen Stilfragen Saubere Trennung von HTML und PHP 27 27 28 29 29 29 30 30 31 31 31 32 32 33 33 33 3.5.2 3.6 4 5 6 Einrückungen Zusammenfassung 35 36 Variablen und Operatoren 39 4.1 4.2 4.2.1 4.2.2 4.2.3 4.3 4.3.1 4.3.2 4.3.3 4.3.4 4.3.5 4.3.6 4.3.7 4.4 4.4.1 4.4.2 4.4.3 4.4.4 4.4.5 4.5 39 Das Problem Kommentare in PHP einbetten Grundlagen Einzeilige Kommentare Mehrzeilige Kommentare Variablen Grundlagen Benennung von Variablen Der Zuweisungsoperator Zahlen Zeichenketten Der null-Wert Variableninhalte auslesen Operatoren Grundlagen Rechenoperatoren Der Verknüpfungsoperator Kombinierte Operatoren Inkrement und Dekrement-Operatoren Zusammenfassung 39 39 39 40 41 41 41 42 43 43 43 44 44 44 45 46 46 48 48 PHP-Funktionen 51 5.1 5.2 5.3 5.3.1 5.3.2 5.4 5.5 5.5.1 5.5.2 5.5.3 5.6 5.7 5.7.1 5.7.2 5.7.3 5.8 51 Das Problem Aufgabe von Funktionen Funktionen aufrufen Grundlagen Fehlerhafter Funktionsaufruf Parameter an Funktionen übergeben Rückgabewerte von Funktionen Grundlagen Rückgabewerte ausgeben Rückgabewerte in Variablen speichern Funktionen mit mehreren Parametern Die PHP-Funktionsreferenz Grundlagen Suchen und Browsen von php.net Funktionsdefinitionen lesen Zusammenfassung 51 52 52 52 53 54 54 54 55 55 56 56 56 57 60 PHP-Datentypen 62 6.1 6.2 6.3 6.4 6.4.1 6.4.2 6.4.3 62 Das Problem Die Funktion gettype() Null Boolean Grundlagen isset() empty() 62 62 63 63 63 64 6.5 6.5.1 6.5.2 6.5.3 6.6 6.6.1 6.6.2 6.6.3 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.7.5 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.9 6.9.1 6.9.2 6.9.3 6.9.4 6.10 7 Integer Grundlagen is_int() intval() Float/Double Grundlagen is_float() floatval() String Grundlagen Bedeutung der Anführungszeichen is_string() strval() strlen() Weitere Datentypen Grundlagen Array Object Resource Dynamische Typumwandlung Grundlagen Mathematische Operatoren Der Verknüpfungsoperator Nicht-boolesche Wahrheitswerte Zusammenfassung Arrays 7.1 7.2 7.3 7.3.1 7.3.2 7.3.3 7.3.4 7.4 7.4.1 7.4.2 7.5 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.5.8 7.5.9 7.5.10 7.5.11 7.5.12 7.6 66 66 67 68 70 70 70 70 71 71 71 73 73 73 74 74 74 74 74 74 74 74 76 76 77 80 Das Problem Grundlagen Mit Arrays arbeiten Erzeugen mit eckigen Klammern Auslesen von Werten Erzeugen mit explizitem Index Erzeugen mit der array()-Funktion Assoziative Arrays Grundlagen Der Doppelpfeil-Operator (=>) Nützliche Array-Funktionen is_array() count() var_dump() explode() implode() shuffle() in_array() array_reverse() array_keys() array_values() array_pop() array_shift() Zusammenfassung 80 80 80 80 81 82 83 84 84 85 86 86 86 86 87 88 88 89 90 91 92 93 94 94 8 9 10 11 Formulare und Links 97 8.1 8.2 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.5 8.5.1 8.5.2 8.6 97 Das Problem Informationen an PHP-Skripte übergeben Parameter über HTML-Links übergeben Aufbau von URLs URL-Parameter in PHP auslesen Zweck von URL-Parametern Parameter durch HTML-Formulare übergeben Grundlagen Der Form-Tag Formulardaten auslesen Formularelemente Das Array $_REQUEST Grundlagen $_REQUEST oder $_POST? Zusammenfassung 97 97 97 98 100 101 101 101 103 104 112 112 113 113 Funktionsentwurf 116 9.1 9.2 9.2.1 9.2.2 9.2.3 9.3 9.4 9.5 116 Das Problem Funktionen definieren Funktionskopf Funktionskörper Selbstgeschriebene Funktionen aufrufen Funktionen in Funktionen aufrufen Namenskonventionen Zusammenfassung 116 116 117 117 118 118 119 Strukturierung von PHP-Skripten 121 10.1 10.2 10.2.1 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.4.3 10.4.4 10.4.5 10.5 121 PHP-Code strukturieren Dreiteilung des PHP-Codes Grundlagen Namensgebung Variablen Funktionen Auslagern von Funktionen Konzept require_once require include(_once) Namens- und andere Konventionen Zusammenfassung 122 122 126 126 126 127 127 127 128 129 129 131 Verzweigungen 133 11.1 11.2 11.2.1 11.2.2 11.2.3 11.2.4 11.3 11.3.1 133 Das Problem Boolesche Logik Konzept Vergleichsoperatoren Boolesche Ausdrücke modifizieren Wahrheitswerte aus anderen Quellen if-Anweisung Grundlagen 133 133 133 143 148 149 149 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.4.3 11.5 12 13 14 Reine if-Anweisung if-else if-elseif-else Alternativen zur if-Anweisung Grundlagen switch-Anweisung Der Ternäre Operator Zusammenfassung 149 150 151 155 155 155 158 160 Schleifen 163 12.1 12.2 12.3 12.3.1 12.3.2 12.3.3 12.4 12.4.1 12.4.2 12.4.3 12.4.4 12.4.5 12.4.6 12.5 12.5.1 12.5.2 12.6 12.7 163 Das Problem Schleifen foreach-Schleife Grundlagen foreach zur formatierten Ausgabe von HTML Über Schlüssel und Werte iterieren for-Schleife Grundlagen Die Startanweisung Die Abbruchbedingung Der Modifikator Der Schleifenkörper Anwendungen while-Schleife Grundlagen Anwendung Endlos-Schleifen Zusammenfassung 163 164 164 165 166 166 166 167 167 168 168 168 172 172 173 174 174 Funktionen mit Parametern und Rückgabewerten 177 13.1 13.2 13.2.1 13.2.2 13.2.3 13.2.4 13.3 13.3.1 13.3.2 13.3.3 13.3.4 13.4 177 Das Problem Parameter an Funktionen übergeben Geltungsbereiche von Variablen Übergabe von Parametern Übergabe mehrerer Parameter Parameter mit Standardwerten Werte aus einer Funktion zurückgeben Konzept return Einen Wert zurückgeben Mehrere Werte als Array zurückgeben Zusammenfassung 177 177 178 179 181 183 183 183 183 185 185 Mehrdimensionale Arrays 187 14.1 14.2 14.3 14.3.1 14.3.2 14.3.3 14.4 187 Das Problem Konzept Zweidimensionale Arrays Zweidimensionale Arrays erzeugen Zweidimensionale Arrays auslesen Formatierung Mehrdimensionale Arrays 187 187 187 188 188 190 14.5 14.6 15 16 17 Verschachtelte foreach-Schleifen Zusammenfassung 191 194 Stringbehandlung 196 15.1 15.2 15.2.1 15.2.2 15.2.3 15.2.4 15.2.5 15.2.6 15.2.7 15.2.8 15.2.9 15.2.10 15.2.11 15.3 15.3.1 15.3.2 15.3.3 15.3.4 15.3.5 15.3.6 15.4 15.4.1 15.4.2 15.4.3 15.5 15.5.1 15.5.2 15.5.3 15.6 15.7 196 Das Problem Strings formatieren Grundlagen trim() strtoupper() strtolower() ucfirst() lcfirst() htmlspecialchars() strip_tags() nl2br() vprintf() vsprintf() Datum und Uhrzeit formatieren Das Problem Der Timestamp time() strftime() mktime() strtotime() Strings durchsuchen Grundlagen strlen() strpos() Strings bearbeiten Grundlagen substr() str_replace() lcfirst() selbst programmieren Zusammenfassung 196 196 196 197 198 199 200 200 203 204 205 207 208 208 208 209 209 211 214 215 215 215 217 218 218 219 219 222 223 Persistente Daten 226 16.1 16.2 16.2.1 16.2.2 16.3 16.3.1 16.3.2 16.4 16.4.1 16.4.2 16.5 226 Das Problem Dateien als Speichermedium file_put_contents() file_get_contents() Speichern komplexer Datenstrukturen serialize() unserialize() Serialisierte Daten aktualisieren Das Problem Vorgehensweise Zusammenfassung 226 226 227 228 228 229 230 230 231 232 HTTP und PHP-Sessionverwaltung 233 17.1 17.2 233 Das Problem Grundlagen des HTTP-Protokolls 233 17.2.1 17.3 17.3.1 17.3.2 17.3.3 17.4 17.5 17.6 17.6.1 17.6.2 17.6.3 17.7 18 19 Antwort des Servers (Response) Mit PHP HTTP-Header auslesen und manipulieren Grundlagen $_SERVER header() Einschränkungen des HTTP-Protokolls Sessions Die PHP-Sessionverwaltung Sessions eröffnen Daten in Sessions speichern Sessions beenden Zusammenfassung 238 240 240 240 242 244 245 245 245 246 247 249 Einige Tipps und Tricks aus der PHP-Kiste 251 18.1 18.2 18.2.1 18.2.2 18.3 18.3.1 18.3.2 18.3.3 18.4 18.4.1 18.4.2 18.5 251 Das Problem Konstanten Prinzip Anwendung error_reporting() Das Problem Den Fehlerlevel einstellen Fehlermeldungen abschalten Alternative PHP-Syntax für HTML-Templates Warum eine andere Syntax Die Syntax Zusammenfassung 251 251 252 253 253 254 254 255 255 256 256 Wir programmieren einen Weblog 258 19.1 19.1.1 19.1.2 19.1.3 19.2 19.3 19.3.1 19.3.2 19.4 19.4.1 19.4.2 19.4.3 19.4.4 19.5 19.5.1 19.5.2 19.5.3 19.6 19.7 19.7.1 19.7.2 19.7.3 19.7.4 19.8 258 Das Projekt Grundlagen Ein wenig Makeup CSS Die Funktionen Testdaten Benutzer Einträge Die Startseite Inhalt Einträge auslesen Einträge formatiert anzeigen Menü oder Login-Formular Einloggen Inhalt Der Login Weiterleitung per header() Ausloggen Eintrag schreiben Inhalt Logintest Eintrags-Formular Hauptmenü Eintrag speichern 258 258 262 265 266 266 267 269 269 270 270 271 272 272 272 273 273 274 274 275 275 276 276 19.8.1 19.8.2 19.8.3 19.8.4 19.8.5 19.9 20 21 Inhalt Login und POST-Test Eintrag-Array erstellen Neuen Eintrag speichern Eintrag formatiert anzeigen Zusammenfassung 276 277 277 278 278 278 Anhang 1: XAMPP 280 20.1 20.2 20.2.1 20.2.2 20.2.3 20.3 280 Was XAMPP ist Installation Windows Mac OS X Linux Zusammenfassung 281 281 282 282 283 Anhang 2: Die Netbeans-IDE 284 21.1 21.2 21.3 21.4 21.5 21.5.1 21.5.2 21.5.3 21.5.4 21.5.5 21.6 21.6.1 21.6.2 21.6.3 21.6.4 21.6.5 21.6.6 21.7 21.7.1 284 Über Netbeans Installation Installation von Netbeans Netbeans starten Mit Netbeans arbeiten Die Arbeitsfläche Ein Projekt anlegen Einen Ordner anlegen Eine Datei anlegen und editieren Eine Datei im Browser aufrufen Besondere Funktionen Größe von Elementen der Arbeitsfläche ändern Navigator Hervorhebung der Syntax/Fehleranzeige Autovervollständigung Einklappen von Code-Blöcken TODOs schreiben Alternativen zu Netbeans Notepad++ 284 285 286 286 286 286 288 289 291 291 291 291 292 292 293 293 294 295 Lösungen 298 Index 312 1.1 Für wen dieses Lernheft gedacht ist 17 Einführung In dieser Lektion lernen Sie: ➤ die Ziele dieses Lernhefts kennen. ➤ was Sie an Vorwissen mitbringen sollten. ➤ was Sie technisch benötigen, um mit dem Lernheft arbeiten zu können. 1.1 Für wen dieses Lernheft gedacht ist Dieses Lernheft ist für Sie gedacht, wenn Sie lernen wollen, mit PHP Webseiten zu entwickeln. Vielleicht haben Sie schon einige Zeit Erfahrung im Bereich Webdesign gesammelt und wollen nun die Möglichkeiten von PHP nutzen, Ihre Webseiten um Funktionen, wie Foren, Gästebücher, Artikelverwaltung oder auch Bildergalerien zu erweitern. Sie haben wahrscheinlich schon einige Zeit fertige PHP-Skripte verwendet, die Sie zu Hauf im Internet finden können. Zu so ziemlich jedem Themenbereich werden Dutzende von fertigen Programmen angeboten. Ebenso wahrscheinlich werden Sie bemerkt haben, dass diese in den seltensten Fällen genau auf Ihre Situation passen. Das generierte Hauptmenü des CMS-Systems erlaubt nicht die von Ihnen gewünschte Struktur, das Gästebuch bietet nur unzureichenden Schutz vor Spam oder die Bildergalerie Ihrer Wahl lässt sich nur sehr schwer in das Layout Ihrer aktuellen Webseite einbauen. Die meisten Probleme kriegen Sie zwar irgendwie gelöst, es bleibt aber das Gefühl, dass der Schuh an einigen Stellen doch drückt. In diesem Fall sind Sie der ideale Kandidat für dieses Lernheft. Hier werden Sie PHP »von der Pike auf« lernen und sich so in die Lage versetzen, entweder fertige Programme viel leichter anpassen zu können oder die Funktionen gleich selbst zu schreiben. Da dieses Lernheft Ihnen die Grundlagen der PHP-Programmierung vermitteln soll, werde ich natürlich nicht jedes Thema behandeln können, das Sie interessieren könnte. Ich habe mich vielmehr bemüht, solide Grundlagen zu schaffen, so dass Sie am Ende dieses Skriptes selbständig weiterarbeiten und sich auch neue Funktionen von PHP selbst beibringen können. 1.2 Vorkenntnisse Da dieses Lernheft als Einstieg in die PHP-Programmierung gedacht ist, sind die Voraussetzungen für das Durcharbeiten entsprechend gering: ➤ Sie sollten Erfahrung im Umgang mit Ihrem aktuellen Betriebssystem haben. Ich werde Ihnen nicht erklären, wie Sie Dateien und Ordner anlegen, umbenennen oder löschen können. ➤ Sie sollten Erfahrung im Umgang mit Texteditoren haben. ➤ Sie sollten mit dem Webbrowser Ihrer Wahl gut umgehen können und Erfahrung bei der Recherche im Internet (Suchmaschinen) besitzen. 1 18 1 Einführung ➤ Sie sollten solide Grundkenntnisse in HTML haben. Da mit PHP HTML-Seiten erzeugt werden, ist dieses Wissen Voraussetzung für das erfolgreiche Arbeiten. Da wir uns nicht mit Design beschäftigen1, müssen Sie keine tieferen Kenntnisse von CSS mitbringen. ➤ Sie benötigen keine Kenntnisse in anderen Programmiersprachen. Dieses Skript ist dafür geschrieben, PHP als erste Programmiersprache zu lernen. Sollten Sie bereits andere Programmiersprachen beherrschen, wird Ihnen das Durcharbeiten des Lernhefts leichter fallen. Eventuell können Sie einige Abschnitte sogar nur überfliegen. 1.3 Aufbau des Lernhefts 1.3.1 Code-Listings im Text Eventuell sind Sie schon erschrocken, als dieser Wälzer auf Ihrem Schreibtisch gelandet ist. Keine Sorge, der Umfang liegt nicht an der ungeheuren Stoffmenge, die Sie jetzt lernen müssen. Was dieses Skript so umfangreich macht, ist die Menge an Code-Beispielen, die etwa die Hälfte des Umfangs ausmachen. Da Sie nicht durch theoretische Vorträge zu einem guten PHP-Programmierer werden, sondern durch das Lesen und Schreiben von hochwertigem Code, kann es meiner Meinung nach von diesem nicht genug geben. Alle Code-Listings finden Sie ebenfalls in digitaler Form in den Begleitmaterialien zu diesem Lernheft (dieses erhalten Sie von Ihrem Trainingcenter). So müssen Sie nicht jedes Beispiel komplett abtippen, sondern können an den bereits fertigen Beispielen experimentieren. 1.3.2 Testen Sie Ihr Wissen Gegen Ende jeder Lektion finden Sie einen Abschnitt mit Fragen. Dort werden Ihnen zu den wichtigen Themen dieser Lektion Fragen gestellt, um zu testen, wie viel Sie bereits von dem Lehrstoff behalten und verstanden haben. Gehen Sie die Fragen gewissenhaft durch und beginnen Sie erst mit den nächsten Lektionen, wenn Sie alle Fragen korrekt beantworten können. Am Ende dieses Lernhefts gibt es zu allen Fragen, die am Ende jeder Lektion gestellt werden, die Antworten. Machen Sie sich bitte zuerst Gedanken über die Fragen, bevor Sie die Antworten nachschlagen. 1.3.3 Aufgaben zur Selbstkontrolle In diesem Abschnitt am Ende einer Lektion finden Sie kleinere Aufgaben, die überprüfen sollen, ob Sie den gelernten Stoff wirklich anwenden können. Sie sollten erst dann mit einer neuen Lektion beginnen, wenn Sie alle Aufgaben gelöst und auch verstanden haben. Die Lösungen zu den Übungsaufgaben jeder Lektion finden Sie ebenfalls im Begleitmaterial zu diesem Lernheft. 1. Für das Aussehen einer Webseite sind die Designer zuständig, nicht wir Programmierer! 1.4 Formale Anforderungen 19 1.3.4 Optionale Aufgaben Die optionalen Übungsaufgaben testen ebenfalls den Stoff der Lektion, aber die Aufgaben sind umfassender und meistens auch schwieriger. Die Aufgaben verbinden auch oft den Stoff dieser Lektion mit den Techniken der vorherigen Lektionen. Wenn Sie bisher wenig Erfahrung in der Programmierung haben, werden Sie eventuell nicht alle optionalen Aufgaben selbständig lösen können. Ist das der Fall, machen Sie sich keine Sorgen und gehen Sie zur nächsten Lektion über. Die Pflichtaufgaben prüfen alle wichtigen Grundlagen ab. Kehren Sie, nachdem Sie das ganze Skript durchgearbeitet haben, noch einmal zu den optionalen Aufgaben zurück. Sie werden sehen, dass Sie diese nun lösen können. 1.4 Formale Anforderungen 1.4.1 Windows-PC Sie benötigen natürlich einen funktionierenden PC, um programmieren zu können. PHP ist an sich unabhängig von einem bestimmten Betriebssystem, theoretisch können Sie dieses Lernheft also auch auf einem Mac OS X-Rechner oder einem Linux-Desktop durcharbeiten. Da die Mehrheit der Benutzer aber unter einem Windows-System arbeitet, beziehen sich einige Dinge (z.B. Pfade) auf ein solches System. 1.4.2 PHP-fähiger Webserver Sie benötigen zum Ausführen Ihrer PHP-Skripte einen laufenden Webserver, der auch PHP beherrscht. Die Auswahl in diesem Bereich ist ziemlich groß, angefangen von der manuellen Installation, bis hin zu Komplettpaketen2, die sich mit ein paar Mausklicks installieren lassen. Ich empfehle Ihnen unter Windows3 das Paket XAMPP, das viele Vorteile in sich vereinigt: ➤ Es ist eines der verbreitetsten Webserver/PHP-Pakete auf den Markt. ➤ Es ist komplett kostenlos. ➤ Es ist relativ einfach zu installieren. Sollten Sie noch keinen laufenden Webserver haben, möchte ich Sie an dieser Stelle auf den Anhang verweisen (siehe Lektion 20), in welchem ich eine Linksammlung für die unterschiedlichen Systeme zusammengetragen habe. In den folgenden Lektionen werde ich davon ausgehen, dass Ihnen mindestens eine Entwicklungsumgebung mit PHP 5.4 zur Verfügung steht. Ich selbst nutze übrigens derzeit eine XAMPP-Installation mit PHP 5.5. 1.4.3 Code-Editor Sie benötigen einen Texteditor, um PHP-Code zu schreiben. Im einfachsten Fall würde zu diesem Zweck auch der in Windows mitgelieferte Notepad ausreichen. Dieser unterstützt Sie jedoch in keinster Weise beim Schreiben von PHP-Code. 2. Siehe auch: en.wikipedia.org/wiki/List_of_AMP_packages 3. Auch wenn es XAMPP ebenfalls für Mac OS X gibt, greifen Sie hier lieber zu MAMP. 20 1 Einführung Es ist besser, wenn Sie einen Editor verwenden, der speziell auf Programmierung, besser noch auf PHP ausgerichtet ist. Wenn Sie zum ersten Mal überhaupt programmieren, empfehle ich Ihnen Notepad++, einen einfach zu bedienenden Editor für Windows, der trotzdem bereits einige nützliche Funktionen enthält, die Ihnen das Leben mit PHP erleichtern werden. Falls Sie schon Erfahrung mit anderen Programmiersprachen haben, also zum Beispiel schon JavaScript programmiert haben, empfehle ich Ihnen ein etwas mächtigeres Programm, eine sogenannte IDE (dt. integrierte Entwicklungsumgebung, engl. Integrated Development Environment). Diese ist zwar am Anfang wegen der enormen Funktionsvielfalt deutlich schwieriger in der Handhabung, wird Sie beim Schreiben von PHP-Code aber sehr unterstützen. Der Installation und Anwendung unserer Beispiel-IDE Netbeans habe ich ein eigenes Kapitel im Anhang (siehe Lektion 21) gewidmet. Sollte Sie keinen Gefallen an dieser IDE finden oder es noch zu früh für diese sein, so habe ich anschließend noch ein paar Alternativen aufgelistet (siehe Abschnitt 21.7). Natürlich dürfen Sie auch jeden anderen Editor verwenden, mit dem Sie Programmcode schreiben können. 1.4.4 Webbrowser Zu guter Letzt brauchen Sie noch einen Webbrowser, mit dem Sie sich das Ergebnis Ihrer erstellten PHP-Skripte ansehen können. Da es hier nicht um Design geht, können Sie jeden beliebigen Browser verwenden. Ich empfehle Ihnen den Firefox Webbrowser, da es für diesen einige nützliche Erweiterungen gibt, die Ihnen bei der Entwicklung von PHP-Websites helfen. In diesem Lernheft gibt es einige wenige Beispiele, die Sie nur mit diesem Browser nachvollziehen können, da hierfür spezielle Firefox-Plugins notwendig sind. 1.5 Zusammenfassung Sie sollten nun alle Vorbereitungen getroffen haben, die Sie für die Arbeit mit diesem Schulungsskript benötigen. Der Webserver sollte installiert sein und laufen, Sie sollten einen CodeEditor haben, mit dem Sie umgehen können und die angestaubten HTML-Kenntnisse haben Sie auch etwas aufgefrischt. Idealerweise haben Sie sich auch schon die Codebeispiele aus den Begleitmaterialen auf Ihren Rechner geladen, um jedes Beispiel im Skript auch sofort nachvollziehen zu können. Wenn Sie das alles erledigt haben – prima, dann können wir ja loslegen… 2.1 Was sind dynamische Webseiten? 21 Dynamische Webseiten mit PHP In dieser Lektion lernen Sie: ➤ ➤ ➤ ➤ ➤ was dynamische von statischen Webseiten unterscheidet. welche Technologien es gibt, dynamische Webseiten umzusetzen. dass PHP eine serverseitige Programmiersprache ist. wie und warum PHP entstanden ist. dass Ihr Webbrowser keine Ahnung hat, was PHP ist (und das auch gut so ist). 2.1 Was sind dynamische Webseiten? Sie lesen dieses Schulungsskript, um die Programmierung von dynamischen Webseiten mit PHP zu lernen. Dazu erst einmal herzlich willkommen! Doch was versteht man genau unter einer dynamischen Webseite und was genau ist der Unterschied zu einer statischen Webseite? 2.1.1 Statische Webseiten Als statisch bezeichnet man Webseiten, wenn sich ihr Inhalt nicht verändert. Sie haben sicherlich schon einige statische Webseiten erstellt, nämlich jedes Mal, wenn Sie HTML-Code geschrieben haben. Egal, wie oft Sie eine statische Seite aufrufen, ihr Quellcode wird jedes Mal gleich aussehen. Wenn Sie möchten, dass sich am Inhalt einer statischen Seite etwas ändert, müssen Sie Ihren Texteditor öffnen, die gewünschten Änderungen vornehmen und die neue Version auf den Webserver hochladen. Es wird oft fälschlich angenommen, dass dynamisch bedeutet, dass sich auf der Webseite etwas bewegt, also eine Animation läuft, oder ein Menü plötzlich eingeblendet wird, wenn Sie mit der Maus über einen bestimmten Bereich der Seite fahren. Auch diese Seiten sind jedoch statisch, da sich ihr eigentlicher Inhalt (der HTML-Quellcode) nicht verändert. 2.1.2 Dynamische Webseiten Dynamische Webseiten hingegen existieren gar nicht, bis Sie sie mit dem Webbrowser anfordern. Wenn Sie in Ihren Browser eine URL eingeben, wird die passende Seite zu exakt diesem Zeitpunkt auf dem Webserver zusammengebaut und das fertige HTML zu Ihnen ausgeliefert. Natürlich existieren auch vorher schon Teile des HTML-Codes, aber erst bei Bedarf werden die Teile zu einer Seite vereint. Das hat den Vorteil, dass Sie eine Seite bauen können, die Informationen verarbeitet, die erst beim Seitenaufruf vorhanden sind. Stellen Sie sich vor, Ihre Webseite verfügt über ein Suchformular, mit dem die Besucher nach Produkten suchen können, die Sie dort verkaufen. Nehmen wir an, ein Besucher gibt dort den Begriff Kaktus ein und schickt das Formular ab. 2 22 2 Dynamische Webseiten mit PHP Auf der nächsten Seite erwartet er, alle Produkte zu sehen, die mit dem Wort Kaktus etwas zu tun haben. Wenn Sie eine rein statische Seite hätten, müssten Sie für jeden Suchbegriff eine komplette Seite mit allen Ergebnissen hinterlegen4. Das hat zwei Nachteile: Zum einen müssen Sie jede Seite anpassen, wenn sich etwas an den Produktinformationen ändert. Zum anderen, und das ist viel schlimmer, können Sie gar nicht alle Begriffe vorhersehen, die jemand in dieses Formular eingeben wird. Sie müssten tausende von Seiten erstellen und aktuell halten und würden trotzdem nicht jeden Fall abdecken. Wenn Sie allerdings eine dynamische Seite verwenden, kann diese den Suchbergriff auswerten, alle passenden Produkte zusammensuchen (z.B. aus einer Datenbank) und die fertige Webseite mit der Liste zum Absender zurückschicken. Die fertige Seite wird erst zu dem Zeitpunkt erstellt, als der Besucher das Formular abgesendet hat und das Beste ist, sie enthält alle Produktinformationen in der aktuellsten Form. 2.1.3 Vorteile dynamischer Webseiten Sie sehen also, dass Sie mit dynamischen Webseiten viele Probleme lösen können, die mit statischen nur schwer oder gar nicht zu lösen sind: ➤ Sie können auf Benutzereingaben reagieren und eine angepasste Version der gewünschten Seite ausliefern. ➤ Sie können dem Benutzer für ihn passende Informationen anzeigen. So hat jeder Besucher eines Online-Shops zum Beispiel seinen eigenen Warenkorb, der sich auch noch ständig ändert. So etwas ist ohne dynamische Webseiten nicht lösbar. ➤ Dynamische Webseiten aktualisieren sich von selbst. Da sie erst zum Zeitpunkt der Anforderung erzeugt werden, können sie auch alle Informationen verarbeiten, die erst in genau diesem Moment vorliegen. So können sie zum Beispiel in einem Forum anzeigen, wie viele andere Personen zu diesem Zeitpunkt ebenfalls diese Diskussion betrachten. 2.1.4 Nachteile dynamischer Webseiten Wenn dynamische Webseiten so viel besser sind, warum gibt es dann überhaupt noch statische Seiten? ➤ Die Regeln, wie die dynamischen Seiten zusammengebaut werden sollen, müssen Sie erst einmal aufstellen. Das ist wesentlich aufwändiger, als eine einfache statische Webseite zu bauen. So müssen Sie festlegen, woher die Webseite die Informationen erhält, müssen diese in HTML umbauen und dann ausliefern. Vielleicht haben Sie es schon geahnt, aber eben diese Regeln legt man in einer Programmiersprache fest. ➤ Womit wir schon beim nächsten Punkt wären: Diese Programmiersprache müssen Sie erst einmal lernen. HTML und CSS sind relativ einfach zu erlernen, bis Sie eine Programmiersprache beherrschen, benötigen Sie schon wesentlich mehr Aufwand und Geduld. ➤ Der Vorteil von dynamischen Seiten ist, dass Sie bei jedem Aufruf neu zusammengebaut werden. Genau das ist aber auch ein großer Nachteil. Der Zusammenbau kostet sehr große Serverkapazitäten. Je mehr Informationen zusammengetragen werden, desto aufwändiger wird es für einen Server. 4. Und selbst da habe ich geschummelt, denn ohne dynamische Inhalte kann Ihr Webserver gar nicht die richtige statische Seite auswählen. 2.1 Was sind dynamische Webseiten? 23 Moderne Webserver sind in der Lage, pro Sekunde hunderte oder sogar tausende Anfragen nach statischen HTML-Seiten zu beantworten, ohne "außer Puste" zu kommen. Eine typische dynamische Webseite mit Datenbankanbindung wird kaum mehr als hundert Anfragen pro Sekunde verarbeiten können, bei wirklich komplexen Seiten kann dies sogar auf unter zehn Anfragen zurückgehen. Sie sehen, der Vorteil, Daten dynamisch verarbeiten zu können, hat einen hohen Preis. Sie sollten also nur dann dynamische Webseiten entwickeln, wenn dies technisch wirklich notwendig ist. Es gibt immer noch mehr als genug Webseiten, die als statische Seite prima funktionieren. Trotzdem werden Sie bei vielen Projekten um dynamische Inhalte nicht herumkommen. 2.1.5 Die Auslieferung von Webseiten Sie haben im letzten Abschnitt gelernt, dass dynamische Webseiten durch vorher festgelegte Regeln zum Zeitpunkt der Anforderung zusammengebaut werden. Diese Regeln legen Sie durch eine Programmiersprache fest. Sehen wir uns die einzelnen Schritte doch ein wenig genauer an, zuerst bei einer statischen Seite, um den Unterschied besser zu sehen: Ausliefern von statischen Webseiten Der Benutzer gibt in seinem Browswer die URL einer statischen Webseite ein. Der Browser schickt eine Anfrage nach dieser Seite zum passenden Webserver. Der Webserver sieht auf seiner Festplatte nach, ob die gewünschte Datei existiert. Wenn ja, liest er sie ein und schickt sie an den Browser zurück. Ausliefern von dynamischen Webseiten Der Benutzer gibt in seinem Browser die URL einer dynamischen Webseite ein. Der Browser schickt eine Anfrage nach dieser Seite zum passenden Webserver. Der Webserver sieht auf seiner Festplatte nach, ob die gewünschte Datei existiert. Wenn ja, liest er sie ein. Dann übergibt er sie einem weiteren Programm, dass den enthaltenen Programmcode auswertet, einem sogenannten Interpreter. Dieser geht das Skript Zeile für Zeile durch und führt alle Anweisungen durch, die er dort findet. Eventuell lädt er noch weiteren Programmcode aus anderen Dateien nach, wenn das Skript dies verlangt und wertet diesen ebenfalls aus. Danach baut er alle Ausgaben, die das Programm erzeugt hat, zu einer einzelnen Datei zusammen. In dieser ist von dem ursprünglichen Programmcode nichts mehr zu sehen. Es enthält nur noch reines HTML, oder was auch immer diese Datei sonst ausliefern soll5. Dieses Ergebnis gibt er dem Webserver zurück. Der Webserver sieht sich das Ergebnis an und prüft, ob ein Fehler aufgetreten ist. Wenn nicht, liefert er die fertig erstellte Seite an den Browser zurück. Dieser sieht nichts mehr von dem ursprünglichen Programmcode auf dem Server, nur noch das erzeugte Ergebnis. Das ist auch 5. Sie können natürlich auch beliebige andere Inhalte dynamisch erzeugen, wie Bilder, PDFs, reinen Text, WordDokumente ... 24 2 Dynamische Webseiten mit PHP gut so, denn ein Webbrowser hat keine Ahnung, was eine sogenannte serverseitige Programmiersprache (beispielsweise PHP, Python oder Ruby)6 überhaupt ist, geschweige denn, wie er deren Code verarbeiten soll. Sie sehen, eine dynamische Seite auszuliefern, ist für einen Webserver deutlich mehr Arbeit. 2.2 PHP 2.2.1 Stärken von PHP Serverseitige Programmiersprachen gibt es viele und beinahe alle lassen sich mehr oder weniger gut für die Entwicklung von Webseiten einsetzen. Bei all der Auswahl, warum sollten Sie ausgerechnet PHP lernen, um Webentwicklung betreiben zu können? Dafür gibt es viele gute Gründe: ➤ PHP ist die verbreitetste Skriptsprache im Web. Für sehr wenig Geld können Sie heutzutage einen voll ausgestatteten Webspace inklusive PHP und Datenbank mieten. Sie werden also niemals Probleme bei der Suche nach einem Provider haben, was man bei den anderen Websprachen, gerade bei begrenztem Budget, nicht sagen kann. ➤ PHP ist frei und kostenlos verfügbar. Auch wenn Sie eine kommerzielle Webseite betreiben, müssen Sie PHP nicht kaufen. ➤ PHP läuft auf nahezu jedem Betriebssystem. Egal, was Sie für einen Rechner zu Hause stehen haben, die Chancen, dass PHP darauf läuft, sind ziemlich groß. Beachten Sie dennoch, dass die Mehrzahl aller produktiven PHP-Webserver im Internet auf Unix/Linux-Servern laufen. ➤ Es gibt eine große, aktive Community rund um PHP. Sie werden immer jemanden finden, den Sie bei Problemen fragen können oder einen Partner, wenn ein Programmierauftrag für eine Person zu groß ist. ➤ Mit PHP können Sie sehr schnell Webseiten entwickeln. Die Einfachheit von PHP, die es sich seit den Anfängen zum Glück bewahrt hat, ermöglicht es Ihnen, mit relativ wenig Aufwand schon recht ansprechende Ergebnisse zu erzielen. Dank vieler existierender Zusatzmodule und Bibliotheken gibt es auch komplexere Funktionen schon fertig zum Einbau in Ihre Webseite. ➤ PHP wurde speziell für das Web entwickelt. Mit keiner anderen Sprache können Sie so schnell und einfach loslegen, ohne erst etwas stundenlang installieren und konfigurieren zu müssen. ➤ Nicht zu vergessen - PHP ist sehr einfach zu erlernen. Im Vergleich mit Sprachen wie beispielsweise Java werden Sie mit PHP schon die ersten Webseiten entwickeln, während Ihre Java-Kollegen noch beim Lernen der theoretischen Grundlagen sind. 2.2.2 Geschichte von PHP PHP war die erste Programmiersprache, die speziell für die Programmierung dynamischer Webseiten entwickelt wurde. Inzwischen können Sie mit sehr vielen Programmiersprachen, elegant Webentwicklung betreiben, aber PHP ist die einzige dieser Sprachen, die von Anfang an bis heute speziell auf die Web-Programmierung ausgelegt ist. 6. Das Gegenteil von serverseitigen Programmiersprachen bilden clientseitige Sprachen, wie beispielsweise JavaScript. 2.2 PHP 25 PHP/FI Im Jahr 1995 entwickelte der Programmierer Rasmus Lerdorf die sogenannten Personal Home Page Tools, kurz PHP. Es handelte sich um eine Sammlung von Perl-Skripten, die ihm die Verwaltung seiner Webseite erleichtern sollten. Als das Projekt umfangreicher wurde und es immer neue Anforderungen gab, schrieb Rasmus eine neue, erweiterte Fassung in der Programmiersprache C, in der PHP auch heute noch weiterentwickelt wird. Da er das Projekt unter anderem um einen sogenannten Formular-Interpreter erweitert hat, der die automatische Verwaltung von HTML-Formularen ermöglichte, hieß das Projekt nun PHP/FI. Zu diesem Zeitpunkt entschied sich Rasmus auch, sein Projekt zu veröffentlichen und es kostenlos zur Verfügung zu stellen. Als er 1997 die zweite Version von PHP/FI veröffentlichte, erfreute sich das Projekt bereits einer für damalige Verhältnisse ziemlich großen Beliebtheit, das sich mit der neuen Version nur noch verstärkte. Version 2 war weltweit etwa auf 50.000 Domains installiert. PHP 3 PHP 3 war die erste Version, die dem heutigen PHP ähnlich ist. 1997 begannen Andi Gutmans und Zeev Suraski eine alternative Version von PHP/FI zu entwicklen, da das Original deutliche Schwächen hatte. Rasmus erkannte das Potential des Konkurrenzprojekts und entschloss sich zur Zusammenarbeit mit den beiden Programmierern. Im Jahr 1998 wurde die dritte Version freigegeben und zu dieser Gelegenheit gleich umgetauft. Von nun an hieß es nicht mehr PHP/FI, sondern nur noch PHP. Die Abkürzung steht nun für PHP: Hypertext Preprocessor. Diese Version war zu ihren besten Zeiten auf ca. 10% aller Webserver im Internet installiert. Sie bot damals schon viele der Funktionen, die PHP damals wie heute so beliebt und erfolgreich machen. PHP 4 Zwei Jahre nach Version 3, also im Jahr 2000, wurde PHP 4 veröffentlicht. Mit dieser Version gelang PHP endgültig der Durchbruch als eine der beliebtesten serverseitigen Websprachen. Gerade kleinere und mittlere Projekte wurden bevorzugt mit PHP umgesetzt, wobei im Enterprise-Bereich immer noch fast ausschließlich mit Java gearbeitet wurde. Viele der bekanntesten PHP-Projekte, wie beispielsweise die Content-Management-Systeme Drupal und TYPO3, sind zu Zeiten von PHP 4 entstanden. PHP 5 Im Juli 2004 wurde PHP 5 veröffentlicht. Viele sagen, dass PHP mit dieser Version endlich erwachsen geworden ist. Viele grundlegende Funktionen von PHP, wie die objektorientierte Programmierung, Verarbeitung von XML-Daten, der Zugriff auf Datenbanken oder die generelle Ausführungsgeschwindigkeit wurden massiv überarbeitet oder komplett neu entwickelt. Mit dieser Version ist PHP auch endlich im Enterprise-Bereich angekommen. Gerade durch die wesentlich verbesserte Unterstützung der objektorientierten Programmierung und die Ver- 26 2 Dynamische Webseiten mit PHP einheitlichung vieler wichtiger Erweiterungen wurde PHP auch für große Firmen immer interessanter. PHP 5 hatte zu Anfang einige Startschwierigkeiten, weil Version 4 unglaublich beliebt war. Fast niemand sah die Notwendigkeit, auf eine neue Version zu wechseln, weswegen viele ISPs7 die neue Version überhaupt nicht installierten. Deswegen wurde Mitte 2007 das offizielle Ende von PHP 4 beschlossen. Die Entwickler von PHP haben die Entwicklung von Version 4 zum Ende des Jahres 2007 praktisch eingestellt. Bis August 2008 gab es noch Sicherheitsupdates, aber von diesem Zeitpunkt an gab es keinerlei Unterstützung mehr für PHP Versionen vor 5.2. Gerade durch diese Maßnahme hat sich damals die Verbreitung von PHP 5 deutlich verbessert. PHP 5.5 Am 20.06.2013 erschien PHP in der Version 5.5. Seit dieser Version wird erneut verstärkt Druck auf die bisherigen Installationen gemacht, da die im Juni 2009 erschienene und derzeit am weitesten verbreitete Version 5.38 gleichzeitig in die EOL-Phase (engl. end of life, dt. Ende des Lebens) kam, in der sie lediglich noch ein weiteres Jahr mit Sicherheitsupdates versorgt wird. 2.3 Zusammenfassung In dieser Lektion haben Sie gelernt, was eine dynamische Webseite ist und deren Vorteile, aber auch Nachteile kennengelernt. Sie wissen ebenfalls, wie PHP entstanden ist und warum es eine gute Wahl ist, gerade diese Sprache zu lernen. Vor allem aber haben Sie begriffen, dass dynamische Webseiten auf dem Webserver verarbeitet werden und nur das fertige Ergebnis beim Webbrowser ankommt. Testen Sie Ihr Wissen 1. 2. 3. 4. Was versteht man unter dynamischen Webseiten? Nennen Sie zwei Vor- und Nachteile von dynamischen Webseiten. Was bedeutet die Abkürzung PHP? Wie nennt man das Programm, das den Programmcode innerhalb der Webseite auswertet? 7. Internet Service Provider. Das sind die Firmen, bei denen Sie Webspace mieten. 8. Siehe: w3techs.com/blog/entry/php_version_5_3_is_now_the_most_used_version_just_ahead_of_5_2 3.1 Das Problem 27 HTML und PHP In dieser Lektion lernen Sie: ➤ ➤ ➤ ➤ wie Sie PHP in Ihre HTML-Dateien einbetten können. was Sie dabei beachten müssen. die sechs Fehler kennen, die jeder PHP-Anfänger macht. die echo -Anweisung kennen. 3.1 Das Problem Wenn Sie die letzte Lektion durchgelesen haben, wissen Sie zwar, wie eine dynamische Webseite prinzipiell funktioniert, haben aber noch keine Ahnung davon, wie Sie konkret eine PHPSeite bauen sollen. Dafür wird es langsam aber auch wirklich Zeit, daher lassen Sie uns auch gleich loslegen9! 3.2 PHP in eine HTML-Seite einbetten 3.2.1 Eine statische HTML-Seite erstellen Öffnen Sie Ihren bevorzugten Code-Editor und erstellen Sie folgendes HTML-Dokument. Speichern Sie es im document root Ihres Webservers im Unterordner phpschulung unter dem Namen erste_seite.php ab. Wenn Sie beispielsweise eine Standardinstallation von XAMPP (siehe Lektion 20) durchgeführt haben, ist Ihr document root das Verzeichnis c:\xampp\ htdocs.10 Vergessen Sie nicht die korrekte Dateiendung .php zu benutzen, diese ist sehr wichtig. Beispiel 1 2 3 4 5 6 7 8 9 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Hallo Welt</title> </head> <body> 9. Sie haben inzwischen doch den Webserver und den Code-Editor installiert, wie es in Lektion 1 verlangt war, oder? 10. Bei MAMP unter Mac OS X ist der Standard /Applications/MAMP/htdocs und auf Linux-Servern finden Sie dieses Verzeichnis oft unter /var/www. 3 28 3 HTML und PHP 10 Hallo Welt 11 </body> 12 13 </html> Listing 3.1 erste_seite.php (Version 1) Rufen Sie die Datei nun in Ihrem Browser unter der URL localhost/phpschulung/ erste_seite.php auf. So weit sollte das für Sie nichts Neues gewesen sein. Das Besondere an PHP ist allerdings, dass Sie es, ähnlich wie JavaScript, direkt in Ihre HTML-Dokumente einfügen können. 3.2.2 PHP-Code einfügen Um dem Webserver zu zeigen, wo PHP-Code in HTML-Dokumenten steht, wurde ein spezieller Tag entwickelt, der jeden PHP-Code umgeben muss. Kein PHP-Code darf außerhalb dieser Begrenzung stehen, oder der Webserver hält es für normales HTML und zeigt es einfach an. Beispiel 1 2 3 4 5 6 7 8 9 10 11 12 13 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title><?php <?php echo "Hallo Welt"; ?> ?></title> </head> <body> <?php echo "Hallo Welt"; ?> </body> </html> Listing 3.2 erste_seite.php (Version 2) Was hat sich hier geändert? Wenn Sie sich die geänderte Seite in Ihren Browser ansehen, werden Sie keinen Unterschied feststellen. Die Seite hat immer noch den Titel Hallo Welt und gibt im Body -Tag den selben Text noch einmal aus. Der Unterschied ist, dass der Text Hallo Welt nun mittels PHP in die Seite geschrieben wurde. Wann immer Sie PHP-Code einfügen wollen, müssen Sie zuerst <?php schreiben, um zu zeigen, dass nun PHP-Code folgt. Wenn Sie mit dem PHP-Block fertig sind, zeigen Sie das durch den schließenden Tag ?> . Um die Bedeutung des eigentlichen PHP-Codes müssen Sie sich im Moment noch nicht kümmern.11 Jeder PHP-Code muss zwischen <?php und dem schließenden Tag ?> stehen. Ansonsten wird er nicht ausgewertet, sondern unverändert angezeigt. Dies sind die sogenannten PHP-Tags, analog zu den bekannten HTML-Tags. 11. Er sorgt dafür, dass der Text in den Anführungszeichen in der Webseite angezeigt wird. 3.3 Die sechs berühmten Fehler 29 3.2.3 PHP erzeugt HTML Wenn Sie sich den Quelltext der HTML-Seite anzeigen lassen (z.B. im Firefox-Browser Strg+U), werden Sie feststellen, dass dort nichts mehr von dem PHP-Code zu sehen ist. Bei genauerer Betrachtung werden Sie sogar erkennen, dass die erzeugte Seite mit der ersten, statischen Version aus Abschnitt 3.2.1 identisch ist12. Exakt das ist damit gemeint, wenn man von PHP als einer serverseitigen Programmiersprache spricht. Der Webserver hat die PHP-Datei geöffnet, den PHP-Code darin ausgewertet und was als Ergebnis übrig blieb, an den Browser gesendet. Der Browser sieht nichts mehr von den ursprünglichen PHP-Tags und das ist auch gut so, denn Webbrowser haben keine Ahnung, was PHP überhaupt ist! JavaScript wird vom Webbrowser ausgewertet. Also ist JavaScript-Code für den Browser sichtbar. PHP wird schon auf dem Webserver ausgewertet, lange bevor der Browser die Seite erhält. Also wird ein Webbrowser niemals PHP-Code sehen. 3.3 Die sechs berühmten Fehler Wenn Sie den Beispielen aus dem vorherigen Abschnitt problemlos folgen konnten, gratulieren Sie sich. Sie haben die Beispiele fehlerfrei abgetippt. Wenn Sie hingegen seltsame Meldungen oder schlimmer gar nichts in Ihrem Browser gesehen haben, sind Sie wahrscheinlich in einen der sechs Fehler gelaufen, die jeder PHP-Anfänger macht. Sollte es Sie erwischt haben, grämen Sie sich nicht. Das bedeutet nur, dass Sie es schon hinter sich haben! Jeder PHP-Anfänger macht diese Fehler! 3.3.1 PHP-Code im HTML-Bereich schreiben Einer der beliebtesten Fehler ist es, PHP-Code außerhalb des markierten Bereiches, also von <?php ?> zu schreiben. Das bedeutet, dass dieser Code für HTML gehalten und einfach an den Browser geschickt wird. Beispiel 1 2 3 4 5 6 7 8 9 10 11 12 13 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title><?php <?php echo "Hallo Welt"; ?> ?></title> </head> <body> echo "Hallo Welt"; </body> </html> Listing 3.3 php_im_html.php 12. Eventuell sind nicht alle Zeilenumbrüche da, wo Sie es erwarten. Zum Beispiel könnte der schließende bodyTag hinter das "Hallo Welt" gerutscht sein. 30 3 HTML und PHP Die erste echo -Anweisung in Zeile 6 wird korrekt ausgewertet. Im Browser steht an dieser Stelle nur noch Hallo Welt . In Zeile 10 jedoch haben wir vergessen, den PHP-Code in den passenden Tags zu verbergen. Das Ergebnis ist, dass der Browser an dieser Stelle das komplette echo "Hallo Welt"; ausgibt. 3.3.2 HTML-Code im PHP-Bereich schreiben Das Gegenteil des letzten Fehlers ist genauso verhängnisvoll. Wenn Sie HTML-Tags in den PHPBereich schreiben, versucht der PHP-Interpreter, aus den für ihn seltsamen Zeichen schlau zu werden und gibt schließlich mit einer Fehlermeldung auf. Beispiel 1 2 3 4 5 6 7 8 9 10 11 12 13 <!DOCTYPE html> <html> <head> <?php <meta charset="utf-8" /> ?> <title><?php <?php echo "Hallo Welt"; ?> ?></title> </head> <body> <?php echo "Hallo Welt"; ?> </body> </html> Listing 3.4 html_im_php.php Jetzt liegt der Fehler in Zeile 5. Dort wird zwar ein PHP-Tag geöffnet, aber sein Inhalt besteht aus purem HTML. Bestraft wird dieses Verhalten von PHP mit einer hässlichen Fehlermeldung. Wenn Sie die Seite aufrufen, sehen Sie folgenden Text: Parse error: syntax error, unexpected '<' in (...)\html_im_php.php on line 5 Genauso wenig, wie der Browser Ahnung von PHP hat, weiß der PHP-Interpreter etwas mit den HTML-Formatierungen anzufangen. Dementsprechend sagt er uns auch, dass er mit dem unerwarteten (unexpected) Zeichen '<' nichts anfangen kann. 3.3.3 Die PHP-Datei hat die Endung .html Selbst wenn Sie das ursprüngliche Beispiel fehlerfrei abgetippt haben, kann es dennoch sein, dass Sie den kompletten Code mit allen PHP-Tags im Browser sehen. Das kann mehrere Gründe haben. Der häufigste ist jedoch, dass Sie die Datei mit der Endung .html versehen haben. Wenn eine Datei, die PHP-Code enthält, nicht auf .php endet, weiß der Webserver für gewöhnlich nicht, dass sich PHP darin befindet und schickt die Datei unverändert an den Browser13. 13. Welche Dateiendungen der Webserver als PHP-Dateien ansieht, kann natürlich konfiguriert werden. Häufig funktionieren neben .php auch versionsspezifische Endungen wie beispielsweise .php55. So lange Sie keinen triftigen Grund haben, etwas anderes zu tun, sollten Sie immer die Endung .php verwenden, da diese immer funktioniert und Sie auf die Konfiguration bei Ihrem Webhoster oft keinen Einfluss haben. 3.3 Die sechs berühmten Fehler 31 3.3.4 Die PHP-Datei liegt nicht im Zugriff des Webservers Ein Webserver darf nur auf Dateien in einem vorher festgelegten Verzeichnis, genannt document root, zugreifen. Wenn Sie Ihre PHP-Dateien außerhalb dieses Verzeichnisses speichern, wird der Webserver sie nicht finden und einen Fehler melden. Dies ist ein, gerade von PHP-Anfängern, häufig gemachter Fehler, da die meisten WindowsAnwender es beispielsweise gewohnt sind, Dateien in Eigene Dateien oder auf dem Desktop abzulegen, wo der Webserver sie nicht finden kann. Wenn Sie häufiger in diese Falle tappen, legen Sie sich eine Verknüpfung zum document root auf Ihrem Desktop an. So sieht es aus, als würden Sie die Dateien direkt in einem Ordner auf dem Desktop ablegen und es funktioniert trotzdem. 3.3.5 Die PHP-Datei wurde direkt im Browser geöffnet Kommen wir zum krönenden Abschluss zu dem wahrscheinlich häufigsten Anfängerfehler. Anstatt die PHP-Datei über den Webserver aufzurufen, haben Sie die Datei direkt vom Dateisystem aus geöffnet. Das bedeutet, Ihr Webbrowser erhält direkt den PHP-Code und hat natürlich keine Ahnung, was er damit anfangen soll. Moderne Browser blenden alles zwischen <?php ... ?> einfach aus, aber gerade ältere Browser haben den Inhalt direkt angezeigt. Sie merken am besten an der URL-Zeile im Browser, dass Sie die Datei direkt geöffnet haben. Wenn Sie dort zu Anfang nicht wie gewohnt http:// sondern file:// lesen, sind Sie in die Falle getappt. Gerade am Anfang Ihrer PHP-Karriere sollte der erste Blick der URL gelten, wenn etwas nicht so funktioniert, wie Sie es erwarten. 3.3.6 Die echo-Anweisung fehlt In den vorherigen Abschnitten haben Sie in die PHP-Tags das Wort echo , gefolgt von Text in Anführungszeichen geschrieben. Das Ergebnis war, dass das Wort echo und die Anführungszeichen verschwunden sind und nur der Text selbst im Browser angekommen ist (siehe Abschnitt 3.2.3). Dieses Wort echo ist für PHP eine Anweisung und veranlasst den PHP-Interpreter, den folgenden Text auszugeben. Im Gegensatz zu HTML, wo Sie jegliche Ausgabe einfach in die Datei schreiben, müssen Sie PHP ausdrücklich sagen, wenn Sie etwas auf dem Bildschirm ausgeben wollen. Für diesen Zweck gibt es in PHP eine ganze Reihe von Anweisungen, für den Anfang soll uns echo allerdings genügen, da Sie mit dieser Anweisung fast jede Situation meistern können. Beispiel 1 2 3 4 5 6 7 8 9 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title><?php <?php echo "Hallo Welt"; ?> ?></title> </head> <body> 32 3 HTML und PHP 10 <?php "Hallo Welt"; ?> 11 </body> 12 13 </html> Listing 3.5 echo_fehlt.php Fehlt die echo -Anweisung, so hat der PHP-Interpreter keine Ahnung, was er mit dem Text in Anführungszeichen anfangen soll und dieser verfällt nach Ausführung von Zeile 10 ungenutzt. In diesem Fall erhalten wir somit eine leere Seite, da das body -Tag keinen weiteren Inhalt hat. 3.4 Mehrzeilige PHP-Anweisungen 3.4.1 Das Semikolon Bisher haben Sie in jedem Beispiel am Ende einer PHP-Anweisung ein Semikolon, zu Deutsch Strichpunkt gesehen. Sollten Sie eines vergessen haben, werden Sie keinen Unterschied bemerkt haben. Der PHP-Code hat weiterhin genau dasselbe getan. Wofür brauchen wir dieses Semikolon dann überhaupt? Es ist für die Trennung einzelner PHPAnweisungen zuständig. Wenn Sie also mehr als eine Anweisung für PHP haben, müssen Sie dazwischen ein Semikolon setzen. Beispiel 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title><?php <?php echo "Hallo Welt"; ?> ?></title> </head> <body> <?php echo "Hallo Welt "; echo "und willkommen beim PHP-Seminar!" ?> Das ist normales HTML. <?php echo "Das funktioniert noch." echo "das nicht mehr!" ?> </body> </html> Listing 3.6 mehrere_php_anweisungen.php Der Unterschied zwischen den Zeilen 10 und 12 besteht darin, dass in Zeile 12 vor dem zweiten echo kein Semikolon steht. PHP denkt also, hier stünde nur eine einzige lange Anweisung, anstatt zwei. Da eine Anweisung mit zwei echo -Anweisungen für PHP kein gültiger Code ist, wird hier ein Fehler erzeugt: Parse error: syntax error, unexpected 'echo' (T_ECHO), expecting ',' or ';' in (...)\mehrere_php_anweisungen.php on line 12 PHP sagt uns hier, dass es in Zeile 12 entweder ein Komma oder ein Semikolon erwartet14, also tragen Sie das fehlende Semikolon nach und der Code wird funktionieren. 14. Das mit dem Komma besprechen wir noch. 3.5 Stilfragen 33 3.4.2 Mehrzeilige PHP-Anweisungen Auch wenn es funktioniert, mehrere PHP-Anweisungen hintereinander zu schreiben, so ist es nicht wirklich übersichtlich. Vergleichen Sie im folgenden Listing die beiden PHP-Blöcke: Beispiel 1 <!DOCTYPE html> 2 <html> 3 4 <head> 5 <meta charset="utf-8" /> 6 <title>Hallo Welt</title> 7 </head> 8 9 <body> 10 <?php echo "Hallo Welt "; echo "und willkommen beim PHP-Seminar! "; echo "Langsam wir es unübersichtlich. "; echo "Jetzt ist aber wirklich Schluss!" ?> 11 <br /> 12 <?php 13 echo "So sieht das schon viel besser aus. "; 14 echo "Wenn Sie jede Anweisung auf eine Zeile schreiben, "; 15 echo "behalten Sie leichter den Überblick. "; 16 echo "Trotzdem müssen Sie immer noch "; 17 echo "ein Semikolon nach jeder Anweisung schreiben, "; 18 echo "da PHP eine neue Zeile nicht als das Ende "; 19 echo "einer Anweisung sieht."; 20 ?> 21 </body> 22 23 </html> Listing 3.7 mehrzeiliges_php.php Der erste Abschnitt in Zeile 10 ist, obwohl ihn PHP versteht, nicht sehr übersichtlich. Sie müssen gezielt nach den Semikolons suchen, um den Beginn einer neuen Anweisung zu sehen. Der zweite Abschnitt in den Zeilen 12 bis 20 bringt jede Anweisung auf eine eigene Zeile, was es Ihnen leichter macht, den Code zu verstehen. Für PHP macht es allerdings keinen Unterschied. Schreiben Sie jede Anweisung auf eine eigene Zeile, um die Lesbarkeit des Codes zu erhöhen. Wenn Sie mehrzeilige PHP-Anweisungen haben, schreiben Sie den öffnenden und den schließenden PHP-Tag auf jeweils eigene Zeilen. Der PHP-Code wird üblicherweise um eine Ebene eingerückt (siehe Abschnitt 3.5.2). 3.5 Stilfragen 3.5.1 Saubere Trennung von HTML und PHP In diesem Abschnitt werden Sie eines der wenigen Code-Beispiele in diesem Schulungsskript sehen, das eindeutig schlechten Stil darstellt. Ich bemühe mich natürlich, Ihnen nur Dinge beizubringen, die Sie später auch so benutzen sollten. Manchmal müssen Sie aber auch Beispiele sehen, wie es nicht gemacht werden sollte. Hier ist das erste: 34 3 HTML und PHP Beispiel 1 <!DOCTYPE html> 2 <html> 3 4 <head> 5 <meta charset="utf-8" /> 6 <title>Hallo Welt</title> 7 </head> 8 9 <body> 10 <?php 11 echo '<form action="test.php" method="post">'; 12 echo '<input type="text" name="vorname" id="vorname" value="Arthur" />'; 13 echo '<input type="text" name="nachname" id="nachname" value="Dent" />'; 14 echo '<input type="submit" value="abschicken" />'; 15 echo '</form>'; 16 ?> 17 </body> 18 19 </html> Listing 3.8 stillos.php Vergleichen Sie das Beipiel eben mit dem folgenden, das exakt die gleiche Ausgabe erzeugt: Beispiel 1 <!DOCTYPE html> 2 <html> 3 4 <head> 5 <meta charset="utf-8" /> 6 <title>Hallo Welt</title> 7 </head> 8 9 <body> 10 <form action="test.php" method="post"> 11 <input type="text" name="vorname" id="vorname" value="<?php <?php echo 'Arthur' ?> ?>" /> 12 <input type="text" name="nachname" id="nachname" value="<?php <?php echo 'Dent' ?> ?>" /> 13 <input type="submit" value="abschicken" /> 14 </form> 15 </body> 16 17 </html> Listing 3.9 stilvoll.php Im ersten Listing wird ein komplettes HTML-Formular mit mehreren echo -Anweisungen ausgegeben. Das ist prinzipiell möglich, da echo jede Art von Inhalten ausgeben kann, auch HTML-Formatierungen. Diese Herangehensweise hat allerdings mehrere Nachteile, von denen einige bereits jetzt offensichtlich sind: ➤ Da Sie wahrscheinlich (hoffentlich) mit einem Editor arbeiten, der Syntax-Highlighting beherrscht, wird auch der HTML-Code farblich hervorgehoben, z.B. werden Attribute und ihre Werte anders dargestellt. Wenn Sie einen HTML-Tag in eine echo -Anweisung verpacken, verlieren Sie diesen Vorteil. Alles wird in einer Farbe dargestellt, was das Auffinden von Fehlern erschwert. ➤ Sie müssen alle Texte, die Sie mit echo ausgeben, in Anführungszeichen einschließen. Ich werde später noch im Detail darauf eingehen, aber Sie dürfen die selben Anführungszei- 3.5 Stilfragen 35 chen nicht mehr im Text verwenden, die Sie zum Einschließen verwendet haben. Gerade bei HTML, wo viel mit doppelten Anführungszeichen gearbeitet wird, stellt dies oft ein Problem dar. In unserem Beispiel wäre folgendes also nicht erlaubt: <?php echo 'Arthur 's '; ?> ➤ Jedes Zeichen, das Sie mit echo ausgeben, statt direkt im HTML, sorgt dafür, dass die Seite langsamer lädt, da PHP mehr Daten verarbeiten muss. Der Unterschied mag bei kleinen Seiten nicht ins Gewicht fallen, aber auch dort gibt es keinen Grund, den Server unnötig zu belasten. ➤ Es ist schlicht und ergreifend hässlich! Wenn Sie sich fertige PHP-Programme aus dem Internet herunterladen, werden Sie gerade bei älteren Projekten noch viel Code sehen, der wie die erste Version aussieht. Inzwischen ist man in der PHP-Community allerdings komplett von dieser Vorgehensweise abgerückt. Viele Projekte jüngeren Datums akzeptieren gar keinen Code mehr, der irgendwelche HTML-Formatierungen mit PHP-Anweisungen ausgibt. Sie werden später noch wesentlich mehr zu diesem Thema hören, also gewöhnen Sie es sich am besten gar nicht erst falsch an: Versuchen Sie, wo immer möglich, HTML-Code und PHP-Code getrennt zu halten. HTMLTags mit PHP-Anweisungen auszugeben, ist extrem schlechter Stil und behindert die Übersichtlichkeit Ihres Codes. 3.5.2 Einrückungen Ein zweiter Punkt beim Thema Stil sind Code-Einrückungen. Vergleichen Sie die beiden Beispiele: Beispiel 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Hallo Welt</title> </head> <body> <?php echo "So sieht das schon viel besser aus. "; echo "Wenn Sie jede Anweisung auf eine Zeile schreiben, "; echo "behalten Sie leichter den Überblick. "; echo "Trotzdem müssen Sie immer noch "; echo "ein Semikolon nach jeder Anweisung schreiben, "; echo "da PHP eine neue Zeile nicht als das Ende "; echo "einer Anweisung sieht."; ?> </body> </html> Listing 3.10 schlechter_stil.php