PHP und MySQL E INFÜHRUNG PHP und MySQL Eine Einführung von Norbert Rogler 1/0 PHP und MySQL E INFÜHRUNG 2/0 Copyright c 2004-2009 Norbert Rogler D-95100 Selb [email protected] Dieser Text wurde ursprünglich in DocBook XML verfasst, dann mit dblatex nach LATEX übersetzt und dort weiter bearbeitet. Er darf im Ganzen oder in Auszügen kopiert und im Sinne der GNU/GPL (»GNU GENERAL PUBLIC LICENSE«) weiterverwendet werden. Es wird keinerlei GARANTIE für das Funktionieren der hier vorgestellten Methoden übernommen. Jede HAFTUNG für SCHÄDEN, die aus der Anwendung dieser Methoden entstehen oder daraus, dass sich diese Methoden nicht in der gewünschten Weise anwenden lassen, wird hiermit AUSGESCHLOSSEN. Dieser Text enthält viele Links auf diverse Internet-Seiten. Dies ist einerseits bequem, andererseits ändert sich da vieles oft sehr schnell. Sie müssen deshalb manchmal die neue URL selber suchen. PHP und MySQL E INFÜHRUNG 3/0 Inhaltsverzeichnis Einleitung 1 2 3 4 5 5 Editoren 10 1.1 Linux und Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.2 Nur Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.3 Nur Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Erste PHP-Beispiele 13 2.1 Aufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.2 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Zins-Projekt 15 3.1 Ziel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.2 Vorbereitungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.3 Parameter mit der GET-Methode übergeben . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.4 Ablaufsteuerung von Programmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.4.1 Kontrollanweisungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.4.2 Logische Ausdrücke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.4.3 Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Lesen von Text-Dateien 26 4.1 Zu den Zielen und Beispieldateien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 4.2 Öffnen und Schließen von Dateien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Datenbanken (allgemein) 29 5.1 Datenbank-Management-Systeme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 5.2 Realisierungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 5.2.1 Dektop-Datenbank-Systeme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 5.2.2 Client-Server-Datenbank-Systeme . . . . . . . . . . . . . . . . . . . . . . . . . . 30 PHP und MySQL E INFÜHRUNG 4/0 5.3 5.4 6 7 Relationale Datenbanken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 5.3.1 Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 5.3.2 NULL-Werte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 5.3.3 Schlüssel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 5.3.4 Werkzeuge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 MySQL 33 6.1 Freie Datenbanksysteme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 6.2 Zur Einführung in MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 6.2.1 Programme zur Administration von MySQL . . . . . . . . . . . . . . . . . . . . 34 6.2.2 Starten des Kommandozeilen-Client . . . . . . . . . . . . . . . . . . . . . . . . . 34 6.2.3 MySQL-Benutzerverwaltung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 6.3 Aufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 6.4 Lösungen der Aufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 PHP und MySQL 39 7.1 Die wesentlichen Operationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 7.2 Die mitgelieferten Beispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 7.3 Session-Verwaltung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 7.4 Passwort-Schutz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 7.5 Lösungen der Aufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Literaturverzeichnis 45 PHP und MySQL E INFÜHRUNG 5/0 Einleitung Einführung Im Herbst 1994 begann Rasmus Lerdorf mit der Entwicklung von PHP. Die erste öffentlich verfügbare Version erschien 1995 unter dem Namen Personal Home Page Tool Seitdem wird PHP kontinuierlich von verschiedenen Personen weiterentwickelt, wobei die Koordination weiter bei Rasmus Lerdorf liegt. Der Name PHP wird heute als PHP Hypertext Preprocessor interpretiert. Inzwischen (2007) sind wir bei PHP 5.2 angelangt, wobei in PHP 5 vor allem die Unterstützung Objektorientierter Programmierung gegenüber PHP 4 stark verbessert wurde. Der folgende einführende Text ist wörtlich übernommen aus PHP kurz & gut von Rasmus Lerdorf O’Reillys Taschenbibliothek c 2000 by O’Reilly Verlag GmbH & Co. KG PHP und MySQL E INFÜHRUNG 6/0 Beginn des Zitats: PHP ist - kurz gesagt - eine serverseitige, in HTML eingebettete plattformunabhängige Skriptsprache. Einfacher ausgedrückt: PHP ermöglicht es Ihnen, Anweisungen in HTMLCode einzufügen, um dynamische Inhalte zu erzeugen. Diese Anweisungen werden vom Webserver eingelesen und verarbeitet. Der Browser, der die Seite anzeigt, bleibt davon völlig unberührt. Der Webserver ersetzt den PHP-Code durch den Inhalt, der durch den Code beschrieben wird. PHP kann so konfiguriert werden, dass es entweder als Servermodul oder als eigenständiges CGI-Skript arbeitet. Zum jetzigen Zeitpunkt ist die Servermodulversion nur auf Unix-Apache-Webservern produktiv einsetzbar. Die CGI-Version ist dagegen auf allen Webservern lauffähig, sowohl auf Unix als auch auf Windows 95/98/NT. Für die Windows-Plattform (PHP-Version 4) werden die Servermodule dahingehend weiterentwickelt, dass sie mit ISAPI, NSAPI und WSAPI lauffähig sind, was bedeutet, dass die Servermodule eventuell Microsofts IIS, Netscape Enterprise Server und O’Reillys Webseite unterstützen werden. Für Details über die Verfügbarkeit von PHP siehe http://www.php.net Die Sprache PHP bedient sich der Konzepte anderer weitverbreiteter Sprachen wie C und Perl. Falls Sie Erfahrungen in einer dieser Sprachen haben, werden Sie sich bei PHP gleich heimisch fühlen. Als Ergänzung seines Grundwortschatzes bietet PHP eine große Menge von Funktionen an, die alles von Array-Manipulationen bis hin zu regulären Ausdrücken unterstützen. Eine der gebräuchlichsten Anwendungen von PHP ist die Datenbankanbindung. PHP unterstützt eine Vielfalt von Datenbanken direkt. Viele andere sind indirekt über die ODBCFunktionen von PHP verfügbar. Mit Hilfe dieser Datenbankanbindung ist es zum Beispiel möglich, mit PHP ein Webinterface für die Produktdatenbank einer Firma zu erstellen. Ende des Zitats. Vorbereitungen und Installationen Voraussetzungen Dieser Text ist gedacht als Grundlage für einen einführenden Kurs in LAMP (»Linux Apache MySQL und PHP«) oder in WAMP (»Windows Apache MySQL und PHP«) im Umfang von ungefähr 24 Stunden. Da PHP auch mit anderen Web-Servern (z.B. dem »Internet Information Server« von Microsoft) und mit vielen Datenbanksystemen gut zusammenspielt, geht es letztlich um die Erstellung Dynamischer Web-Seiten mit PHP . Es handelt sich hier nicht um ein eigenständiges Tutorial, sondern um einen Leitfaden, der eine Sammlung von Beispielen und Verweise auf Materialien zur Verfügung stellt, die mir für einen solchen Kurs geeignet erscheinen. Alle Beispiele und fast alle der referenzierten Materialien sind frei im Internet erhältlich. Von den TeilnehmerInnen werden erwartet: Grundkenntnisse in HTML. PHP und MySQL E INFÜHRUNG 7/0 Grundkenntnisse in strukturierter Programmierung. Grundkenntnisse im Bereich Datenbanken und in SQL. Wir gehen von folgender Ausstattung des Unterrichts-Raumes aus: 1. Allen TeilnehmerInnen steht ein eigener PC mit Linux oder Windows zur Verfügung. 2. Auf jedem Rechner ist ein Benutzer php eingerichtet. Diesem steht (wenigstens) ein leistungsfähiger Editor zur Verfügung. 3. Auf allen Rechnern wird der Web-Server Apache 2.x installiert mit Unterstützung für PHP 5. 4. Auf allen Rechnern wird der Datenbankserver MySql installiert. 5. Unter Linux sollten der Web-Server und der Datenbank-Server beim Booten automatisch starten. Unter Windows ist es empfehlenswert, diese Server nicht als Dienste zu starten. Installieren unserer Arbeitsumgebung Web-Server und Datenbanken Um unsere WEB-Seiten der Öffentlichkeit zugänglich zu machen, werden wir meist einen Provider nutzen. Wenn wir PHP einsetzen wollen, muss dessen WEB-Server natürlich PHP unterstützen. Nachdem wir in diesem Zusammenhang oft auch eine Datenbank nutzen wollen, sollte er uns einen Zugang zu einem Datenbank-System zur Verfügung stellen. Der übliche Zugang geschieht heute über LAMP (Linux + Apache + MySQL + PHP). Zum Testen unserer WEB-Seiten brauchen wir keinen Provider, denn alle oben genannten Programme können wir kostenlos auf unserem Rechner installieren. Es muss auch nicht Linux sein, denn es geht (fast) genauso gut mit WAMP (Windows + Apache + MySQL + PHP). LAMP Alle neueren Linux-Distributionen bringen alles mit, was wir in diesem Kurs benötigen. Wir beziehen uns hier auf SuSE 10.2. Die Installation unter anderen Versionen oder Distributionen kann ganz ähnlich durchgeführt werden, wenn diese einigermaßen aktuell sind. Unter SuSE 10.2 sind die Voraussetzungen 3. und 4. vorhergehender Liste erfüllt, wenn die Selektion Webund LAMP-Server installiert ist. Der Punkt 5. kann mittels yast -> Netzwerkdienste -> HTTP-Server eingerichtet werden. Übernehmen Sie alle Einstellungen, die der »HTTP-Server-Wizard« vorschlägt bis zur letzten Seite. Bevor Sie auf Beenden klicken, sollten Sie die Option Apache2-Server beim Systemstart starten anklicken. PHP und MySQL E INFÜHRUNG 8/0 WAMP Die »Apache Friends« stellen ein Paket XAMPP zusammen, das es ganz leicht macht, eine Plattform zu installieren, die der entspricht, wie sie von vielen Providern unter Linux angeboten wird. (XAMPP gibt es auch für Linux; das scheint mir allerdings ziemlich überflüssig zu sein, weil gängige Linux-Distributionen alles mitbringen, was LAMP beötigt.) Download für die Windows-Version von XAMPP: http://www.apachefriends.org/de/xampp-windows.html (Ich empfehle für Windows die »Installer-Version«.) Wenn Sie auf Ihrem eigenen Rechner installieren, können Sie das Installations-Verzeichnis natürlich frei wählen. Unter Vista sollten Sie dazu kein Unterverzeichnis von C:\Programme wählen, wie es frühere Versionen von XAMPP vorgeschlagen haben. Im Kurs installieren wir in unserem Heimatverzeichnis. Für eine Testumgebung sollten Sie keines der mitgelieferten Programme als Dienst installieren, sondern zur Steuerung der Programme das mitinstallierte »XAMPP Control Panel« verwenden. Testen der Web-Server-Installation Starten des Web-Servers Unter Linux sollte er gestartet sein und in Zukunft auch automatisch starten, Unter Windows müssen Sie den Apache bei der hier vorgeschlagenen Installation manuell mit dem »XAMPP Control Panel« starten. Starten Sie dann einen Web-Browser und geben Sie als URL ein: http://localhost (mittels localhost können Sie immer Ihren eigenen Rechner ansprechen). Es sollte eine HTML-Seite angezeigt werden, die Ihnen mitteilt, dass Ihr Server funktioniert. Anmerkungen zum Literaturverzeichnis Am Schluss dieses Skripts finden Sie ein kurzes Literaturverzeichnis, das ausschließlich Verweise auf deutsche Texte enthält. Diese werden in der Form [ ... ] referenziert. Mit Ausnahme der Bücher [RDB] und [THEIS] können diese Texte frei aus dem Internet bezogen werden. Unter [SOURCE] finden Sie die neueste Version dieses Skripts und ein Archiv mit allen Beispielen, die in diesem Skript behandelt werden. Die Dateinamen, die hinter vielen Aufgaben genannt sind, beziehen sich immer auf dieses Beispiel-Archiv. Dieses Archiv kann unter Linux mit dem Befehl tar -f php_kurs-source.tar.gz -z -x entpackt werden. Unter Windows können Sie dieses Archiv mit neueren Versionen von WinZIP in zwei Schritten entpacken: Das erste Entpacken liefert die Datei php_kurs-source.tar, und wenn Sie diese mit WinZIP öffnen, können Sie nun alle oder nur die gewünschten Dateien extrahieren. Basis desssen, was wir hier erarbeiten wollen, ist natürlich HTML, und das wird in sehr schöner Weise in [SELFHTML] beschrieben. Das ist zwar primär eine Sprachreferenz, aber die vielen Beispiele machen (denke ich) ein spezielles HTML-Tutorial fast überflüssig. PHP und MySQL E INFÜHRUNG 9/0 Es gibt inzwischen sehr viele PHP-Tutorials, auch in deutscher Sprache. Besonders gut gefällt mir [PHPTUT], auf das ich im Folgenden auch immer wieder verweise. Ein Tutorial will natürlich keine Sprach-Referenz ersetzen. Eine sehr übersichtlich gestaltete deutsche Referenz zu PHP stellt [SELFPHP] dar; es ist aber weder vollständig noch ganz aktuell. Die deutsche Übersetzung des offiziellen PHP-Manuals finden Sie unter [PHPDOC]. Dieses Manual ist gut und recht aktuell übersetzt, es ist allerdings sehr umfangreich. Das sollte nicht abschrecken: man braucht nur ein bisschen Übung im Umgang mit derart umfangreichen Dokumentationen. Sie sollten deshalb [PHPTUT] -> 18. Aufbau des PHP-Handbuchs . http://tut.php-quake.net/de/manual.html zu Rate ziehen. Die Themen Relationale Datenbanken und SQL werden sehr gut dargestellt in [RDB]. Dieses Buch ist in seinen Formulierungen allerdings sehr konzentriert und deshalb nicht immer ganz leicht zu verstehen. Leicht verständlich ist [SQLEINF], ein kurzer, an der Universität Hamburg veröffentlichter Artikel, der nur einen kleinen Teil des komplexen Themas SQL abdeckt, der aber sehr schön fast alles beschreibt, was wir in diesem Zusammenhang benötigen. Das deutsche Referenzhandbuch [MYSQL] zu MySQL ist wieder erschreckend umfangreich, aber es ist gut und aktuell ins Deutsche übersetzt. Und man soll (und kann) das auch nicht alles durcharbeiten, sondern es geht darum, möglichst schnell das zu finden, was man braucht. Einen guten Einstieg liefert wieder [PHPTUT] in den Kapiteln 30 - 37. Eine kleine, ausführlich kommentierte “Bibliothek” zur Zusammenarbeit von PHP und MySQL finden Sie in [SOURCE]->iadressen/mysql.php . PHP und MySQL E INFÜHRUNG 10 / 0 Kapitel 1 Editoren PHP-Code muss immer ganz “klassisch” mit einem Editor “eingetippt” werden. (Grafische Werkzeuge beim Programmieren waren bis jetzt nur erfolgreich beim Gestalten grafischer Oberflächen.) Dabei ist ein Editor ein Textverarbeitungs-Programm, das nur die eingegebenen Zeichen in seine Dateien schreibt und darüber hinaus nichts (im Gegensatz etwa zu Word, das normalerweise zusätzliche Informationen zur Formatierung speichert). Nachdem beim Programmieren der Editor das wichtigste Werkzeug ist, sollten Sie verschiedene Editoren ausprobieren und herausfinden, welche Ihnen am besten liegen. Ich denke, Sie können sich dabei auf kostenlose Editoren beschränken, denn es gibt da sehr gute Produkte. Für PHP-Programmierung sollte ein Editor wenigstens die Sprachen HTML, XHTML, JavaScript, PHP und SQL unterstützen. Im Folgenden möchte ich einige Editoren nennen, die ich in diesem Zusammenhang für empfehlenswert halte. 1.1 Linux und Windows Unter UNIX spielen Editoren schon immer eine ganz wichtige Rolle. Deshalb wurden dort auch die beiden wohl leistungsfähigsten Editoren entwickelt: vim und emacs. Diese Editoren unterstützen alle gängigen Programmiersprachen und sind selber fast universell kofigurierbar und programmierbar. Die grafischen Versionen dieser Editoren heißen gvim und xemacs und können auch unter Windows (natürlich kostenlos) eingesetzt werden. Wohl jede Linux-Distribution stellt diese Editoren zur Verfügung. Download-Adressen (auch für die Windows-Versionen): http://www.vim.org/download.php http://www.xemacs.org/Download Problem: Diese Editoren erfordern viel Zeit zur Einarbeitung. PHP und MySQL E INFÜHRUNG 11 / 0 1.2 Nur Linux Die KDE-Editoren kwrite und kate sind gut geeignet zum Erstellen von Programmtexten und ermöglichen unter LINUX das Editieren in MS-Windows-Art. Speziell zum Arbeiten im WEB-Bereich sind die einfach zu bedienenten Editoren Bluefish und Quanta Plus zu empfehlen, die sich auch gut für PHP eignen. Wohl jede Linux-Distribution stellt diese Editoren zur Verfügung. 1.3 Nur Windows Sehr gut gefällt mir PSPad. Es unterstützt ganz viele Programmiersprachen, gestattet sehr rationelles Arbeiten, ist über den »Windows Scripting Host« programmierbar und kann noch vieles mehr. Download-Adresse: http://www.pspad.com/de Konsultieren Sie auch [PHPTUT] -> editor http://faq.php-quake.net/#editor Aufgabe 1.0 (Kurs-Verzeichnis einrichten) Loggen Sie sich mit dem Benutzernamen php ein. Wir wollen alle unsere html-Dateien und php-Dateien nur unterhalb eines Kurs-Verzeichnisses anlegen. Linux Unter SuSE-Linux werden Sie in Ihrem Heimatverzeichnis ein Verzeichnis public_html finden. Das ist unser Kurs-Verzeichnis. Wenn Sie mit einer anderen Linux-Distribution arbeiten und dieses Verzeichnis existiert nicht, legen Sie es bitte an. Windows Ihr xampp-Verzeichnis hat ein Unterverzeichnis htdocs. Legen Sie in diesem htdocs-Verzeichnis ein Unterverzeichnis kurs an. Das ist unser Kurs-Verzeichnis. Aufgabe 1.1 (hallo.html) Öffnen Sie in Ihrem Arbeitsplatz Ihr Kurs-Verzeichnis und legen Sie dort die Datei hallo.html an. Unter Linux können Sie folgendermaßen vorgehen: Drücken Sie die rechte Maustaste und wählen Sie Neu erstellen ... -> HTML-Datei PHP und MySQL E INFÜHRUNG 12 / 0 und geben Sie im folgenden Dialogfeld für den Namen der HTML-Datei ein hallo.html Klicken Sie nun mit der rechten Maustaste hallo.html und wählen Sie im Kontextmenü den Eintrag Öffnen mit und wählen Sie dort Ihren bevorzugten Editor. Wenn Sie unter Windows das empfohlene pspad benutzen, dann starten Sie diesen Editor, Wählen Sie im File-Menü Neu ... -> HTML-Datei hallo.html Ergänzen Sie den HTML-Text um einen Titel und einen kurzen Begrüßungstext. Starten Sie einen Web-Browser und wählen Sie unter Linux die URL http://localhost/~php/hallo.html und unter Windows die URL http://localhost/kurs/hallo.html Sollten Sie eine Fehlermeldung erhalten, prüfen Sie bitte erst einmal nach, ob Ihr Web-Server gestartet ist. Beim Aufruf unserer html- und php-Dateien werden wir im folgenden nur noch die URL angeben, die unter Windows verwendet wird, also http://localhost/kurs/Pfad Linux-Benutzer sollten darin immer kurs ersetzen durch ~php. PHP und MySQL E INFÜHRUNG 13 / 0 Kapitel 2 Erste PHP-Beispiele 2.1 Aufgaben Aufgabe 2.1 (hallo.php) Öffnen Sie Ihr “Arbeitsplatz-Fenster”. Wechseln Sie in Ihr Unterverzeichnis kurs, öffnen Sie die Datei hallo.html mit Ihrem Editor und speichern Sie diese unter dem neuen Namen hallo.php Starten Sie Ihren Web-Browser und wählen Sie die URL http://localhost/kurs/hallo.php Die Ausgabe wird die Gleiche sein wie bei der Wahl von hallo.html. Aufgabe 2.2 (hallo.php) Ergänzen Sie in Ihrer hallo.php den Text im body folgendermaßen: <center> Anzeigen der PHP-Konfiguration <br/><br/> <?php phpinfo(); ?> </center> Lassen Sie sich die hallo.php erneut in Ihrem Web-Browser anzeigen. Sehen Sie sich nun den Seiten-Quelltext an: Die Funktion phpinfo hat ganz schön viel HTML-Text erzeugt! Damit wir selber ähnlich leistungsfähige Funktionen in PHP schreiben können, müssen wir die Sprachregeln von PHP (die Syntax) und deren Bedeutung kennenlernen. Einige wesentliche Elemente werden Ihnen im folgenden Abschnitt vorgestellt. Doch zunächst noch eine kleine Aufgabe. PHP und MySQL E INFÜHRUNG 14 / 0 Aufgabe 2.3 (hallo.php) Ergänzen Sie in Ihrer hallo.php den Text im body folgendermaßen: <center> Anzeigen der PHP-Konfiguration <br/><br/> <?php echo "Hallo, Kursteilnehmer!<br/>"; echo "So wird die PHP-Konfiguration angezeigt:<br/>"; echo "<br/><br/>"; phpinfo(); ?> </center> Lassen Sie sich die hallo.php erneut in Ihrem Web-Browser anzeigen. 2.2 Zusammenfassung Wir können in HTML-Seiten mitttels <?php ... ?> PHP-Code einfügen. Wenn unser Web-Server PHP unterstützt, ruft er im Falle von PHP-Dateien vor deren Auslieferung den PHP-Interpreter auf, der Abschnitte der Form <?php ... ?> ersetzt durch den von ihm erzeugten Text. Meist werden dazu Anweisungen der Form echo "Zeichenkette"; benutzt, die dafür sorgen, dass Zeichenkette in die HTML-Seite geschrieben wird. Jede einfache PHPAnweisung muss durch ein Semikolon abgeschlossen werden. Dies ist der Preis dafür, dass PHP eine formatfreie Programmiersprache ist; d.h.: Zwischen zwei Sprachelemente dürfen beliebig viele Leerzeichen, Tabulatoren und Zeilentrenner eingefügt werden. ACHTUNG Sie können PHP-Dateien auch direkt mit einem Web-Browser öffnen, also mit einer URL vom Typ file:/....php . Es wird dann aber der PHP-Teil nicht ausgewertet. PHP und MySQL E INFÜHRUNG 15 / 0 Kapitel 3 Zins-Projekt 3.1 Ziel Ziel dieses kleinen Projekts ist es, ein PHP-Programm zu erstellen, das mit folgendem Formular zur Eingabe von Werten zum Erstellen einer Zinstabelle auffordert (hier sind schon Beispielwerte eingetragen): Bild 3.1 Basierend auf dieser Eingabe sollte eine Zinstabelle der folgenden Form erstellt werden: PHP und MySQL E INFÜHRUNG 16 / 0 Bild 3.2 Wir legen hier weniger Wert auf das Aussehen, sondern konzentrieren uns auf die Sprache PHP. Bei der praktischen Umsetzung unserer Beispiele sollten Sie schon versuchen, das optisch ansprechender zu gestalten, etwa durch Farben. 3.2 Vorbereitungen Legen Sie in Ihrem Kurs-Verzeichnis ein Unterverzeichnis zins an und erstellen Sie dort die folgende Datei vorlage.php: PHP und MySQL E INFÜHRUNG 17 / 0 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!-zinsN.php --> <html> <head> <title>Zinsberechnung</title> </head> <body> <center> <h3>Zinstabelle</h3> <?php ?> </center> </body> </html> Diese Datei soll als Rahmen und Ausgangspunkt für unser Zins-Projekt dienen. Passen Sie den HTMLKommentar Ihren Vorstellungen an. Wir wollen unsere Ziele in kleinen Schritten ansteuern, wobei jede Aufgabe in einer eigenen php-Datei erledigt werden sollte, die aus der vorhergehenden mittels »Speichern unter« erzeugt wird. (Ähnlich sollten Sie beim Programmieren immer vorgehen!) Die Lösungen der folgenden Aufgaben finden Sie im beiliegenden Archiv [SOURCE] im Verzeichnis zins unter den jeweils in Klammern angegebenen Dateinamen. Aufgabe 3.1 (zins1.php) Ziel: Eine unformatierte Zinstabelle mit fest vorgegebenen Werten. Das sollte dann ungefähr so aussehen: Bild 3.3 PHP und MySQL E INFÜHRUNG 18 / 0 Wir wollen auch dieses erste Ziel in kleinen Schritten ansteuern. Kopieren Sie vorlage.php nach zins1.php. Ergänzen Sie den PHP-Abschnitt folgendermaßen: <?php /* Kapital unformatiert. */ $kapital = 9000.0; $zinssatz = 4.5; $laufzeit = 12; echo "1.Jahr: $kapital EUR <br/>"; ?> Testen Sie dieses Programm. Zum Verständnis sollten Sie nun in [PHPTUT] die Kapitel 5. Kommentare http://tut.php-quake.net/de/comments.html und 6. Variablen http://tut.php-quake.net/de/variables.html lesen. Anschließend sollten Sie versuchen, auf der Basis userer echo-Anweisung in einer for-Schleife eine Tabelle obiger Form zu erzeugen. Konsultieren Sie dazu [SELFPHP] -> Funktionsreferenz -> Kontroll-Mechanismen -> for http://www.selfphp.de/funktionsuebersicht/kontroll_mechanismen.php#for oder (ausführlicher) [PHPTUT] -> 16.Schleifen http://tut.php-quake.net/de/loops.html Aufgabe 3.2 (zins2.php) Ziel: Das Kapital sollte in der Ausgabe auf zwei Stellen hinter dem Komma gerundet werden, und als Dezimaltrenner sollte das Komma benutzt werden. Das sollte dann ungefähr so aussehen: PHP und MySQL E INFÜHRUNG 19 / 0 Bild 3.4 Benutzen Sie dazu in der echo-Ausgabe eine zusätzliche Variable $fkapital, in der Sie vorher die gewünschte Formatierung von $kapital speichern. Benutzen Sie zur Formatierung die Funktion number_format . Zur Verwendung dieser Funktion sollten Sie diese in [SELFPHP] -> Funtionsreferenz http://www.selfphp.de/funktionsreferenz/index.php suchen. Aufgabe 3.3 (zins3.php) Erstellen Sie eine neue Version des Zinsprogramms, bei der die Ausgabe als HTML-Tabelle formatiert ist (ähnlich wie in Bild 3.2, aber ohne DM-Spalte und ohne Farbänderung). Informieren Sie sich über HTMLTabellen in [SELFHTML] -> tabellen http://de.selfhtml.org/navigation/html.htm#tabellen 3.3 Parameter mit der GET-Methode übergeben Eine Zinstabelle mit den immer gleichen Werten ist sicher nicht so sonderlich interessant. Nützlich wird so etwas erst, wenn die Benutzer die Werte für Kapital, Zinssatz und Laufzeit selbst bestimmen können. Es werden dazu die Werte von den Benutzern in ein Formular eingegeben und dem Server mit der nächsten Anfrage übermittelt. Zur Übermittlung werden zwei Methoden verwendet - GET und POST. Wir wollen uns hier die Standardmethode GET ansehen. Vergleichen Sie dazu [PHPTUT] -> 23. GET-Variablen http://tut.php-quake.net/de/get.html PHP und MySQL E INFÜHRUNG 20 / 0 Anmerkung Werte aus Formularen wurden zunächst generell an globale PHP-Variablen übergeben. Dieses Verfahren war einfach, aber fehlerträchtig und inkonsistent, und es gilt deshalb heute als obsolet. Damit Kompatibilität gewahrt bleibt, kann es wieder „eingeschaltet“ werden: Es muss dabei in der /etc/php.ini die Option register_globals = ON gesetzt werden (Standard ist »register_globals = 0FF«). Veränderungen der php.ini werden erst nach einem Neustart des ApacheApache übernommen. Da die PHP-Entwickler aber inzwischen bessere Verfahren zur Verfügung gestellt haben, sollten wir diese auch nutzen. Der erste Schritt dabei war, dass die Werte aus Formularen abgelegt werden in globalen Arrays mit den Namen $HTTP_GET_VARS bzw. $HTTP_POST_VARS. Auch die Verwendung dieser Arrays ist inzwischen obsolet. Heute sollten stattdessen vordefinierte Arrays verwendet werden, die als Superglobal Arrays bezeichnet werden. Funktionen können auf diese Superglobals zugreifen, ohne sie als global zu deklarieren. Für den Zugriff auf Werte, die mittels Formularen übergeben werden, stehen die Superglobal Arrays $_GET und $_POST zur Verfügung. Aufgabe 3.4 (zins4.php) Ziel: Parameterüber mit der GET-Methode kennenlernen. Ersetzen Sie die Variablendefinitionen $kapital = 9000.0; $zinssatz = 4.5; $laufzeit = 12; durch $kapital = $_GET[’kapital’]; $zinssatz = $_GET[’zinssatz’]; $laufzeit = $_GET[’laufzeit’]; Rufen Sie Ihr Programm nun auf mit der URL http://localhost/kurs/zins/zins4.php?kapital=9000.0\&zinssatz=4.5\&laufzeit=12 Testen Sie auch andere Werte in obiger URL. PHP und MySQL E INFÜHRUNG 21 / 0 Aufgabe 3.4a (eingabe.html) Schreiben Sie in Ihrem zins-Verzeichnis eine HTML-Datei, die ein einfaches Formular für die Eingabe von Kapital, Zinssatz und Laufzeit erzeugt. Dies könnte etwa so aussehen (auf ordentliche Formatierung legen wir zunächst keinen Wert): Bild 3.5 Sehen Sie sich die URL an, die beim Senden des Formulars aufgerufen wird. Aufgabe 3.4b Ergänzen Sie nun in Ihrer eingabe.html das einleitende <form>-Tag mit einem action-Attribut, das auf Ihr letztes Zinsprogramm gerichtet ist, also in der hier verwendeten Nummerierung <form action=’zins4.php’> Wenn Sie nun dieses Formular absenden, sollte unsere Zinstabelle mit den von Ihnen eingegebenen Werten erzeugt werden. Aufgabe 3.5 (zins5.php) Ziel: Ein- und Ausgabe sollen in einer einzigen php-Datei formuliert werden. Anmerkung: Bei größeren PHP-Programmen ist es zwar sinnvoll, diese auf verschiedene Dateien zu verteilen. Das Hauptprogramm sollte aber immer in einer einzigen Datei enthalten sein - sonst werden komplexere Interaktionen sehr unübersichtlich. Speichern Sie Ihr letztes Zinsprogramm wieder unter einem neuen Namen, und kopieren Sie das ganze <form>-Element aus eingabe.html an den Beginn des php-Abschnitts. Entfernen Sie das actionAttribut, weil sich nun der GET-Aufruf immer auf die aktuelle php-Datei beziehen soll. Schließen Sie nun das <form>-Element in eine echo- Anweisung ein, so dass Ihr php-Abschnitt beginnt mit echo " <form> ... </form> "; PHP und MySQL E INFÜHRUNG 22 / 0 Wenn Sie dieses Programm ausführen, bekommen Sie evtl. Warnungen, die hier als Notice ausgegeben werden. Diese weisen Sie darauf hin, dass die Variablen $kapital, $zinssatz und $laufzeit erst nach dem Absenden des Formulars definiert sind. Das Arbeiten mit undefinierten Variablen ist in PHP kein Fehler (anfangs war dies in PHP gang und gäbe), sollte heute aber vermieden werden. 3.4 Ablaufsteuerung von Programmen Programme arbeiten nicht einfach eine Folge von Befehlen ab, sondern sie können in verschiedenen Situationen ganz unterschiedliche Abläufe realisieren. Einige der dabei verwendeten Mechanismen sollen hier dargestellt werden. 3.4.1 Kontrollanweisungen Der Programmablauf beim strukturierten Programmieren wird gesteuert durch Kontrollanweisungen (man spricht da auch von Kontrollstrukturen oder Kontroll-Mechanismen). Bis jetzt haben wir nur eine einzige Kontrollanweisung kennengelernt, nämlich die for-Schleife. Sie sollten sich an dieser Stelle ansehen [PHPTUT] -> 10. Kontrollstrukturen http://tut.php-quake.net/de/control.html [PHPTUT] -> 15. Schleifen http://tut.php-quake.net/de/loops.html und [SELFPHP] -> Funktionsreferenz -> Kontroll-Mechanismen http://www.selfphp.de/funktionsreferenz/kontroll_mechanismen/index.php Dort finden Sie alle Kontrollanweisungen, die PHP zur Verfügung stellt. Die wichtigsten sind dabei: Als bedingte Anweisungen die if-Anweisung und die if-else-Anweisung und als Wiederholungs- oder Schleifen-Anweisung die while-Anweisung. Alle anderen Kontrollanweisungen, die PHP zur Verfügung stellt, dienen nur der Bequemlichkeit: Man braucht sie nicht unbedingt, aber sie machen manches einfacher. PHP und MySQL E INFÜHRUNG 23 / 0 3.4.2 Logische Ausdrücke Bei der Ablaufsteuerung von Programmen spielen Bedingungen eine entscheidende Rolle. Sie können wahr oder falsch sein, und sie werden formuliert als logische Ausdrücke. PHP unterstützt den Datentyp boolean mit den beiden Werten TRUE und FALSE. Beliebige Zahlen und Zeichenketten dürfen in logischen Ausdrücken verwendet werden. Sie werden dabei automatisch in FALSE oder TRUE umgewandelt, und zwar nach den folgenden Regeln: Als FALSE werden bewertet: Alle Zahlen, die gleich 0 sind. Alle Zeichenketten, die leer sind (gleich “”), oder die gleich "0" sind. Alle anderen Werte werden als TRUE gewertet. Basis aller logischen Ausdrücke sind Vergleiche. Diese werden in ganz natürlicher Weise formuliert und interpretiert – mit einer (fehlerträchtigen!) Ausnahme: == fungiert als Gleichheitsoperator. (das einfache Gleichheitszeichen = ist vergeben als Zuweisungsoperator, und Zuweisung ist etwas ganz anderes als ein Vergleich). Lesen Sie dazu [PHPTUT] -> 11. Vergleichsoperatoren http://tut.php-quake.net/de/compare.html Logische Verknüpfungen Bei der Bildung logischer Ausdrücke spielen die Verknüpfungen eine entscheidende Rolle. Sie sollten dies nachlesen in [PHPTUT] -> 12. Logische Verknüpfungen http://tut.php-quake.net/de/logical.html PHP unterstützt bei den logischen Verknüpfungen auch die klassische C-Syntax, bei der anstelle von AND der Operator && verwendet wird, und anstelle von OR der Operator || 3.4.3 Funktionen Eine Funktion dient dazu, eine Reihe von Anweisungen, die eine bestimmte Aufgabe erfüllt, unter einem Namen zusammenzufassen. Beim Aufruf einer Funktion über ihren Namen wird die Reihe der darunter zusammengefassten Anweisungen ausgeführt, wobei die Ausführung durch die Übergabe von Parametern beeinflußt werden kann. Eine Funktion kann einen Wert zurückgeben, aber sie muss dies nicht tun: In allen C-ähnlichen Sprachen wird nicht unterschieden zwischen Funktionen und Prozeduren. Größere Programme lassen sich nur durch die Verwendung von Funktionen übersichtlich formulieren. Genaues dazu finden Sie in [PHPTUT] -> 38. Funktionen http://tut.php-quake.net/de/function.html PHP und MySQL E INFÜHRUNG 24 / 0 Aufgabe 3.6 (zins6.php) Ziel: Eingabe und Ausgabe sollen von den Funktionen eingabe und ausgabe erledigt werden. Solange die Laufzeit nicht definiert oder <= 0 ist, wird die Eingabemaske angezeigt, ansonsten wird die Zinstabelle ausgegeben. Speichern Sie zunächst Ihre vorige Version unter einem neuen Namen (hier zins6.php) und arbeiten Sie mit dieser Kopie weiter. Umschließen Sie nun die echo-Anweisung, die das Eingabeformular erzeugt, mit function eingabe() { ... } und umschließen Sie den „Rest“, der die Ausgabetabelle erzeugt, mit function ausgabe($kapital, $zinssatz, $laufzeit) { ... } Jetzt haben Sie ein PHP-Programm, das nichts tut: Funktionsdefinitionen stellen nur ein »Werkzeug« zur Verfügung, führen selber aber noch nichts aus. Deshalb brauchen wir nun ein Hauptprogramm, das unsere Funktionen in der gewünschten Weise abruft. Fügen Sie deshalb am Anfang Ihres PHP-Teils folgendes ein: /*** Hauptprogramm ***/ if (isset($_GET[’laufzeit’]) AND $_GET[’laufzeit’] > 0) ausgabe($_GET[’kapital’], $_GET[’zinssatz’], $_GET[’laufzeit’]); else eingabe(); /* Ende Hauptprogramm */ Anmerkung Früher mussten PHP-Funktionen schon vor ihrem ersten Aufruf definiert sein. Deswegen konnte ein Hauptprogramm der hier verwendeten Art erst am Schluss des PHP-Teils eingesetzt werden. Inzwischen ist dies glücklicherweise anders. Eine Programm-Code wird einfach übersichtlicher, wenn das Hauptprogramm als »Ablaufplan« am Anfang steht. Testen Sie Ihr Programm - wir sollten im Wesentlichen unser eingangs formuliertes Ziel erreicht haben. Die Funktion isset sollte bei sauberer PHP-Programmierung immer eingesetzt werden, bevor man eine Variable benutzt, die nicht im Programm selbst definiert ist. Vergleichen Sie dazu [SELFPHP] -> Variablen-Funktionen -> isset http://www.selfphp.de/funktionsreferenz/variablen_funktionen/isset.php PHP und MySQL E INFÜHRUNG 25 / 0 Aufgabe 3.7 (zins7.php) Ziel: Ordentliche Formatierung der Eingabemaske, damit dies ungefähr so aussieht wie in Bild 3.1. Dazu muss nur in der Funktion eingabe die Eingabemaske als HTML-Tabelle formuliert werden. Aufgabe 3.8 (zins8.php) Ziel: Konstanten kennen lernen - zusätzliche Spalte mit den „alten“ DM-Werten anfügen. Das Einfügen einer Spalte mit den DM-Werten stellt sicher keine Schwierigkeit mehr dar. Wir wollen hier vor allem den Gebrauch von Konstanten kennen lernen. Der Umrechnungskurs EUR -> DM bietet sich dazu an. Informieren Sie sich in [PHPTUT] -> 21. Konstanten http://tut.php-quake.net/de/constants.html Aufgabe 3.9 (zins9.php) Ziel: Zins soll nicht mehr eingegeben werden, sondern sich an der Laufzeit orientieren. Etwa: Laufzeit < 4 Laufzeit < 8 andernfalls 2.5 % 3.5 % 4.0 % Aufgabe 3.10 (zins10.php) Ziel: Statt der Laufzeit soll das gewünschte Endkapital eingegeben werden, das natürlich größer als das (Anfangs-)Kapital sein soll. Nachdem die Zinstabelle hier unerwünscht lang werden kann, soll ihre Länge durch eine Konstante MAX_JAHRE beschränkt werden. PHP und MySQL E INFÜHRUNG 26 / 0 Kapitel 4 Lesen von Text-Dateien 4.1 Zu den Zielen und Beispieldateien Wir wollen uns in diesem Kapitel ansehen, wie der Inhalt einer Textdatei mittels PHP in eine HTML-Seite eingelesen werden kann. Wir benützen dabei die Linux-Datei passwd, deren Zeilen Datensätze darstellen, deren einzelne Felder durch jeweils einen Doppelpunkt getrennt sind. Im ersten Schritt sollte das dann ungefähr so aussehen (die Ausgabe ist wesentlich verkürzt): root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/bin/bash daemon:x:2:2:Daemon:/sbin:/bin/bash lp:x:4:7:Printing daemon:/var/spool/lpd:/bin/bash mail:x:8:12:Mailer daemon:/var/spool/clientmqueue:/bin/false In einem zweiten Schritt wollen wir diese Datei als übersichtliche Tabelle formatiert ausgeben: Das sollte dann ungefähr so aussehen (die Tabelle ist wesentlich verkürzt): Bild 5.1 Die bei den Aufgaben genannten Beispiel-Dateien finden Sie in [SOURCE] -> dateien. Anmerkung: Die UNIX-Benutzerverwaltung ist in einer Text-Datenbank untergebracht. Die Datei passwd stellt dabei eine Tabelle dar, und die Darstellung solcher Text-Dateien hat viel Ähnlichkeit mit der Darstellung von Datenbank-Abfragen. Insofern stellen die hier betrachteten einfachen Beispiele schon eine Vorbereitung auf das Arbeiten mit Datenbanken dar. PHP und MySQL E INFÜHRUNG 27 / 0 Aufgabe 5.1 (lies1.php) Kopieren Sie die Datei /etc/passwd in Ihr Arbeitsverzeichnis. Für die Arbeit unter Windows: Sie finden eine passwd-Datei auch in [SOURCE] -> dateien. Schreiben Sie den folgenden kurzen Text in eine Datei lies1.php: <html> <head> <title>passwd lesen</title> </head> <body> <?php /* * Gibt Inhalt der passwd-Datei aus. */ $dateiname = "passwd"; $datei = fopen($dateiname, "r"); if (!$datei) die("<h4>Datei $dateiname konnte nicht geoeffnet werden.</h4>"); while ($zeile = fgets($datei, 256)) echo "$zeile<br>"; fclose($datei); ?> </body> </html> Testen Sie Ihr Programm lies1.php, und versuchen Sie es zu verstehen. Lesen Sie über die verwendeten Funktionen nach in [SELFPHP] -> Funktionsreferenz -> Dateisystem-Funktionen. http://www.selfphp.de/funktionsreferenz/dateisystem_funktionen/index.php 4.2 Öffnen und Schließen von Dateien Jeder Prozess verwaltet eine Datei-Liste für die von ihm geöffneten Dateien. Jeder Eintrag in dieser Liste hat Platz für alle Informationen, die das Betriebssystem über eine Datei gespeichert hat, und für einen Zeiger auf einen Datei-Puffer: das ist ein Speicherbereich, der für die Arbeit mit der jeweiligen Datei reserviert ist. Beim Lesen aus der Datei werden die gelesenen Daten im Datei-Puffer zwischengespeichert, beim Schreiben die zu schreibenden Daten. Öffnen einer Datei Wenn auf die gewünschte Datei in der gewünschten Weise (i.w. Lesen oder Schreiben/Anhängen) zugegriffen werden kann, wird ein Datei-Puffer reserviert und ein entsprechender Eintrag in der oben beschriebenen PHP und MySQL E INFÜHRUNG 28 / 0 Datei-Liste gemacht. Die zum Öffnen benutzte Funktion (hier fopen) gibt eine Ganzzahl > 0 zurück, die den Listeneintrag kennzeichnet. Diese Zahl wird mit verschiedenen Namen belegt. Im Englischen spricht man u.a. vom „File Handle“, vom „File Identifier“ oder vom „File Pointer“, im Deutschen oft vom „DateiHandle“ oder vom „Datei-Zeiger“. Im Weiteren greift der Prozess nur noch über dieses Datei-Handle auf die geöffnete Datei zu. Wenn auf die gewünschte Datei nicht in der gewünschten Weise zugegriffen werden kann (sei es, dass die Datei überhaupt nicht existiert, oder dass wir nicht die gewünschten Zugriffsrechte besitzen), dann gibt die Funktion fopen die Zahl 0 zurück (die hier ja auch als „falsch“ interpretiert wird). Schließen einer Datei Wenn die Datei zum Schreiben geöffnet ist, werden zunächst alle noch nicht geschriebenen Puffer-Inhalte in die Datei geschrieben. Dann werden der Puffer-Speicher und der Eintrag in der Datei-Liste zum Überschreiben freigegeben. Aufgabe 5.2 (lies2.php) Ziel: Ausgabe der Datei passwd als Tabelle, die ungefähr so aussieht wie in Bild 5.1. Speichern Sie dazu lies1.php unter einem neuen Namen. Realisieren Sie unser Ziel in folgenden Schritten: Schritt 1: Erweitern Sie das Programm so, dass jede $zeile als Zeile einer Tabelle mit einer einzigen Spalte ausgegeben wird. Schritt 2: Es müssen nun noch die Zeilen in Felder zerlegt werden, was technisch darauf hinausläuft, jeden Doppelpunkt zu ersetzen durch die Zeichenkette </td><td> Dies lässt sich mit verschiedenen PHP-Funktionen erledigen. Mein Vorschlag ist orientiert an der Arbeit mit Datenbanken, bei der die abgefragten Datensätze oft als Arrays geliefert werden, wobei die Felder der Datensätze in korrespondierenden Elementen der Arrays abgelegt werden. Benutzen Sie die Funktion explode dazu, einer Array-Variable $felder die durch Doppelpunkt getrennten Felder aus $zeile zuzuweisen, und benutzen Sie dann die Funktion implode zur Erzeugung einer Zeichenkette mit den gewünschten Trennern. Lesen Sie die Beschreibung dieser Funktionen nach in [SELFPHP] -> Funktionsreferenz -> String-Funktionen http://www.selfphp.de/funktionsreferenz/string_funktionen/index.php Schritt 3: Setzen Sie die Spaltenüberschriften ganz einfach mit einer oder mehreren echo-Anweisungen. Vergleichen Sie auch hier die in [SOURCE] -> dateien/lies2.php gewählte Lösung. PHP und MySQL E INFÜHRUNG 29 / 0 Kapitel 5 Datenbanken (allgemein) 5.1 Datenbank-Management-Systeme Ein Datenbank-Management-System (DBMS) ist ein Softwarepaket, das Daten in einem Computersystem so verwaltet, dass diese Daten von verschiedenen Anwendungen genutzt werden können. Anmerkung: Die Rechtschreibprüfung einer Textverarbeitung z.B. ist kein DBMS: sie verwaltet zwar Daten (Wörter, Regeln etc.), aber diese Daten können unmittelbar nur von dieser Textverarbeitung genutzt werden. Häufig wird statt Datenbank-Managment-System einfach von einem Datenbank-System gesprochen. Eine Datenbank ist eine Sammlung von zusammengehörenden Daten, die von einem DBMS verwaltet wird. Das DBMS verwaltet die Daten intern in Dateien, auf die von außen, also von Benutzern und anderen Programmen, nicht direkt zugegriffen werden darf. Zur Arbeit mit den Datenbanken stellt das DBMS Werkzeuge zur Verfügung. Anwender, die mit Datenbanken arbeiten, benutzen in der Regel nicht direkt die vom DBMS zur Verfügung gestellten Werkzeuge, sondern Programme, die mit dem DBMS kommunizieren, dessen Werkzeuge nutzen und auf die speziellen Bedürfnisse der Anwender zugeschnitten sind. 5.2 Realisierungen 5.2.1 Dektop-Datenbank-Systeme Das DBMS arbeitet auf dem Arbeitsplatzrechner. Auf nicht-vernetzten Rechnern ist dies die einzige Möglichkeit. Auch heute gehören die viele im PC-Bereich verwendeten DBMS zu dieser Kategorie (DBase, FoxPro, Access, Paradox, . . . ). Dabei unterscheiden wir nochmal zwei Typen: Stand-Alone-Datenbank-Systeme Dies sind Desktop-Datenbank-Systeme, auf deren Datenbanken immer nur ein Anwender mit einer einzigen Anwendung zugreifen kann. Die ersten auf PC’s realisierten Datenbank-Systeme gehörten natürlich zu diesem Typ. PHP und MySQL E INFÜHRUNG 30 / 0 File-Share-Datenbank-Systeme Dies sind Desktop-Datenbank-Systeme, auf deren Datenbanken mit mehreren Anwendungen (und im Netz auch von verschiedenen Rechnern) gleichzeitig zugegriffen werden kann. Dabei werden die von einer Anwendung gerade bearbeiteten Dateien oder Datensätze für andere gesperrt (File Locking bzw. Record Locking). Die wichtigsten der im PC-Bereich eingeführten DBMS, die ursprünglich nur als Stand-AloneDatenbank-Systeme arbeiten konnten, sind heute netzwerkfähig, d.h.: sie können auch als File-Share-Datenbank-Systeme genutzt werden. 5.2.2 Client-Server-Datenbank-Systeme Das DBMS arbeitet auf einem Server. Auf den Arbeitsstationen laufen nur Client-Programme, die dem Server Befehle übermitteln und mit ihm Daten austauschen. Dies bringt u. a. folgende Vorteile: Sicherheit und Zuverlässigkeit: Clients können nicht direkt auf die Daten zugreifen. Server kann eigene Benutzerrechte verwalten. Netzwerkbelastung: Gering, da nur Befehle und Ergebnisse übermittelt werden. Die meisten der heute professionell genutzten Datenbank-Systeme sind als Client-Server-System realisiert (DB2, Oracle, Informix, MS-SQL-Server, Sybase, MySQL, PostgreSQL, . . . ). 5.3 Relationale Datenbanken Ein Relationales Datenbank-Management-System (RDBMS) ist ein DBMS, das Daten in Tabellen (Relationen) verwaltet und dabei ein mathematisches Regelsystem verwendet, dessen Entwicklung auf Überlegungen von E.F. Codd basiert, die er erstmals 1970 in dem Artikel „A Relational Model of Data for Large Shared Data Banks“ veröffentlicht hat. Eine relationale Datenbank ist eine Sammlung von Daten, die von einem RDBMS verwaltet werden. Statt von einem Relationen Datenbank-Management-System wird häufig einfach von einem Relationalen Datenbank-System gesprochen, und das Folgende bezieht sich immer auf diese Systeme. 5.3.1 Tabellen Eine Tabelle besteht aus einer festen Anzahl von Spalten (Attributen) und einer variablen Zahl von Zeilen (Datensätzen). Spalten besitzen Namen und Wertebereiche, die Anzahl der Spalten wird als Degree bezeichnet. Der Wertebereich eines Attributs wird auch als seine Domäne bezeichnet und entspricht in herkömmlichen Programmiersprachen dem Datentyp. Jeder Datensatz wird durch die Spalten aufgeteilt in einzelne Bestandteile, die als Datenfelder bezeichnet werden. Die Struktur einer Tabelle wird durch ihre Spalten bestimmt und kann nach der Definition nicht mehr verändert werden. Die Zahl der Zeilen einer Tabelle wird als Kardinalität bezeichnet. Diese Zahl wird sich i. a. verändern und kann auch geich 0 sein, wenn die Tabelle leer ist. Eine Tabelle muss zusätzlich den folgenden Forderungen genügen: Keine doppelten Datensätze; d.h. es darf nie zwei verschiedene Zeilen in einer Tabelle geben, deren Attribute alle den gleichen Wert haben. PHP und MySQL E INFÜHRUNG 31 / 0 Eine Reihenfolge der Datensätze ist nicht definiert; auf Zeilen kann nicht über Zeilennummern zugegriffen werden, sondern nur durch Suchen nach Inhalten, insbesondere über Schlüssel (s.u.). Attributwerte sind atomar; d.h. sie lassen sich nicht weiter in verschiedene sinnvolle Bestandteile zerle- gen (ein „Familenname“ ist atomar, ein Attribut „Name“ bestehend aus „Vorname“ und „Familienname“ ist nicht atomar). 5.3.2 NULL-Werte In einer Datenbank kann es vorkommen, dass ein Wert nicht bekannt ist. In relationalen Datenbanken wird dann der Wert NULL verwendet, der nichts mit der Zahl 0 zu tun hat. 5.3.3 Schlüssel Wir werden hier nicht allgemeine Schlüssel, sondern nur speziell Schlüssel-Attribute betrachten. Unter dieser Einschränkung wird dann definiert: Ein Schlüssel ist ein Attribut, dessen Werte immer eindeutig sind; d.h. es gibt nie zwei verschiedene Zeilen mit dem gleichen Schlüsselwert. Oft werden Attribute nur zu dem Zweck eingeführt, als Schlüssel zu dienen: Artikel-Nummern, Kunden-Nummern etc. . In jeder Tabelle muss genau ein Schlüssel als Primär-Schlüssel (Primary Key) ausgezeichnet werden. Ein Primary Key darf keine NULL-Werte enthalten. 5.3.4 Werkzeuge Das RDBMS stellt Werkzeuge zur Verfügung, um neue (leere) Tabellen zu definieren, Dateinsätze zu dieser Tabelle hinzuzufügen, Daten in bestehenden Tabellen zu suchen, einzelne Datenfelder zu ändern, Datensätze zu löschen, Tabellen komplett aus der Datenbank zu entfernen. 5.4 SQL Um die Werkzeuge eines Datenbanksystems nutzen zu können, benötigt man Sprachen, über die das DBMS angesprochen werden kann. Die dazu seit Jahren meist verwendete Sprache ist SQL (Structured Query Language oder auch Standard Query Language, heute ein eigenständiger Begriff). SQL ist besonders auf RDBMS zugeschnitten. Diese Sprache entstand aus einem Forschungsprojekt, das Anfang der siebziger Jahre bei IBM begonnen wurde und das u.a. zum bekannten Datenbanksystem DB2 führte. Inzwischen bieten fast alle Datenbank-Hersteller SQL-Schnittstellen für ihre Datenbanksysteme an. Während Programmiersprachen wie PASCAL, C, C++, Java etc. als Programmiersprachen der 3. Generation bezeichnet werden, ist SQL eine Programmiersprache der 4. Generation. Dies heißt nicht, dass SQL PHP und MySQL E INFÜHRUNG 32 / 0 moderner oder besser als die vorher genannten Sprachen ist, sondern: Sprachen der 3. Generation beschreiben, wie etwas gemacht werden soll, Sprachen der 4. Generation beschreiben nur noch, was gemacht werden soll. Angesichts der zunehmenden Verbreitung von SQL bemühte man sich um Standardisierung. 1986 wurde ein erster ANSI-Standard SQL86 verabschiedet, der 1989 in einer leicht erweiterten Form auch als ISOStandard übernommen wurde. Dieser Sprachstandard wird als SQL-1 bezeichnet. Eine wesentliche Erweiterung dieses Sprachstandards wurde Anfang der 90er Jahre veröffentlicht und wird als SQL92 oder SQL-2 bezeichnet. 1999 wurde die neueste Standardisierung verabschiedet, die als SQL99 oder SQL-3 bezeichnet wird. PHP und MySQL E INFÜHRUNG 33 / 0 Kapitel 6 MySQL 6.1 Freie Datenbanksysteme Im Open-Source-Bereich gibt es inzwischen verschiedene leistungsfähige Datenbanksysteme. Die Zeitschrift iX enthält in der Ausgabe vom Februar 2004 einen interessanten Artikel, in dem die folgenden vier Systeme verglichen werden: Firebird, der freie Nachfolger von Borlands Interbase. MaxDB, das inzwischen freie SAP-Datenbanksystem. MySQL, das „Internet-Datenbanksystem“. PostgreSQL, das an der Universität Berkley entstand. MaxDB wird genau wie MySQL von der schwedischen Firma MySQL AB weiterentwickelt. Alle diese Datenbanksysteme können direkt oder über Treiber von PHP aus angesprochen werden – genauso wie die meisten der gängigen kommerziellen Systeme. Wenn wir uns hier speziell mit MySQL beschäftigen, dann deswegen, weil dieses Datenbanksystem im Bereich der Web-Programmierung derzeit wohl die größte Verbreitung hat. Persönlich schätze ich PostgreSQL mehr. 6.2 Zur Einführung in MySQL Wenn Sie mit MySQL vertraut werden wollen, empfiehlt es sich, zunächst einmal [MYSQL] -> 3 Einführung in MySQL: Ein MySQL-Tutorial http://dev.mysql.com/doc/refman/5.1/de/tutorial.html durchzuarbeiten. Die Administration des Systems wird ausführlich dargestellt in [MYSQL] -> 5 MySQL-Datenbankverwaltung http://dev.mysql.com/doc/refman/5.1/de/database-administration.html Wir brauchen hier nur sehr wenig von diesem Wissen, sollten uns aber darüber im Klaren sein, dass wir in MySQL nur ein wenig “hineinschnuppern”. Zum Thema SQL sollten Sie sich auf jeden Fall den kurzen Artikel [SQLEINF] ansehen, der eine schöne Einführung in dieses komplexe Gebiet bietet. PHP und MySQL E INFÜHRUNG 34 / 0 6.2.1 Programme zur Administration von MySQL Wie alle mir bekannten SQL-fähigen Datenbanksysteme stellt auch MySQL einen Kommandozeilen-Client zur Verfügung, der einfach als mysql aufgerufen wird. Für ProgrammiererInnen ist dies das geeignetste Werkzeug, weil in Programmen die Befehle für MySQL genauso formuliert werden wie auf dieser Kommandozeile. Es gibt natürlich auch (inzwischen recht viele) grafische Verwaltungswerkzeuge. Ich möchte nur auf phpMyAdmin verweisen, das über http://www.mysql.com erhältlich ist, den meisten modernen Linux-Distributionen beiliegt und auch im Paket XAMPP enthalten ist. Wir wollen hier nur den Kommandozeilen-Client mysql betrachten. Wenn der MySQL-Server beim Booten nicht automatisch gestartet wurde und XAMPP installiert wurde, müssen wir ihn mit dem »XAMPP Control Panel« starten. 6.2.2 Starten des Kommandozeilen-Client Linux Starten Sie eine Konsole (ein Terminalprogramm) und rufen Sie am Prompt mysql -u root auf. Windows Starten Sie die Eingabeaufforderung cmd.exe. Klicken Sie mit der rechten Maustaste auf die obere Fensterleiste und wählen Sie im Kontextmenü Eigenschaften. Konfigurieren Sie das Fenster entsprechend Ihren Vorstellungen. Setzen Sie insbesondere unter Layout die (maximale) Fenstergröße so, daß fast der ganze Bildschirm ausgefüllt wird. Beim Speichern wählen Sie die Option Einstellungen für alle Fenster dieses Typs übernehmen. Wechseln Sie nun mittels cd in Ihr xampp-Verzeichnis, und dann in das Unterverzeichnis mysql\bin. Jetzt können Sie (endlich) auch den Befehl mysql -u root eingeben. Damit der Aufruf in Zukunft einfacher wird, können Sie natürlich Ihr mysql\bin-Verzeichnis in den Pfad aufnehmen oder eine Batch-Datei schreiben oder auf dem Desktop passende Verknüpfungen anlegen. PHP und MySQL E INFÜHRUNG 35 / 0 6.2.3 MySQL-Benutzerverwaltung MySQL hat eine eigene Benutzerverwaltung, die mit der Benutzerverwaltung des zugrunde liegenden Betriebssystems nichts zu tun hat. Nach der Installation ist unter MySQL der Benutzer root@localhost eingetragen und hat alle Rechte zur Verwaltung des MySQL-Servers. Mit dem Vorgehen im letzten Abschnitt haben Sie sich mit dieser Benutzerkennung eingeloggt, und Sie sollten sich nun am MySQL-Prompt mysql> befinden. Setzen des root-Passworts Damit Ihr MySQL-Server vor unberechtigten Zugriffen geschützt ist, sollten Sie nun sofort den root-Zugang mit einem Passwort absichern. Wir wählen hier das Passwort mysqlRoot. Geben Sie dazu am MySQLPrompt Folgendes ein: mysql> SET PASSWORD = PASSWORD(’mysqlRoot’); Es sollte daraufhin eine Meldung der Form Query OK, 0 rows affected (0.05 sec) erscheinen. Das zweimalige Auftreten von PASSWORD mag verwundern: PASSWORD(’mysqlRoot’) ist ein Funktionsaufruf, der als Ergebnis die Verschlüsselung von mysqlRoot liefert. Loggen Sie sich nun aus mit mysql> exit oder mysql> quit Wenn Sie sich nun erneut mit mysql -u root in MySQL einloggen wollen, wird Ihnen der Zugriff verweigert. Um Ihr Passwort eingeben zu können, müssen Sie nun mysql -u root -p aufrufen und an der der dann erscheinenden Eingabeaufforderung Enter password: PHP und MySQL E INFÜHRUNG 36 / 0 Ihr Passwort eingeben. Zum Aufruf von mysql: Es gibt da wieder viele Optionen. Meist ausreichend ist die Form mysql [-h host] [-u user] [-p] Genaueres finden Sie in [MYSQL] -> 3.1 Verbindung zum Server herstellen und trennen http://dev.mysql.com/doc/refman/5.1/de/connecting-disconnecting.html Anmerkungen zur MySQL-Kommandozeile: Die Eingabe von mysql> ? liefert eine Hilfetafel mit den internen Befehlen der MySQL-Kommandozeile. Wichtig ist da noch, wie wir einen Befehl verlassen können, wenn wir uns “verhakt” haben, nämlich mit \c . Wenn dies nicht sofort klappt, haben Sie wahrscheinlich Anführungszeichen nicht geschlossen. Erledigen Sie das vorher. Bei Befehlen wird, wie allgemein in SQL, nicht zwischen Klein- und Großschreibung unterschieden. Bei den Namen von Datenbanken und Tabellen sollten wir davon ausgehen, dass zwischen Klein- und Großschreibung unterschieden wird (ist abhängig vom Betriebssystem). Bei Benutzernamen und Passwörtern wird zwischen Klein- und Großschreibung unterschieden. Befehle dürfen i. allg. auf mehrere Zeilen verteilt werden. Solange der Befehl noch nicht beendet ist, werden weitere Eingaben angefordert durch einen Sekundär-Prompt der Gestalt ->. Abgeschlossen werden Befehle durch ein Semikolon. (Dieses abschließende Semikolon ist nicht Bestandteil der SQL-Anweisung, sondern nur Trennzeichen auf der MySQL-Kommandozeile. Es ist auch dort nicht immer notwendig, aber es schadet nie.) mysql „merkt“ sich die eingegeben Befehle in einer Liste, in der Sie sich mit den Tasten Pfeil nach oben und Pfeil nach unten bewegen können. Anlegen eines Benutzers Ziel: Es soll ein Benutzer php angelegt werden, der zur Arbeit in MySQL alle Rechte hat, der selber aber keine Rechte vergeben darf. Er soll das Passwort Linux haben. Starten Sie dazu den MySQL-Client als root, und geben Sie dann die folgenden Befehle ein: mysql> GRANT ALL ON *.* TO php@localhost; mysql> SET PASSWORD FOR php@localhost = PASSWORD(’Linux’); Im Weiteren wollen wir uns immer als Benutzer php in mysql einloggen. Falls wir in unserem Betriebssystem als Benutzer php eingeloggt sind, genügt der Befehl mysql -p PHP und MySQL E INFÜHRUNG 37 / 0 falls wir unter einem anderen Namen eingeloggt sind, verwenden wir mysql -u php -p Der MySQL-Client kann alle in einer Sitzung eingegebenen Befehle und deren Ausgaben in einer Datei speichern. Dies hilft nicht nur beim Lernen, sondern auch bei der Administration (wir können verfolgen, was wir so alles gemacht haben). Geben Sie dazu am MySQL-Prompt den Befehl tee Dateiname ein. 6.3 Aufgaben Aufgabe 6.1 a. Legen Sie eine Datenbank mit dem Namen inet an. b. Legen Sie in der Datenbank inet eine Tabelle mit dem Namen adressen an. Diese Tabelle soll nur die folgenden beiden Spalten haben: name mit maximal 30 Zeichen email mit maximal 60 Zeichen Die Spalte email soll als Primär-Schlüssel dienen. Anmerkung: name soll immer einen Familiennamen und email eine zugehörige E-Mail-Adresse aufnehmen. In der Praxis wird man in eine solche Tabelle sicher mehr Spalten aufnehmen (wenigstens noch eine Spalte für den Vornamen). Uns geht es hier nur um das Prinzip, und dabei sollen die Situation möglichst übersichtlich und der Schreibaufwand möglichst klein gehalten werden. Aufgabe 6.2 Fügen Sie in die Tabelle adressen ein paar Datensätze ein, und lassen Sie sich den Inhalt der Tabelle anzeigen. 6.4 Lösungen der Aufgaben Lösung 6.1 a. b. mysql> CREATE DATABASE inet; mysql> USE inet; mysql> CREATE TABLE adressen ( -> name VARCHAR(30), -> email VARCHAR(60) NOT NULL, -> PRIMARY KEY (email) -> ); PHP und MySQL E INFÜHRUNG 38 / 0 Lösung 6.2 Zum Beispiel: mysql> USE inet; mysql> INSERT INTO adressen -> VALUES(’maier’, ’[email protected]’); PHP und MySQL E INFÜHRUNG 39 / 0 Kapitel 7 PHP und MySQL 7.1 Die wesentlichen Operationen Wenn wir mit einer Programmiersprache auf ein Datenbanksystem zugreifen wollen, das SQL “versteht”, müssen wir wissen, wie sich die folgenden Aufgaben erledigen lassen: 1. Verbindung zu einer Datenbank aufnehmen. 2. SQL-Anweisungen übermitteln. 3. Abfrageergebnisse engegennehmen. 4. Verbindung zur Datenbank schließen. PHP stellt zur Arbeit mit MySQL viele Funktionen zur Verfügung; siehe [SELFPHP] -> Funktionsreferenz -> MySQL-Funktionen . http://www.selfphp.de/funktionsreferenz/mysql_funktionen/index.php Die oben genannten Aufgaben (und damit fast alle Arbeiten im Zusammenhang mit MySQL) lassen sich mit wenigen Funktionen erledigen: Zu 1.: Benutzt werden die Funktionen mysql_connect und mysql_select_db. Die Funkfion mysql_connect gibt immer eine Ganzzahl zurück. Wenn die Verbindung nicht hergestellt werden konnte, ist diese Rückgabe gleich 0 (FALSE). Im Erfolgsfalle ist diese Rückgabe > 0 und wird als Verbindungs-Kennung bezeichnet. Die restlichen der hier verwendeten MySQL-Funktionen brauchen diese Verbindungs-Kennung als Argument, weil eine geöffnete Verbindung nur noch über ihre Kennung identifiziert wird. Man beachte die Analogie zur Arbeit mit Dateien. Zu 2.: Benutzt wird die mysql_query. Diese gibt 0 (FALSE) zurück, wenn bei der Befehlsausführung ein Fehler aufgetreten ist, ansonsten eine Ganzzahl > 0. Zu 3.: Wenn mysql_query einen SELECT-Befehl übermittelte, der erfolgreich ausgeführt werden konnte, ist die positive Ganzzahl, die zurückgegeben wird, eine Ergebnis-Kennung. Ausgehend von dieser ErgebnisKennung können die Ergebnis-Zeilen ganz analog zu den Zeilen einer Textdatei gelesen werden. Wir benutzen zum Lesen die Funktion mysql_fetch_row, die jede gelesene Zeile (jeden „Datensatz“) als Array zurückgibt. Wenn nichts mehr gelesen werden konnte, wird FALSE zurückgegeben. Zu 4.: Die Funktion mysql_close schließt die Verbindung, deren Kennung als Argument übergeben wird. PHP und MySQL E INFÜHRUNG 40 / 0 7.2 Die mitgelieferten Beispiele Alle Beispiele zu diesem Kapitel finden Sie in [SOURCE] -> iadressen . Dabei ist mysql.php als kleine „Bibliotheks-Datei“ gedacht, die einige nützliche Funktionen zur Verfügung stellt. Wenn diese Funktionen in einer PHP-Datei benützt werden sollen, braucht diese Datei nur mittels include "mysql.php" eingebunden werden. Die restlichen Beispiele arbeiten mit der Datenbank inet und der Tabelle adressen, die wir im vergangenen Kapitel angelegt haben. Die wenigen SQL-Befehle, die wir hier benützen, finden Sie fast alle in [SQLEINF]. TIPP Wenn Sie mit Programmen auf MySQL zugreifen, sollten Sie immer in einem Fenster (unter Linux am besten in einer eigenen Arbeitsfläche) den MySQL-Client mysql laufen lassen, damit Sie die Wirkung Ihrer Programme sofort überprüfen können. Außerdem können Sie so beim Programmieren die SQL-Befehle, die das Programm absetzen soll, erst einmal direkt auf der MySQL-Kommandozeile ausprobieren. Aufgabe 7.1 tabelle.php füllt die Tabelle adressen mit „zufällig“ gebildeten Datensätzen. Testen Sie das Programm tabelle.php. Warum kommen dabei Warnungen Datensatz konnte nicht eingefuegt werden. wobei diese Warnungen umso öfter auftreten, je mehr Datensätze Sie mit tabelle.php schon eingefügt haben? Aufgabe 7.2 Mit welchem SQL-Befehl lassen sich alle Datensätze aus der Tabelle adressen löschen? (Es soll nicht die ganze Tabelle gelöscht werden!) Anmerkung: Sollten Sie dabei doch die ganze Tabelle adressen löschen, ist dies kein Problem: Wenn die Tabelle adressen nicht existiert, wird sie von tabelle.php neu angelegt. Nur die Datenbank inet muss bei der Ausführung dieses Programms existieren. PHP und MySQL E INFÜHRUNG 41 / 0 Aufgabe 7.3 a. Mit welchem SQL-Befehl lassen sich alle Datensätze aus der Tabelle adressen anzeigen, deren EMail-Adresse die Endung edu hat? b. Speichern Sie tabelle.php unter einem neuen PHP-Namen. Modifizieren Sie diese Datei so, dass am Schluss nur die Datensätze angezeigt werden, deren E-Mail-Adresse die Endung edu hat. Aufgabe 7.4 Mit dem Programm tabelle.php können Sie leicht größere Tabellen erzeugen, anhand derer Sie einfache SELECT- und DELETE-Befehle üben können. Speichern Sie tabelle.php unter neuen PHP-Namen und modifizieren Sie in diesen Kopien die Arrays $names, $domains und $roots, indem Sie etwa weitere Möglichkeiten einfügen. Diese modifizierten Programme sollten ohne weitere Änderungen funktionieren. Versuchen Sie, zu verstehen, warum sich tabelle.php so einfach modifizieren lässt. Machen Sie sich klar, wie wichtig es ist, Programme so zu schreiben, dass sie sich einfach modifizieren lassen. Aufgaben zu inet.php In den folgenden Aufgaben wollen wir Operationen, die das Programm inet.php zur Verfügung stellt, als eigenständige Programme realisieren. Aufgabe 7.5 Ziel: Datensätze in die Tabelle adressen mit einer Eingabemaske eingeben. Benutzen Sie dabei die Datei tabelle_ein0.php als Vorlage. Aufgabe 7.6 Ziel: Datensätze in der Tabelle adressen suchen, wobei das Suchmuster mit einer Eingabemaske eingegeben wird. Benutzen Sie dabei die Datei tabelle_suche0.php als Vorlage. Aufgabe 7.7 Modifizieren Sie in einer Kopie von mysql.php die Funktion zeige so, dass vor der Ausgabe jedes Datensatzes eine checkbox angezeigt wird. Konsultieren Sie dazu [SELFHTML] und [SOURCE] -> formulare/formular_demo.php . PHP und MySQL E INFÜHRUNG 42 / 0 Aufgabe 7.8 Ziel: Datensätze aus der Tabelle adressen durch Anklicken entsprechender Checkboxen löschen. Benutzen Sie dabei die Datei tabelle_loesche0.php als Vorlage. 7.3 Session-Verwaltung Sie sollten nun zunächst das etwas umfangreichere Programm inet.php ausprobieren. Es werden dabei zunächst einfach Methoden kombiniert, die wir alle schon kennengelernt haben. Vor dem doch schon recht großem Umfang dieses Programms sollten Sie nicht erschrecken. Sie haben gelernt: Wenn man dies alles schrittweise aufbaut und jede Aufgabe einer eigenen Funktion zuweist, entwickelt sich so etwas recht natürlich, und wenn man dann alles noch ordentlich kommentiert, bleibt es auch verständlich. Eines allerdings haben wir noch nicht angesprochen: Wenn wir Datensätze löschen und dann ZurueckBlättern - woher weiß unser Programm noch, welche Auswahl wir eingangs getroffen hatten? Im „klassischen“ Programmieren ist so etwas ganz selbstverständlich: Ein Prozess behält seine Informationen im Speicher. Bei der Web-Programmierung haben wir eine grundsätzlich andere Situation: Jeder Eingabe über ein Formular folgt ein Neustart unseres Programms - es weiß zunächst nichts mehr von der vorhergehenden Kommunikation. Deshalb müssen hier zwischen den Instanzen eines Programms, die mit dem gleichen Client kommunizieren, Informationen festgehalten und von Instanz zu Instanz weitergereicht werden. Man spricht hier von einer Session. Wenn also ein Programm von einem Client aufgerufen wird, muss es feststellen können: Hat er mit mir (in letzter Zeit) kommuniziert? Welche Informationen haben wir ausgetauscht? Prinzipiell gibt es da drei Möglichkeiten, die miteinander kombiniert werden können: 1. Session-Informationen werden beim Aufruf der Web-Seiten und deren Auslieferung ausgetauscht. 2. Session-Informationen werden auf der Festplatte des Clients gespeichert. 3. Session-Informationen werden auf der Festplatte des Servers gespeichert. Punkt 2. wird mittels Cookies realisiert, und für die Kombination von 2. und 3. stellt PHP inzwischen leistungsfähige Funktionen zur Verfügung. Siehe dazu [PHPTUT] -> 43. Sessions . http://tut.php-quake.net/de/sessions.html Wir wollen uns hier nur den Punkt 1. ansehen, der zum Zwischenspeichern kleiner Informationsmengen der wohl geeignetste ist. HTML bietet dazu die ’hidden’-Felder an. Die Funktion setHidden in inet.php zeigt, wie Informationen auf diesem Weg rationell ausgetauscht werden können. PHP und MySQL E INFÜHRUNG 43 / 0 7.4 Passwort-Schutz Nicht alle sollen alle unsere Web-Seiten lesen können. Der übliche Schutz benutzt Passwörter zur Authentifizierung. Es gibt verschiedenste Methoden, eine solchen Authentifizierung einzurichten. Der Web-Server selbst kann diesen Schutz übernehmen - das muss allerdings mit Administratorrechten für den Web-Server eingerichtet werden. Wenn wir ohne solche Privilegien unsere Seiten schützen wollen, können wir dafür direkt innerhalb unserer PHP-Programme sorgen. [SOURCE] -> iadressen/ineta.php zeigt eine Möglichkeit. Damit nicht bei jedem Aufruf erneut die Authentifizierung verlangt wird, muss auch dabei mit Methoden der Session-Verwaltung gearbeitet werden. Wir verwenden auch hier hidden-Felder. Ein Passwort-Schutz dieser Art wird »pur« in [SOURCE] -> iadressen/auth.php dargestellt. Einen leistungsfähigeren Ansatz finden Sie in [PHPTUT] -> 40. Loginskript . http://tut.php-quake.net/de/login.html 7.5 Lösungen der Aufgaben Lösung 7.1 Unter unseren 100 „zufällig“ erzeugten Datensätzen sind mit großer Wahrscheinlichkeit einige mit einem schon vorhandenen email-Feld. Da die Spalte email als Primary Key deklariert ist, werden solche Datensätze nicht aufgenommen. Lösung 7.2 DELETE FROM adressen Lösung 7.3 1. SELECT * FROM adressen WHERE email LIKE ’%.edu’ 2. Ersetzen Sie im Hauptprogramm in der Funktion zeige die SELECT-Anweisung durch die unter 1. genannte Version. Lösung 7.5 Siehe [SOURCE] -> iadressen/tabelle_ein.php PHP und MySQL E INFÜHRUNG 44 / 0 Lösung 7.6 Siehe [SOURCE] -> iadressen/tabelle_suche.php Lösung 7.7 Siehe [SOURCE] -> iadressen/mysql1.php Lösung 7.8 Siehe [SOURCE] -> iadressen/tabelle_loesche.php PHP und MySQL E INFÜHRUNG 45 / 0 Literaturverzeichnis [MYSQL] MySQL-Referenzhandbuch http://dev.mysql.com/doc/refman/5.1/de [PHPDOC] PHP-Handbuch http://de.php.net/manual/de [PHPTUT] Progman, quakenet:#php Tutorial http://tut.php-q.net [RDB] Hermann Sauer, Relationale Datenbanken [SELFHTML] Stefan Münz, SELFHTML http://de.selfhtml.org [SELFPHP] Damir Enseleit, Matthias Hupp SELFPHP http://www.selfphp.info [SOURCE] Norbert Rogler, PHP-Kurs: Quelltexte http://www.nrogler.de [SQLEINF] SQL-Einführung: http://print-www.informatik.uni-hamburg.de/Dokumentation/sql-basic.phtml [THEIS] Thomas Theis, PHP 5 & MySQL 5