Einführung in die Skriptsprache PHP Materialien zum NLI-Kurs 02.48.78 Version: 02-11-24 Einführung in PHP In a world without fences . . . ” who needs gates?“ Vorwort Das Skript geht auf ein Vorlesungsskript von Alfred Wassermann, Uni Bayreuth, zurück. Es wurde für den NLI-Kurs in wesentlichen Teilen überarbeitet und erweitert. Die im Skript erwähnten Software- und Hardwarebezeichnungen sind in den meisten Fällen auch eingetragene Warenzeichen und unterliegen als solche den gesetzlichen Bestimmungen. Das Skript wurde mit LATEX unter Verwendung (http://www.miktex.org , http://www.dante.de ). des Makropackets pdfLATEX Alle Grafiken wurden mit Dia (http://www.lysator.liu.se/˜alla/dia ) entwickelt. I erstellt Inhaltsverzeichnis 1 2 3 Grundlagen, Variablen, Wiederholungen 1 1.1 Skriptsprache PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 PHP-Befehle in HTML einbetten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.3 Unser erster PHP-Befehl! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.4 Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.5 Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.5.1 Skalare Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.5.2 Assoziative Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.5.3 Zweidimensionale Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.6 Datenübernahme aus HTML-Formularen . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.7 Einfache Rechenoperationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.8 Wiederholung von Anweisungen mit der while -Schleife . . . . . . . . . . . . . . . . . . 9 1.9 Aufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Kontrollstrukturen, Dateioperationen 1 2.1 Weitere Befehle zur Ablaufkontrolle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2.2 Fallunterscheidungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2.3 Weitere Vergleichsmöglichkeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.4 Nochmals HTML-Formulare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.5 Dateien hinzuladen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.6 Dateien lesen und schreiben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.7 Aufgaben zur Vorlesung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Vordefinierte und benutzerdefinierte Funktionen 1 3.1 Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 3.2 Vordefinierte Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3.3 String-Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.4 Aufgaben zur Vorlesung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 II Einführung in PHP 4 INHALTSVERZEICHNIS Zugriff auf Datenbanken 1 4.1 Einführung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 4.2 Zugriff auf Datenbanken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 4.3 SQL-Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 4.4 SQL-Befehle mit PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 4.5 Verteilung des Datenbankprogramms auf mehrere Skriptdateien . . . . . . . . . . . . . . 6 4.6 Weitere SQL-Befehle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 4.7 Aufgaben zur Vorlesung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 4.8 Fallaufgabe Elektronikversand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 A NLI-Kurs 1 A.1 Rechner-Umgebung NLI-Kurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 A.2 Loginparameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 A.3 Entwicklungsumgebung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 B Zugriff auf Access-Datenbanken mit PHP 5 B.1 Vorbereitung der Datenquelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 B.2 Zugriff auf Access-Datenbank mit Skript . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 C Installation einer lokalen Entwicklungsumgebung D Lösungen zu den Übungsaufgaben 9 10 D.1 Vorlesung 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 D.1.1 Aufgabe 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 D.1.2 Aufgabe 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 D.1.3 Aufgabe 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 D.1.4 Aufgabe 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 D.1.5 Aufgabe 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 D.1.6 Aufgabe 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 D.1.7 Aufgabe 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 D.1.8 Aufgabe 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 D.2 Vorlesung 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 D.2.1 Aufgabe 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 III Einführung in PHP INHALTSVERZEICHNIS D.2.2 Aufgabe 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 D.2.3 Aufgabe 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 D.2.4 Aufgabe 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 D.2.5 Aufgabe 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 D.2.6 Aufgabe 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 D.3 Vorlesung 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 D.3.1 Aufgabe 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 D.3.2 Aufgabe 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 D.3.3 Aufgabe 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 D.3.4 Aufgabe 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 D.3.5 Aufgabe 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 D.3.6 Aufgabe 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 D.4 Vorlesung 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 D.4.1 Aufgabe 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 D.4.2 Aufgabe 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 D.4.3 Aufgabe 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 D.4.4 Aufgabe 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 IV Einführung in PHP Vorlesung 1: Grundlagen, Variablen, Wiederholungen Vorlesung 1 Grundlagen, Variablen, Wiederholungen 1.1 Skriptsprache PHP PHP ist eine Skriptsprache, die mit dem Focus auf die Generierung dynamischer Webseiten entwickelt wurde. PHP-Befehle werden direkt in HTML-Seiten eingebettet, d. h. der Autor schreibt PHP-Befehle zusammen mit HTML-Befehlen in eine PHP-Datei. Wird diese Datei von einem Betrachter angefordert, so werden die PHP-Befehle von einer Zusatzsoftwa” re“ des Webservers Schritt für Schritt ausgeführt und die Ergebnisse als reines HTML-Dokument an den Betrachter weitergeleitet (siehe Abbildung 1.1). Abbildung 1.1: Dynamische Webseite mit PHP 2) 1) PHP-Dateien 3) Webserver PHPPreprocessor 8) HTML 6) 7) 4) 5) Datenbank Achtung: Der Webserver muß PHP“-fähig sein. Standardmäßig funktionieren diese Befehle nicht. In” zwischen bieten nahezu alle Provider Hosting-Pakete an, die die Benutzung von PHP zulassen. Mit Lycos (http://www.tripod.de ) stellt auch ein zuverlässiger deutscher Gratisanbieter Accounts mit PHPUnterstützung zur Verfügung. Je nach Installation interpretiert die PHP-Zusatzsoftware nur Dateien mit der Endung .php “, häufig aber ” auch Dateien mit der Endung .php3 “, .php4 “, .phtml “. ” ” ” Es ist (bei entsprechender Konfiguration des Webservers) auch möglich, PHP-Befehle in Dateien mit den Vorlesung 1 - 1 Einführung in PHP Vorlesung 1: Grundlagen, Variablen, Wiederholungen Endungen .html “ oder .htm “ einzubetten. Damit wird der Generierungsprozess vor dem Endnutzer ” ” verborgen. PHP wird seit etwa 1994 entwickelt und erfreut sich seitdem stetig wachsender Beliebtheit. Eine der besonderen Stärken der Skriptsprache PHP ist die problemlose Anbindung an verschiedene Datenbanken. Die Sprache ist in ihrer Syntax an C, Java und Perl angelehnt. 1.2 PHP-Befehle in HTML einbetten PHP-Befehle werden in HTML-Dokumente eingebettet, indem für sie besondere Skriptbereiche abgegrenzt werden. Hierfür ein erstes Beispiel: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>PHP-Beispiel</title> </head> <body> <?php echo ” H a l l o W e l t ”; ?> </body> </html> Es gibt vier alternative Möglichkeiten, PHP-Skriptbereiche in einem HTML-Dokument abzugrenzen. 1. <? ... ?> 2. <?php ... ?> 3. <script language="php"> ... </script> 4. <% ... %> ... “ steht hier für beliebige PHP-Befehle. ” Es wird allgemein empfohlen, die Form <?php ... ?> zu benutzen, da diese XML-konform und damit wohl dauerhaft Unterstützung erfahren wird. 1.3 Unser erster PHP-Befehl! Der echo -Befehl gibt Texte (sogenannte Strings) aus: <?php echo ” H a l l o ”; ?> Vorlesung 1 - 2 Einführung in PHP Vorlesung 1: Grundlagen, Variablen, Wiederholungen Alternativ ist auch die folgende Syntax zulässig: <?php echo( ” H a l l o ” ); ?> Das gleiche Ausgaberesultat erzielen Sie im Übrigen auch mit der print -Funktion, die Bestandteil der mehrere hundert vordefinierte Funktionen umfassenden PHP-Standardbibliothek ist. <?php print( ” H a l l o ” ); ?> Merke: Alle PHP-Anweisungen werden mit einem Semikolon ( ; “) abgeschlossen. ” Es gibt eine Reihe von Sonderzeichen, die Sie in Strings verwenden können. Wichtigstes Sonderzeichen: \n “ = Zeilenumbruch. ” echo ” H a l l o \n”; echo ” H a l l o \n”; Man beachte dabei den Unterschied zu echo ” H a l l o <BR>”; echo ” H a l l o <BR>”; Im ersten Fall wird lediglich im vom Webserver ausgelieferten HTML-Quelltext ein Zeilenumbruch durchgeführt. Im zweiten Fall enthält der HTML-Quelltext den HTML-Befehl zum Zeilenumbruch, der im Ausgabefenster des Browsers umgesetzt wird. Wenn Sie Anführungszeichen innerhalb eines Strings verwenden wollen, müssen Sie das Sonderzeichen \" “ verwenden. ” Beispiel: echo ”Er s e t z t e s i c h , w i e ihm b e f o h l e n , a u f e i n e Wolke und begann z u f r o h l o c k e n : \ ” H a l l e l u j a − − − H a h l e l u j a − − − H a h l e l u j a − − − Hahlee−l u j a . . . \ ” ”; 1.4 Variablen Um sinnvolle Anwendungen erstellen zu können, benötigen wir Speicherbereiche, in denen Daten vorübergehend abgelegt werden können. Dazu können in PHP Variablen deklariert werden. Merke : Alle Variablennamen beginnen in PHP mit dem Dollarzeichen ( $ “). ” 1 2 3 4 5 6 7 8 9 10 11 $text = ” I c h b i n e i n S t r i n g ! ”; echo $text; echo $text.” ”.$text.” ”.$text; $l = ” l a n g e r ”; $k = ” k u r z e r ”; echo ” I c h b i n e i n ”.$l.$l.$l.$l.$l.$l.” T e x t ! ”; Vorlesung 1 - 3 Einführung in PHP 12 13 14 15 16 Vorlesung 1: Grundlagen, Variablen, Wiederholungen echo ” I c h b i n e i n ”.$k.” T e x t ! ”; $i = 10; $j = 5; echo $i.” + ”.$j.” = ”.($i+$j); Der Typ der Variablen (ganze Zahl, Gleitpunktzahl, String, Boolsche Werte) wird je nach situativer Verwendung von PHP automatisch bestimmt. Der Benutzer braucht sich darum nur in Spezialfällen kümmern. 1.5 Arrays In vielen Anwendungsfällen ist es von Vorteil, Daten nicht in Einzelvariablen abzulegen, sondern sie in zusammengehörigen Datenfeldern - sogenannten Arrays - zu speichern. PHP unterstützt von Haus aus skalare und assoziative Arrays. 1.5.1 Skalare Arrays Beispiel für einen skalaren Array: 1 2 3 4 5 6 7 8 9 /∗ Deklaration eines $text[0] = ” D i e s i s t $text[1] = ” D i e s i s t $text[2] = ” D i e s i s t skalaren Arrays ∗/ d i e e r s t e Z e i l e . ”; d i e z w e i t e Z e i l e . ”; d i e d r i t t e Z e i l e . ”; / ∗ Ausgabe ∗ / echo $text[0].”<br >\n”; echo $text[1].”<br >\n”; echo $text[2].”<br >\n”; Alternative Deklarationen ohne explizite Indexierung der Datenfelder: 1 2 3 4 5 6 7 8 9 /∗ Deklaration eines $text[] = ” D i e s i s t $text[] = ” D i e s i s t $text[] = ” D i e s i s t s k a l a r e n A r r a y s ohne e x p l i z i t e I n d e x i e r u n g ∗ / d i e e r s t e Z e i l e . ”; d i e z w e i t e Z e i l e . ”; d i e d r i t t e Z e i l e . ”; / ∗ Ausgabe ∗ / echo $text[0].”<br >\n”; echo $text[1].”<br >\n”; echo $text[2].”<br >\n”; Möglich ist auch die Erzeugung eines Arrays mit Hilfe der array -Funktion: 1 2 3 4 5 6 7 8 9 10 /∗ Deklaration eines $text = array( ” D i e s ”Dies ”Dies ); skalaren i s t die i s t die i s t die A r r a y s m i t d e r a r r a y −F u n k t i o n ∗ / e r s t e Z e i l e . ”, z w e i t e Z e i l e . ”, dritte Zeile .” / ∗ Ausgabe ∗ / echo $text[0].”<br >\n”; echo $text[1].”<br >\n”; echo $text[2].”<br >\n”; Vorlesung 1 - 4 Einführung in PHP Vorlesung 1: Grundlagen, Variablen, Wiederholungen In vielen Anwendungen ist es zweckmäßig die Inhalte eines Arrays durch ein Schleifenkonstrukt auszuwerten. Sehr häufig findet man die foreach -Schleife in PHP-Skripts (siehe Abbildung 1.2). Beispiel: 1 2 3 4 5 6 7 8 9 10 /∗ Deklaration eines $text = array( ” D i e s ”Dies ”Dies ); skalaren i s t die i s t die i s t die A r r a y s m i t d e r a r r a y −F u n k t i o n ∗ / e r s t e Z e i l e . ”, z w e i t e Z e i l e . ”, dritte Zeile .” / ∗ Ausgabe m i t S c h l e i f e n k o n s t r u k t ∗ / foreach( $text as $zeile ) { echo $zeile.”<br >\n”; } Abbildung 1.2: Funktionsweise einer foreach -Schleife Arrayzeiger auf Anfang setzen Arrayzeiger vorruecken Textausgabe Variable ja Array-Element vorhanden? Array-Element -> Variable nein 1.5.2 Assoziative Arrays Beispiel für einen assoziativen Array: 1 2 3 4 5 /∗ Deklaration eines a s s o z i a t i v e n $text[” Z e i l e A”] = ” D i e s i s t d i e $text[” Z e i l e B”] = ” D i e s i s t d i e $text[” Z e i l e C”] = ” D i e s i s t d i e Arrays ∗/ e r s t e Z e i l e . ”; z w e i t e Z e i l e . ”; d r i t t e Z e i l e . ”; Vorlesung 1 - 5 Einführung in PHP Vorlesung 1: Grundlagen, Variablen, Wiederholungen / ∗ Ausgabe ∗ / echo $text[” Z e i l e A”].”<br >\n”; echo $text[” Z e i l e B”].”<br >\n”; echo $text[” Z e i l e C”].”<br >\n”; 6 7 8 9 Auch in diesem Fall ist eine Deklaration mit der array -Funktion möglich: / ∗ D e k l a r a t i o n e i n e s a s s o z i a t i v e n A r r a y s m i t d e r a r r a y −F u n k t i o n ∗ / $text = array( ”X” => ” D i e s i s t d i e e r s t e Z e i l e . ”, ”A” => ” D i e s i s t d i e z w e i t e Z e i l e . ”, ”H” => ” D i e s i s t d i e d r i t t e Z e i l e . ” ); 1 2 3 4 5 6 7 8 9 10 / ∗ Ausgabe ∗ / echo $text[”H”].”<br >\n”; echo $text[”A”].”<br >\n”; echo $text[”X”].”<br >\n”; Auch ein assoziativer Array kann komfortabel mit einer foreach -Schleife ausgelesen werden. / ∗ D e k l a r a t i o n e i n e s s k a l a r e n A r r a y s m i t d e r a r r a y −F u n k t i o n ∗ / $text = array( ”X” => ” D i e s i s t d i e e r s t e Z e i l e . ”, ”A” => ” D i e s i s t d i e z w e i t e Z e i l e . ”, ”H” => ” D i e s i s t d i e d r i t t e Z e i l e . ” ); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 / ∗ Ausgabe m i t S c h l e i f e n k o n s t r u k t ∗ / foreach( $text as $zeile ) { echo $zeile.”<br >\n”; } / ∗ Ausgabe m i t S c h l e i f e n k o n s t r u k t ∗ / foreach( $text as $schluessel => $wert ) { echo $schluessel.” − ”.$wert.”<br >\n”; } 1.5.3 Zweidimensionale Arrays Im weiteren Verlauf dieses Grundkurses werden uns Daten begegnen, die in mehreren Zeilen und mehreren Spalten verwaltet werden. Beispiel: ID 1 2 3 Name Herzogkeller Glenk Bei Norbert Art Biergarten Biergarten Diskokneipe Note 1 1 4 Kommentar Sehr schöner Baumbestand Gute Bratwürste Höllisch laut Auch diese Struktur kann mit Hilfe von Arrays problemlos in PHP abgebildet werden. 1 $set1 = array ( ”ID” => 1, 2 ”Name” => ” H e r z o g k e l l e r ”, 3 ” A r t ” => ” B i e r g a r t e n ”, 4 ” N o t e ” => 1, 5 ”Kommentar” => ” S e h r s c h ö n e r Baumbestand ” 6 ); 7 Vorlesung 1 - 6 Einführung in PHP 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 1.6 Vorlesung 1: Grundlagen, Variablen, Wiederholungen $set2 = array ( ”ID” => 2, ”Name” => ” G l e n k ”, ” A r t ” => ” B i e r g a r t e n ”, ” N o t e ” => 1, ”Kommentar” => ” Gute B r a t w ü r s t e ” ); $set3 = array ( ”ID” => 3, ”Name” => ” B e i N o r b e r t ”, ” A r t ” => ” D i s k o k n e i p e ”, ” N o t e ” => 4, ”Kommentar” => ” H ö l l i s c h l a u t ” ); $all = array ( $set1, $set2, $set3 ); / / Ausgabe a l l e r Kneipennamen foreach( $all as $dataset ) { echo $dataset[”Name”].”<br >\n”; } Datenübernahme aus HTML-Formularen Da PHP speziell zur Erzeugung von dynamischen Webseiten entwickelt wurde, ist es sehr leicht, Eingaben, die aus HTML-Formularen stammen, zu bearbeiten. Ein Beispiel: Die Formulardatei formular.htm“ enthalte: ” 1 2 3 4 5 6 7 8 9 10 11 12 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Formular</title> </head> <body> <FORM ACTION=” t u w a s . php” METHOD=POST> <INPUT NAME=” b e l i e b i g e r n a m e ”> <INPUT TYPE=” s u b m i t ” VALUE=”OK”> </FORM> </body> </html> Der HTML-Formular-Kenner sieht sofort: Beim Klicken auf den Submit-Button wird also die Datei tu” was.php“ aufgerufen. Diese Datei könnte dann so aussehen: 1 2 3 4 5 6 7 8 9 10 11 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>PHP-Skript</title> </head> <body> <?php echo ” S i e haben ”.$_REQUEST[” b e l i e b i g e r n a m e ”].” e i n g e g e b e n . ”; ?> </body> </html> Vorlesung 1 - 7 Einführung in PHP Vorlesung 1: Grundlagen, Variablen, Wiederholungen Achtung: Ab der PHP-Version 4.1 werden Daten aus den HTML-Formularen im assoziativen Array $ REQUEST bereitgestellt. Alternativ kann auf die Formulardaten in Abhängigkeit der benutzten ActionMethode auch über die Arrays $ POST bzw. $ GET zugegriffen werden. Beispiel: <?php echo ” S i e haben ”.$_POST[” b e l i e b i g e r n a m e ”].” e i n g e g e b e n . ”; ?> In älteren PHP-Versionen war ein Zugriff auf Formulardaten über automatische vordefinierte Variablen nach dem folgenden Muster möglich: <?php echo ” S i e haben ”.$beliebigername.” e i n g e g e b e n . ”; ?> Dieser bequeme“ Weg sollte nicht mehr benutzt werden. Aus Sicherheitsgründen wird empfohlen zukünf” tig die neuen Superarrays“ ($ REQUEST , $ POST , $ GET ) zu benutzen. Die alte Zugriffsmethode kann in ” den neueren PHP-Versionen bei Bedarf aber noch in der Datei php.ini“ freigeschaltet werden. ” GET-Aktionen können im Übrigen auch durch den direkten Aufruf eines PHP-Skripts mit Parameterübergabe ausgelöst werden. Beispielsweise bewirkt der Skript-Aufruf http://localhost/tuwas.php?beliebigername=Hallo Leute “ ” über das Adressfeld eines Browsers bei Auswertung im PHP-Skript als GET-Aktion ein den obigen Beispielen entsprechendes Ergebnis. 1.7 Einfache Rechenoperationen Folgende Rechenoperationen stehen in PHP zur Verfügung: Operator +: -: *: /: %: Beschreibung Addition Subtraktion Multiplikation Division Reste-Bildung .: Verknüpft zwei Zeichenketten (Strings) Beispiel $erg=$i+$j $erg=$i-$j $erg=$i*$j $erg=$i/$j $erg=$i%$j Erläuterung z. B. 23%17 ergibt 6, da 23 geteilt durch 17 gleich 1 Rest 6 ist. Dazu kommen noch ein paar Abkürzungen, um dem Programmierer das Leben zu erleichtern: $i++ ++$i $i---$i erhöht $i um 1. erhöht $i ebenfalls um 1. erniedrigt $i um 1. erniedrigt $i ebenfalls um 1. Der Unterschied zwischen $i++ und ++$i ist: $i=0; echo $i++; Vorlesung 1 - 8 Einführung in PHP Vorlesung 1: Grundlagen, Variablen, Wiederholungen gibt 0 aus, anschließend wird $i auf den Wert 1 erhöht. $i=0; echo ++$i; erhöht zuerst $i auf 1 und gibt den Wert 1 aus. 1.8 Wiederholung von Anweisungen mit der while -Schleife Mit der foreach -Schleife haben wir bereits eine Möglichkeit vorgestellt, um dieselbe Anweisung mehrfach abzuarbeiten. Gleich noch ein Beispiel: $t = ” I c h s o l l m e i n e U e b u n g s a u f g a b e n s e l b s t e r s t e l l e n !<BR>\n”; // $i = 0; Initialisierung while ($i < 10) { echo $t; $i++; } Hier wird 10-mal der Text in der Variablen $t mit Hilfe einer while -Schleife ausgegeben. Zu Beginn wird $i dazu auf 0 gesetzt. $i wird in jedem Schleifendurchlauf um 1 erhöht, bis $i den Wert 10 erreicht. Dann ist die Bedingung ($i < 10) nicht mehr wahr und die Schleife bricht ab. 1.9 Aufgaben 1. Schreiben Sie ein Dokument, das einen PHP-Befehl enthält, der den Text: Romanes eunt domus“ ” ausgibt. 2. Erstellen Sie eine PHP-Datei, welche die nachfolgend angegebene Adresse in einem skalaren Array speichert und anschließend in einer HTML-Tabelle auf dem Bildschirm ausgibt. Name: Vorname: Anschrift: PLZ: Ort: Meier Wolfgang Waldweg 13 12345 Testburg 3. Weisen Sie die o. g. Adressdaten mit Hilfe der array -Funktion einem assoziativen Array zu. Geben Sie die Adresse anschließend in einer HTML-Tabelle auf dem Bildschirm aus. 4. Erweitern Sie das Beispiel aus dem Kapitel 1.5.3 so, dass die gesamte Datenstruktur in einer HTMLTabelle im Browserfenster ausgegeben wird. 5. Schreiben Sie eine HTML-Seite, auf der 1000-mal Romanes eunt domus“ richtig geschrieben steht. ” 6. Schreiben Sie ein HTML-Formular, in das man eine Zahl eingeben kann. Klickt man auf Abschi” cken“, wird so oft der Text Romanes eunt domus“ ausgegeben, wie diese Zahl angibt. ” 7. Schreiben Sie ein Formular, in das zwei Zahlen eingegeben werden können. Klickt man auf Ab” schicken“, so sollen diese Zahlen miteinander multipliziert und das Ergebnis auf einer Webseite ausgegeben werden. Vorlesung 1 - 9 Einführung in PHP Vorlesung 1: Grundlagen, Variablen, Wiederholungen 8. Lassen Sie alle Schlüssel und Werte des in PHP automatisch vordefinierten assoziativen Arrays $ SERVER als HTML-Seite mit Hilfe der foreach -Schleife ausgeben. Vorlesung 1 - 10 Einführung in PHP Vorlesung 2: Kontrollstrukturen, Dateioperationen Vorlesung 2 Kontrollstrukturen, Dateioperationen 2.1 Weitere Befehle zur Ablaufkontrolle Im vorherigen Kapitel haben wir mit der foreach - und der while -Schleife zwei Möglichkeiten kennengelernt, eine Wiederholung von Anweisungen mit Hilfe eines Schleifenkonstrukts zu erzeugen. Statt $t = ” I c h s o l l m e i n e U e b u n g s a u f g a b e n s e l b s t e r s t e l l e n !<BR>\n”; $i = 0; while ( $i < 10 ) { echo $t; $i++; } kann man aber in PHP auch schreiben: $t = ” I c h s o l l m e i n e U e b u n g s a u f g a b e n s e l b s t e r s t e l l e n !<BR>\n”; $i = 0; do { echo $t; $i++; } while ( $i < 10 ); Wo liegt der Unterschied zwischen diesen beiden Schleifenkonstrukten? Man bemerkt den Unterschied, wenn z. B. statt $i=0; “ zu Beginn $i=10; “ gesetzt wird. ” ” Im ersten Fall ist die Bedingung ($i < 10) “ nicht wahr und die Befehle innerhalb der geschweiften ” Klammern werden nicht ausgeführt. Im zweiten Fall werden zuerst die Befehle innerhalb der geschweiften Klammern ausgeführt, danach wird getestet, ob die Bedingung ($i<10) “ erfüllt ist. Dies ist nicht der Fall, also wird abgebrochen. D. h. aber, ” die Schleife wird mindestens einmal durchlaufen. Eine weitere Möglichkeit, eine Schleife zu programmieren, ist der for -Befehl. Gleich ein Beispiel: $t = ” I c h s o l l m e i n e U e b u n g s a u f g a b e n s e l b s t e r s t e l l e n !<BR>\n”; for ( $i=0; $i < 10; $i++ ) { echo $t; } Der for -Befehl besteht aus drei Ausdrücken. for ( ausdruck1; ausdruck2; ausdruck3) { ... } Mit ausdruck1 “ wird die Schleife initialisiert, d. h. normalerweise wird die Variable, die die Schleifen” durchläufe zählt, auf den Anfangswert gesetzt. ausdruck2 “ gibt die Abbruchbedingung für die Schleife an. ” In ausdruck3 “ wird die Variable, die die Schleifendurchläufe zählt, erhöht bzw. erniedrigt. ” Der for -Befehl hat den Vorteil, dass alle zur Kontrolle der Schleife nötigen Befehle in einer Zeile stehen. Vorlesung 2 - 1 Einführung in PHP Vorlesung 2: Kontrollstrukturen, Dateioperationen Ein weiteres Beispiel, diesmal wird heruntergezählt. $t = ” I c h s o l l m e i n e U e b u n g s a u f g a b e n s e l b s t e r s t e l l e n !<BR>\n”; for ( $i=10; $i > 0; $i-- ) { echo $t; } 2.2 Fallunterscheidungen Zur Fallunterscheidung (= bedingte Verzweigung) gibt es in PHP den if -Befehl: 1 2 3 if ($i < 0) { echo ”$i i s t k l e i n e r a l s N u l l \n”; } oder auch 1 2 3 4 5 if ($i echo } else echo } < 0) { ”$i i s t k l e i n e r a l s N u l l \n”; { ”$i i s t n i c h t k l e i n e r a l s N u l l \n”; Man kann diesen Befehl auch nach dem folgenden Muster schachteln: 1 2 3 4 5 6 7 if ( $i < 0 ) { echo ”$i i s t k l e i n e r a l s N u l l \n”; } elseif ( $i > 0 ) { echo ”$i i s t g r o e s s e r a l s N u l l \n”; } else { echo ”$i i s t N u l l \n”; } Hat man mehrere Tests der gleichen Variablen vorzunehmen, so läßt sich mit dem switch -Befehl evtl. Arbeit einsparen: switch ($name) { case ” H e i n r i c h ”: echo ” I c h b i n d e r k l u g e H e i n r i c h ”; break; case ”Hans”: echo ” I c h b i n d e r dumme Hans”; break; case ” A g a t h e ”: echo ” I c h b i n d i e A g a t h e und k l ü g e r a l s H e i n r i c h und Hans”; break; default: echo ”Wir s i n d d e r R e s t ”; } Falls die Variable $name den Wert Hans“ hat, wird als nächster Befehl ” echo ” I c h b i n d e r dumme Hans”; ausgeführt. Normalerweise würden dann alle nachfolgenden Befehle ausgeführt werden, u. a. echo ” I c h b i n d i e A g a t h e und k l ü g e r a l s H e i n r i c h und Hans”; Vorlesung 2 - 2 Einführung in PHP Vorlesung 2: Kontrollstrukturen, Dateioperationen Dies ist meist nicht erwünscht, man springt deshalb mit der Anweisung break “ aus dem switch -Befehl ” heraus. 2.3 Weitere Vergleichsmöglichkeiten Bisher konnten wir testen, ob $i < 10 “ oder $i > 10 “ gilt. ” ” Es gibt in PHP aber natürlich noch mehr Vergleichsmöglichkeiten, die nachfolgend in einer Übersicht zusammengestellt sind: Beispiel $a == $b $a === $b Name Gleich Identisch $a != $b $a <> $b $a !== $b Ungleich Ungleich Nicht identisch $a $a $a $a Kleiner Als Größer Als Kleiner Gleich Größer Gleich < $b > $b <= $b >= $b Ergebnis Gibt TRUE zurück, wenn $a gleich $b ist. Gibt TRUE zurück wenn $a gleich $b ist und beide vom gleichen Typ sind(nur ab PHP 4). Gibt TRUE zurück, wenn $a nicht gleich $b ist. Gibt TRUE zurück, wenn $a nicht gleich $b ist. Gibt TRUE zurück, wenn $a nicht gleich $b ist, oder wenn beide nicht vom gleichen Typ sind (nur PHP 4). Gibt TRUE zurück, wenn $a kleiner als $b ist. Gibt TRUE zurück, wenn $a größer als $b ist. Gibt TRUE zurück, wenn $a kleiner oder gleich $b ist. Gibt TRUE zurück, wenn $a größer oder gleich $b ist. Ein weiterer Vergleichs-Operator ist der ?:“- oder Trinitäts-Operator. Er arbeitet genauso wie in C und ” vielen anderen Programmier-Sprachen. (ausdr1) ? (ausdr2) : (ausdr3); Dieser Ausdruck gibt ausdr2 zurück, wenn ausdr1 TRUE zurückgibt und ausdr3 , wenn ausdr1 FALSE zurückgibt. Man kann auch Bedingungsprüfungen durch den Einsatz von Logik-Operatoren (Boolsche Logik) beliebig kombinieren: Beispiel: ($i == 10) && ($j > 0) : ($i == 10) || ($j == 0) : Ist $i gleich 10 und $j größer als 0? Ist $i gleich 10 oder $j gleich 0? Hier in einer Übersicht die möglichen Logik-Operatoren: Beispiel $a and $b $a or $b $a xor $b ! $a $a && $b $a || $b Name Und Oder Entweder Oder Nicht Und Oder Ergebnis TRUE wenn sowohl $a als auch $b TRUE ist. TRUE wenn $a oder $b TRUE ist. TRUE wenn entweder $a oder $b TRUE ist, aber nicht beide. TRUE wenn $a nicht TRUE ist. TRUE wenn sowohl $a als auch $b TRUE ist. TRUE wenn $a oder $b TRUE ist. Vorlesung 2 - 3 Einführung in PHP 2.4 Vorlesung 2: Kontrollstrukturen, Dateioperationen Nochmals HTML-Formulare Wir haben gelernt, dass in einer PHP-Datei, die aus einem Formular gestartet wird, die Namen der Formular-Elemente als assoziative Indices in den Arrays $ REQUEST“, $ POST“ und $ GET“ zur ” ” ” Verfügung stehen. Dies kann man nutzen, um Formular und Befehle, die das Formular behandeln, in einer einzigen PHP-Datei zusammenzufassen: Angenommen die Datei form.php“ enthält folgendes Formular: ” <FORM ACTION=” f o r m . php” METHOD=POST> <INPUT NAME=” b e l i e b i g e r n a m e ”> <INPUT TYPE=” s u b m i t ”> </FORM> Dann ruft sich beim Klicken auf den Schaltknopf submit“ die Datei selbst auf. Allerdings ist beim zweiten ” Aufruf innerhalb des Arrays $ REQUEST“ der assoziative Index beliebigername “ Name gesetzt. ” ” Dies können wir folgendermaßen ausnützen, um Anfrage und Antwort in einem Skript abzuwickeln: <?php if( isset( $_REQUEST[” b e l i e b i g e r n a m e ”] ) ) { echo ” S i e haben ”.$_REQUEST[” b e l i e b i g e r n a m e ”].” e i n g e g e b e n \n”; } ?> <P> <FORM ACTION=” f o r m . php” METHOD=POST> <INPUT NAME=” b e l i e b i g e r n a m e ”> <INPUT TYPE=” s u b m i t ”> </FORM> Wird die Datei zum ersten Mal aufgerufen, d. h. ohne dass man auf den SubmitButton klickt, so ist $ REQUEST["beliebigername"] nicht gesetzt, der Ausdruck isset($ REQUEST["beliebigername"] ist also nicht wahr. Füllt man das Formular dann aus und klickt auf submit“, so ist die Variable gesetzt, Die Bedingung isset($ REQUEST["beliebigername"] “ ist ” ” wahr und es wird Sie haben Text eingegeben“ ausgegeben. ” Will man danach die Skriptauswertung abbrechen, so sollte der Befehl exit; verwendet werden. 2.5 Dateien hinzuladen Der Befehl include_once(” d a t e i n a m e ”); liest den Inhalt der Datei dateiname so, als ob er an dieser Stelle im Skript stehen würde. Damit kann z. B. sehr leicht ein einheitliches Layout bei einer größeren Anzahl von Dateien erreicht werden. Beispiel: 1 <?php 2 $kopf=” v o r l a g e n / k o p f b e r e i c h . t p l ”; Vorlesung 2 - 4 Einführung in PHP 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 $fuss=” v o r l a g e n / f u s s b e r e i c h . t p l ”; ?> 2.6 Dateien lesen und schreiben Vorlesung 2: Kontrollstrukturen, Dateioperationen <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Titel hier</title> </head> <body> <?php if( file_exists( $kopf ) ){ include_once( $kopf ); } ?> <p> Hier steht nun der Hauptteil des Dokuments. </p> <?php if( file_exists( $fuss ) ){ include_once( $fuss ); } ?> </body> </html> Wir wollen nun von Dateien, die auf dem Server liegen, lesen bzw. in diese Dateien etwas hineinschreiben. Dies ist nützlich, um z. B. Zähler oder Gästebücher zu erzeugen. Wichtig: Aus Sicherheitsgründen ist der Webserver auf Systemen, die von mehreren Usern genutzt werden, i. d. R. einem besonderen Benutzer auf dem Server-Computer zugeordnet, der sehr wenig Rechte hat. U. a. darf er nicht einfach in eine Datei in einem User-Verzeichnis schreiben. Genausowenig darf er eine Datei in einem User-Verzeichnis erzeugen. Um eine für Schreibaktionen durch den Webserver freigegebene Datei xxx“ zu erzeugen, müssen Sie auf Serversys” temen folgendermaßen vorgehen: Verwenden Sie z. B. das Programm ws ftp unter Windows, so kann man im ftp-Programm die Datei anwählen, auf die rechte Maustaste klicken und dann den Befehl chmod verwenden. Steht der Befehl chmod nicht per Mausklick zur Verfügung, so kann man die Rechte dennoch mit einem ftp-Befehl eingeben: Der Befehl lautet site chmod xyz DATEINAME x, y, z sind 3 Ziffern, die die Rechte für den Datei-Eigentümer, die Benutzergruppe des Datei-Eigentümers (das sind üblicherweise alle anderen Benutzer auf dem Computer) und den Rest der Welt bestimmen. Dabei gilt: Jede der 3 Ziffern liegt zwischen 0 und 7. Vorlesung 2 - 5 Einführung in PHP 0 bedeutet: 1 bedeutet: 2 bedeutet: 4 bedeutet: Vorlesung 2: Kontrollstrukturen, Dateioperationen keinerlei Zugriffsrecht. Ausführrecht (wichtig bei Programmen und Verzeichnissen). Schreibrecht (was gleichzeitig auch L̈öschrechtïst). Leserecht. Der Clou an der Sache ist, dass die Zahlen addiert werden können: Will man einer Datei Lese- und Schreibrecht zuordnen, so ist die Zahl 2+4=6 anzugeben. Beispiele: site chmod 777 DATEINAME gibt jedem das Recht, alles mit der Datei DATEINAME anzustellen. site chmod 754 DATEINAME bedeutet, der Eigentümer darf alles mit der Datei anstellen, die Gruppe des Eigentümers darf die Datei ausführen und lesen, der Rest darf die Datei nur lesen. Achtung: Der Webserver läuft normalerweise unter dem User nobody“, ist also weder der Eigentümer noch gehört er ” zur Gruppe des Eigentümers. OK. Gehen wir davon aus, dass wir nun eine Datei mit dem Namen xxx “ haben, deren Inhalt wir lesen ” wollen. Ein kurzes Dateilese-“-Programm kann folgendes Aussehen haben: ” 1 2 3 4 5 6 7 8 $datei = fopen(” x x x ”,” r ”); while (!feof($datei)) { $zeile = fgets($datei,1000); echo $zeile; } fclose($datei); Erläuterungen: Zuerst müssen wir die Datei öffnen, dabei muß angegeben werden, was mit der Datei geschehen soll: Wollen wir lesen, schreiben, anhängen,... Der PHP-Befehl lautet $datei = fopen(” x x x ”,” r ”); Das heißt, wir öffnen die Datei mit dem Namen xxx und wollen darin lesen ("r" ). Die technischen Details lassen wir dabei von der Variablen $datei regeln, d. h. wenn wir später aus der Datei lesen wollen, so benützen wir die Variable $datei . Nun lesen wir zeilenweise den Inhalt der Datei, und zwar so lange, bis wir ans Ende der Datei gelangt sind: while (!feof($datei)) { $zeile = fgets($datei,1000); echo $zeile; } feof($datei) “ ist wahr, sobald wir an das Datei-Ende gelangt sind. $zeile = ” ” fgets($datei,1000); “ liest maximal die nächsten 1000 Zeichen, hört aber auf, sobald eine neue Zeile beginnt, oder das Ende der Datei erreicht ist. echo $zeile; “ gibt einfach das Gelesene wieder aus. ” Schließlich muß die Datei noch geschlossen werden: Vorlesung 2 - 6 Einführung in PHP Vorlesung 2: Kontrollstrukturen, Dateioperationen fclose($datei); Folgende Möglichkeiten gibt es, eine Datei zu öffnen: "r" : "r+" : "w" : "w+" : "a" : "a+" : nur lesen, begonnen wird am Dateianfang. lesen und schreiben, begonnen wird am Dateianfang. nur schreiben. Existiert die Datei bereits, wird der bisherige Inhalt gelöscht. Existiert sie nicht, wird versucht, sie zu erzeugen. lesen und schreiben. Ansonsten wie "w" . nur schreiben. Begonnen wird am Ende der Datei (a wie append, anhängen). Existiert sie nicht, wird versucht. sie zu erzeugen. lesen und schreiben. Ansonsten wie "a" . Achtung: Es wird beim Lesen natürlich auch am Ende der Datei begonnen (dort steht natürlich nichts mehr...) Mit dem Befehl fwrite($datei, ” E i n T e x t ”); kann der String Ein Text“ in die Datei geschrieben werden. ” 2.7 Aufgaben zur Vorlesung 1. Geben Sie auf im Browserfenster das Kleine 1 x 1“ aus. ” 2. Schreiben Sie einen einfachen Rechner, der mit Hilfe der bedingten Verzweigung (if-else bzw. switch ) die vier arithmetischen Grundrechenarten Addition, Subtraktion, Multiplikation und Division für zwei in ein Formular einzugebende Zahlen umsetzt. 3. Lassen Sie im Browserfenster ein HTML-Formular ausgeben, in das man eine Zahl eingeben kann. Klickt man auf Abschicken“, wird so oft der Text Romanes eunt domus“ ausgegeben, wie diese ” ” Zahl angibt. Formulareingabe und -auswertung sollen in einem PHP-Skript vereinigt werden. 4. Schreiben Sie ein Gästebuch. D. h. der Benutzer kann in einem Formular einen Text eingeben. Dieser Text wird dann an eine Datei angehängt, die anschließend ausgegeben wird. 5. Schreiben Sie mit PHP einen Zähler (Counter) für eine Seite. Lösungshilfe: Beim Aufruf der Seite wird eine Datei geöffnet. Die darin enthaltene Zahl wird nun gelesen, ausgegeben, um 1 erhöht und wieder in die Datei zurückgeschrieben. 6. Schreiben Sie ein PHP-Skript, mit dem dynamisch verschiedene Inhalte geladen und in einem festen Seitenlayout dargestellt werden können. Lösungshilfe: Schreiben Sie eine HTML-Seite mit vordefiniertem Kopf- und Fussteil. Laden Sie durch Übergabe im Array $ GET (siehe Abbildung 2.1) dynamisch die Inhalte aus anderen Dateien unter Benutzung der include-Funktion in den Mittelteil der Ausgabe. Vorlesung 2 - 7 Einführung in PHP Vorlesung 2: Kontrollstrukturen, Dateioperationen Abbildung 2.1: Seitenaufruf mit Übergabeparameter Vorlesung 2 - 8 Einführung in PHP Vorlesung 3: Vordefinierte und benutzerdefinierte Funktionen Vorlesung 3 Vordefinierte und benutzerdefinierte Funktionen 3.1 Funktionen Ein wichtiger Bestandteil einer jeden modernen Programmiersprache ist die Fähigkeit, mehrere Anweisungen zu einem einzigen Befehl zusammenzufassen, d. h. neue Funktionen zu definieren (benutzerdefinierte Funktionen). PHP verfügt über diese Fähigkeit selbstverständlich auch. Ein Beispiel: Wir wollen für eine bestimmte Anzahl von Tagen berechnen, wieviele Sekunden diese Tage zusammen haben. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Title here!</title> </head> <body> <?php function tag ( $anzahl ) { $sekunden = 3600 * 24 * $anzahl; return $sekunden; } $x = tag(7); echo ” 7 Tage b e s t e h e n a u s $x S e k u n d e n ! ”; ?> </body> </html> $anzahl “ nennt man auch Argument oder Übergabeparameter der Funktion. Eine Funktion kann mehrere ” Argumente oder auch kein Argument besitzen: 1 2 3 4 5 6 7 8 9 10 11 function zinseszins ($prozent,$laufzeit) { $kapital = 10000.0; $x = 1.0 + ($prozent/100.0); $y = $kapital * exp( $laufzeit*log($x) ); return $y; } $proz = 6; $zeit = 10; $x = zinseszins($proz,$zeit); echo ”Das K a p i t a l b e t r ä g t $x Euro ”; Mehr zu den hier verwendeten mathematischen Funktionen exp() “ und log() “ kann man im PHP” ” Handbuch nachlesen. Problematisch ist im obigen (zugegebenermaßen etwas konstruierten) Beispiel, dass die Variable $kapital in der Funktion selbst festgelegt wird. Natürlich wird man auch diesen Wert normalerweise als Argument der Funktion übergeben, also etwa: 1 function zinseszins ($prozent,$laufzeit,$kapital) { ... } Vorlesung 3 - 1 Einführung in PHP Vorlesung 3: Vordefinierte und benutzerdefinierte Funktionen Wir wollen aber jetzt den Fall betrachten, dass diese Variable bereits im Vorfeld der PHP-Datei gesetzt ist und wir sie nicht als Argument übergeben wollen. Dann müssen wir für die Funktion explizit angeben, dass die Variable von außen“ stammt. Dies geschieht durch den Befehl global : ” 1 2 3 4 5 6 7 8 9 10 11 12 13 14 $kapital = 10000.0; function zinseszins ($prozent,$laufzeit) { global $kapital; $x = 1.0 + ($prozent/100.0); $y = $kapital * exp( $laufzeit*log($x) ); return $y; } $proz = 6; $zeit = 10; $x = zinseszins($proz,$zeit); echo ”Das K a p i t a l b e t r ä g t $x Euro ”; Es empfiehlt sich benutzerdefinierte Funktionen, die häufiger in verschiedenen Skripten zum Einsatz kommen sollen, in gesonderten Bibliotheks-Dateien (ggfs. in gesonderten Unterverzeichnissen) zu speichern und bei Bedarf mit dem include once -Befehl in die Skripten einzubinden. Sinnvoll kann es auch sein, die Bibliotheks-Dateien außerhalb des offen zugänglichen Webbereichs (z. B. Verzeichnis www“) auf dem ” Server abzulegen, um die Inhalte dem allgemeinen Zugriffs zu entziehen. account includes meineSuperFunktionen.inc www offener Bereich tageInSekunden.php 1 2 3 4 5 6 7 8 9 10 11 12 <?php include_once(” . . / i n c l u d e s / m e i n e S u p e r F u n k t i o n e n . i n c ”); ?> <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Title here!</title> </head> <body> <?php $x = tag(7); echo ” 7 Tage b e s t e h e n a u s $x S e k u n d e n ! ”; Vorlesung 3 - 2 Einführung in PHP Vorlesung 3: Vordefinierte und benutzerdefinierte Funktionen 13 ?> 14 </body> 15 </html> 3.2 Vordefinierte Funktionen PHP verfügt über eine inzwischen umfangreiche Bibliothek von vordefinierten Funktionen, die für die meisten Problemstellungen im Zusammenhang mit der Erzeugung dynamische Webseiten optimierte Lösungen bereit stellen. Einige dieser Funktionen wurden bereits vorgestellt. Diese Funktionsbibliothek ist im Abschnitt Funktionsreferenz“ des PHP-Handbuchs dokumentiert, wel” ches für jede PHP-Version veröffentlicht wird. Hier im Überblick die Referenzkapitel der PHP-Version 4: Allgemein nützliche Funktionen für die Erzeugung dynamischer Webseiten: II. IV. VI. IX. XVI. XVIII. XXIII. XXIV. XXX. XCVII. XCIX. LI. LV. LIX. LXXVIII. LXXXII. LXXIV. LXXXVII. LXXXIX. Array Funktionen Mathematische Funktionen mit beliebiger Genauigkeit Kalender-Funktionen Klassen- und Objekt-Funktionen Character type functions Datums- und Zeit-Funktionen Direkte Ein-/Ausgabe Funktionen Verzeichnis-Funktionen Funktionen des Dateisystems String-Funktionen Tokenizer functions Mathematische Funktionen Hash Funktionen Sonstige Funktionen PHP Optionen und Informationen Funktionen zur Programmausführung Funktionen zur Ausgabesteuerung Regular Expression Functions (Perl-Compatible) Reguläre Ausdrücke Funktionen (POSIX erweitert) Funktionen zur Generierung und Bearbeitung bestimmter Dateiformate: V. X. XXV. XXXI. XLI. XCIV. LVIII. LXXVI. CIV. CV. CVI. CVII. CX. CXI. Bzip2 Komprimierungsfunktionen ClibPDF Funktionen DOM XML Funktionen Forms Data Format Funktionen Grafik-Funktionen Shockwave Flash Funktionen Ming functions for Flash PDF Funktionen WDDX Funktionen XML parser functions XML-RPC functions XSLT Funktionen ZIP Funktionen (Lesezugriff) Zlib Komprimierungsfunktionen Vorlesung 3 - 3 Einführung in PHP Vorlesung 3: Vordefinierte und benutzerdefinierte Funktionen Funktionen für Netzwerk-Operationen: I. XII. XV. XXXIII. XXXVII. XLII. XLVIII. XLIX. L. LVI. XLVI. LXV. XC. LXXI. XCIII. XCV. XCII. XCVI. C. CII. CIX. Apache-spezifische Funktionen CURL, Client URL Library Functions Cyrus IMAP administration functions FTP-Funktionen HTTP-Funktionen IMAP, POP3 und NNTP Funktionen LDAP Funktionen Mail Funktionen mailparse functions Mimetype Functions IRC Gateway Funktionen Netzwerk Funktionen Semaphor und Shared Memory Funktionen OpenSSL Funktionen Shared Memory Funktionen (Gemeinsamer Speicher) SNMP Funktionen Session Funktionen Socket Funktionen URL Funktionen vpopmail functions YP/NIS Funktionen Funktionen für den Zugriff auf spezielle Datenbanken: XVII. XIX. XX. XXI. XXII. XXVIII. XXIX. XXXVIII. XXXIX. XLIII. XLIV. XLV. LVII. LXI. LXII. LXVII. LXVIII. LXX. LXXII. LXXIII. LXXX. XCI. XCVIII. dba Datenbank (dbm-style) Abstraktions-Funktionen dBase Funktionen DBM Datenbankfunktionen dbx Funktionen DB++ Functions FrontBase Funktionen filePro Funktionen Hyperwave functions Hyperwave API functions Informix Funktionen InterBase-Funktionen Ingres II Funktionen Microsoft SQL Server Funktionen mSQL Funktionen MySQL Funktionen Lotus Notes functions ODBC Funktionen Oracle 8 Funktionen Oracle Funktionen Ovrimos SQL functions PostgreSQL Funktionen SESAM Datenbankfunktionen Sybase functions Weitere Funktionen der Standardbibliothek XIV. III. Crédit Mutuel CyberMUT functions Aspell Funktionen [veraltet] Vorlesung 3 - 4 Einführung in PHP VII. VIII. XI. XIII. XXVI. XXVII. XXXII. XXXIV. XXXV. XXXVI. XL. XLVII. LII. LIII. LIV. LX. LXIII. LXIV. LXVI. LXIX. LXXV. LXXVII. LXXIX. LXXXI. LXXXIII. LXXXIV. LXXXV. LXXXVI. LXXXVIII. CIII. CVIII. Vorlesung 3: Vordefinierte und benutzerdefinierte Funktionen CCVS API Funktionen COM Support Funktionen für Windows Crack Funktionen Cybercash Bezahl Funktionen .NET Funktionen Error Handling and Logging Functions FriBiDi Funktionen Function Handling functions GNU Gettext GMP functions iconv Funktionen Java Funktionen Multi-Byte String Functions MCAL Funktionen Mcrypt Encryption Functions mnoGoSearch Funktionen Mohawk Software Session Handler Funktionen muscat functions Ncurses terminal screen control functions Object Aggregation/Composition Functions Object property and method call overloading Verisign Payflow Pro Funktionen POSIX Funktionen Process Control Functions Printer functions Pspell Funktionen GNU Readline GNU Recode Funktionen qtdom functions W32api functions YAZ functions Achtung: Nicht jedes Funktionsmodul ist bei den verschiedenen Providern auch tatsächlich aktiviert. 3.3 String-Funktionen Ein wichtiges Betätigungsfeld von PHP ist die Bearbeitung von Zeichenketten. Es gibt eine ganze Reihe von vordefinierten Funktionen um Zeichenketten zu manipulieren. Wir stellen hier nur die wichtigsten vor, der Rest kann im Handbuch unter dem Stichwort String-Funktionen“ nachgeschlagen werden. ” Die Funktion trim() entfernt Leerzeichen, Tabulatorzeichen etc. (sogenannten whitespace“) vor dem ” ersten und nach dem letzten echten“ Zeichen in der Zeichenkette. ” $x = ” I c h b i n e i n e Z e i c h e n k e t t e ! ”; $y = trim($x); Die Funktionen ltrim() und chop() entfernen whitespace“ vor bzw. nach der Zeichenkette. ” Für die verspielten PHP-Programmierer: strtoupper() und strtolower() wandeln alle Zeichen eines Strings in Großbuchstaben bzw. Kleinbuchstaben um. Achtung: Probleme kann es bei Umlauten geben. Die Funktion ucfirst() wandelt das erste Zeichen eines Strings in Großbuchstaben um (wenn möglich). Vorlesung 3 - 5 Einführung in PHP Vorlesung 3: Vordefinierte und benutzerdefinierte Funktionen Die Funktion ucwords() hingegen wandelt in jedem Wort eines Strings das erste Zeichen in Großbuchstaben um (wenn möglich). Die folgende Funktion ist besonders wichtig, wenn man vorhandenen Text für das WWW aufbereiten will: $x = nl2br($y); ersetzt alle Zeilenumbruch-Zeichen ( \n “) des Strings $y in die Zeichenfolge <BR>\n “. ” ” Daneben gibt es noch einige wichtige Funktionen, um Strings zu vergleichen, zu ersetzen und mit HTMLSonderzeichen umzugehen. 3.4 Aufgaben zur Vorlesung 1. Erstellen Sie eine Funktion flaeche() , welche als Übergabeparameter zwei Zahlen erhält (eine Längen- und ein Breitenangabe) und die entsprechende Fläche zurück liefert. Testen Sie die Funktion in einer PHP-Anwendung. 2. Erstellen Sie eine Funktion mitglied() , welche als Übergabeparameter eine Zahl erhält. Die Funktion soll das dieser Zahl entsprechende Mitglied namentlich zurückmelden. Erzeugen Sie dazu zunächst innerhalb der Funktion ein skalares Array nach folgendem Muster: $adresse[0] : $adresse[1] : $adresse[2] : $adresse[3] : Dieter Schulz Wolfgang Herbst Franz Lang Horst Schmidt 3. Erweitern Sie die vorhergehende Aufgabe so, dass überprüft wird, ob ein bestimmter Name Mitglied ist. D. h. als Übergabeparameter erhält die Funktion einen beliebigen Namen und liefert entweder die Nummer zurück oder aber eine Fehlermeldung. 4. Lassen Sie einen Text über ein HTML-Formular eingeben und geben Sie den Text vollständig in Großbuchstaben als Antwort zurück. Benutzen Sie dazu eine geeignete String-Funktion aus der PHPBibliothek. 5. Lassen Sie einen Text über ein HTML-Formular eingeben und geben Sie den Text in umgekehrter Reihenfolge aller Buchstaben als Antwort zurück. Benutzen Sie dazu eine geeignete String-Funktion aus der PHP-Bibliothek. 6. Lassen Sie einen Text über ein HTML-Formular eingeben und geben Sie den Text in umgekehrter Reihenfolge alle Wörter als Antwort zurück. Benutzen Sie dazu die Funktion explode() aus der PHP-Bibliothek. Vorlesung 3 - 6 Einführung in PHP Vorlesung 4: Zugriff auf Datenbanken Vorlesung 4 Zugriff auf Datenbanken 4.1 Einführung Eines der Haupteinsatzgebiete von PHP ist der Online-Zugriff auf Datenbanken. Was ist eine Datenbank? Vereinfacht gesagt: Eine Datenbank enthält geordnete Informationen, die Daten. Zusammengehörige Daten sind dabei in Datensätzen vereint. Mit den Daten in einer Datenbank kann unter Nutzung eines Datenbank-Management-Systems (DBMS) bedarfgerecht gearbeitet werden. Zum Beispiel können bestimmte Datensätze ausgelesen werden, neue Datensätze hinzugefügt werden, Datensätze können aktualisiert oder gelöscht werden. Diese Vorgänge erfolgen durch sogenannte Datenbank-Abfragen. Abbildung 4.1: PHP, DBMS, Datenbanken dbnli01 PHP-Skript Datenbank Management System (z.B. MySQL) dbnli02 dbnli02 Weit verbreitet sind relationale Datenbanken-Management-Systeme, die Datenbanken über mehrere Tabellen (Relationen) verteilt verwalten. Alle marktgängigen DBMS ermöglichen die Übermittlung von Anfragen an eine Datenbank mit Hilfe der Abfragesprache SQL (Structured Query Language). PHP unterstützt die Datenbankabfrage mittels SQL und kann mit den DBMS nahezu aller Hersteller direkt oder unter Vermittlung der spezifischen ODBC-Treiber kommunizieren. Im Bereich der Webprogrammierung erfreut sich das DBMS MySQL besonderer Beliebtheit. Vorteile von MySQL: es ist schnell und es ist kostenlos. Vorlesung 4 - 1 Einführung in PHP 4.2 Vorlesung 4: Zugriff auf Datenbanken Zugriff auf Datenbanken Um eine SQL-Abfrage mit PHP auszuführen, muss • zuerst die Datenbank geöffnet werden (vergleichbar mit dem Zugriff auf eine Datei), • dann wird die SQL-Befehlszeile an die Datenbank geschickt, • die Antwort der Datenbank wird aufgenommen und • schließlich wird die Datenbank-Verbindung wieder geschlossen. 4.3 SQL-Grundlagen Um mit MySQL produktiv arbeiten zu können, müssen wir uns zunächst etwas Hintergrundwissen über die Struktur von SQL-Abfragen verschaffen. SQL-Datenbanken bestehen aus einer Tabelle oder mehreren Tabellen (Relationen). Jeder Datensatz der Datenbank entspricht dabei genau einer Zeile in einer Tabelle. Beispiel: Ein Kneipenführer. Die Tabelle kneipen (zur Datenstruktur siehe Abbildung 4.2): ID 1 2 3 Name Herzogkeller Glenk ... Art Biergarten Biergarten ... Note 1 1 ... Kommentar Sehr schöner Baumbestand Gute Bratwürste ... Abbildung 4.2: Struktur der Tabelle kneipen“ ” Man kann auf die Tabellen einer Datenbank einzeln zugreifen, aber auch Tabellen verküpfen. Wir wollen uns hier der Einfachkeit halber zunächst auf eine einzige Tabelle beschränken. Es gibt im wesentlichen vier Abfragemöglichkeiten: Auslesen: Einfügen: Überschreiben: Löschen: SELECT INSERT UPDATE DELETE Will man z. B. alle Kneipennamen, die sich in der Datenbank befinden, auslesen, so gibt man den SQLBefehl Vorlesung 4 - 2 Einführung in PHP Vorlesung 4: Zugriff auf Datenbanken SELECT Name FROM kneipen; ein. Will man Name und Art der Kneipe ausgeben, so lautet der Befehl SELECT Name,Art FROM kneipen; Soll schließlich die komplette Tabelle ausgelesen werden, so genügt der Befehl SELECT * FROM kneipen; Die auszulesenden Datensätze können nun noch weiter spezifiziert werden: SELECT * FROM kneipen WHERE NOTE=1; gibt nur die Datensätze aus, die in der Spalte Note eine 1 enthalten. Eine sortierte Ausgabe der Datensätze kann mit SELECT * FROM kneipen WHERE NOTE=1 ORDER BY Name; erzeugt werden. Neue Datensätze werden folgendermaßen hinzugefügt: INSERT kneipen (Name,Art,Note,Kommentar) VALUES ( ’ G l e n k ’, ’ B i e r g a r t e n ’,1, ’ Gute B r a t w ü r s t e ’); Vorhandene Datensätze können mit UPDATE kneipen SET Note=2, Kommentar= ’ Die B r a t w ü r s t e l a s s e n nach ’ WHERE ID=2; überschrieben werden. Das soll als erster Einblick genügen. SQL ist eine sehr mächtige Abfragesprache, insbesondere für Kombinationsabfragen aus mehreren Tabellen gleichzeitig (inner joins, outer joins,...) existiert eine eigene, beinahe mathematische Theorie. 4.4 SQL-Befehle mit PHP Die vorgestellten SQL-Befehle verwenden wir nun mit PHP. Wir wollen als Beispiel alle Datensätze aus der Tabelle kneipen “ in der Datenbank dbnli03 “ ausgeben. ” ” Zuerst muß eine Verbindung von PHP zum Datenbank-Server (d. h. dem Computer, auf dem die Datenbank liegt) hergestellt werden: / / Z u g a n g s d a t e n werden z u n a e c h s t i n V a r i a b l e n h i n t e r l e g t $host = ”db . bbs−l o e n i n g e n . de ”; $login = ” n l i 0 3 ”; $password = ” h e u t e ”; / / V e r b i n d u n g zum S e r v e r h e r s t e l l e n $verbindung = mysql_connect( $host, $login, $password ); Vorlesung 4 - 3 Einführung in PHP Vorlesung 4: Zugriff auf Datenbanken Wie im Beispiel zu sehen, kann auf beliebige Datenbankserver im Internet zugegriffen werden - vorausgesetzt man besitzt die entsprechende Zugangsberechtigung. Server, Benutzername und Passwort müssen Sie natürlich an die Gegebenheiten Ihres Systems anpassen. Wir sollten im Skript auch überprüfen, ob die Verbindung zum MySQL-Server klappt: $verbindung = mysql_connect( $host, $login, $password ); if (!$verbindung) { echo ” K e i n e V e r b i n d u n g m ö g l i c h ! \ n”; exit; } Steht die Verbindung, so können wir die erste Abfrage starten. Zur besseren Übersicht schreiben wir die geplante SQL-Abfrage vorab in eine Variable: $abfrage = ”SELECT Name , A r t f r o m k n e i p e n ”; Diese Abfrage wird nun an den Datenbank-Server geschickt. Das Resultat fangen wir in der Variablen $erg auf. mysql_select_db( ” d b n l i 0 3 ” ); $erg = mysql_query( $abfrage ); / / DB a u s w a e h l e n / / Anfrage s t e l l e n Die erste Anweisung wählt die Datenbank dbnli03 “ aus, die wir abfragen wollen. ” Die zweite Anweisung schickt den SQL-Befehl an die ausgewählte Datenbank und liefert als Ergebnis eine Verweis auf das Abfrageergebnis. Dieser Verweis wird in der Variablen $erg abgelegt. Nun kommt eine etwas knifflige Arbeit: Wir müssen unter Verwendung von $erg die zurückgelieferten Datensätze auslesen. Hätten wir einen INSERT, UPDATE oder DELETE Befehl verschickt, würden wir nur testen, ob $erg wahr oder falsch ist, d. h. ob die Abfrage geklappt hat oder nicht. Da wir aber den SELECT-Befehl an die Datenbank geschickt haben, wollen wir die von der Datenbank zurückgelieferten Datensätze auslesen. Wir haben pro Datensatz die beiden Spalten Name“ und Art“ angefordert. ” ” Diese lesen wir nun zeilenweise aus: $zeile = mysql_fetch_array( $erg ) ); echo $zeile[”Name”].” i s t e i n ( e ) ”.$zeile[” A r t ”].”<br >\n”; Die Variable $erg enthält nach der Abfrage Zeilen mit jeweils zwei Spalten ( Name“ und Art“). mys” ” ” ql fetch array( $erg ) “ gibt genau eine Zeile als Assoziativ-Array zurück. Zu Beginn steht eine Art Zeiger auf der ersten Zeile des Datenbereichs, führt man den Befehl mys” ql fetch array( $erg ) “ aus, rutscht der Zeiger zur nächsten Zeile usw. Will man alle Zeilen ausgeben, empfiehlt sich eine Schleife: while ( $zeile = mysql_fetch_array( $erg ) ) { foreach( $zeile as $wert ) { echo $zeile[”Name”].” i s t e i n ( e ) ”.$zeile[” A r t ”].”<br >\n”; } } Vorlesung 4 - 4 Einführung in PHP Vorlesung 4: Zugriff auf Datenbanken Die Ergebnisse verarbeiten wir also zeilenweise zu HTML-Text. Alternative: Etwas eleganter läßt sich das Ergebnis der Datenbankabfrage auch unter Verwendung des list -Konstrukts auswerten, mit dem ein skalarer Array in Einzelvariablen (hier $Name und $Art ) aufgeteilt werden kann. list($Name,$Art) = mysql_fetch_array($erg); Innerhalb einer while -Schleife: while( list( $Name,$Art ) = mysql_fetch_array( $erg ) ) { echo $Name.” i s t e i n ( e ) ”.$Art.”<BR>\n”; } Am Ende empfiehlt es sich, die Verbindung zur Datenbank zu kappen: mysql_close( $verbindung ); Das grundlegende Datenbankprogramm noch einmal im Gesamtüberblick: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 / / Z u g a n g s d a t e n werden z u n a e c h s t i n V a r i a b l e n h i n t e r l e g t $host = ”db . bbs−l o e n i n g e n . de ”; $login = ” n l i 0 3 ”; $password = ” h e u t e ”; / / V e r b i n d u n g zum S e r v e r h e r s t e l l e n $verbindung = mysql_connect( $host, $login, $password ); if (!$verbindung) { echo ” K e i n e V e r b i n d u n g m ö g l i c h ! \ n”; exit; } / / SQL−A b f r a g e f o r m u l i e r e n $abfrage = ”SELECT Name , A r t f r o m k n e i p e n ”; mysql_select_db( ” d b n l i 0 3 ” ); $erg = mysql_query( $abfrage ); / / DB a u s w a e h l e n / / Anfrage s t e l l e n / / Ergebnis der Abfrage p u b l i z i e r e n while ( $zeile = mysql_fetch_array( $erg ) ) { foreach( $zeile as $wert ) { echo $zeile[”Name”].” i s t e i n ( e ) ”.$zeile[” A r t ”].”<br >\n”; } } mysql_close( $verbindung ); / / V e r b i n d u n g k a p p e n Vorlesung 4 - 5 Einführung in PHP 4.5 Vorlesung 4: Zugriff auf Datenbanken Verteilung des Datenbankprogramms auf mehrere Skriptdateien Das Datenbank-Programm aus dem vorhergehenden Kapitel ist - wie der Versuch gezeigt hat - voll funktionsfähig. Trotzdem lassen sich drei bedenkenswerte Kritikpunkte an ihm festmachen: 1. Im Skript sind die Zugangsdaten zum Datenbankserver im Klartext enthalten. Wenn das Skript im öffentlichen Bereich des Serverrechners liegt, sind diese Daten schnell gehackt“. ” 2. Eine Wiederverwendung von Codeteilen ist nicht möglich. 3. Bei einem Wechsel des Datenbank-Management-Systems (Providerwechsel, Zweitinstallation auf einem anderen Server, . . .) muss das gesamte Programm umgeschrieben werden. Abhilfe verspricht hier die bewährte Praxis, das Programm auf mehrere Dateien zu verteilen. Einen Strukurvorschlag zeigt die nachfolgende Grafik. Abbildung 4.3: Verteilte Datenbankskripte account etc dbDaten.inc includes dbFunktionen.inc www offener Bereich datenLesen.php Die Dateien können folgendes Aussehen haben: Datei dbDaten.inc“ - enthält alle Zugangsdaten ” 1 2 / / Z u g a n g s d a t e n werden z u n a e c h s t i n V a r i a b l e n h i n t e r l e g t $host = ”db . bbs−l o e n i n g e n . de ”; Vorlesung 4 - 6 Einführung in PHP 3 4 5 6 7 Vorlesung 4: Zugriff auf Datenbanken $login = ” n l i 0 3 ”; $password = ” h e u t e ”; $database = ” d b n l i 0 3 ”; $connection = FALSE; / / Globale Vaiable f u e r die Verbindung Datei dbFunktionen.inc“ - enthält die Logik des Datenbankzugriffs für ein spezifisches DBMS ” 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 include_once(” . . / e t c / dbDaten . i n c ”); / / Z u g a n g s d a t e n e i n b i n d e n /∗ ∗ ∗ ∗ O e f f n e t d i e V e r b i n d u n g zum DBMS und s e l e k t i e r t e i n e D a t e n b a n k ∗ ∗ R u e c k g a b e : TRUE b e i E r f o l g , s o n s t FALSE ∗/ function open_database() { global $host, $login, $password, $database, $connection; $status = FALSE; $connection = mysql_connect( $host, $login, $password ); if( $connection != FALSE ) { mysql_select_db( $database ); $status = TRUE; } return $status; } /∗ ∗ ∗ ∗ S c h l i e s s t e i n e o f f e n e V e r b i n d u n g zum DBMS ∗ ∗ Rueckgabe : k e i n e ∗/ function close_database() { global $connection; if( $connection != FALSE){ mysql_close( $connection ); $connection = FALSE; } return; } /∗ ∗ ∗ ∗ S t e l l e e i n e SQL−SELECT−A b f r a g e ∗ ∗ R u e c k g a b e : Z w e i d i m e n s i o n a l e r A r r a y m i t a l l e n D a t e n s ä t z e n und D a t e n f e l d e r n ∗/ function select( $query_string ) { $result = mysql_query( $query_string ); / / A n f r a g e s t e l l e n / / Ergebnis der Abfrage in einen zweidimensionalen Array e i n l e s e n Vorlesung 4 - 7 Einführung in PHP 53 54 55 56 57 58 59 60 Vorlesung 4: Zugriff auf Datenbanken $i = 0; while ( $zeile = mysql_fetch_array( $erg ) ) { $resultArray[ $i ] = $zeile; $i++; } return $resultArray; } Datei datenLesen.php“ - enthält das eigentliche Programm ” 1 2 3 4 5 6 7 8 9 10 11 12 13 4.6 include_once(” . . / i n c l u d e s / d b F u n k t i o n e n . i n c ”); / / E i n b i n d u n g F u n k t i o n e n / / SQL−A b f r a g e f o r m u l i e r e n $abfrage = ”SELECT Name , A r t f r o m k n e i p e n ”; if( open_database() == TRUE ) { $daten = select( $abfrage ); ... / / HTML−Ausgabe } else { echo ” K e i n e V e r b i n d u n g z u S e r v e r und D a t e n b a n k m o e g l i c h } . . . ”; Weitere SQL-Befehle Nachdem wir nun ein wenig Erfahrung mit SQL-Befehlen sammeln konnten, trauen wir uns auch an den DELETE -Befehl heran. Wichtig ist für diesen Befehl, dass ganz genau (und vorsichtig) spezifiziert wird, welcher Datensatz oder welche Datensätze aus der Datenbank gelöscht werden sollen. In unserem Beispiel ist es am besten, wenn man über das Feld ID “ den zu löschenden Datensatz angibt, ” denn dieses Feld enthält für jeden Datensatz eine eindeutige Nummer (= Primärschlüssel der Tabelle). Wollen wir den Datensatz mit ID=120 löschen, so geben wir als Abfrage an: $sql = ”DELETE FROM k n e i p e n WHERE ID=120”; Achtung: Vergißt man den WHERE -Teil, werden alle Datensätze der Tabelle gelöscht! Als Ersteller einer dynamischen Webseite mit PHP und einer Datenbank sollte man also immer genau darüber nachdenken, was den Betrachtern erlaubt werden soll und was nicht. Die Einrichtung einer neuen Tabelle erfolgt mit dem Befehl CREATE TABLE “. ” Beispiel: $sql = ”CREATE TABLE a d r e s s e n ( ’ ID ’ INT ( 3 ) AUTO INCREMENT , PRIMARY KEY ( ’ ID ’ ) , ’ Nachname ’ VARCHAR ( 4 0 ) , ’ Vorname ’ VARCHAR ( 4 0 ) , ’ Ort ’ VARCHAR ( 4 0 ) ) ”; Eine nicht mehr benötigte Tabelle läßt sich mit dem Befehl DROP TABLE “ löschen. ” Beispiel: $sql = ”DROP TABLE a d r e s s e n ”; Vorlesung 4 - 8 Einführung in PHP Vorlesung 4: Zugriff auf Datenbanken Neben der Tabelle kneipen“ existiert in der Datenbank dbnli03“ auch die Tabelle noten“ mit den folgen” ” ” den Inhalten. Num 0 1 2 3 4 5 6 Wort keine Wertung sehr gut gut befriedigend ausreichend mangelhaft ungenügend Wie lassen sich nun die beiden Tabellen abfragen, so dass im Ergebnis die Wertung für alle Kneipen in Worten ausgegeben wird? Hier der entsprechende SQL-Befehl: $sql = ”SELECT k n e i p e n . Name , n o t e n . Wort FROM k n e i p e n , n o t e n WHERE n o t e n . Num=k n e i p e n . N o t e ”; Wie sie erkennen können, wird in der WHERE-Klausel eine Beziehung zwischen dem Primärschlüssel der Tabelle noten“ und dem Datenfeld Note“ in der Tabelle kneipen“ (Fremdschlüssel) definiert, die zur ” ” ” korrekten Verknüpfung der beiden Tabellen in der SELECT-Abfrage genutzt wird. 4.7 Aufgaben zur Vorlesung 1. Schreiben Sie ein PHP-Programm, das aus der Tabelle kneipen in der Datenbank dbnli03 alle Datensätze ausgibt, deren Bewertung schlechter als 2 ist. 2. Schreiben Sie ein HTML-Formular, das neue Datensätze in die Tabelle kneipen in der Datenbank dbnli03 einfügt. 3. Erweitern Sie Ihr Formular zur Eingabe in die Datenbank-Tabelle kneipen : Fragen Sie mit PHPBefehlen ab, ob alle Felder ausgefüllt sind und ob die Note im gültigen Bereich zwischen 1 und 6 liegt. 4. Schreiben Sie ein PHP-Programm zur Auswertung der Tabelle kneipen : Es soll für jede Kneipe die Art, der Kommentar und die Bewertung in Worten angezeigt werden. 4.8 Fallaufgabe Elektronikversand Ein Elektronik-Versand möchte seine Waren in Zukunft über das Internet verkaufen. Dabei sollen interessierte Kunden die Möglichkeit haben, über eine Suchmaske Artikel (hier Notebooks oder Monitore) nach bestimmten Kriterien auszuwählen. 1. Vorbereitet ist die Datenbank Artikel“ mit den Tabellen Notebooks“ und Monitore“. ” ” ” Tabelle Notebooks: Vorlesung 4 - 9 Einführung in PHP Artikel-Nr 1001 1002 1003 1004 1005 1006 Vorlesung 4: Zugriff auf Datenbanken Bezeichung Notebook TPT 23 Notebook Top Note Notebook Thinkpad Vaio-PCG Hersteller IBM ECS IPC Gericom IBM Sony Preis 1.799 999 899 859 1.299 999 Bestand 15 7 6 9 4 11 Arbeitsspeicher 128 256 256 128 128 128 Prozessor 1600 1000 900 750 900 866 Display 15 14 13 13 14 14 Tabelle Monitore: Artikel-Nr 2001 2002 2003 Bezeichung Monitor P76 V75 Hersteller Siemens IBM Compaq Preis 299 199 199 Bestand 3 2 4 Lochmaske 0,28 0,24 0,26 Display 21 17 17 2. Der Benutzer soll zunächst auswählen können, welchen Artikel er kaufen möchte (vgl. Abbildung). 3. Anschließend soll der Benutzer über Textfelder und Radiobuttons und/oder Checkboxen die Möglichkeit erhalten, eine Auswahl nach bestimmten Kriterien vorzunehmen. Dazu wurden zwei Eingabemasken nach dem folgenden Vorbild (monitore.html und notebooks.html) erstellt. 4. Stellen Sie sicher, dass wenn ein Artikel von einem Benutzer gekauft wurde, dessen Bestand in der Datenbank um 1 reduziert wird. 5. Möchte ein Kunde einen Artikel mit einem Bestand von 0 erwerben soll eine entsprechende Fehlermeldung angezeigt werden. Vorlesung 4 - 10 Anhang A NLI-Kurs A.1 Rechner-Umgebung NLI-Kurs Novell-File-/Print-Server BBSLOE User-Laufwerk H Datenbank-Server db.bbs-loeningen.de IP: 172.18.100.9 Intranet-Server ins.bbs-loeningen.de IP: 172.18.100.1 Client-Rechner IP: 172.18.101.x Laufwerke C, D Internet Raum 101 A.2 Loginparameter Für die Teilnehmer/-innen des NLI-Kurses sind die Benutzernamen nli01 “ bis nli20 “ vorbereitet. Als ” ” Passwort ist für alle Accounts heute “ festgelegt. Dieses Passwort bitte nicht eigenmächtig ändern! ” Benutzername und Passwort gelten für das Novell-Login und die Anmeldung am MySQLDatenbankserver. Auf dem Datenbankserver sind für alle Teilnehmer/innen entsprechende Datenbanken dbnli01 “ bis dbnli20 “ eingerichtet. ” ” 1 Einführung in PHP Anhang A: NLI-Kurs Vorinstalliert sind für jede Datenbank die Tabellen kneipen“, noten“, monitore“ und notebooks“. ” ” ” ” Anhang A - 2 Einführung in PHP A.3 Anhang A: NLI-Kurs Entwicklungsumgebung Für jeden Kursteilnehmer/jede Kursteilnehmerin steht ein eigener Bereich auf der Serverfestplatte zur Verfügung, der auf den Clientrechner als Laufwerk H: erscheint. Auf diesem Laufwerk H: können die eigenen Dateien dauerhaft gespeichert werden. Auf dem Laufwerk H: ist die Entwicklungsumgebung für den PHP-Kurs vorinstalliert und muss nach dem Booten des Rechners über den Aufruf der entsprechenden Batchdateien aktiviert werden. Nähere Erläuterungen: Das Verzeichnis apache “ ist für den Betrieb des lokalen Webservers notwendig und darf nicht gelöscht ” werden. Hier werden Logdateien des Webservers abgelegt. Das Verzeichnis dbg “ enthält die Dateien des PHP-Debuggers, der bei der schrittweisen Abarbeitung von ” Skripten eingesetzt wird. Anhang A - 3 Einführung in PHP Anhang A: NLI-Kurs Das Verzeichnis Maguma Studio “ enthält die Dateien der Entwicklungsumgebung Maguma Studio ” ” Light“. Im Verzeichnis www “ sollten Sie alle HTML-Dokumente und PHP-Skripten ablegen. Der lokale Webserver ” betrachtet dieses Verzeichnis als Root-Verzeichnis für alle verfügbaren Webdokumente (offener Bereich). Über die Verknüpfung Editor “ können Sie die PHP-IDE Maguma Studio“ starten. ” ” Über die Verknüpfung PHP “ wird die lokale Entwicklungsumgebung initialisiert. Dies muss einmalig nach ” jedem neuen Login am Novellserver erfolgen. Über die Verknüpfungen Start Webserver “ und Stop Webserver“ können Sie den lokalen Webser” ” ver aktivieren bzw. deaktivieren. Wenn der lokale Webserver aktiviert ist, kann er unter der Adresse http://localhost “ via Browser kontaktiert werden. Von anderen Client-Rechnern kann der lokale ” Webserver unter der Adresse http://172.18.101.x “ angesprochen werden, wobei x “ durch die ” ” Platznummer ersetzt werden muss. Webdokumente für den lokalen Webserver müssen unterhalb von H:\www “ abgelegt werden. ” Anhang A - 4 Einführung in PHP Anhang B: Zugriff auf Access-Datenbanken mit PHP Anhang B Zugriff auf Access-Datenbanken mit PHP B.1 Vorbereitung der Datenquelle Für diese kleine Beispielanwendung sollte eine Access-Datenbank als MDB-Datei vorhanden sein. Im Folgenden wird die Datenbank beispiel.mdb“ benutzt, in der eine Tabelle kneipen“ gemäß der folgenden ” ” Abbildung bereitgestellt ist. Um auf diese Datenquelle extern zugreifen zu können, muss ein ODBC-Treiber für die Datenbank installiert werden. Sie finden das Installationsprogramm für ODBC-Treiber auf einem Windowssystem unter Start — Ein” stellungen — Systemsteuerung“ (muss evtl. von der Setup-CD nachinstalliert werden). Durch Doppelklick auf dem Icon ODBC-Datenquellen“ wird das Installationsprogramm gestartet. ” Anhang B - 5 Einführung in PHP Anhang B: Zugriff auf Access-Datenbanken mit PHP Im ODBC-Datenquellen-Administrator wählen Sie die Option Hinzufügen...“. ” Es öffnet sich der Dialog Neue Datenquelle erstellen“. Wählen Sie hier den Microsoft Access-Treiber“ ” ” und drücken Sie den Button Fertigstellen“. ” Anhang B - 6 Einführung in PHP Anhang B: Zugriff auf Access-Datenbanken mit PHP Im Dialog ODBC Microsoft Access Setup“ nehmen Sie die Einstellungen nach dem abgebildeten Muster ” vor. Wichtig: Sie müssen die Datenbank über einen Datei-öffen-Dialog mit dem ODBC-Treiber verbinden (Option Datenbank: Auswählen...“). ” Bei Rückkehr in den ODBC-Datenquellen-Administrator erkennen Sie, dass nunmehr für die ausgewählte Datenquelle ein ODBC-Treiber installiert wurde, der unter dem DSN-Namen phpAccess“ angesprochen ” werden kann. Anhang B - 7 Einführung in PHP B.2 Anhang B: Zugriff auf Access-Datenbanken mit PHP Zugriff auf Access-Datenbank mit Skript Es ist nun an der Zeit ein PHP-Skript zu schreiben, mit dem auf die Access-Datenbank zugegriffen werden kann. Es wird im Beispielskript eine einfache SELECT-Abfrage der Datenbank durchgeführt. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>PHP-Zugriff auf Access</title> </head> <body> <?php / / A u f b a u d e r V e r b i n d u n g , F u n k t i o n s −P a r a m e t e r dsn−name , u s e r , p a s s w o r d $verbindung = odbc_connect(” p h p A c c e s s ”,””,””); if( !$verbindung ){ echo ” K e i n e V e r b i n d u n g . . . < br>”; exit; / / N i x w i e r a u s , k l a p p t h e u t e n i c h t } / / SQL−A n f r a g e $erg = odbc_exec($verbindung, ”SELECT ∗ FROM K n e i p e n ”); / / Z e i l e n w e i s e A b f r a g e e r g e b n i s h o l e n und a u s w e r t e n while( $row = odbc_fetch_row( $erg ) ){ $kname = odbc_result($erg,”Name”) ; $kart = odbc_result($erg,” A r t ”); echo $kname.” i s t e i n ( e ) ”.$kart.”<br >\n”; } / / Datenbank s c h l i e s s e n odbc_close( $verbindung ); ?> </body> </html> Als Ausgabe im Browser sollte das Skript eine Ergebnis wie in der nachfolgenden Abbildung erzeugen. Anhang B - 8 Anhang C Installation einer lokalen Entwicklungsumgebung Für ein lokales PHP-Entwicklungssystem unter Windows empfiehlt es sich, auf zwei vorkonfigurierte Programmpakete zurückzugreifen, die im Internet frei verfügbar zum Download angeboten werden - zum einen Foxserv“ (www.foxserv.net), zu anderen Maguma Studio Light“ (www.maguma.com). ” ” Foxserv“ ist ein vorkonfiguriertes Setup-Paket, das bei Ausführung einen lokalen Apache-Webserver (mit ” PHP-, Perl- und Python-Unterstützung) sowie ein MySQL-Datenbanksystem auf dem Windowsrechner (Windows 95 bis Windows XP, Windows NT/Windows 2000) installiert. Maguma Studio Light“ ist eine PHP-Entwicklungsumgebung, mit der Sie PHP-Skripte schreiben und ” debuggen können. Für das Testen der Datenübernahme aus HTML-Formularen in PHP-Skripte benötigen Sie als Ergänzung einen Webserver (also z. B. Foxserv“). ” Installieren Sie zunächst das Foxserv“-Paket auf dem Rechner. Bug-Warnung: Damit der Apache” Webserver ordnungsgemäß startet, sollten Sie die Datei php4ts.dll“, die sich im Verzeichnis ” c:\foxserv\php “ befindet, manuell in das Verzeichnis c:\windows\system “ kopieren. ” ” Anschließend sollten Sie auf Windows 95/98 bzw. Windows NT/2000 den Windows Installer (InstMsiA 95 98.exe bzw. InstMsiW NT 2K auf der Kurs-CD im Maguma-Ordner) installieren, da dieser vom Debugger in Maguma Studio“ benötigt werden. ” Anschließend kann Maguma Studio“ inklusive GNU-Debugger installiert werden. ” Für den Betrieb des Webservers sollten Sie berücksichtigen, dass der Apache-Webserver in der Standardkonfiguration von Foxserv das Verzeichnis c:\foxserv\www “ als Basisverzeichnis für alle Dokumente ” ansieht. 9 Anhang D Lösungen zu den Übungsaufgaben D.1 Vorlesung 1 D.1.1 Aufgabe 1 Listing D.1: v1 aufg1 a.php 1 2 3 4 5 6 7 8 9 10 11 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Vorlesung 1 Aufgabe 1</title> </head> <body> <?php echo ”Romanes e u n t domus”; ?> </body> </html> D.1.2 Aufgabe 2 Bildschirmausgabe mit HTML-Zeilenumbrüchen: Listing D.2: v1 aufg2 a.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Vorlesung 1 Aufgabe 2 ohne Tabelle</title> </head> <body> <?php / / D e f i n i t i o n des skalaren Arrays $adresse = array( ” M e i e r ”, ” W o l f g a n g ”, ”Waldweg 13 ”, ” 12345 ”, ” T e s t b u r g ” ); / / Einfache Bildschirmausgabe $br = ”<br >\n”; echo echo echo echo echo ”Name : ”.$adresse[0].$br; ”Vorname : ”.$adresse[1].$br; ” A n s c h r i f t : ”.$adresse[2].$br; ”PLZ : ”.$adresse[3].$br; ” O r t : ”.$adresse[4].$br; ?> </body> </html> Bildschirmausgabe mit HTML-Tabelle: 10 Einführung in PHP Anhang D: Lösungen zu den Übungsaufgaben Listing D.3: v1 aufg2 b.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Vorlesung 1 Aufgabe 2</title> </head> <body> <?php / / D e f i n i t i o n des skalaren Arrays $adresse = array( ” M e i e r ”, ” W o l f g a n g ”, ”Waldweg 13 ”, ” 12345 ”, ” T e s t b u r g ” ); / / E i n f a c h e B i l d s c h i r m a u s g a b e a l s HTML−T a b e l l e $za = ”<t r ><t d >”; / / Zeilenanfang $zm = ”</ t d ><t d >”; // Zeilenmitte $ze = ”</ t d ></ t r >\n”; / / z e i l e n e n d e echo echo echo echo echo echo echo ”< t a b l e b o r d e r =\”1\”>\n”; $za.”Name : ”.$zm.$adresse[0].$ze; $za.”Vorname : ”.$zm.$adresse[1].$ze; $za.” A n s c h r i f t : ”.$zm.$adresse[2].$ze; $za.”PLZ : ”.$zm.$adresse[3].$ze; $za.” O r t : ”.$zm.$adresse[4].$ze; ”</ t a b l e >\n” ?> </body> </html> D.1.3 Aufgabe 3 Listing D.4: v1 aufg3 a.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Vorlesung 1 Aufgabe 3</title> </head> <body> <?php / / D e f i n i t i o n des skalaren Arrays $adresse = array( ”Name” =>” M e i e r ”, ”Vorname” =>” W o l f g a n g ”, ”Anschrift” =>”Waldweg 13 ”, ”PLZ” =>” 12345 ”, ”Ort” =>” T e s t b u r g ” ); / / E i n f a c h e B i l d s c h i r m a u s g a b e a l s HTML−T a b e l l e $za = ”<t r ><t d >”; / / Zeilenanfang $zm = ”</ t d ><t d >”; // Zeilenmitte $ze = ”</ t d ></ t r >\n”; / / z e i l e n e n d e echo echo echo echo echo echo echo ”< t a b l e b o r d e r =\”1\”>\n”; $za.”Name : ”.$zm.$adresse[”Name”].$ze; $za.”Vorname : ”.$zm.$adresse[”Vorname”].$ze; $za.” A n s c h r i f t : ”.$zm.$adresse[” A n s c h r i f t ”].$ze; $za.”PLZ : ”.$zm.$adresse[”PLZ”].$ze; $za.” O r t : ”.$zm.$adresse[” O r t ”].$ze; ”</ t a b l e >\n” Anhang D - 11 Einführung in PHP Anhang D: Lösungen zu den Übungsaufgaben 27 ?> 28 </body> 29 </html> D.1.4 Aufgabe 4 Listing D.5: v1 aufg4 a.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Vorlesung 1 Aufgabe 4</title> </head> <body> <?php $set1 = array ( ”ID” => 1, ”Name” => ” H e r z o g k e l l e r ”, ” A r t ” => ” B i e r g a r t e n ”, ” N o t e ” => 1, ”Kommentar” => ” S e h r s c h ö n e r Baumbestand ” ); $set2 = array ( ”ID” => 2, ”Name” => ” G l e n k ”, ” A r t ” => ” B i e r g a r t e n ”, ” N o t e ” => 1, ”Kommentar” => ” Gute B r a t w ü r s t e ” ); $set3 = array ( ”ID” => 3, ”Name” => ” B e i N o r b e r t ”, ” A r t ” => ” D i s k o k n e i p e ”, ” N o t e ” => 4, ”Kommentar” => ” H ö l l i s c h l a u t ” ); $all = array ( $set1, $set2, $set3 ); / / Ausgabe echo ”< t a b l e b o r d e r =\”1\”>\n”; / / U e b e r s c h r i f t e n ausgeben echo ”<t r >\n”; foreach( $all[0] as $key => $value) { echo ”<t h >”.$key.”</ t h >\n”; } echo ”</ t r >\n”; / / Datensaetze ausgeben foreach( $all as $dataset ) { echo ”<t r >\n”; foreach( $dataset as $value ) { echo ”<t d >”.$value.”</ t d >\n”; Anhang D - 12 Einführung in PHP 51 52 53 54 55 56 57 58 59 Anhang D: Lösungen zu den Übungsaufgaben } echo ”</ t r >\n”; } echo ”</ t a b l e >\n”; ?> </body> </html> D.1.5 Aufgabe 5 Listing D.6: v1 aufg5 a.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Vorlesung 1 Aufgabe 5</title> </head> <body> <?php /∗ D e fi n i ti o n Textelemente ∗/ $r_e_d = ”Romanes e u n t domus . ”; $br = ”<br >\n”; /∗ Einfache Bildschirmausgabe ∗/ $zaehler=0; // Initialisierung Zaehlervariable while( $zaehler < 1000 ) { $zaehler = $zaehler+1; / / Zaehler inkrementieren echo $zaehler.” : ”.$r_e_d.$br; / / O u t p u t Z e i l e } ?> </body> </html> D.1.6 Aufgabe 6 Listing D.7: v1 aufg6 a.html 1 2 3 4 5 6 7 8 9 10 11 12 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Title here!</title> </head> <body> <form action=” v 1 a u f g 6 a . php” method=”POST”> <input type=” t e x t ” name=” e n d e ” size=”20”> <input type=” s u b m i t ” value=”OK”> </form> </body> </html> Anhang D - 13 Einführung in PHP Anhang D: Lösungen zu den Übungsaufgaben Listing D.8: v1 aufg6 a.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Vorlesung 1 Aufgabe 6</title> </head> <body> <?php /∗ D e fi n i ti o n Textelemente ∗/ $r_e_d = ”Romanes e u n t domus . ”; $br = ”<br >\n”; /∗ Einfache Bildschirmausgabe ∗/ $zaehler = 0; $abbruch = $_POST[” e n d e ”]; / / Initialisierung Zaehlervariable / / Uebergabe a u s F o r m u l a r f e l d while( $zaehler < $abbruch ) { $zaehler = $zaehler+1; / / Zaehler inkrementieren echo $zaehler.” : ”.$r_e_d.$br; / / O u t p u t Z e i l e } ?> </body> </html> D.1.7 Aufgabe 7 Listing D.9: v1 aufg7 a.html 1 2 3 4 5 6 7 8 9 10 11 12 13 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Title here!</title> </head> <body> <form action=” v 1 a u f g 7 a . php” method=”POST”> <input type=” t e x t ” name=” z a h l 1 ” size=”20”> * <input type=” t e x t ” name=” z a h l 2 ” size=”20”> <input type=” s u b m i t ” value=”OK”> </form> </body> </html> Listing D.10: v1 aufg7 a.php 1 2 3 4 5 6 7 8 9 10 11 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Vorlesung 1 Aufgabe 7</title> </head> <body> <?php / ∗ Uebergabe d e r F o r m u l a r e i n g a b e n i n V a r i a b l e n ∗ / $a = $_POST[” z a h l 1 ”]; $b = $_POST[” z a h l 2 ”]; Anhang D - 14 Einführung in PHP Anhang D: Lösungen zu den Übungsaufgaben 12 /∗ Ermittlung Ergebniswert ∗/ 13 $erg = $a * $b; 14 15 /∗ Bildschirmausgabe ∗/ 16 echo ”Das E r g e b n i s von ”.$a.” ∗ ”.$b.” l a u t e t : ”.$erg; 17 ?> 18 </body> 19 </html> Listing D.11: v1 aufg7 b.html 1 2 3 4 5 6 7 8 9 10 11 12 13 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Title here!</title> </head> <body> <form action=” v 1 a u f g 7 b . php” method=”POST”> <input type=” t e x t ” name=” z a h l 1 ” size=”20”> * <input type=” t e x t ” name=” z a h l 2 ” size=”20”> <input type=” s u b m i t ” value=”OK”> </form> </body> </html> Listing D.12: v1 aufg7 b.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Vorlesung 1 Aufgabe 6</title> </head> <body> <?php /∗ Bildschirmausgabe ∗/ echo ”Das E r g e b n i s von ”.$_POST[” z a h l 1 ”].” ∗ ”.$_POST[” z a h l 2 ”]. ” l a u t e t : ”.($_POST[” z a h l 1 ”]*$_POST[” z a h l 2 ”]; ?> </body> </html> D.1.8 Aufgabe 8 Listing D.13: v1 aufg8 a.php 1 2 3 4 5 6 7 8 9 10 11 12 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Vorlesung 1 Aufgabe 8</title> </head> <body> <?php $za = ”<t r ><t d >”; $zm = ”</ t d ><t d >”; $ze = ”</ t d ></ t r >\n”; / / Zeilenanfang // Zeilenmitte / / zeilenende Anhang D - 15 Einführung in PHP Anhang D: Lösungen zu den Übungsaufgaben 13 echo ”<h3>FOREACH−S c h l e i f e </h3>\n”; 14 echo ”< t a b l e b o r d e r =\”1\”>\n”; 15 foreach( $_SERVER as $schluessel => $wert ){ 16 echo $za.$schluessel.$zm.$wert.$ze; 17 } 18 echo ”</ t a b l e >\n”; 19 20 ?> 21 </body> 22 </html> D.2 Vorlesung 2 D.2.1 Aufgabe 1 Listing D.14: v2 aufg1 a.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Vorlesung 2 Aufgabe 1</title> </head> <body> <?php $za = ”<t r ><t d >”; $zm = ”</ t d ><t d >”; $ze = ”</ t d ></ t r >\n”; / / Zeilenanfang // Zeilenmitte / / zeilenende echo ”< t a b l e b o r d e r =\”0\”>\n”; for( $i = 1; $i < 10; $i++ ) { for( $j = 1; $j < 10; $j++ ) { $ergebnis = $j*$i; echo $za.$j.” x ”.$i.$zm.” = ”.$ergebnis.$ze; } echo $za.”&n b s p ; ”.$zm.”&n b s p ; ”.$ze; } echo ”</ t a b l e >\n”; ?> </body> </html> D.2.2 Aufgabe 2 Listing D.15: v2 aufg2 a.html 1 2 3 4 5 6 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Formular Vorlesung 2 Aufgabe 2</title> </head> <body> Anhang D - 16 Einführung in PHP Anhang D: Lösungen zu den Übungsaufgaben 7 <form action=” v 2 a u f g 2 a . php” method=”POST”> 8 <table> 9 <tr> 10 <td>Wert 1:</td> 11 <td><input type=” t e x t ” name=” z a h l 1 ” size=”20”></td> 12 </tr> 13 <tr> 14 <td>Wert 2:</td> 15 <td><input type=” t e x t ” name=” z a h l 2 ” size=”20”></td> 16 </tr> 17 <td>Operation:</td> 18 <td><input type=” t e x t ” name=” o p e r a t i o n ” size=”4”></td> 19 </tr> 20 <tr> 21 <td>&nbsp;</td> 22 <td><input type=” s u b m i t ” value=”OK” size=”20”></td> 23 </tr> 24 25 </form> 26 </body> 27 </html> Listing D.16: v2 aufg2 a.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Vorlesung 2 Aufgabe 2</title> </head> <body> <?php / ∗ Uebergabe d e r F o r m u l a r e i n g a b e n i n V a r i a b l e n ∗ / $a = $_POST[” z a h l 1 ”]; $b = $_POST[” z a h l 2 ”]; $op = $_POST[” o p e r a t i o n ”]; /∗ Ermittlung Ergebniswert ∗/ $erg = ” u n b e k a n n t ”; / / switch( $op ) { case ”+”: $erg = break; case ”−”: $erg = break; case ”∗”: $erg = break; case ” / ”: $erg = break; default: / / } Initialisierung $a + $b; $a - $b; $a * $b; $a / $b; keine Aktion /∗ Bildschirmausgabe ∗/ if( $erg != ” u n b e k a n n t ” ) { echo ”Das E r g e b n i s von ”.$a.” ”.$op.” ”.$b.” l a u t e t : ”.$erg; } else { Anhang D - 17 Einführung in PHP 38 39 } 40 ?> 41 </body> 42 </html> D.2.3 Anhang D: Lösungen zu den Übungsaufgaben echo ” Die O p e r a t i o n ’ ”.$op.” ’ i s t ”.$erg; Aufgabe 3 Listing D.17: v2 aufg3 a.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Vorlesung 2 Aufgabe 3</title> </head> <body> <?php /∗ D e fi n i ti o n Textelemente ∗/ $r_e_d = ”Romanes e u n t domus . ”; $br = ”<br >\n”; /∗ Einfache Bildschirmausgabe ∗/ // $zaehler = 0; if( isset( $_POST[” e n d e ”] ) ) { $abbruch = $_POST[” e n d e ”]; Initialisierung Zaehlervariable / / Uebergabe a u s F o r m u l a r f e l d while( $zaehler < $abbruch ) { $zaehler = $zaehler+1; / / Zaehler inkrementieren echo $zaehler.” : ”.$r_e_d.$br; / / O u t p u t Z e i l e } } ?> <hr> <form action=” v 2 a u f g 3 a . php” method=”POST”> Gewünschte Wiederholungen: <input type=” t e x t ” name=” e n d e ” size=”20”> <input type=” s u b m i t ” value=”OK”> </form> </body> </html> D.2.4 Aufgabe 4 Listing D.18: v2 aufg4 a.php 1 <?php 2 $gaestebuch = ” g a e s t e b u c h . t x t ”; 3 4 /∗ Zuerst e r f o l g t ein etwaiger Neueintrag ∗/ 5 if( !empty( $_POST[” m e s s a g e ”] ) ) { 6 $datei = fopen( $gaestebuch, ”a” ); / / O e f f n e n f u e r APPEND 7 8 if( $datei ) { 9 fwrite( $datei, ”<p>\n” ); / / HTML−A b s a t z a n f a n g Anhang D - 18 Einführung in PHP 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 Anhang D: Lösungen zu den Übungsaufgaben fwrite( fwrite( fwrite( fclose( $datei, $_POST[” m e s s a g e ”] ); $datei, ”</p>\n” ); / / HTML−A b s a t z e n d e $datei, ”<hr >\n” ); / / HTML−H o r i z . L i n i e $datei ); } } ?> <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Vorlesung2 Aufgabe 4</title> </head> <body> <!−− F o r m u l a r a u s g a b e A n f a n g −−> <form action=” v 2 a u f g 4 a . php” method=”POST”> <textarea name=” m e s s a g e ” rows=5 cols=40 wrap=” o f f ”> </textarea> <input type=” s u b m i t ” value=” A b s e n d e n ”> </form> <hr> <!−− F o r m u l a r a u s g a b e Ende −−> <?php /∗ Ausgabe E i n t r a e g e G a e s t e b u c h , wenn e i n e G a e s t e b u c h s c h o n a n g e l e g t i s t . D i e s w i r d vorweg m i t f i l e e x i s t s ( ) g e p r u e f t . ∗/ if( file_exists( $gaestebuch ) ) { $datei = fopen( $gaestebuch, ” r ” ); / / O e f f n e n f u e r READ if( $datei ) { while( !feof( $datei ) ) { echo fgets( $datei ); } fclose( $datei ); } / / Ausgabe e i n g e l e s . Z e i l e } ?> </body> </html> D.2.5 Aufgabe 5 Listing D.19: v2 aufg5 a.php 1 <?php 2 $counter = ” c o u n t e r . t x t ”; / / D a t e i n a m e 3 $zaehler_stand = 0; / / Variable f u e r s Mitzaehlen der Hits 4 5 /∗ Alten Zaehlerstand einlesen , 6 wenn s c h o n e i n e Z a e h l e r d a t e i b e s t e h t . ∗ / 7 if( file_exists( $counter ) ) { 8 $datei = fopen( $counter, ” r ” ); / / O e f f n e n f u e r READ Anhang D - 19 Einführung in PHP 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 Anhang D: Lösungen zu den Übungsaufgaben if( $datei ) { $zaehler_stand = fgets( $datei ); fclose( $datei ); } } /∗ Zaehlerstand erhoehen ∗/ $zaehler_stand = $zaehler_stand+1; / ∗ Neuen Z a e h l e r s t a n d s p e i c h e r n ( a l t e D a t e i w i r d u e b e r s c h r i e b e n ) ∗ / $datei = fopen( $counter, ”w” ); / / O e f f n e n f u e r WRITE−O p e r a t i o n if( $datei ) { fwrite( $datei, $zaehler_stand ); fclose( $datei ); } ?> <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Vorlesung 2 Aufgabe 5</title> </head> <body> Diese Seite wird gerade zum <?php echo $zaehler_stand.” . ” ?> Mal aufgerufen. </body> </html> D.2.6 Aufgabe 6 Listing D.20: v2 aufg6 a.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Susis Wasserbetten GmbH</title> </head> <body bgcolor=”# c c c c f f ”> <?php / ∗ V a r i a b l e n d e k l a r a t i o n und I n i t i a l i e r u n g e n ∗ / $kopfteil = ” . / v o r l a g e n / k o p f . t p l ”; $fussteil = ” . / v o r l a g e n / f u s s . t p l ”; $mittelteil = ” d e f a u l t ”; / ∗ E r m i t t l u n g d e r GET−Uebergabe−P a r a m e t e r ∗ / if( !empty( $_GET[” i n h a l t ”] ) ) { $mittelteil = $_GET[” i n h a l t ”]; } $dynamic = ” . / v o r l a g e n / ”.$mittelteil.” . t p l ”; / ∗ K o p f t e i l e i n b i n d e n , wenn v o r h a n d e n ∗ / if( file_exists( $kopfteil ) ) { include( $kopfteil ); } Anhang D - 20 Einführung in PHP Anhang D: Lösungen zu den Übungsaufgaben 26 / ∗ M i t t e l t e i l e i n b i n d e n , wenn v o r h a n d e n ∗ / 27 if( file_exists( $dynamic ) ) { 28 include( $dynamic ); 29 } 30 31 / ∗ F u s s t e i l e i n b i n d e n , wenn v o r h a n d e n ∗ / 32 if( file_exists( $fussteil ) ) { 33 include( $fussteil ); 34 } 35 36 ?> 37 </body> 38 </html> D.3 Vorlesung 3 D.3.1 Aufgabe 1 Listing D.21: v3 aufg1 a.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 <?php /∗ ∗ ∗ Berechnet die Flaeche eines Rechtecks ∗ ∗ Parameter : ∗ $height − Hoehe ∗ $width − Breite ∗ ∗/ function flaeche( $height, $width ) { $result = $height * $width; return $result; } ?> <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Flächenberechnung</title> </head> <body bgcolor=”# c c c c f f ”> <h2>Flächenberechnung</h2> <?php if( isset( $_POST[” r e c h n e n ”] ) ){ / ∗ Uebergabe an F u n k t i o n und R u e c k g a b e d e s E r g e b n i s ∗ / $erg = flaeche( $_POST[” h o e h e ”], $_POST[” b r e i t e ”] ); /∗ Bildschirmausgabe ∗/ echo ” Die F l ä c h e b e t r ä g t : ”.$erg.”<br><br >\n”; } ?> <!−− B e g i n n F o r m u l a r a u s g a b e −−> <form action=” v 3 a u f g 1 a . php” method=”POST”> <table> <tr><td>Höhe:</td> Anhang D - 21 Einführung in PHP 38 39 40 41 42 43 44 45 46 47 48 49 Anhang D: Lösungen zu den Übungsaufgaben <td><input type=” t e x t ” name=” h o e h e ”></td></tr> <tr><td>Breite:</td> <td><input type=” t e x t ” name=” b r e i t e ”></td></tr> <tr><td>&nbsp;</td> <td><input type=” s u b m i t ” name=” r e c h n e n ” value=” B e r e c h n e n ”> </td></tr> </table> </form> <!−− Ende F o r m u l a r a u s g a b e −−> </body> </html> D.3.2 Aufgabe 2 Listing D.22: v3 aufg2 a.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 <?php /∗ ∗ ∗ E r m i t t e l t das M i t g l i e d aufgrund der Mitgliedsnummer ∗ ∗ Parameter : ∗ $index − Mitgliedsnummer ∗ ∗/ function mitglied( $index ) { $mitglieder = array( ” D i e t e r S c h u l z ”, ” W o l f g a n g H e r b s t ”, ” F r a n z Lang”, ” H o r s t S c h m i d t ” ); $resultat = ””; if( $index >= 0 && $index < count( $mitglieder ) ) { $resultat = $mitglieder[ $index ]; } return $resultat; } ?> <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Mitgliedsnummer -> Mitglied</title> </head> <body bgcolor=”# c c c c f f ”> <?php if( isset( $_POST[” s u c h e ”] ) ){ $num = $_POST[”nummer”]; $erg = mitglied( $num ); /∗ Bildschirmausgabe ∗/ echo ” M i t g l i e d s n u m m e r : ”.$num.” − Name : ”; if( empty($erg) ) { Anhang D - 22 Einführung in PHP 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 Anhang D: Lösungen zu den Übungsaufgaben echo ” noch f r e i ”; } else { echo $erg; } echo ”<br><br >\n”; } ?> <!−− B e g i n n F o r m u l a r a u s g a b e −−> <form action=” v 3 a u f g 2 a . php” method=”POST”> <table> <tr><td>Mitgliedsnummer:</td> <td><input type=” t e x t ” name=”nummer”></td></tr> <tr><td>&nbsp;</td> <td><input type=” s u b m i t ” name=” s u c h e ” value=” S u c h e n s t a r t e n ”></td></tr> </table> </form> <!−− Ende F o r m u l a r a u s g a b e −−> </body> </html> D.3.3 Aufgabe 3 Listing D.23: v3 aufg3 a.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <?php /∗ ∗ ∗ E r m i t t e l t das M i t g l i e d aufgrund der Mitgliedsnummer ∗ ∗ Parameter : ∗ $name − Mitgliedsname ∗ ∗ Rueckgabe : ∗ I n d e x z a h l b e i E r f o l g , s o n s t −1 ∗ ∗/ function mitgliedsnummer( $name ) { $mitglieder = array( ” D i e t e r S c h u l z ”, ” W o l f g a n g H e r b s t ”, ” F r a n z Lang”, ” H o r s t S c h m i d t ” ); $resultat = -1; $anzahl = count( $mitglieder ); for( $i = 0; $i < $anzahl; $i++ ){ if( $name == $mitglieder[ $i ] ){ / / Gefunden ! ! ! ! ! $resultat = $i; break; } Anhang D - 23 Einführung in PHP 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 Anhang D: Lösungen zu den Übungsaufgaben } return $resultat; } ?> <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Mitglied -> Mitgliedsnummer</title> </head> <body bgcolor=”# c c c c f f ”> <?php if( isset( $_POST[” s u c h e ”] ) ){ $suchname = $_POST[” m i t g l i e d ”]; $erg = mitgliedsnummer( $suchname ); /∗ Bildschirmausgabe ∗/ echo ” M i t g l i e d : ”.$suchname.” − M i t g l i e d s n u m m e r : ”; if( $erg < 0 ) { echo ” n i c h t g e f u n d e n ”; } else { echo $erg; } echo ”<br><br >\n”; } ?> <!−− B e g i n n F o r m u l a r a u s g a b e −−> <form action=” v 3 a u f g 3 a . php” method=”POST”> <table> <tr><td>Suchname:</td><td><input type=” t e x t ” name=” m i t g l i e d ”></td></tr> <tr><td>&nbsp;</td> <td><input type=” s u b m i t ” name=” s u c h e ” value=” S u c h e n s t a r t e n ”></td></tr> </table> </form> <!−− Ende F o r m u l a r a u s g a b e −−> </body> </html> Listing D.24: v3 aufg3 b.php 1 2 3 4 5 6 7 8 9 10 11 12 <?php /∗ ∗ ∗ E r m i t t e l t das M i t g l i e d aufgrund der Mitgliedsnummer ∗ ∗ Parameter : ∗ $name − Mitgliedsname ∗ ∗ Rueckgabe : ∗ I n d e x z a h l b e i E r f o l g , s o n s t −1 ∗ ∗/ function mitgliedsnummer( $name ) { Anhang D - 24 Einführung in PHP 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 Anhang D: Lösungen zu den Übungsaufgaben $mitglieder = array( ” D i e t e r S c h u l z ”, ” W o l f g a n g H e r b s t ”, ” F r a n z Lang”, ” H o r s t S c h m i d t ” ); $resultat = -1; $anzahl = count( $mitglieder ); $gesucht = trim( $name ); / / L e e r z e i c h e n kappen for( $i = 0; $i < $anzahl; $i++ ){ / ∗ I s t Suchname i n M i t g l i e d s n a m e n e n t h a l t e n ? ∗ / $rv = stristr( $mitglieder[ $i ], $gesucht ); if( $rv != false ){ / / Gefunden ! ! ! ! ! $resultat = $i; break; } } return $resultat; } ?> <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Mitglied -> Mitgliedsnummer</title> </head> <body bgcolor=”# c c c c f f ”> <?php if( isset( $_POST[” s u c h e ”] ) ){ $suchname = $_POST[” m i t g l i e d ”]; $erg = mitgliedsnummer( $suchname ); /∗ Bildschirmausgabe ∗/ echo ” M i t g l i e d : ”.$suchname.” − M i t g l i e d s n u m m e r : ”; if( $erg < 0 ) { echo ” n i c h t g e f u n d e n ”; } else { echo $erg; } echo ”<br><br >\n”; } ?> <!−− B e g i n n F o r m u l a r a u s g a b e −−> <form action=” v 3 a u f g 3 b . php” method=”POST”> <table> <tr><td>Suchname:</td><td><input type=” t e x t ” name=” m i t g l i e d ”></td></tr> <tr><td>&nbsp;</td> <td><input type=” s u b m i t ” name=” s u c h e ” Anhang D - 25 Einführung in PHP 73 74 75 76 77 78 79 Anhang D: Lösungen zu den Übungsaufgaben value=” S u c h e n s t a r t e n ”></td></tr> </table> </form> <!−− Ende F o r m u l a r a u s g a b e −−> </body> </html> D.3.4 Aufgabe 4 Listing D.25: v3 aufg4 a.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Großschreiben aller Buchstaben</title> </head> <body> <?php if( isset( $_POST[” f o r m s e n d ”] ) ){ echo ” E r g e b n i s : ”; echo strtoupper( $_POST[” s o u r c e ”] ); echo ”<br><hr><br><br >\n”; } ?> <!−− B e g i n n F o r m u l a r a u s g a b e −−> <form action=” v 3 a u f g 4 a . php” method=”POST”> <table> <tr><td valign=” t o p ”>Quelltext:</td> <td> <textarea name=” s o u r c e ” rows=5 cols=40 wrap=”on”> </textarea> </td></tr> <tr><td>&nbsp;</td> <td><input type=” s u b m i t ” name=” f o r m s e n d ” value=”und l o s . . . ”></td></tr> </table> </form> <!−− Ende F o r m u l a r a u s g a b e −−> </body> </html> D.3.5 Aufgabe 5 Listing D.26: v3 aufg5 a.php 1 2 3 4 5 6 7 8 9 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Buchstaben umdrehen</title> </head> <body> <?php if( isset( $_POST[” f o r m s e n d ”] ) ){ echo ” E r g e b n i s : ”; Anhang D - 26 Einführung in PHP 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Anhang D: Lösungen zu den Übungsaufgaben echo strrev( $_POST[” s o u r c e ”] ); echo ”<br><hr><br><br >\n”; } ?> <!−− B e g i n n F o r m u l a r a u s g a b e −−> <form action=” v 3 a u f g 5 a . php” method=”POST”> <table> <tr><td valign=” t o p ”>Quelltext:</td> <td> <textarea name=” s o u r c e ” rows=5 cols=40 wrap=”on”> </textarea> </td></tr> <tr><td>&nbsp;</td> <td><input type=” s u b m i t ” name=” f o r m s e n d ” value=”und l o s . . . ”></td></tr> </table> </form> <!−− Ende F o r m u l a r a u s g a b e −−> </body> </html> D.3.6 Aufgabe 6 Listing D.27: v3 aufg6 a.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Wörter-Reihenfolge tauschen</title> </head> <body> <?php if( isset( $_POST[” f o r m s e n d ”] ) ){ $teile = explode( ” ”, $_POST[” s o u r c e ”] ); $anzahl = count( $teile ); echo ” E r g e b n i s : ”; for( $i = $anzahl-1; $i >= 0; $i−− ) { echo $teile[ $i ].” ”; } echo ”<br><hr><br><br >\n”; } ?> <!−− B e g i n n F o r m u l a r a u s g a b e −−> <form action=” v 3 a u f g 6 a . php” method=”POST”> <table> <tr><td valign=” t o p ”>Quelltext:</td> <td> <textarea name=” s o u r c e ” rows=5 cols=40 wrap=”on”> </textarea> </td></tr> <tr><td>&nbsp;</td> <td><input type=” s u b m i t ” name=” f o r m s e n d ” value=”und l o s . . . ”></td></tr> Anhang D - 27 Einführung in PHP 32 33 34 35 36 37 Anhang D: Lösungen zu den Übungsaufgaben </table> </form> <!−− Ende F o r m u l a r a u s g a b e −−> </body> </html> D.4 Vorlesung 4 D.4.1 Aufgabe 1 Listing D.28: v4 aufg1 a.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>SELECT aus Tabelle kneipen</title> </head> <body> <?php /∗ Z e n t r a l e I n i t i a l i s i e r u n g der Verbindungsparameter f u e r e i n e n s p a e t e r e n Gebrauch ∗/ $dbserver = ”db . n l i s e r v e r . de ”; $user = ” n l i u s e r ”; $password = ” k l e i n e s G e h e i m n i s ”; $database = ” d b n l i ”; /∗ Verbindung zur Datenebank h e r s t e l l e n , Verbindungsparameter werden b e n u t z t ∗ / $verbindung = mysql_connect( $dbserver, $user, $password ); / ∗ P r u e f e n , ob V e r b i n d u n g h e r g e s t e l l t ∗ / if( $verbindung ) { / ∗ Auswahl d e r D a t e n b a n k u n t e r B e n u t z u n g d e s oben g e s e t z t e n P a r a m e t e r s ∗ / mysql_select_db( $database ); / ∗ V o r f o r m u l i e r u n g d e r SQL−A b f r a g e i n V a r i a b l e ∗ / $sql = ”SELECT Name , A r t , N o t e FROM k n e i p e n WHERE N o t e > 0”; / ∗ S c h i c k e n d e r A b f r a g e an a u s g e w a e h l t e D a t e n b a n k und A u f f a n g e n d e s E r g e b n i s w e r t s ∗/ echo ” Die f o l g e n d e SQL−A b f r a g e w i r d nun”. ” an den D a t e n b a n k s e r v e r g e s c h i c k t : ”. ”< f o n t c o l o r =b l u e >”.$sql.”</ f o n t ><br><br >\n”; $erg = mysql_query( $sql ); if( $erg ) { while( $zeile = mysql_fetch_row( $erg ) ) { Anhang D - 28 Einführung in PHP 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 ?> 65 66 </body> 67 </html> D.4.2 Anhang D: Lösungen zu den Übungsaufgaben echo ”Name : ”.$zeile[0]. ” , A r t : ”.$zeile[1]. ” , N o t e : ”.$zeile[2]. ”<br >\n”; } } else { echo ” L e i d e r wohl n i c h t a l l e s übergekommen .< br >\n”; } / ∗ Verbindung zur Datenbank s c h l i e s s e n ∗ / mysql_close( $verbindung ); } else { echo ” Die V e r b i n d u n g zum D a t e n b a n k s e r v e r ”. ” i s t g e s c h e i t e r t .< br >\n”; } Aufgabe 2 Listing D.29: v4 aufg2 a.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Insert Tabelle kneipen</title> </head> <body> <?php /∗ ∗ PHP−V e r a r b e i t u n g d e r F o r m u l a r d a t e n , wenn d a s S k r i p t u e b e r ∗ den SUBMIT−Knopf m i t Namen ’ i n s e r t ’ a u f g e r u f e n w i r d . ∗ ∗/ if( isset( $_POST[” i n s e r t ”] ) ) { /∗ Z e n t r a l e I n i t i a l i s i e r u n g der Verbindungsparameter f u e r e i n e n s p a e t e r e n Gebrauch ∗/ $dbserver = ”db . n l i s e r v e r . de ”; $user = ” n l i u s e r ”; $password = ” k l e i n e s G e h e i m n i s ”; $database = ” d b n l i ”; /∗ Verbindung zur Datenebank h e r s t e l l e n , Verbindungsparameter werden b e n u t z t ∗ / $verbindung = mysql_connect( $dbserver, $user, $password ); / ∗ P r u e f e n , ob V e r b i n d u n g h e r g e s t e l l t ∗ / if( $verbindung ) { / ∗ Auswahl d e r D a t e n b a n k u n t e r B e n u t z u n g d e s oben g e s e t z t e n P a r a m e t e r s ∗ / Anhang D - 29 Einführung in PHP 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 Anhang D: Lösungen zu den Übungsaufgaben mysql_select_db( $database ); / ∗ V o r f o r m u l i e r u n g d e r SQL−A b f r a g e i n V a r i a b l e ∗ / $sql = ”INSERT k n e i p e n ( Name , A r t , Note , Kommentar ) VALUES ( ”; $sql = $sql.” ’ ”.$_POST[”name”].” ’ , ”; / / i s t Text $sql = $sql.” ’ ”.$_POST[” a r t ”].” ’ , ”; / / i s t Text $sql = $sql.””.$_POST[” n o t e ”].” , ”; / / i s t Integer !!! $sql = $sql.” ’ ”.$_POST[” kommentar ”].” ’ ) ”; / / i s t T e x t / ∗ S c h i c k e n d e r A b f r a g e an a u s g e w a e h l t e D a t e n b a n k und A u f f a n g e n d e s E r g e b n i s w e r t s ∗/ echo ” Die f o l g e n d e SQL−A b f r a g e w i r d nun an den ”. ” D a t e n b a n k s e r v e r g e s c h i c k t : ”.$sql.”<br><br >\n”; $erg = mysql_query( $sql ); if( !$erg ) { echo ”FEHLER : ”.mysql_error().”<br >\n”; } / ∗ Verbindung zur Datenbank s c h l i e s s e n ∗ / mysql_close( $verbindung ); echo ”<hr >\n”; } else { echo ” V e r b i n d u n g zum D a t e n b a n k s e r v e r i s t g e s c h e i t e r t .< br >\n”; } } ?> <!−− B e g i n n d e r F o r m u l a r a u s g a b e −−> <p><font size=”6”>Kneipenf&uuml;hrer</font></p> <p><font size=”3”>F&uuml;gen Sie eine neue Kneipe in den Kneipenf&uuml;hrer ein.</font></p> <form action=” v 4 a u f g 2 a . php” method=” p o s t ”> <table border=”0” cellspacing=”0” cellpadding=”5”> <tr> <td>Name:</td> <td> <input type=” t e x t ” name=”name”> </td> </tr> <tr> <td>Art:</td> <td> <input type=” t e x t ” name=” a r t ”> </td> </tr> <tr> <td>Note:</td> <td> <input type=” t e x t ” name=” n o t e ”> </td> </tr> <tr> <td>Kommentar:</td> <td> <textarea name=” kommentar ”></textarea> Anhang D - 30 Einführung in PHP 91 92 93 94 95 96 97 98 99 100 101 102 103 Anhang D: Lösungen zu den Übungsaufgaben </td> </tr> <tr> <td> <input type=” s u b m i t ” name=” i n s e r t ” value=” A b s c h i c k e n ”> </td> <td>&nbsp;</td> </tr> </table> </form> <!−− Ende d e r F o r m u l a r a u s g a b e −−> </body> </html> D.4.3 Aufgabe 3 Listing D.30: v4 aufg3 a.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 <?php / ∗ V a r i a b l e n d e k l a r a t i o n , V a r i a b l e n nehmen s p a e t e r d i e ∗ Formulardaten auf ∗/ $f_name = ””; $f_art = ””; $f_note = 0; $f_kommentar = ””; /∗ ∗ Die F u n k t i o n s o r g t f u e r den E i n t r a g d e r n e u e n D a t e n s a e t z e ∗ ∗ Aufruf in Zeile 129 ∗ ∗/ function db_kommunikation() { global $f_name, $f_art, $f_note, $f_kommentar; /∗ Z e n t r a l e I n i t i a l i s i e r u n g der Verbindungsparameter f u e r e i n e n s p a e t e r e n Gebrauch ∗/ $dbserver = ”db . n l i s e r v e r . de ”; $user = ” n l i u s e r ”; $password = ” k l e i n e s G e h e i m n i s ”; $database = ” d b n l i ”; /∗ Verbindung zur Datenebank h e r s t e l l e n , Verbindungsparameter werden b e n u t z t ∗ / $verbindung = mysql_connect( $dbserver, $user, $password ); / ∗ P r u e f e n , ob V e r b i n d u n g h e r g e s t e l l t ∗ / if( $verbindung ) { / ∗ Auswahl d e r D a t e n b a n k u n t e r B e n u t z u n g d e s oben g e s e t z t e n P a r a m e t e r s ∗ / mysql_select_db( $database ); / ∗ V o r f o r m u l i e r u n g d e r SQL−A b f r a g e i n V a r i a b l e ∗ / $sql = ”INSERT k n e i p e n ( Name , A r t , Note , Kommentar ) VALUES ( ”; $sql = $sql.” ’ ”.$f_name.” ’ , ”; / / i s t Text Anhang D - 31 Einführung in PHP 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 Anhang D: Lösungen zu den Übungsaufgaben $sql = $sql.” ’ ”.$f_art.” ’ , ”; $sql = $sql.””.$f_note.” , ”; $sql = $sql.” ’ ”.$f_kommentar.” ’ ) ”; // // // i s t Text i s t Integer !!! i s t Text / ∗ S c h i c k e n d e r A b f r a g e an a u s g e w a e h l t e D a t e n b a n k und A u f f a n g e n d e s E r g e b n i s w e r t s ∗/ echo ” Die f o l g e n d e SQL−A b f r a g e w i r d nun an den ”. ” D a t e n b a n k s e r v e r g e s c h i c k t : ”.$sql.”<br><br >\n”; $erg = mysql_query( $sql ); if( !$erg ) { echo ”FEHLER : ”.mysql_error().”<br >\n”; } / ∗ Verbindung zur Datenbank s c h l i e s s e n ∗ / mysql_close( $verbindung ); } else { echo ” V e r b i n d u n g zum D a t e n b a n k s e r v e r i s t g e s c h e i t e r t .< br >\n”; } } /∗ ∗ Die F u n k t i o n p r u e f t d i e F o m u l a r d a t e n a u f G u e l t i g k e i t ∗ ∗ Rueckgabe : ∗ 1 bei Erfolg ∗ −1 nicht alle Datenfelder ausgefuellt ∗ −2 N o t e n i c h t im g u e l t i g e n B e r e i c h ∗ ∗ Aufruf in Zeile 124 ∗ ∗/ function pruefung() { global $f_name, $f_art, $f_note, $f_kommentar; $status = 0; / / S p a e t e r e r Rueckgabewert /∗ Sind a l l e Formularfelder a u s g e f u e l l t ? ∗/ if( !empty( $f_name ) && !empty( $f_art ) && !empty( $f_note ) && !empty( $f_kommentar ) ) { / ∗ E r f u e l l t der E i n t r a g Note d i e Bedingung ? ∗ / if( $f_note > 0 && $f_note < 7 ) { $status = 1; / / a l l e B e d i n g u n g e n s i n d e r f u e l l t } else { $status = -2; } } else { $status = -1; } return $status; } Anhang D - 32 Einführung in PHP 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 Anhang D: Lösungen zu den Übungsaufgaben ?> <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Insert Tabelle kneipen mit Pruefung</title> </head> <body> <?php /∗ ∗ PHP−V e r a r b e i t u n g d e r F o r m u l a r d a t e n , wenn d a s S k r i p t u e b e r ∗ den SUBMIT−Knopf m i t Namen ’ i n s e r t ’ a u f g e r u f e n w i r d . ∗ ∗/ if( isset( $_POST[” i n s e r t ”] ) ) { / ∗ E i n t r a e g e n o r m a l i s i e r e n und i n V a r i a b l e n u e b e r n e h m e n ∗ / $f_name = trim( $_POST[”name”] ); $f_art = trim( $_POST[” a r t ”] ); $f_note = trim( $_POST[” n o t e ”] ); $f_kommentar = trim( $_POST[” kommentar ”] ); / ∗ Nur wenn P r u e f u n g d e r E i n g a b e ok w i r d d e r D a t e n s a t z ∗ i n d i e D a t e n b a n k uebernommen . ∗/ $rv = pruefung(); / ∗ R u e c k g a b e w e r t von p r u e f u n g ( ) a u s w e r t e n ∗ / switch( $rv ) { case 1: / / a l l e s ok db_kommunikation(); break; case -1: / / D a t e n f e l d e r l e e r echo ” S i e haben n i c h t a l l e D a t e n f e l d e r a u s g e f ü l l t .< br >\n”; break; case -2: / / N o t e n i c h t g u e l t i g echo ” Die B e n o t u n g s p r e n g t den g ü l t i g e n Rahmen.< br >\n”; break; } echo ”<hr >\n”; } ?> <!−− B e g i n n d e r F o r m u l a r a u s g a b e −−> <p><font size=”6”>Kneipenf&uuml;hrer</font></p> <p><font size=”3”>F&uuml;gen Sie eine neue Kneipe in den Kneipenf&uuml;hrer ein.</font></p> <form action=” v 4 a u f g 3 a . php” method=” p o s t ”> <table border=”0” cellspacing=”0” cellpadding=”5”> <tr> <td>Name:</td> <td> <input type=” t e x t ” name=”name”> </td> </tr> <tr> <td>Art:</td> Anhang D - 33 Einführung in PHP 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 Anhang D: Lösungen zu den Übungsaufgaben <td> <input type=” t e x t ” name=” a r t ”> </td> </tr> <tr> <td>Note:</td> <td> <input type=” t e x t ” name=” n o t e ”> </td> </tr> <tr> <td>Kommentar:</td> <td> <textarea name=” kommentar ”></textarea> </td> </tr> <tr> <td> <input type=” s u b m i t ” name=” i n s e r t ” value=” A b s c h i c k e n ”> </td> <td>&nbsp;</td> </tr> </table> </form> <!−− Ende d e r F o r m u l a r a u s g a b e −−> </body> </html> D.4.4 Aufgabe 4 Listing D.31: v4 aufg4 a.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>SELECT aus Tabelle kneipen</title> </head> <body> <?php /∗ Z e n t r a l e I n i t i a l i s i e r u n g der Verbindungsparameter f u e r e i n e n s p a e t e r e n Gebrauch ∗/ $dbserver = ”db . n l i s e r v e r . de ”; $user = ” n l i u s e r ”; $password = ” k l e i n e s G e h e i m n i s ”; $database = ” d b n l i ”; /∗ Verbindung zur Datenebank h e r s t e l l e n , Verbindungsparameter werden b e n u t z t ∗ / $verbindung = mysql_connect( $dbserver, $user, $password ); / ∗ P r u e f e n , ob V e r b i n d u n g h e r g e s t e l l t ∗ / if( $verbindung ) { / ∗ Auswahl d e r D a t e n b a n k u n t e r B e n u t z u n g d e s oben g e s e t z t e n P a r a m e t e r s ∗ / Anhang D - 34 Einführung in PHP 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 ?> 67 68 </body> 69 </html> Anhang D: Lösungen zu den Übungsaufgaben mysql_select_db( $database ); / ∗ V o r f o r m u l i e r u n g d e r SQL−A b f r a g e i n V a r i a b l e ∗ / $sql = ”SELECT k n e i p e n . Name , k n e i p e n . A r t , k n e i p e n . Kommentar , ”. ” n o t e n . Wort FROM k n e i p e n , n o t e n ”. ”WHERE n o t e n . Num=k n e i p e n . N o t e ”; / ∗ S c h i c k e n d e r A b f r a g e an a u s g e w a e h l t e D a t e n b a n k und A u f f a n g e n d e s E r g e b n i s w e r t s ∗/ echo ” Die f o l g e n d e SQL−A b f r a g e w i r d nun”. ” an den D a t e n b a n k s e r v e r g e s c h i c k t : ”. ”< f o n t c o l o r =b l u e >”.$sql.”</ f o n t ><br><br >\n”; $erg = mysql_query( $sql ); if( $erg ) { while( $zeile = mysql_fetch_row( $erg ) ) { echo ”Name : ”.$zeile[0]. ” , A r t : ”.$zeile[1]. ” , N o t e : ”.$zeile[2]. ”<br >\n”; } } else { echo ” L e i d e r wohl n i c h t a l l e s übergekommen .< br >\n”; } / ∗ Verbindung zur Datenbank s c h l i e s s e n ∗ / mysql_close( $verbindung ); } else { echo ” Die V e r b i n d u n g zum D a t e n b a n k s e r v e r ”. ” i s t g e s c h e i t e r t .< br >\n”; } Anhang D - 35