PHP & MySQL
Unser Online-Tipp für noch mehr Wissen …
... aktuelles Fachwissen rund um die Uhr – zum Probelesen, Downloaden oder auch auf Papier.
www.InformIT.de
PHP & MySQL Dynamik für Ihre Webseiten! GIESBERT DAMASCHKE
Ü leicht
Ü
klar
eBook Die nicht autorisierte Weitergabe dieses eBooks ist eine Verletzung des Urheberrechts!
Ü
sofort
Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.ddb.de abrufbar.
Die Informationen in diesem Produkt werden ohne Rücksicht auf einen eventuellen Patentschutz veröffentlicht. Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt. Bei der Zusammenstellung von Texten und Abbildungen wurde mit größter Sorgfalt vorgegangen. Trotzdem können Fehler nicht vollständig ausgeschlossen werden. Verlag, Herausgeber und Autoren können für fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung übernehmen. Für Verbesserungsvorschläge und Hinweise auf Fehler sind Verlag und Herausgeber dankbar. Alle Rechte vorbehalten, auch die der fotomechanischen Wiedergabe und der Speicherung in elektronischen Medien. Die gewerbliche Nutzung der in diesem Produkt gezeigten Modelle und Arbeiten ist nicht zulässig. Fast alle Hardware- und Softwarebezeichnungen, die in diesem Buch erwähnt werden, sind gleichzeitig auch eingetragene Warenzeichen oder sollten als solche betrachtet werden. Umwelthinweis: Dieses Buch wurde auf chlorfrei gebleichtem Papier gedruckt.
10 9 8 7 6 5 4 3 2 1
07 06 05 04
ISBN 3-8272-6932-6 © 2004 by Markt+Technik Verlag, ein Imprint der Pearson Education Deutschland GmbH, Martin-Kollar-Straße 10–12, D-81829 München/Germany Alle Rechte vorbehalten Coverkonzept: independent Medien-Design, Widenmayerstraße 16, 80538 München Coverlayout: adesso 21, Thomas Arlt, München Titelfoto: Getty Images Lektorat: Boris Karnikowski,
[email protected] Herstellung: Monika Weiher,
[email protected] Korrektorat: Dr. Florence Maurice, München Satz: mediaService, Siegen (www.media-service.tv) Druck und Verarbeitung: Kösel, Krugzell (www.KoeselBuch.de) Printed in Germany
4
Inhaltsverzeichnis
Inhaltsverzeichnis Liebe Leserin, lieber Leser ..............................11
1
Erste Schritte in PHP
12
Dynamische Webseiten mit PHP ................... 14 Datenbankbasiertes Webpublishing ...............15 Xampp!.......................................................... 16 Xampp installieren .........................................18 Der erste PHP-Test .........................................21 HTML und PHP .............................................23 Kommentare in PHP ......................................25 Textausgaben mit »echo«...............................26 Variablen & Konstanten ................................. 28 Der Einsatz von Variablen..............................31 Rechnen und Verknüpfen in PHP................... 34 Abkürzungen und Zuweisungen ....................38 Kleine Typenlehre .......................................... 39 Menschen, nicht Maschinen: Rasmus Lerdorf ..............................................41
2
Entscheidungen, Schleifen und Funktionen
42
Logische Vergleiche und Verknüpfungen .......44 Wenn ... dann ... andernfalls!.........................46 Auf Inhalt überprüfen .....................................49 Alternative Abfragen ......................................50 Datumsangaben in PHP .................................51 Programmschleifen ........................................55 Das kleine Einmaleins ....................................59 Funktionen.....................................................61 Variablentypen überprüfen ............................64 Menschen, nicht Maschinen: Brian Behlendorf ............................................65
5
3
Ein Besucherzähler und anderes
66
Drei Projekte für die Homepage.....................68 Grundlegende Dateioperationen mit PHP ......68 Den Besucherzähler als Grafik ausgeben .......72 Wiederholungen ausfiltern mit Cookies .........75 Ein Kennwortschutz für Webseiten................. 77 Eingaben überprüfen ......................................79 Externe Dateien einbinden .............................80 Ein Kontaktformular auf der Webseite ............83 Die Auswertung .............................................85 Die Ausgabe .................................................. 88 Menschen, nicht Maschinen: David Axmark, Allan Larsson und Michael »Monty« Widenius ...........................91
4
Daten strukturieren mit Arrays Ein Umfrageformular mit PHP ........................94 Array: Ein Name, viele Werte.........................95 Ein universales Formular ................................98 Die Auswahl als Drop-Down-Menü ...............99 Das Formular als Tabelle..............................101 Die Ergebnisdatei anlegen und testweise auslesen ........................................102 Assoziative Arrays: Namen statt Nummern...105 Die Umfrage auswerten ...............................107 Das Ergebnis ausgeben ................................110 Datumsangaben mit Arrays ..........................112 Ein intelligentes Menüsystem .......................114 Menschen, nicht Maschinen: Bruce Perens ..119
6
92
Inhaltsverzeichnis
5
Datenbanken mit MySQL und PHPMyAdmin
120
Warum eigentlich eine Datenbank? .............122 PHPMyAdmin ..............................................123 Kopfüber in die Datenwelt ...........................128 Mit PHP auf MySQL-Daten zugreifen...........133 Datensätze ändern .......................................137 Tabellenstruktur ändern ...............................141 Tabellen sichern, löschen und importieren ..145 Menschen, nicht Maschinen: Eric S. Raymond...........................................149
6
Eine Logdatei mit MySQL und PHP
150
Kurzer Rückblick und neue Aussichten ........152 Woher des Wegs, Webwanderer? ................153 Datentypen in MySQL .................................155 Datentypen für Zeichenketten ......................155 Numerische Datentypen ..............................157 Datums- und Zeittypen ................................159 Die Tabelle der Logdatei ..............................161 Daten via PHP in eine Tabelle schreiben .....162 Die Logdaten in die Logdatei schreiben .......164 Die Logdatei vollständig ausgeben ...............167 Die Einträge einer Tabelle zählen.................171 Die Logdatei bereichsweise ausgeben ..........175 TIMESTAMP-Einträge einfügen.....................177 TIMESTAMP-Einträge formatiert auslesen .....180 Das komplette Script ....................................182 Menschen, nicht Maschinen: Richard M. Stallman ....................................183
7
7
Eine Mottomaschine für die Homepage 184 Öfter mal was Neues: Die Mottomaschine ...186 Die Motto-Tabelle........................................186 Das Eingabeformular....................................187 Die Auswertung ...........................................189 Berechneter Zufall .......................................191 Ein Abstecher zu den Lottozahlen ................193 Die Motto-Auswahl und -Ausgabe ...............194 Das Bearbeitungsmodul ...............................196 Ausgewählte Mottos anzeigen......................200 Das ausgewählte Motto bearbeiten und speichern ..............................................201 Der Maschinenraum ....................................204 Einträge aus einer MySQL-Tabelle löschen ..208 Eine neue Funktion für die Mottomaschine ..208 Jede Menge Formulare .................................209 Das Auswertungsscript anpassen..................211 Die Ausgaberoutine anpassen ......................213 Zufallszugriffe mit MySQL ...........................216 Die Bildermaschine: Dateiverzeichnisse mit PHP lesen ..............................................218 Menschen, nicht Maschinen: Linus Torvalds..............................................221
8
Fauler Zauber und andere Fallgruben Fehler gibt es immer wieder ... .....................224 Fauler Zauber mit »Magic Quotes« ..............224 Magic Quotes ausgetrickst ...........................227 Sichere Variablenübernahme .......................228 Die fehlerbereinigte Mottomaschine ............231 Die Sollbruchstellen die() und exit() .............233 Datei- und Datenbankfehler abfangen..........234 Fehlermeldungen bei fehlgeschlagenem Lese- oder Schreibzugriff..............................238 Fehlermeldungen protokollieren ..................241 Die Protokolldatei auslesen und löschen......244 Typische Fehler............................................246 Menschen, nicht Maschinen: Kai Oswald Seidler und Kay Vogelgesang ....249
8
222
Inhaltsverzeichnis
9
Ein Gästebuch
250
Konzept eines Gästebuches .........................252 Eine Tabelle in Handarbeit...........................252 Das Grundgerüst ..........................................256 Die Vorschauroutine ....................................259 Inhalte und Formate .....................................262 Einen Beitrag speichern................................264 Gästebuch ausgeben ....................................266 Der Gästebuch-Prototyp ..............................268 Fehleingaben abfangen ................................269 Umbrüche einfügen .....................................272 Das Gästebuch komplett ..............................274 Menschen, nicht Maschinen: Larry Ewing ....277
10
Ein Weblog
278
Was ist ein »Weblog«? .................................280 Die Zielvorgabe ...........................................280 Das Grundgerüst ..........................................282 Die Tabellen ................................................286 Das Admin-Interface ....................................287 Noch einmal: Datums- und Zeitfunktionen ..291 Menüeinträge auslesen und anzeigen...........293 Das Blog anzeigen .......................................294 Zwischenstand .............................................298 Einen Kennwortschutz einfügen ...................298 Die Formatierung der Eingabe......................302 Schönheitsreparatur beim Menü...................303 Menschen, nicht Maschinen: Sie, ich, wir alle ...........................................304
Internetlexikon
305
Stichwortverzeichnis
311
9
Liebe Leserin, lieber Leser, warum interessiert man sich für PHP und MySQL und greift zu einem Buch zu diesem Thema? Aus Neugier, allgemeinem technischen Interesse oder weil man Programmiersprachen und Datenbanken als solche so ungemein spannend findet? Mag sein. Doch vor allem wohl deshalb, weil einem die immer gleichen Webseiten aus reinem HTML nicht mehr genügen. Weil man sich die Arbeit erleichtern will. Weil man es leid ist, unzählige Dokumente zu öffnen, zu bearbeiten und zu speichern, nur weil sich ein Eintrag geändert hat. Weil man seine Homepage flexibler und leistungsfähiger gestalten möchte. Weil man endlich die Vorteile dynamischer Websites nutzen möchte. Wenn Sie das wollen, dann sind Sie bei diesem Buch genau richtig. Es wird Sie Schritt für Schritt mit ausführlichen Erklärungen von den ersten zögerlichen Anfängen in PHP und MySQL bis zur Erstellung eines Weblogs begleiten und Sie mit den erstaunlichen Möglichkeiten dieses dynamischen Duos vertraut machen. Wenn Sie bislang nur mit HTML gearbeitet haben, dann halten Sie sich gut fest – mit PHP und MySQL revolutionieren Sie Ihre Homepage und stoßen in bislang völlig ungeahnte Bereiche vor. Dieses Buch setzt auf die motivierende Kraft des schnellen Erfolgserlebnisses, auf den Praxiskick, der einem dabei hilft, den Spaßfaktor einer nur scheinbar so trockenen Sache wie dem Programmieren zu entdecken. Die Funktionen von PHP und MySQL werden Ihnen nicht um ihrer selbst willen erklärt, sondern immer mit Blick auf ihren möglichen und nützlichen Einsatz in der Praxis. An zahlreichen praxisnahen Beispielen lernen Sie, wie Sie schon mit wenigen Code-Zeilen in PHP die erstaunlichsten Dinge realisieren können. Schließlich müssen Sie kein Informatikstudium absolviert haben, um PHP und MySQL gewinnbringend einzusetzen. Alles, was Sie tun müssen, ist: anfangen. Wenn Sie Anregungen, Kritik oder Fragen zu diesem Buch haben, mailen Sie diese bitte an
[email protected]. P.S.: Die in diesem Buch vorgestellten Beispiele und Scripts finden Sie unter der Adresse http://www.damaschke.de/scripts/ zum Download.
11
Kapitel 1
Erste Schritte in PHP
Mit der serverbasierten Scriptsprache PHP und einer MySQLDatenbank sind dynamische Webseiten kein Problem. In diesem Kapitel bekommen Sie einen ersten Einblick in die erstaunlichen Möglichkeiten, die Ihnen mit PHP & MySQL offen stehen.
Ihr Erfolgsbarometer
Das lernen Sie neu: Dynamische Webseiten mit PHP
14
Xampp!
16
Xampp installieren
18
HTML und PHP
23
Textausgaben mit »echo«
26
Variablen & Konstanten
28
Rechnen und Verknüpfen in PHP
34
Kleine Typenlehre
39
13
Dynamische Webseiten mit PHP PHP ist eine serverbasierte Scriptsprache, die aus statischen HTML-Dateien dynamische, interaktive und flexible Webseiten macht. Mit PHP ist es möglich, Webseiten in Abhängigkeit von individuellen Vorgaben des Benutzers zu erzeugen. Man kann Formular-Eingaben verarbeiten, in einer MySQLDatenbank speichern, zu einem späteren Zeitpunkt wieder auslesen und erneut anzeigen. Script- vs. Programmiersprache
Bei einer Programmiersprache wird der Programmcode durch einen so genannten Compiler in Maschinencode umgesetzt und als direkt ausführbare Programmdatei gespeichert. Die Anweisungen eines Scripts werden dagegen bei jedem Aufruf erneut sequentiell abgearbeitet. Scripts sind normalerweise rechenintensiver und langsamer als Programme, was bei heutigen Computern nicht mehr so stark ins Gewicht fällt.
Eine traditionelle Webseite liegt als HTML-Code auf der Festplatte des Webservers vor. Fordert ein Besucher diese Seite an, so schickt der Webserver eine exakte Kopie der Datei an den Webbrowser des Besuchers, der die gesendeten Daten analysiert und schließlich die Webseite anzeigt. Bei PHP ist das prinzipiell anders. Hier ist eine Webseite kein statisches HTML-Dokument, sondern diese Seite wird erst in dem Moment erzeugt, in dem ein Besucher sie anfordert. Auf dem Server steht gewissermaßen nur die Rohfassung oder Konstruktionsanweisung der angeforderten Seite parat. Diese Rohfassung besteht aus mehr oder weniger viel normalem HTML-Code, in den PHP-Anweisungen eingebettet sind. Diese Anweisungen können sehr einfacher Natur sein – zum Beispiel: »Füge am Kopf jeder angezeigten Seite das aktuelle Datum ein« –, aber auch beliebig komplex werden. Der Besucher einer Webseite merkt davon jedoch nichts. Er fordert unter einer bestimmten Webadresse ein bestimmtes Dokument von einem Webserver an. Der Webserver führt die PHP-Anweisungen in diesem Dokument aus und setzt das gewünschte HTML-Dokument zusammen, das dem Besucher schließlich übermittelt wird. Der Besucher bekommt die PHP-Anweisungen also nicht zu Gesicht, sondern nur das fertige Ergebnis und wird sich allenfalls wundern, warum eine Webseite, die er immer mit der gleichen Adresse aufruft, immer wieder anders aussieht. Selbst ein Blick in den Quelltext der
14
Datenbankbasiertes Webpublishing
Webseite verrät – anders als bei clientbasierten Scriptsprachen wie etwa Javascript, die erst im Browser ausgeführt werden – nichts über ihre Entstehung. Lediglich die Dateiendung, etwa »index.php« statt »index.html«, zeigt, dass es sich hier um eine dynamisch erzeugte Webseite und nicht um eine statische HTML-Datei handelt.
Datenbankbasiertes Webpublishing Durch den Einsatz von PHP wird also eine HTML-Seite flexibel, doch erst in Kombination mit einer MySQL-Datenbank entfaltet sich das volle Potenzial dynamischer Websites in Form eines datenbankbasierten Webpublishings. MySQL
SQL ist die Abkürzung für Standard Query Language. Ein SQL-Server ist ein Datenbankserver, der mittels SQL-Kommandos gesteuert wird. MySQL ist eine sehr leistungsfähige Open-Source-Variante von SQL.
Das klingt jetzt vielleicht etwas rätselhaft, daher dazu rasch ein einfaches Beispiel. Sie möchten, dass beim Aufruf der Startseite »index.php« Ihrer Website ein wechselndes Motto zur Begrüßung angezeigt wird. Beim klassischen HTML-Design würden Sie dieses Motto direkt in den HTML-Code der Startseite integrieren. Möchten Sie das Motto ändern, müssen Sie die Datei index.php im Editor öffnen, das Motto austauschen und die geänderte Datei schließlich wieder auf den Webserver laden. Beim Einsatz von PHP und MySQL gehen Sie dagegen grundlegend anders vor. Die verschiedenen Mottos, die beim Aufruf von index.php angezeigt werden sollen, liegen als Einträge in einer MySQL-Tabelle vor, die zum Beispiel »meine_mottos« heißt. Der Code von index.php enthält dagegen keine direkt anzuzeigenden Texte mehr, sondern nur noch einige HTML-Codes zur Formatierung der Seite und verschiedene PHP-Anweisungen. Wird die Seite aufgerufen, so wird das nächste Motto aus »meine_mottos« ausgelesen, in die Seite eingefügt und die so erzeugte HTML-Datei an den Browser geschickt. Möchten Sie ein Motto hinzufügen, löschen oder korrigieren, so verändern Sie die Daten in der MySQL-Tabelle – die Datei index.php bleibt davon völlig unberührt. Idealerweise enthält die Datei nur die Formatierungen der angezeigten Seite, während die Inhalte aus einer Datenbank ausgelesen werden, die wiederum von Ihnen jederzeit problemlos verändert werden kann.
15
Denkt man dieses Beispiel etwas weiter, gelangt man schnell zu Content Management Systemen, bei denen der Webautor sich nicht mehr mit der Formatierung und HTML-Umsetzung seiner Texte herumschlägt, sondern diese Texte über ein Formular in eine Datenbank eingibt und die webtaugliche Aufbereitung PHP und MySQL überlässt.
Xampp! PHP-Code schreiben ist nicht schwer, ihn auszuführen dagegen sehr: Wie bei HTML benötigen Sie zum Schreiben von PHP-Code keine besonderen Werkzeuge, sondern nur einen einfachen Texteditor, zur Not reicht selbst Notepad, das zum Lieferumfang von Windows gehört. Doch anders als bei HTML können Sie Ihre PHP-Scripte nicht dadurch testen, dass Sie sie lokal in einem Browser öffnen. Schließlich muss PHP-Code von einem PHP-tauglichen Webserver abgerufen werden, damit er ausgeführt wird.
Mit Xampp für Windows können Sie auf Ihrem Windows-Computer einen vollwertigen Webserver mit PHP, MySQL und mehr installieren.
16
Xampp!
Inzwischen gehören PHP und MySQL glücklicherweise zum Standardangebot bei praktisch allen Webhostern, so dass Sie keine Schwierigkeit haben werden, hier einen passenden Anbieter zu finden. Problematisch aber bleibt, dass Sie zum Testen Ihrer Scripts jedes PHPDokument zuerst in ein Testverzeichnis auf dem Webserver hochladen und anschließend mit Ihrem Browser abrufen müssen. Dazu müssen Sie nicht nur permanent online sein (was, falls Sie keine Flatrate oder Standleitung haben, ziemlich ins Geld geht), das kostet auch Zeit und Nerven. Das muss doch einfacher gehen. Die benötigte Serversoftware stammt aus der Open-Source-Szene und kann kostenlos aus dem Internet geladen werden. Nun müssen Sie also nur noch einen lokalen Apache-Webserver mit allen benötigten Modulen installieren und konfigurieren, einen MySQL-Server aufsetzen, und schon – das ist Ihnen zu kompliziert? Ach, wissen Sie was? Mir auch. Apache-Webserver
Wer bei dem Namen des wohl wichtigsten Webservers im Internet an Karl May, Winnetou und edle Indianer denkt, liegt gar nicht mal so falsch. Der Name des Webservers, so sein Entwickler Brian Behlendorf in einem Interview aus dem Jahr 2000, verdankt sich dem Wunsch, ein fantastisches, abenteuerliches Bild zu beschwören. Erst nach der Namensfindung fiel ihm auf, dass »Apache« auch ein hübsches Wortspiel ist: »a patchy Server«, ein geflickter, gepatchter Server. Schließlich bestehe Serversoftware aus einm Haufen Software-Flicken und -Modulen und wird ständig weiterentwickelt und gepatcht.
Glücklicherweise müssen wir uns auch nicht in die ganz und gar nicht trivialen Untiefen der Webserverinstallation und -konfiguration einarbeiten, um mit PHP und MySQL spannende Dinge anstellen zu können. Denn da gibt es lobenswerterweise die Apachefriends, die uns sehr viel Arbeit abgenommen haben und eine lokale Serverinstallation auf Mausklick bereit halten. Kostenlos, versteht sich. Die Lösung des Problems lautet Xampp für Windows. Dabei ist »ampp« die Abkürzung für Apache, MySQL, PHP und Perl, das X steht als Platzhalter für verschiedene Betriebssysteme. Xampp für Windows wird mitunter auch als Wampp bezeichnet. Aber das klingt nicht so hübsch, also lassen wir das. Xampp für Windows läuft unter allen Windows-Installationen ab Version Windows 98 und bietet ein fix und fertig konfiguriertes und sofort einsatzbe-
17
reites Programmpaket, in dem sich alles findet, was Sie zum Betrieb eines Webservers benötigen. Neben den Bestandteilen, die bereits im Namen genannt werden, sind dies zum Beispiel auch FTP-Server, Mailserver und verschiedene Hilfsprogramme wie das unverzichtbare Tool PHPMyAdmin, das im Rahmen dieses Buches noch eine große Rolle spielen wird.
Xampp installieren Die jeweils aktuelle Version von Xampp für Windows finden Sie unter www.apachefriends.org. Alle Scripts in diesem Buch wurden mit der zum Zeitpunkt der Manuskripterstellung aktuellen Version 1.4.5 von Xampp getestet. Die Installation und Inbetriebnahme von Xampp wird auf den Webseiten der Apachefriends ausführlich beschrieben und im Folgenden exemplarisch vorgestellt.
Wenn Sie die EXE-Datei der Installationsdatei laden, beschränkt sich die Xampp-Installation auf wenige Mausklicks.
1 Laden Sie die gewünschte Installationsdatei von Xampp für Windows von den
Webseiten der ApacheFriends und entpacken Sie diese Datei im Hauptverzeichnis Ihrer Festplatte, d. h. normalerweise auf Laufwerk C:\. Am einfachsten geht dies, indem Sie die EXE-Version der Installationsdatei laden und starten. Anschließend finden Sie das Verzeichnis »xampp« im Hauptverzeichnis, also etwa C:\xampp\.
2
Wechseln Sie nun in das neu angelegte Xampp-Verzeichnis auf Laufwerk C:\ und starten Sie die Datei »xampp_start.exe«. Es öffnet sich ein DOS-Fenster, das Sie über den Start von Apache und MySQL informiert. Dieses Fenster dürfen Sie nicht schließen, aber Sie können es natürlich minimieren.
18
Xampp installieren
Ein Klick und schon läuft auf Ihrem lokalen Windows-Computer ein Web- und ein MySQL-Server.
3 Rufen Sie nun in Ihrem Webbrowser die Adresse http://localhost/ auf. Wenn
alles geklappt hat – und es gibt eigentlich keinen Grund, warum es das nicht getan haben sollte –, sehen Sie nun die Xampp-Begrüßungsseite.
Na, wer sagt's denn: Xampp stellt Ihnen alles zur Verfügung, was Sie zur PHP- und MySQL-Entwicklung benötigen.
19
4
Um die Arbeit mit Xampp zu beenden und alle laufenden Server wieder zu stoppen, rufen Sie im Xampp-Verzeichnis einfach die Datei »xampp_stop.exe« auf.
Und tschüss – so einfach, wie Sie die verschiedenen Server starten, so einfach beenden Sie sie auch wieder.
WICHTIGE DURCHSAGE!
Sobald Xampp gestartet ist, läuft auf Ihrem Computer unter anderem ein vollwertiger Webserver und ein Datenbankserver. Sollten Sie zu diesem Zeitpunkt online sein, sind diese Server – und damit Ihr Computer – via Internet zu erreichen und angreifbar. Die Absicherung der verschiedenen Serverdienste auf Ihrem Computer ist zwar möglich, aber nicht ganz trivial und ihre Beschreibung würde den Rahmen dieses Buches sprengen. Am einfachsten und sichersten ist es, wenn Sie während der Zeit, in der Sie Xampp laufen lassen, einfach offline bleiben.
20
Der erste PHP-Test
Sobald Sie via Xampp den Apache-Webserver gestartet haben, ist Ihr Computer im Internet erreichbar. Falls Sie während der Arbeit mit Xampp online sind, sollten Sie den Zugriff von außen auf Ihren Computer möglichst unterbinden. Allerdings ist nicht jede Personal Firewall (hier: Sygate) in der Lage, bei Zugriffen auf den Server zwischen denen, die von der lokalen Maschine erfolgen (und also harmlos sind) und denen, die von außen kommen (und die ein potentielles Sicherheitsrisiko darstellen) zu unterscheiden.
Der erste PHP-Test Sobald Sie Xampp installiert und probeweise gestartet haben, müssen Sie nur noch das Webverzeichnis für Ihre Tests vorbereiten und schon steht Ihrer PHP- und MySQL-Entwicklung nichts mehr im Weg.
1
Im Xampp-Verzeichnis finden Sie einen Ordner namens »htdocs«. Auf dieses Verzeichnis greift der Apache-Webserver standardmäßig als Webverzeichnis zu. Heißt Ihr Xampp-Verzeichnis »C:\xampp« und rufen Sie im Browser die Adresse http://localhost/index.php auf, dann schickt Apache die Datei C:\xampp\htdocs\ index.php an den Browser. Nach der Installation von Xampp finden sich im Webverzeichnis zahlreiche Beispiele, Demos und Dokumente.
2
Benennen Sie das Verzeichnis »htdocs« um, etwa in »htdocs_xampp«, und legen Sie ein neues Verzeichnis »htdocs« an. Dieses neue, leere Verzeichnis entspricht einem neuen und leeWren Verzeichnis bei einem Webhoster.
Sichern Sie das originale Xampp-Webverzeichnis, indem Sie es einfach umbenennen und legen Sie ein neues htdocs-Verzeichnis für Ihre Tests an.
21
Wenn Sie jetzt Xampp starten und Ihren lokalen Webserver mit http://localhost/ aufrufen, erhalten Sie eine Fehlermeldung. Kein Wunder, das Webverzeichnis ist ja leer und das Verzeichnis, auf das Apache in der XamppKonfiguration standardmäßig zugreifen will, existiert nicht mehr. Aber das ändern wir jetzt und setzen dabei sofort eine Prise PHP ein.
3
Öffnen Sie Ihren Editor, notieren Sie in einem neuen, leeren Textdokument das folgende Kommando
4
und speichern Sie die Datei im neu angelegten »htdocs«-Verzeichnis auf Ihrer Festplatte unter dem Namen »index.php«.
Kleine Ursache, große Wirkung: Die unscheinbare Code-Zeile führt zu einer kompletten Konfigurations-Anzeige der installierten PHP-Version.
5 Starten Sie Xampp und rufen Sie in Ihrem Browser die Adresse http://localhost/
index.php auf. Sie sehen nun nicht den kurzen Textschnipsel, den Sie gespeichert haben, sondern eine umfangreiche Tabelle mit Informationen über die laufende PHPInstallation. Wenn Sie einen Blick in den Quelltext der Seite werfen, sehen Sie, dass der unscheinbare Einzeiler offensichtlich eine vollständige HTML-Seite erzeugt hat.
22
HTML und PHP
Was ist da passiert? Nun, ganz einfach: Wir haben vom Webserver eine Datei mit der Endung ».php« angefordert. Anhand dieser Endung erkennt der Server, dass es sich hier nicht um eine normale HTML-Datei handelt, die er unbesehen durchreichen kann, sondern dass sich in der Datei ein Script befindet, das er ausführen muss, bevor die Datei versandfertig ist. Der Webserver öffnet die Datei und stößt sofort auf eine spitze Klammer, gefolgt von einem Fragezeichen: , womit ihm das Ende der PHP-Anweisung signalisiert wird. Alles, was jetzt folgt, ist wieder normaler HTML-Code. Da aber nichts mehr folgt, wird die Datei abgeschlossen und an den Browser geschickt, der die Datei index.php angefordert hat. Der Browser bekommt eine aus seiner Perspektive völlig normale HTML-Seite und stellt sie wie gewohnt dar.
HTML und PHP Das kleine Beispiel zeigt zwar recht eindrucksvoll, wie aus einer unscheinbaren PHP-Anweisung eine ausgewachsene Webseite wird, ist aber, zugegeben, auch ein wenig untypisch. Zum einen kommt es in der Praxis so gut wie nie vor, dass Sie bei Ihren Scripts auf eigenes HTML völlig verzichten, zum anderen werden Sie eigentlich immer mehr als nur eine Zeile PHP ausführen wollen. Eines allerdings zeigt das Beispiel sehr schön: PHP-Code kann nicht nur an jeder beliebigen Stelle in einem HTML-Dokument eingefügt werden, er benötigt noch nicht einmal HTML. Man muss nur darauf achten, dass der PHP-Code korrektes HTML erzeugt, das in einem Webbrowser dargestellt werden kann. Der PHP-Code selbst besteht aus beliebig vielen Anweisungen, die durch ein Semikolon voneinander getrennt werden (das Semikolon darf fehlen, wenn es sich um die letzte Anweisung eines Scripts handelt). Damit der Interpreter den Code eindeutig von der HTML-Umgebung, in die er einge-
23
bettet ist, trennen kann, wird er normalerweise durch ein abgeschlossen. Die Einleitung können Sie auch als arbeiten können. Ein typisches Grundgerüst einer HTML-Datei mit PHP-Code sieht also beispielsweise so aus: Hier steht irgendwas in HTML Hier ist nochmal HTML
Der Vollständigkeit halber sei angemerkt, dass PHP-Scripte innerhalb einer HTML-Datei nicht nur einmal und an einer Stelle, sondern beliebig oft an beliebigen Stellen eingefügt werden können. Die verschiedenen Scripte werden dabei als zusammengehörig aufgefasst. So können Sie in dem einen Script auf Informationen und Daten zugreifen, die Sie in einem anderen Script innerhalb der Datei benutzen. Frei platzierbar
Im Gegensatz zu anderen Scriptsprachen wie etwa Javascript können PHP-Anweisungen an beliebigen Stellen auftauchen – auch außerhalb des HTML-Bereichs. So ist es zum Beispiel möglich, die HEADERDaten einer HTML-Datei über ein PHP-Script zu gestalten, bevor die Datei angezeigt wird.
Wir werden in späteren Beispielen verschiedene praktische Anwendungen kennen lernen. Der typische Einsatz dieser Eigenheit besteht etwa darin, dass Sie in einem Script bestimmte Berechnungen durchführen, die Ergebnisse dieser Berechnungen ausgeben und anschließend weitere Berechnungen erstellen. Die Ergebnisausgabe erfolgt in solchen Fällen typischerweise der Einfachheit halber in HTML, anschließend wechselt man wieder zum Script.
24
Kommentare in PHP
Ausgabe und Formatierung der Ergebnisse in HTML
Kommentare in PHP Wenn Sie ein PHP-Script schreiben, dann wissen Sie natürlich, was die einzelnen Anweisungen bewirken sollen. Das wissen Sie vermutlich auch noch am nächsten Tag. Oder in der nächsten Woche. Aber wissen Sie das auch noch im nächsten Monat oder gar im nächsten Jahr? Aus diesem Grund sollten Sie sich angewöhnen, Ihren Code zu kommentieren. Das mag zur Zeit noch reichlich übertrieben anmuten, schließlich sind die einzelnen Beispiele bislang praktisch selbst erklärend, doch Sie wissen ja – früh übt sich ...
1
Wenn Sie nur kurze Kommentare und Hinweise einfügen, dann setzen Sie einen doppelten Schrägstrich // vor den Kommentar, PHP ignoriert (fast) alles, was nach dieser Markierung kommt bis zum Zeilenende. Das könnte etwa so aussehen:
Das Auswertungsscript des Formulars macht noch nicht mehr, als die eingegebenen Daten zur Kontrolle auszugeben; aber für den Anfang ist das ja schon mal nicht schlecht.
Eingaben überprüfen Der erfolgreiche Testdurchlauf zeigt uns, dass die Datenübertragung vom Formular zum Script funktioniert, wir können uns nun daran machen, die eingegebenen Daten zu überprüfen. Die richtigen Werte für $user und $pass können wir einfach im Script deklarieren. Da der PHP-Code auf dem Server ausgeführt und nicht an den Webbrowser übermittelt wird, bekommt der Besucher diese Deklaration auch dann nicht zu Gesicht, wenn er sich den Quelltext der Seite anzeigen lässt. Über eine if-Abfrage vergleicht man die eingegebenen mit den korrekten Daten. Nur wenn sowohl die Eingabe für den Benutzernamen als auch das Kennwort korrekt sind, die logische Verknüpfung mit AND bzw. in der Kurzform mit && also den Wert true ergibt, werden die Anweisungen in der ifAbfrage ausgeführt.
79
In der Grundform zum Testen könnte das zum Beispiel so aussehen:
Nun sollten die Zugangsdaten zu einer Webseite regelmäßig geändert werden. In diesem Fall müssten wir die Variablen $user_ok und $pass_ok im Script ändern, was auf Dauer aber ein wenig umständlich ist. Angenehmer wäre es doch, wenn wir die Zugangsdaten in einer externen Datei, deklarieren und die Formularseite einfach in Ruhe lassen könnten. Obendrein gilt es ein potentielles Sicherheitsrisiko zu bedenken: Es ist denkbar, dass auf dem Webserver der PHP-Interpreter ausfällt und der Server das Script nicht interpretiert, sondern als Klartext direkt an den Browser schickt. Zugegeben, das kommt praktisch nicht vor, aber es ist möglich. In diesem Fall könnte der Besucher die korrekten Eingaben einfach im Script nachlesen, was nun nicht gerade Sinn und Zweck eines Kennwortschutzes ist. Auch hier empfiehlt es sich folglich, die korrekten Daten außerhalb des Formulars und der Auswertungsroutine zu definieren.
Externe Dateien einbinden Externe Dateien lassen sich mit PHP über die Anweisung include() einbinden. Dabei wird der Inhalt der angegebenen Datei vollständig an die Stelle des include()-Kommandos gesetzt. Vor der Ausführung der Anweisung wird der aktuelle PHP-Code vorübergehend beendet, der Inhalt der angegebenen Datei geladen und anschließend PHP wieder aktiviert und das Script an der Stelle fortgeführt, an der es mit include() unterbrochen wurde. Das bedeutet in der Praxis: Möchten Sie im eingefügten Teil PHP-Kommandos benutzen, dann müssen Sie diese wie gewohnt mit beenden. Andernfalls wird der Dateiinhalt als normales HTML betrachtet. Wenn wir so in einer externen Daten namens »zugang.php« die Zugangsdaten definieren –
80
Externe Dateien einbinden
– können wir diese in unserem Script über include("zugang.php") einbinden und sind damit in der Lage, in Zukunft Username und Passwort zu ändern, ohne das komplette Formular oder das Auswertungsscript bearbeiten zu müssen. Doch das Sicherheitsproblem bleibt bestehen: Wer den Namen der Datei mit der Variablendefinition kennt, kann die Datei unabhängig vom Formular oder Script direkt aufrufen und sich im Browser anzeigen lassen. Und wenn dann noch die PHP-Auswertung schief gehen sollte, war die ganze Kennwortmühe für die Katz. So unwahrscheinlich dieses Szenario auch ist – es ist nicht unmöglich, dass jemand einfach durch einen blöden Zufall über die eigentlich geheimen Daten stolpert. Include() und Pfadangaben
Die Funktion include() sucht standardmäßig im aktuellen Verzeichnis nach der einzubindenden Datei. Will man Dateien aus anderen Verzeichnissen einbinden, muss man eine relative Pfadnotierung benutzen. Mit include ("../inc/#_variablen.inc") greift man also auf die Datei #_variablen.inc zu, die, ausgehend vom übergeordneten Verzeichnis, im Verzeichnis »inc« zu finden ist.
Hier machen wir uns eine Eigenheit von HTML bzw. den Webbrowsern zunutze und notieren an den Anfang der Datei ein Doppelkreuz, statt »zugang.php« heißt sie also nun »#zugang.php«. Diese Datei kann nach wie vor problemlos eingebunden, aber nicht mehr direkt aufgerufen werden. Mit http://localhost/#zugang.php fordert man nämlich nicht mehr die Datei »#zugang.php« an, sondern steuert den Browser zur Sprungmarke »#zugang.php«. Beim Aufruf dieser Seite sucht der Browser nach der HTMLAnweisung in »index.html« oder »index.php«, die er natürlich nicht findet. Selbst wenn der neugierige Besucher also den Dateinamen kennt und obendrein der PHP-Interpreter einen Schluckauf hat, bekommt er die Daten nicht zu sehen. Damit ist der Kennwort-Schutz zwar immer noch nicht hundertprozentig sicher, aber in der Praxis hinreichend sicher genug, um neugierige Zeitgenossen auf Distanz zu halten. Insgesamt sieht unser Script zur Kennwortabfrage jetzt so aus:
81
Nun müssen wir nur noch in der if-Abfrage die kennwortgeschützten Daten eintragen. Auch hier setzen wir das include()-Kommando ein. Unsere Testdatei, die nur nach Eingabe von Benutzername und Kennwort angezeigt werden soll, enthält ein paar HTML-Anweisungen und soll als »#geheim.inc« gespeichert werden (die Dateiendungen spielen in der include()-Anweisung keine Rolle und sind frei wählbar): Guten Tag,
Diese Webseite wird nur nach Eingabe des Benutzernamens und des Kennwortes angezeigt.
Diese Datei wird nun mit include("#geheim")als Anweisung in die die if-Abfrage eingefügt. Wenn wir nun noch wegen der besseren Übersicht die Einbindung der Datei mit den Zugangsdaten an den Anfang der HTML-Datei setzen, sind wir fertig. Die vollständige Webseite mit Formular und Auswertungsroutine hat damit folgende Form bekommen: Username:
Kennwort:
82
Ein Kontaktformular auf der Webseite
Mit nur wenig Aufwand lässt sich in PHP ein relativ sicherer Kennwortschutz für Webseiten realisieren.
Ein Kontaktformular auf der Webseite Wer auf seiner Webseite den Besuchern die Möglichkeit bieten möchte, via E-Mail Kontakt aufzunehmen, der hat ein kleines Problem. Natürlich kann er einfach seine E-Mail-Adresse auf der Seite hinterlegen. Doch wer seine E-Mail öffentlich zugänglich macht, bekommt früher oder später jede Menge unerwünschte Werbebotschaften (Spam), Viren und Ähnliches mehr. Man könnte seine Mailadresse auch als Grafik hinterlegen, aber das ist natürlich nur eine Notlösung. Besser ist es, den Besuchern ein Kontaktformular zu bieten, über das sie den Betreiber der Website eine Nachricht zukommen lassen können. Dabei sorgt ein einfaches PHP-Script für die Auswertung der Formulareingaben und übernimmt den Mailversand. Von außen ist keine Mailadresse zu erkennen, die »Harvester«, also Programme, die Webseiten automatisch nach Adressen absuchen, haben da keine Chance.
1
Ein Kontaktformular benötigt mindestens drei Felder für Absendername, Absenderadresse und die eigentliche Nachricht. Außerdem brauchen wir noch eine Schaltfläche, mit der die Mail auf den Weg geschickt wird. Nach dem Versand soll die Mail zur Kontrolle noch einmal angezeigt werden.
2
Anders als bei der Kennwortabfrage wird die Auswertung des Scripts diesmal in einer eigenen Datei vorgenommen, etwa »auswertung.php«, die über das actionAttribut des -Element definiert wird.
83
3
Der einfache Formularcode in HTML könnte also etwa so aussehen (natürlich sollte das Formular im konkreten Einsatz deutlich ansprechender gestaltet werden, aber für unsere Zwecke genügt es auch so): Ein Kontaktformular <style type="text/css"> td {vertical-align : top; text-align: right;} Ein einfaches Kontaktformular
Ihr Name | |
Ihre Mailadresse | |
Ihre Nachricht | |
Das Auswertungsscript in »auswertung.php« macht nun nichts anderes, als die Daten entgegenzunehmen und nach einer kurzen Plausibilitätsüberprüfungen mit der Funktion mail() an eine bestimmte Adresse zu schicken. Mailkonfiguration
Damit Sie mit der Mailfunktion E-Mails verschicken können, muss auf Ihrem Computer natürlich ein SMTP-Server laufen, was in der Regel nicht der Fall sein dürfte. Mit der lokalen Installation von Apache, PHP und MySQL, wie sie etwa von Xampp zur Verfügung gestellt wird, ist der Aufruf der mail()-Funktion unter Umständen nicht möglich.
84
Die Auswertung
In diesem Fall müssen Sie die letzten Tests auf Ihrem Webserver vornehmen. Falls dies ebenfalls scheitern sollte, hat Ihr Provider die Mailfunktion von PHP vermutlich leider deaktiviert.
Für den Einsatz im richtigen Leben sollte das Formular natürlich deutlich ansprechender gestaltet werden, aber zur Demonstration der grundlegenden Funktionalität mag es auch so schmucklos hingehen. Der eigentliche PHP-Teil beginnt, sobald Sie auf »Ab die Post ...« klicken.
Die Auswertung Im ersten Schritt liest das Auswertungsscript die übergebenen post-Variablen aus. Nur, wenn auch ein Mail-Text, ein Absendername und eine Absenderadresse vorhanden ist, wird die eigentliche Mail ausgefüllt. Ansonsten moniert das Script die fehlenden Daten an. Die übergebenen Werte werden diesmal nicht mit der Funktion isset() überprüft, sondern mit empty(). Der Grund: Das Formular übermittelt auf jeden Fall Werte für Namen, Adresse und Nachricht. Hat der Besucher nichts ausgefüllt, sondern einfach nur auf die Schaltfläche geklickt, dann sind die übergebenen Variablen zwar leer – aber sie existieren dennoch. Eine Abfrage mit isset() wird folglich auf jeden Fall true ergeben. Andererseits ist die Eingabe »0« in einem der drei Felder unsinnig und kann von
85
uns genauso behandelt werden, wie ein komplett leeres Element, so dass die Besonderheit von empty(), den Wert »0« als »leer« zu interpretieren, bei der Auswertung keine störende Rolle spielt. Wenn eine Variable also leer sein oder nur den Wert 0 enthalten sollte, dann wird in der Variablen $fehler die auszugebende Fehlermeldung zusammengesetzt, die später mit der Einleitung »Ihre Nachricht konnte nicht verschickt werden, weil « ausgegeben wird:
Nur wenn die Variable $fehler, die anfangs als leer definiert ist, auch nach diesen Abfragen noch leer ist, wird die Mail mit mail() abgeschickt. Dabei erwartet die Funktion mindestens drei Parameter (und zwar in dieser Reihenfolge): den Empfänger der Mail, die Betreffzeile und die eigentliche MailNachricht. Mit dem Aufruf von mail("
[email protected]", "Test", "Dies ist ein Test");
wird die Mailnachricht »Dies ist ein Test« mit dem Betreff »Test« an die Mailadresse »
[email protected]« geschickt. Als Absender der Mail wird standardmäßig die Adresse »me@localhost« eingetragen. Dies können Sie ändern, wenn Sie der Funktion zusätzlich zu den drei Pflichtangaben noch den From-Eintrag im Mailheader für den Absender übergeben. Die eingegebenen Daten könnten wir also zum Beispiel mit dieser kleinen if-Abfrage per Mail verschicken:
86
Die Auswertung
Allerdings ist diese Lösung noch nicht wirklich überzeugend. Die Nachricht sollte eine kleine Einleitung mit Datum und Absendernamen besitzen, damit wir als Empfänger auch sofort wissen, woher diese Mail kommt. Dabei sollen Datum, Uhrzeit und Absender zeilenweise untereinander stehen. Ein Zeilenumbruch wird in einer E-Mail natürlich nicht mit dem
-Element erzielt, schließlich handelt es sich ja um einen reinen Text, nicht um HTML. In einer Textdatei wird ein Zeilenumbruch stattdessen durch die Kombination von »Wagenrücklauf« (Return) und »Zeilenvorschub« (Line-Feed) eingefügt, die die ASCII-Codes 13 und 10 besitzen. Mit der Funktion chr() können wir jedes ASCII-Zeichen ausgeben, indem wir ihr den entsprechenden Wert übergeben. Für einen Zeilenumbruch benötigen wir also chr(13) und chr(10), die wir der Einfacheit halber in der Varialbe $nz (für: neue Zeile) zusammenfassen:
Über die mail()-Funktion können Sie via PHP problemlos E-Mails verschicken.
87
Die Ausgabe Nun können wir uns daran machen, den HTML-Code für die Seite zu schreiben, die nach dem Abschicken des Kontaktformulars angezeigt werden soll. Falls kein Fehler aufgetreten ist, soll eine Bestätigung zusammen mit einer Kopie der Nachricht angezeigt werden. Andernfalls soll auf die fehlenden Einträge hingewiesen werden. Die abgeschickte Mailnachricht liegt in der Variablen $text vor, zur Ausgabe im HTML-Code müssen wir allerdings Verschiedenes beachten.
•
Die Codefolge chr(13)chr(10) muss durch ein
-Element ausgetauscht werden.
•
Eventuell vorhandene Sonderzeichen müssen durch HTML-Entities ersetzt werden.
•
Eventuell eingegebener HTML- oder PHP-Code innerhalb der Nachricht muss neutralisiert werden, ansonsten ist die Ausgabe des Textes im Rahmen unseres HTML-Codes nicht vorhersagbar und kann schlimmstenfalls zum Absturz des Browsers führen.
1
Der letztgenannte Schritt ist in der Bearbeitungsreihenfolge der erste. Denn würden wir zuerst die Return/Line-Feed-Codes durch einen HTML-Zeilenumbruch ersetzen, so würden bei der anschließenden Code-Entfernung auch unsere eingefügten
-Elemente wieder verschwinden. Und das ist ja nicht Sinn der Aktion. Für die Entfernung von HTML- und PHP-Code aus einer Zeichenkette bietet PHP die Funktion strip_tags().
2
Im nächsten Schritt werden die Sonderzeichen mit der schon mehrfach benutzten Funktion htmlentities() durch Entities ersetzt. Auch dieser Schritt muss vor der Ersetzung von chr(13)chr(10) erfolgen, weil ansonsten die spitzen Klammern der
-Codes durch die entsprechenden Entities ersetzt und die Break-Anweisungen zu
-Texten würden.
3
Zu guter Letzt werden die Return-Codes mit der schon in Kapitel 2 erwähnten Funktion str_replace() ersetzt.
4 Nimmt man nun alle Teile zusammen und kombiniert sie mit einer if-Abfrage, so ergibt sich folgender Code:
Nach erfolgtem Mailversand wird eine Bestätigung angezeigt, die den Text der Nachricht zur Kontrolle noch einmal ausgibt.
Übrigens könnten Sie die drei Wertezuweisungen für $text zu einer einzigen Zeile zusammenfassen, indem Sie die benötigten Funktionsaufrufe kombinieren. Aber das geht nur auf Kosten der Lesbarkeit des Codes und sollte als fehleranfälliges Verfahren eher vermieden werden: $text = str_replace($nz, "
", htmlentities(strip_tags($text)));
5 Nun fehlt uns nur noch eine else-Anweisung, die für den Fall, dass die Variable
$fehler nicht leer ist, den Inhalt der Variablen als Fehlermeldung ausgibt. Da die Fehlermeldung aus einzelnen, mit
formatierten Zeilen besteht, wird die Fehlermeldung mit dem Listenelement