Dynamische Webseiten mit PHP [und Python] Thomas Mohr I N F O R M A T I K Beschränkung (X)HTML K • (X)HTML ist rein „statisch“, d.h. A T I bei jedem Aufruf wird die gleiche Seite angezeigt. es kann nicht auf Benutzereingaben eingegangen werden. es gibt keine Abhängigkeit von der Aufrufumgebung (Uhrzeit, Sprache, Währung, etc.). M • Zur Erinnerung der Ablauf: N F O R Der Benutzer schickt eine http-Anfrage über seinen Browser an einen Webserver. Der Webserver sucht die entsprechende HTML-Datei lokal bei sich auf dem Dateisystem. Die HTML-Datei wird unverändert an den Browser zurückgegeben und dargestellt. I • eine Lösung: Skriptsprachen (PHP, Python, ASP, …) auf dem Server 2 T I K Abruf von Webseiten A Webanfrage R M HTML-Datei im Dateisystem Webserver http://server.com/Datei.html HTML Datei.html HTML I N F O Datei.html Internet 3 Web-Client mit Browser K Wie kommt die Seite auf den Server? PC R M HTML A T HTML I „Programmieren“ der HTML-Datei O Webserver Ftp-Server Web-Client I N F Abrufen der Seite über http Web-Client 4 Internet Web-Client I K … und auf den Übungsrechnern? R M HTML A T „Programmieren“ der HTML-Datei O Webserver F Abrufen der Seite über http I N Browser 5 Verzeichnisstruktur Apache-Webserver I K • In der Standard-Installation von xampp liegen die HTML-Dateien im Unterverzeichnis htdocs. T Weitere (virtuelle) Web-Verzeichnisse können in der Konfigurationsdatei angelegt werden. M A xampplite R (Webserver-Programm) php.ini, um Einstellungen für PHP zu ändern conf Konfiguration des Webservers in httpd.conf (z.B. Anlegen weiterer Verzeichnisse) logs Logdateien des Webservers (Zugriffe / Fehler) N bin O Basisverzeichnis des Webservers F apache I htdocs wb mysql 6 Standardverzeichnis für HTML-Dateien Bitte Anlegen, um eigene HTML-Dateien abzulegen. Verzeichnis der MySQL-Datenbank (auch der Datenbanken selbst) Was ist PHP? K • PHP (rekursives Akronym für „PHP: Hypertext Preprocessor“) I ursprünglich „Personal Home Page Tools“ T • PHP A ist eine Skriptsprache, M • d.h. man braucht ein spezielles Programm (Interpreter), um das PHPProgramm auszuführen (Bestandteil des XAMPP-Paketes). R dient hauptsächlich zur Erstellung „dynamischer“ Webseiten, • d.h. die Webseite kann sich bei jedem Aufruf verändern. O ist „Open-Source“-Software, d.h. I N F • die Software ist kostenlos . • die Software darf von jedem weiter entwickelt werden und unter der gleichen Lizenz weitergegeben werden. 7 PHP erweitert HTML K • Mit PHP kann HTML so erweitert werden, dass I Anteile der HTML-Seite erst beim Aufruf eingefügt werden. • z.B. das aktuelle Datum oder die Uhrzeit M A T auf Benutzereingaben reagiert wird. Inhalte von Datenbanken abgerufen werden können. … R • PHP wird in der HTML-Datei „programmiert“. I N F O Der Webserver besitzt ein besonderes Programm, den PHPInterpreter, der das PHP-Programm im HTML ausführt. Die Ausgabe des PHP-Programms wird in die HTML-Datei eingefügt. 8 I K PHP erweitert HTML T PHP-Datei im Dateisystem HTML & PHP Datei.php A Webanfrage M http://server.com/Datei.php R PHPInterpreter Webserver HTML F Datei.php I HTML N O Datei.php Internet 9 Web-Client mit Browser • PHP-Bereiche im HTML werden durch eine bestimmte Schreibweise (Syntax) vom eigentlichen HTML-Code getrennt. I N F O R M A T I K Trennung HTML - PHP <h1>Aktuelles Datum</h1> <p> <?php echo 'Datum:' . date("d. M Y"); ?> </p> PHP-Bereich innerhalb einer HTML-Datei. PHPInterpreter <h1>Aktuelles Datum</h1> <p> Datum: 14. Nov 2008 </p> Vom PHP-Bereich auf dem Server erzeugte Ausgabe (reiner HTML-Code). Browser (HTML-Interpreter) Im Browser angezeigte HTML-Seite. 10 T I K Anweisungen abgrenzen • PHP-Programme bestehen in der Regel aus mehreren Anweisungen für den Interpreter Die Anweisungen werden nacheinander (sequentiell) ausgeführt. Ein Semikolon schließt jede Anweisung ab. <h1>Ein PHP-Beispiel</h1> <?php echo "<h2>Mein erstes PHP-Programm</h2>"; echo "<p>...mit zwei Anweisungen</p>"; ?> PHPInterpreter I N F O R M A • In der Regel sollte nur eine Anweisung in einer Zeile stehen. 11 <h1>Ein PHP-Beispiel</h1> <h2>Mein erstes PHP-Programm</h2> <p>...mit zwei Anweisungen</p> Hier wurden auch HTML-Tags durch PHP erzeugt. Zwei PHP-Anweisungen zur Ausgabe eines Textes • Welche Uhrzeit wird am Client angezeigt? I K „Dynamische“ Inhalte T Webanfrage Webserver Datei.php HTML Web-Client mit Browser Standort: Atlanta USA Uhrzeit: 2:20 am Standort: Speyer Uhrzeit: 9:20 Uhr I N F O http://server.com/Datei.php Datei.php R M A HTML & PHP 12 Da die PHP-Datei in Atlanta umgewandelt wird, wird auch die Zeit des Webservers eingesetzt, also 2:20 am. • Variablen können Werte zugewiesen werden. <h2>Variablen in PHP</h2> <?php $MeinText = 'Hallo Welt!'; $Zahl = 4711.0815; ?> Namen von Variablen beginnen immer mit einem $-Zeichen. ausgelesen werden. <?php echo "<p>Text: $MeinText</p>"; echo '<p>Zahl: ' . $Zahl . '</p>'; ?> PHPInterpreter I N F O R M A T I K Variablen <h1>Variablen in PHP</h1> <p>Text: Hallo Welt!</p> <p>Zahl: 4711.0815</p> 13 Zwei Varianten zur Ausgabe • Abhängig von der Uhrzeit soll die Homepage „Vormittag“ oder „Nachmittag“ anzeigen. Den Ablauf des Programms kann man sich im Struktogramm klarmachen. M A T I K Bedingte Ausführung – Struktogramm R O Wenn ($Stunde < 12) F Ja Ausgabe: „Vormittag“ I $Stunde : = Stundenanteil(Zeit) N $Zeit : = aktuelle Uhrzeit 14 Nein Ausgabe: „Nachmittag“ • Sollen Programmteile nur unter bestimmten Bedingungen ausgeführt werden, so kommt die if-Anweisung zum Einsatz: if (Bedingung) {Anweisungen} else {Anweisungen} <?php $Zeit = getdate(); $Stunde = $Zeit["hours"]; O R M A T I K Bedingte Ausführung – If-Anweisung I N F if ($Stunde<12) { echo "Vormittag!"; } else { echo "Nachmittag!"; } ?> 15 Anweisungsblock, falls Bedingung erfüllt (falls es vor 12 Uhr ist). Anweisungsblock, falls Bedingung nicht erfüllt (falls es nach 12 Uhr ist). kann auch entfallen O R M A T I K Kommentare • Wie in HTML können / sollen Kommentare benutzt werden, um die Funktionsweise eines PHP-Programms zu beschreiben: Einzeilige Kommentare <?php // ich bin ein Kommentar echo "Hallo Welt!"; ?> Es können auch ganze Bereiche als mehrzeilige Kommentare markiert werden. I N F • z.B. um ein Stück PHP-Programm zeitweise „außer Betrieb zu setzen“. 19 <?php echo "Vor dem Kommentarbereich"; /* Dies ist ein Kommentar mit mehreren Zeilen */ echo "Nach dem Kommentarbereich"; ?> • Wie wird die HTML-Datei im Browser aussehen? <h1>Viele Kommentare</h1> <!-<p>Auf dieser Seite gibt es viele Kommentare.</p> --> <?php // echo "Kommentare sind wichtig, um ein Programm zu verstehen." /* echo "Besser eingerückt könnte man das noch leichter lesen."; */ ?> <p>... sind wichtig!</p> I N F O R M A T I K Kommentare Viele Kommentare … sind wichtig! 20 • Soll ein Block von Anweisungen mehrfach ausgeführt werden, so werden sog. Iterationen (Schleifen) verwendet. Eine „Zählvariable“ zählt dabei die Anzahl der Schleifendurchläufe. Beispiel – while-Schleife: Name und Anfangswert der Zählvariable R O $Summe = 0 Solange $i<=20 I N $i = 1 F M A T I K PHP – Schleifen $i=$i+1 $Summe=$Summe+$i; Bedingung, ob die Schleife wiederholt wird. $i=1; $Summe=0; while ($i<=20) { $Summe=$Summe+$i; $i=$i+1; } Veränderung der Zählvariable 24 Schleifenrumpf mehrfach ausgeführt • Programmablauf Die Zählvariable $i wird mit 1 begonnen („initialisiert“) Bei jedem Durchlauf wird $i um eins erhöht. Nach dem 20. Durchlauf wird $i wieder um eins erhöht. • Damit ist $i nun 21 und die Bedingung ist nicht mehr erfüllt. Die Schleife bricht ab und das Programm läuft nach der Schleife weiter. I 25 $i:21 $i= $i +1 ... $i:20 $i= $i +1 $i:2 while ($i<=20) { $Summe=$Summe+$i; $i=$i+1; } $i:1 $i=1; $Summe=0; $i=$i +1 N F O R M A T I K Schleifen I N F O R M A T I K Schleifen 26 • Soll ein Block von Anweisungen mehrfach ausgeführt werden, so werden sog. Iterationen (Schleifen) verwendet. Eine „Zählvariable“ zählt dabei die Anzahl der Schleifendurchläufe. Beispiel – for-Schleife: for ($i=1; $i<=20; $i=$i+1) Name und Anfangswert der Zählvariable Bedingung, ob die Schleife wiederholt wird. Veränderung der Zählvariable nach einem Durchlauf Beispiel: $Summe=0; for ($i=1; $i<=20; $i=$i+1) { $Summe = $Summe + $i; echo "<p>$i: $Summe</p>"; } Schleifenrumpf, der mehrfach ausgeführt wird. K Solange $x<=10 $y=f($x) $x=$x+0.5 A T $x = 0 I Funktionen Wert(e), der an die Funktion übergeben wird. $x=0; while ($x<=10) { $y=f($x); echo "$y <br />"; $x= $x+1; } function f($eingabe) { $rueckgabe= $eingabe*$eingabe; return $rueckgabe; } I N F O R M Name der Funktion Aufrufendes Programm 28 Funktion (Unterprogramm) Wert, der zurückgegeben wird I N F O R M A T I K Übungen 29 Endlich – Sie sind dran! I N F O R M A T I K Eingaben?? - Formulare in HTML 30 • Die Eingabe von Werten durch einen Benutzer ist mit den bisherigen Mitteln in HTML nicht möglich. Dazu dienen sog. Formulare in HTML, deren Werte dann in PHP ausgelesen werden können. Der Ablauf ist vergleichbar z.B. dem Beantragen eines Bibliotheksausweises: • • • • Man bekommt ein Formular ausgehändigt. Das Formular wird vom neuen Bibliotheksbenutzer ausgefüllt. Der Benutzer gibt das Formular zurück. Das Formular wird ausgewertet und das Ergebnis (der Ausweis) wird an den Benutzer ausgegeben. K Exkurs – Formulare in der „realen“ Welt A Harry Potter M Formulare 31 Auswerten der Daten Herr Potter! Verarbeitung Ausgabe des Ausweises I N F O R Formular Ausweis #4711 Bibliotheksausweis Bibliothek Benutzer Ausfüllen von Daten T I Frage nach Formular K Formulare in HTML I Rufe Eingabe-Seite auf Harry Potter M A Formular.html Auswerten der Daten HTML & PHP 32 Herr Potter! Verarbeitung.php Ergebnis der Verarbeitung I N F O R Formular.html Kunde #4711 Verarbeitung.php Webserver Web-Client Eingabe von Daten T HTML • Das Formular erfordert spezielle HTML-Tags (PHP ist für das Eingabeformular nicht notwendig). I K Formulare in HTML T • Bsp.: I 33 <form action="Verarbeitung.php" method="post"> ... <input type="text" name="Benutzer" /> Text-Eingabefeld mit Namen „Benutzer“ ... <input type="submit" value="abschicken" /> </form> Button zum Aufruf Verarbeitungsseite Formularblock N F O R M A Verarbeitungsseite • Die eingegebenen Daten können in der Verarbeitungsseite im PHP-Interpreter ausgewertet werden: Für jedes Eingabefeld ist der eingegebene Wert in einer Variablen mit dem Namen des Eingabefeldes gespeichert. <form action="Verarbeitung.php" method="post"> <input type="text" name="Benutzer" /> <input type="text" name="Alter" /> </form> Formular.html I N F O R M A T I K Formulare in HTML <?php echo "Name: " . $Benutzer; echo "Alter: " . $Alter; ?> Verarbeitung.php 34 I N F O R M A T I K Übungen 35 Learning by doing… • Dynamische Webseiten (z.B. mit PHP) bieten sich ideal an, Themen zu vernetzen: Darstellung von Informationen mit XHTML und CSS. Algorithmisches Problemlösen. In Teilen: Kommunikation in Rechnernetzen (Protokolle, …) … und nicht zuletzt: Datenbanken I N F O R M A T I K Vernetzung des Themas 36 Datenbanken sind gut geeignet, um für dynamische Webseiten als Datenbasis genutzt zu werden. • Grundlegende Schritte jedes Datenbankzugriffs in PHP: 1. Verbindung mit dem Datenbanksystem aufbauen $link = mysql_connect($Host, $Benutzer, $Passwort) or die("DB-Verbindung unmöglich: " . mysql_error()); M A T I K Zugriff auf MySQL über PHP Ergebnis der Verbindung ist eine Variable (Handle), mit der auf die Verbindung zugegriffen werden kann. Fehler sollten (gerade hier) abgefangen (PHP-Konstrukt „or die“) und ausgegeben werden. N F O R I 2. Datenbank auswählen 37 mysql_select_db($Datenbank) or die("Auswahl Datenbank unmöglich: " . mysql_error()); Abfrage ausführen $result = mysql_query($SQLText) or die("Anfrage fehlgeschlagen: " . mysql_error()); 4. Grundlegendes Problem F O • Programmiersprachen sind iterativ • relationale Datenbanken (und damit SQL) sind mengenorientiert Speicherung und „Durchlaufen“ der Ergebnisse notwendig Für das Abrufen der Ergebnisse gibt es drei wesentliche Varianten: I N i. ii. iii. 5. 38 Ergebnis ist eine Variable (Handle), mit der auf das Resultat der Anfrage zugegriffen werden kann. Ergebnisse ausgeben R M A I 3. T K Zugriff auf MySQL über PHP Array Assoziatives Array Objektorientiert Freigabe der Handles (kann entfallen) mysql_free_result($result); mysql_close($link); mysql_fetch_array liefert eine komplette Zeile des Ergebnisses als Array (Alternative: mysql_fetch_row) Nach der letzten Zeile wird FALSE zurückgegeben A I • Ausgabe der Ergebnisse als Array T K Zugriff auf MySQL über PHP Schleife über alle Zeilen des Ergebnisses while ($arrRow = mysql_fetch_array($result)) { echo "$arrRow[0] : $arrRow[1]"; } I N F O R M Auslesen und Speichern einer Ergebniszeile als Array Zugriff auf eine Spalte der Ergebniszeile 39 • Ausgabe der Ergebnisse als assoziatives Array mysql_fetch_array liefert auch ein assoziatives Array, d.h. es kann über die Spaltennamen zugegriffen werden. Problem: Spaltennamen müssen eindeutig sein A T I K Zugriff auf MySQL über PHP Schleife über alle Zeilen des Ergebnisses while ($arrRow = mysql_fetch_array($result)) { echo "$arrRow[Land] : $arrRow[Sprache]"; } I N F O R M Auslesen und Speichern einer Ergebniszeile als Array Zugriff auf eine Spalte der Ergebniszeile 40 • Ausgabe der Ergebnisse als Objekt mysql_fetch_object liefert eine komplette Zeile des Ergebnisses als Objekt Nach der letzten Zeile wird FALSE zurückgegeben A T I K Zugriff auf MySQL über PHP Schleife über alle Zeilen des Ergebnisses while ($oRow = mysql_fetch_object($result)) { echo "$oRow->Land : $oRow->Sprache"; } I N F O R M Auslesen und Speichern einer Ergebniszeile als objekt Zugriff auf eine Spalte der Ergebniszeile 41 K Zugriff auf MySQL über PHP • Weitere interessante Funktionen: T I mysql_num_rows($result) • Gibt die Anzahl der Zeilen (Datensätze) im Ergebnis aus. mysql_num_fields($result) M A • Gibt die Anzahl der Spalten im Ergebnis aus. mysql_field_name($result, 0) • Name eines Feldes im Ergebnis. I N F O R mysql_affected_rows() 42 • Liefert die Anzahl betroffener Datensätze einer vorhergehenden MySQL Operation wie z.B. DELETE, UPDATE • Vereinfachung: Herstellen der Verbindung / Datenbankauswahl in einer separaten Include-Datei, die immer wieder verwendet werden kann. • include "_DBVerbindung.inc"; • Problem: „Verfolgen eines Flusslaufes“ von der Quelle zum Meer z.B. Spree Nordsee T I K Vernetzung des Themas - Grenzen von SQL • Hier werden iterative Strukturen benötigt, die SQL (als mengenorientierte Sprache) im Standard nicht bietet. Weser Rhein Fulda Mosel Neckar Donau Inn F I N Werra Main Anknüpfung an Programmierung PHP, Delphi, Java Havel Aller O R M A Elbe Isar 43 Spree • Problem: „Verfolgen eines Flusslaufes“ vom Meer zu den Zuflüssen z.B. Nordsee Nordsee T I K Vernetzung des Themas - Grenzen von SQL R M A Elbe Havel Aller Beispiel für eine (elegante?) rekursive Programmierung Weser Rhein O Fulda Werra F Main Neckar Donau Inn I N Mosel Isar 44 Spree 1. Erstellen Sie php-Anzeigeseiten für die Datenbank miniterra. Verwenden Sie dazu Abfragen aus dem SQL-Teil. 2. Erstellen Sie eine Abfrage, bei der der Kontinent eingegeben werden kann (HTML-Formular). Es werden dann alle Länder des Kontinents ausgegeben. 3. Geben Sie die Länder mit ihren Kontinenten aus. Es sollen Links in jeder Spalte sein, die eine Sortierung erlauben. I N F O R M A T I K PHP und Datenbanken – Aufgaben 45 4. Geben Sie den Verlauf eines Flusses bis zur Mündung aus. (Achtung: evtl. Rekursion!) • Alle wichtigen Konstrukte sind vorhanden Verschiedene Schleifenformen (auch für assoziative Arrays) Prozeduren / Funktionen Klassen Exceptions etc. R M A T I K Was kann PHP noch? • Strukturierung eines Projekts I N F O includes 46 Aus der PHP-Dokumentation I N F O R M A T I K Vorteile / Nachteile von PHP 47 • PHP ist eine Skriptsprache Einfachere Erlernbarkeit (?) Keine Notwendigkeit der Variablendefinitionen, etc. ( oder ?) Dennoch auch komplexere Programmierkonzepte (z.B. Klassen, Exceptions) möglich • PHP kann einfach in HTML eingebunden werden. Da HTML bekannt ist, muss die Ausgabe (Grafik, etc.) nicht behandelt werden. Ergebnisse sind schnell sichtbar. Es muss kein weiteres Programm (IDE) erlernt werden. Schüler sind leicht zu motivieren, da außenwirksame (Homepage) Projekte eingebracht werden. Es existiert kaum eine gute Möglichkeit des Debuggings. Umfangreichere Projekte werden leicht unübersichtlich. Vermischung von zwei Sprachen (HTML / PHP) erschwert den Zugang. (Alternative: PHP zur Shell-Programmierung) • PHP ist Open-Source-Software In vielen Webpaketen der Provider verfügbar und damit für die Schüler auch außerhalb der Schule leicht verfügbar. Kein finanzielles Problem bei Anschaffung an der Schule. Ängste bei „etablierten“ Kollegen bzgl. der Wartbarkeit und Weiterentwicklung einer nicht-kommerziellen Software. I N F O R M A T I K Vorteile / Nachteile von PHP 48 • … I K Internet-Referenzen • Installation Apache / PHP / mySQL als Paket (XAMPP) http://www.apachefriends.org/en/xampp.html http://www.php.net/manual/de/ I N F O R M A T • PHP-Dokumentation: 49 • Weitere PHP-Quellen PHP für Einsteiger http://informatik.asn-graz.ac.at/phptutorial/index.html WikiBook http://de.wikibooks.org/wiki/Websiteentwicklung:_PHP PHP für dich (Einsteiger) http://www.schattenbaum.net/php/ … • Eine Möglichkeit, der Einbindung von PHP sehr ähnlich: Erweiterung für Apache: Spyce (http://spyce.sourceforge.net/) Python-Zugriff auf MySQL: MySQL-Python Bibliothek (http://sourceforge.net/projects/mysql-python/) I N F O R M A T I K Geht es auch mit Python? 50 Rudimentäre Installationsanleitung / Beispiele in den Unterlagen <h1>Kugeluhr</h1> [[\ from time import * lt = localtime() Stunde = lt[3] Minute = lt[4] print "<p>Es ist %02i:%02i Uhr.<p>" % (Stunde, Minute) i=1 while i<=Stunde: if (i%10)==0: print "<img src='kreisvoll10.gif' alt='' />" else: print "<img src='kreisvoll.gif' alt='' />" i=i+1 ]] Dynamische Webseiten mit PHP [und Python] Thomas Mohr I N F O R M A T I K