Einführung in die Skriptsprache PHP Materialien zum NLI-Kurs 02.44.78 Version: 02-10-27 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 des Makropackets pdfLATEX erstellt. I 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.6 Vordefinierte Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.7 Einfache Rechenoperationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.8 Erste Schleifen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.9 Aufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Kontrollstrukturen, Dateioperationen 1 2.1 Weitere Befehle zur Ablaufkontrolle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2.2 Fallunterscheidungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2.3 Weitere Vergleichsmöglichkeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.4 Nochmals vordefinierte Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.5 Dateien hinzuladen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.6 Dateien lesen und schreiben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.7 Aufgaben zur Vorlesung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Funktionen, Cookies, variable Variablen 1 3.1 Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 3.2 Vordefinierte Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 3.3 String-Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 3.4 Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.5 Exkurs: Variable Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.6 Exkurs: Arrays aus Formularen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3.7 Aufgaben zur Vorlesung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 II Einführung in PHP 4 INHALTSVERZEICHNIS Zugriff auf Datenbanken 1 4.1 Einführung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 4.2 Zugriff auf Datenbanken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 4.3 SQL-Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 4.4 SQL-Befehle mit PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 4.5 Ein weiterer SQL-Befehl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 4.6 Aufgaben zur Vorlesung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 4.7 Fallaufgabe Elektronikversand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 A NLI-Kurs 1 A.1 Rechner-Umgebung NLI-Kurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 A.2 Loginparameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 A.3 Entwicklungsumgebung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 B Zugriff auf Access-Datenbanken mit PHP 4 B.1 Vorbereitung der Datenquelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 B.2 Zugriff auf Access-Datenbank mit Skript . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 III Einführung in PHP Vorlesung 1: Grundlagen, Variablen, Wiederholungen Vorlesung 1 Grundlagen, Variablen, Wiederholungen 1.1 Skriptsprache PHP PHP ist eine Skriptsprache, deren Befehle direkt in HTML-Seiten eingebettet werden, d. h. der Autor schreibt PHP-Befehle zusammen mit HTML-Befehlen in eine Datei. Wird diese Datei von einem Betrachter angefordert, so werden diese PHP-Befehle von einer Zusatzsoftware“ des Webservers Schritt für Schritt ” ausgeführt und die Ergebnisse als HTML-Dokument an den Betrachter weitergeleitet. 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. Welt” weit bieten nahezu alle Hosting-Provider inzwischen Pakete an, die die Benutzung von PHP zulassen. 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 aber (bei entsprechender Konfiguration des ” Webservers) auch möglich, PHP-Befehle in Dateien mit den Endungen .html “ oder .htm “ einzubetten. ” ” PHP wird seit etwa 1994 entwickelt und erfreut sich stetig wachsender Beliebtheit, Eine die besondere Stärke der Skriptsprache PHP ist die problemlose Einbindung verschiedener Datenbanken. Die Sprache ist in ihrer Syntax an C, Java und Perl angelehnt. Vorlesung 1 - 1 Einführung in PHP 1.2 Vorlesung 1: Grundlagen, Variablen, Wiederholungen PHP-Befehle in HTML einbetten PHP-Befehle werden in HTML-Dokumente eingebettet, indem für sie besondere Skriptbereiche abgegrenzt werden. Hierfür ein Beispiel: <!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. <? ... ?> <?php ... ?> <script language=”php”> ... </script> <% ... %> ... “ steht hier für beliebige PHP-Befehle. ” Es wird allgemein empfohlen die Form <?php ... ?> zu benutzen, da diese XML-konform und damit 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 ”; ?> 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. Vorlesung 1 - 2 Einführung in PHP Vorlesung 1: Grundlagen, Variablen, Wiederholungen <?php print( ” H a l l o ” ); ?> Merke: Alle PHP-Befehle werden mit einem Semikolon ( ; “) abgeschlossen. ” Es gibt eine Reihe von Sonderzeichen, die Sie in Strings verwenden können. Wichtigstes Sonderzeichen: \n “ = Zeilenumbruch. C- oder Perl-Kennern sind diese Zeichen natürlich vertraut. ” 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. 1.4 Variablen Um sinnvolle Anwendungen erstellen zu können, benötigen wir Variablen, in denen Daten temporär abgelegt werden können. Merke: Alle Variablennamen beginnen in PHP mit dem Dollarzeichen ( $ “). ” $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 ! ”; 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) wird je nach 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 vereinzelten Variablen abzulegen, sondern sie in zusammengehörigen Datenfeldern, sogenannten Arrays, zu speichern. PHP unterstützt von Haus aus skalare und assoziative Arrays. Vorlesung 1 - 3 Einführung in PHP Vorlesung 1: Grundlagen, Variablen, Wiederholungen Beispiel für einen skalaren Array: /* 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: /* Deklaration eines skalaren Arrays ohne explizite Indexierung */ $text[] = ” D i e s i s t d i e e r s t e Z e i l e . ”; $text[] = ” D i e s i s t d i e z w e i t e Z e i l e . ”; $text[] = ” D i e s i s t 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: /* Deklaration eines skalaren Arrays mit der array-Funktion */ $text = array( ” D i e s i s t d i e e r s t e Z e i l e . ”, ” D i e s i s t d i e z w e i t e Z e i l e . ”, ”Dies i s t die 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”; Beispiel für einen assoziativen Array: /* Deklaration eines assoziativen Arrays */ $text[” Z e i l e A”] = ” D i e s i s t d i e e r s t e Z e i l e . ”; $text[” Z e i l e B”] = ” D i e s i s t d i e z w e i t e Z e i l e . ”; $text[” Z e i l e C”] = ” D i e s i s t d i e d r i t t e Z e i l e . ”; /* 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”; Auch in diesem Fall ist eine Deklaration mit der array -Funktion möglich: /* Deklaration eines assoziativen Arrays mit der array-Funktion */ $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 . ” ); /* Ausgabe */ echo $text[”H”].”<br >\n”; echo $text[”A”].”<br >\n”; echo $text[”X”].”<br >\n”; Vorlesung 1 - 4 Einführung in PHP 1.6 Vorlesung 1: Grundlagen, Variablen, Wiederholungen Vordefinierte Variablen Da PHP speziell zur Erzeugung von dynamischen Webseiten geschaffen wurde, ist es sehr leicht, Eingaben, die aus HTML-Formularen stammen, zu bearbeiten. Ein Beispiel: Die Formulardatei enthalte: <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 ”> </FORM> 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: <?php echo ” S i e haben {$beliebigername} e i n g e g e b e n . ”; ?> Zulässig ist in diesem Fall (Aufruf einer Einzelvariablen in Textstring) auch die vielen Programmierern aus anderen Skriptsprachen vertraute nachlässige Schreibweise: <?php echo ” S i e haben $beliebigername e i n g e g e b e n . ”; ?> Kurz gesagt: der Text, der in das Formularfeld beliebigername “ eingegeben wurde, ist automatisch in ” einer entsprechenden PHP-Variablen $beliebigername “ enthalten, die dem Skript übergeben wird. ” Achtung: Ab der PHP-Version 4.1 werden Variablen beim Aufruf eines PHP-Skripts aus einer FORMUmgebung nicht mehr standardmäßig als vordefinierte Variablen übernommen. Dieser Mechanismus muß in der INI-Datei von PHP ausdrücklich aktiviert werden, was viele Provider aus Sicherheitsgründen aber ablehnen. Statt dessen werden Variablen aus GET- und POST-Aktionen in den vordefinierten Arrays $ REQUEST, $ GET. $ POST bereit gestellt. Das obige Beispiel muss dann wie folgt abgewandelt werden: <?php echo ” S i e haben {$_REQUEST [ ”beliebigername” ] } e i n g e g e b e n . ”; ?> Oder aber noch spezifischer: <?php echo ” S i e haben {$_POST [ ”beliebigername” ] } e i n g e g e b e n . ”; ?> GET-Aktionen können auch über den direkten Aufruf eines PHP-Skripts mit Parameterübergabe ausgelöst werden. Beispielsweise bewirkt der Skript-Aufruf http://localhost/tuwas.php?beliebigername=Hallo ” Leute “ bei entsprechender Auswertung im PHP-Skript als GET-Aktion ein den obigen Beispielen entsprechendes Ergebnis. Vorlesung 1 - 5 Einführung in PHP 1.7 Vorlesung 1: Grundlagen, Variablen, Wiederholungen Einfache Rechenoperationen Folgende Rechenoperationen stehen in PHP zur Verfügung: Operator +: -: *: /: %: Beschreibung Addition Subtraktion Multiplikation Division Reste-Bildung .: Verknüpft zwei Zeichenketten (Strings) Beispiel $i+$j $i-$j $i*$j $i/$j $i%$j Erläuterung z. B. 23%17 ergibt 6, da 23 geteilt durch 17 gleich 1 Rest 6 ist. Die Befehle $l = ” l a n g e r ”; $k = ” k u r z e r ”; echo $l.$k; ergeben die Ausgabe von langerkurzer“. ” Dazu kommen noch ein paar Abkürzungen, um dem Programmierer das Leben zu erleichtern: Der Unterschied zwischen $i++ und ++$i ist: $i=0; echo $i++; 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 Erste Schleifen 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”; $i = 0; while ($i < 10) { echo $t; $i++; } Hier wird 10-mal der Text in der Variablen $t ausgegeben. Zu Beginn wird $i 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, die einen PHP-Befehl enthält, der den Text: Romanes eunt domus“ ” ausgibt. Vorlesung 1 - 6 Einführung in PHP Vorlesung 1: Grundlagen, Variablen, Wiederholungen 2. Erstellen Sie eine PHP-Datei, welche die angegebene Adresse in einem skalaren Array speichert und anschließend auf dem Bildschirm ausgibt. Name: Vorname: Anschrift: PLZ: Ort: Meier Wolfgang Waldweg 13 12345 Testburg 3. Weisen Sie die o. g. Adressdaten mithilfe der array -Funktion einem assoziativen Array zu. Geben Sie die Adresse anschließend auf dem Bildschirm aus. 4. Schreiben Sie eine HTML-Seite, auf der 1000-mal Romanes eunt domus“ richtig geschrieben steht. ” 5. Schreiben Sie ein HTML-Formular, in das man eine Zahl eingeben kann. Klickt man auf Abschicken, wird so oft der Text aus Aufgabe 3 ausgegeben, wie diese Zahl angibt. 6. Schreiben Sie ein Formular, in das zwei Zahlen eingegeben werden können. Klickt man auf Abschicken, so sollen diese Zahlen miteinander multipliziert und das Ergebnis auf einer Webseite ausgegeben werden. Vorlesung 1 - 7 Einführung in PHP Vorlesung 2: Kontrollstrukturen, Dateioperationen Vorlesung 2 Kontrollstrukturen, Dateioperationen 2.1 Weitere Befehle zur Ablaufkontrolle Im vorherigen Kapitel haben wir die erste Möglichkeit kennengelernt, eine Programm-Schleife 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 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 ); Gibt es einen Unterschied? 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; } Im Zusammenhang mit der Auswertung von Arrays ist die foreach -Schleife häufig nützlich. Beispiel 1: /* Deklaration eines skalaren Arrays mit der array-Funktion */ $text = array( ” D i e s i s t d i e e r s t e Z e i l e . ”, ” D i e s i s t d i e z w e i t e Z e i l e . ”, ”Dies i s t die d r i t t e Z e i l e . ” ); /* Ausgabe mit foreach-Schleife */ foreach( $text as $zeile ){ echo $zeile.”<br >\n”; } Beispiel 2: /* Deklaration eines assoziativen Arrays mit der array-Funktion */ $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 . ” ); foreach ($text as $key => $value) { echo ” S c h l ü s s e l : $key ; Wert : $value<br >\n”; } 2.2 Fallunterscheidungen Zur Fallunterscheidung (= bedingte Verzweigung) gibt es in PHP den if -Befehl: 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 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 folgendn Muster schachteln: if ( $i < 0 ) { echo ”$i i s t k l e i n e r a l s N u l l \n”; } else if ( $i > 0 ) { echo ”$i i s t g r o e s s e r a l s N u l l \n”; } else { Vorlesung 2 - 2 Einführung in PHP Vorlesung 2: Kontrollstrukturen, Dateioperationen 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”; 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 aber natürlich noch mehr Möglichkeiten: $i $i $i $i == != >= <= 10 : 10 : 10 : 10 : Ist $i Ist $i Ist $i Ist $i gleich 10? ungleich 10? größer oder gleich 10? kleiner oder gleich 10? Man kann auch durch den Einsatz der Logik-Operatoren && “ (= UND-Verknüpfung) bzw. || “ (= ODER” ” Verknüpfung) beliebig kombinieren: ($i == 10) && ($j > 0) : ($i == 10) || ($j == 0) : 2.4 Ist $i gleich 10 und $j größer als 0? Ist $i gleich 10 oder $j gleich 0? Nochmals vordefinierte Variablen Wir haben gelernt, dass in einer PHP-Datei, die aus einem Formular gestartet wird, die Namen der Formular-Elemente als Variablen zur Verfügung stehen. Dies kann man nützen, um Formular und Befehle, die das Formular behandeln, in eine einzige Datei zu schreiben: Vorlesung 2 - 3 Einführung in PHP Vorlesung 2: Kontrollstrukturen, Dateioperationen Angenommen unsere Datei form.html“ 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 Zwei” taufruf die Variable $beliebigername “ Name gesetzt. ” Dies können wir folgendermaßen ausnützen, um Anfrage und Antwort in einem Skript abzuwickeln: <?php if (isset($beliebigername)) { echo ” S i e haben $beliebigername 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 daß man auf den Submit-Button klickt, so ist die Variable $beliebigername nicht gesetzt, der Ausdruck isset($beliebigername) ist also nicht wahr. Füllt man das Formular dann aus und klickt auf submit“, so ist die Variable gesetzt, Die Bedingung is” ” set($beliebigername) “ ist wahr, und es wird Sie haben $beliebigername eingegeben ” n“ ausgegeben. Will man danach die Skriptauswertung abbrechen, so sollte der Befehl exit; verwendet werden. 2.5 Dateien hinzuladen Der Befehl include(” d a t e i n a m e ”); liest den Inhalt der Datei dateiname so, als ob er an dieser Stelle stehen würde. Damit kann z. B. sehr leicht ein einheitliches Layout bei einer größeren Anzahl von Dateien erreicht werden. Beispiel: 1 2 3 4 5 6 7 8 9 10 <?php $kopf=” v o r l a g e n / k o p f b e r e i c h . t p l ”; $fuss=” v o r l a g e n / f u s s b e r e i c h . t p l ”; ?> <!doctype html public ” −//W3C / / DTD HTML 4 . 0 / / EN”> <html> <head> <title>Titel hier</title> </head> Vorlesung 2 - 4 Einführung in PHP 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 2.6 Vorlesung 2: Kontrollstrukturen, Dateioperationen <body> <?php if( file_exists( $kopf include( $kopf ); } ) ){ ?> <p> Hier steht nun der Hauptteil des Dokuments. </p> <?php if( file_exists( $fuss ) ){ include( $fuss ); } ?> </body> </html> Dateien lesen und schreiben 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 ” Serversystemen 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. 0 bedeutet: 1 bedeutet: 2 bedeutet: 4 bedeutet: 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. Vorlesung 2 - 5 Einführung in PHP Vorlesung 2: Kontrollstrukturen, Dateioperationen 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. 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: 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 Vorlesung 2 - 6 Einführung in PHP Vorlesung 2: Kontrollstrukturen, Dateioperationen 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. Lassen Sie alle Schlüssel und Werte des vordefinierten assoziativen Arrays $ SERVER als HTMLSeite mit Hilfe der foreach -Funktion ausgeben. 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. Ändern Sie die Lösung von Aufgabe 5 aus Vorlesung 1 so, dass nur noch eine Datei benötigt wird. 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 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 dynamisch die Inhalte aus anderen Dateien unter Benutzung der include-Funktion in den Mittelteil der Ausgabe. Vorlesung 2 - 7 Einführung in PHP Vorlesung 3: Funktionen, Cookies, variable Variablen Vorlesung 3 Funktionen, Cookies, variable Variablen 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. 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 ! ”; $anzahl “ nennt man auch Argument oder Übergabeparameter der Funktion. Eine Funktion kann mehrere ” Argumente, oder auch kein Argument besitzen: 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 verwendeten mathematischen Funktionen 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: function zinseszins ($prozent,$laufzeit,$kapital) { ... Wir wollen aber jetzt den Fall betrachten, dass diese Variable bereits 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 : $kapital = 10000.0; function zinseszins ($prozent,$laufzeit) { global $kapital; $x = 1.0 + ($prozent/100.0); $y = $kapital * exp( $laufzeit*log($x) ); Vorlesung 3 - 1 Einführung in PHP Vorlesung 3: Funktionen, Cookies, variable Variablen 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äufig in verschiedenen Skripten zum Einsatz kommen, in gesonderten Bibliotheks-Dateien zu speichern und bei Bedarf mit dem include -Befehl in die Skripten einzubinden. 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. Bzip2 Komprimierungsfunktionen ClibPDF Funktionen DOM XML Funktionen Forms Data Format Funktionen Grafik-Funktionen Shockwave Flash Funktionen Vorlesung 3 - 2 Einführung in PHP LVIII. LXXVI. CIV. CV. CVI. CVII. CX. CXI. Vorlesung 3: Funktionen, Cookies, variable Variablen Ming functions for Flash PDF Funktionen WDDX Funktionen XML parser functions XML-RPC functions XSLT Funktionen ZIP Funktionen (Lesezugriff) Zlib Komprimierungsfunktionen 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. 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 Vorlesung 3 - 3 Einführung in PHP LXXIII. LXXX. XCI. XCVIII. Vorlesung 3: Funktionen, Cookies, variable Variablen Ovrimos SQL functions PostgreSQL Funktionen SESAM Datenbankfunktionen Sybase functions Weitere Funktionen der Standardbibliothek XIV. III. 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. Crédit Mutuel CyberMUT functions Aspell Funktionen [veraltet] 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 ! ”; Vorlesung 3 - 4 Einführung in PHP Vorlesung 3: Funktionen, Cookies, variable Variablen $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). 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 Cookies Als Cookies werden kurze Informationen bezeichnet, die der WWW-Server beim Client (Betrachter) hinterlassen kann. Sie sind vor allem beim elektronischen Einkaufen im WWW von Bedeutung, genauer gesagt sind sie immer dann von Bedeutung, wenn der Server weitergehende Information vom Betrachter haben muß, als nur die Internet-Adresse, die eine Seite anfordert. Cookies bestehen aus folgenden optionalen Information: name: value: expires: domain: path: secure: Name; Bezeichnung Wert Verfallsdatum Adressraum der Server, die das Cookie wieder lesen dürfen. Nur über Seiten, die in diesem Verzeichnis, oder Unterverzeichnissen davon liegen, darf das Cookie angefordert werden. Wenn gesetzt, darf das Cookie nur über verschlüsselte Informationskanäle übertragen werden. Beispiel: Wir wollen feststellen, ob ein Betrachter eine Seite schon einmal aufgerufen hat. Dazu setzen wir beim ersten Aufruf der Seite ein Cookie. Dies muß allerdings vor dem HTML-Head geschehen, d. h. am Anfang der Datei. (Unbedingt auch die Ausgabe von Leerzeilen, -zeichen vor diesem PHP-Teil vermeiden!) <?php $t = time()+3600*24*10; setcookie(” m y c o o k i e ”,” s c h o n b e s u c h t ”,$t); ?> <HTML> ... Dieser Befehl setzt ein Cookie mit dem Namen mycookie“ auf den Wert schon besucht“ mit einem ” ” Verfallsdatum von 10 Tagen. Vorlesung 3 - 5 Einführung in PHP Vorlesung 3: Funktionen, Cookies, variable Variablen Das Verfallsdatum des Cookie muss in Sekunden seit dem 1. Januar 1970 angegeben werden. Die Funktion time() gibt die Sekunden seit dem 1. Januar 1970 der momentanen Zeit an. Weitere Datums- und Zeitfunktionen sind im Handbuch nachzulesen. Da die Berechnung der Sekunden nicht immer ganz übersichtlich ist, empfiehlt sich die Verwendung einer Funktion: function tage ($anzahl) { $sekunden = time()+ 3600 * 24 * $anzahl; return $sekunden; } setcookie(” m y c o o k i e ”,” Schon b e s u c h t ”,tage(10)); Cookies lesen ist mit PHP wieder sehr einfach realisiert: Der Inhalt des Cookies ist in einer Variablen mit dem Namen des Cookies enthalten: echo ”$mycookie”; gibt also den Wert des Cookies aus, in unserem Fall den Text schon besucht“. ” Ab der PHP-Version 4 sind auch die Cookie-Variablen nicht mehr standardmässig automatisch gesetzt. Die entsprechenden Werte sollen nunmehr aus den vordefinierten Arrays $ REQUEST bzw. $ COOKIE gezogen werden. Beispiel: echo $_COOKIE[” m y c o o k i e ”].”<BR>\n”; echo $_REQUEST[” m y c o o k i e ”]; Ein Server kann mit PHP ein Cookie wieder entfernen, indem lediglich die Funktion setcookie() mit dem Namen des Cookies als Argument angegeben wird: setcookie(” m y c o o k i e ”); 3.5 Exkurs: Variable Variablen Dies ist nun schon fortgeschrittene PHP-Programmierung: In manchen Fällen will man Schleifen über eine Menge von Variablen laufen lassen. Zum Beispiel wenn man viele Eingabefelder in einem Formular hat: <INPUT <INPUT <INPUT ... <INPUT NAME=” f e l d 0 ” > NAME=” f e l d 1 ” > NAME=” f e l d 2 ” > NAME=” f e l d 9 9 ” > Nun ist es sehr mühsam, alle Felder einzeln zu behandeln. Will man z. B. einfach den Inhalt aller Eingabefelder ausgeben, so kann man statt der folgenden 100 Befehle echo ” f e l d 0 : $feld0 <BR>\n”; echo ” f e l d 1 : $feld1 <BR>\n”; ... echo ” f e l d 9 9 : $feld99 <BR>\n”; auch folgendermaßen vorgehen. Wir basteln uns den jeweiligen Variablennamen zusammen: Vorlesung 3 - 6 Einführung in PHP Vorlesung 3: Funktionen, Cookies, variable Variablen for ($i=0; $i < 100; $i++) { $var = ” f e l d ”.$i; echo ”$var : ${$var} <BR>\n”; } Mit einem $var erhalten wir den Variablennamen, mit ${$var} greifen wir auf den Inhalt der Variablen mit dem Namen $var zu. 3.6 Exkurs: Arrays aus Formularen Abschließend noch ein kleiner PHP-Trick: Wenn wir in einem Formular aus einer Menge von HTML-Checkboxen mit PHP ermitteln wollen, welche Checkboxen angeklickt wurden, dann scheitert die bisherige Vorgehensweise: <INPUT TYPE=CHECKBOX NAME=” x” VALUE=1 > Option 1 <INPUT TYPE=CHECKBOX NAME=” x” VALUE=2 > Option 2 ... Schickt man dieses Formular ab, so hat die PHP-Variable $x nur den Wert der ersten angeklickten Checkbox. Der Trick ist, in HTML die Checkbox zum Beispiel so zu benennen: <INPUT TYPE=CHECKBOX NAME=” x [ ] ” VALUE=1 > Option 1 <INPUT TYPE=CHECKBOX NAME=” x [ ] ” VALUE=2 > Option 2 ... Dadurch wird in PHP ein Array mit dem Namen $x existieren. Die Werte können dann so ausgelesen werden: for ($i=0; $i < sizeof($x); $i++) { echo ”$x [ $i ] ”; } 3.7 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 zurückgeben. 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. Vorlesung 3 - 7 Einführung in PHP Vorlesung 3: Funktionen, Cookies, variable Variablen 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. 7. Schreiben Sie ein PHP-Programm fuer eine HTML-Datei, das mitprotokolliert, wie oft ein Benutzer diese HTML-Datei aufgerufen hat. Verwenden Sie dazu den Cookie-Befehl. Vorlesung 3 - 8 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 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. 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. 4.2 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. Vorlesung 4 - 1 Einführung in PHP Vorlesung 4: Zugriff auf Datenbanken 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: ID 1 2 3 Name Herzogkeller Glenk ... Art Biergarten Biergarten ... Note 1 1 ... Kommentar Sehr schöner Baumbestand Gute Bratwürste ... Man kann auf die Tabellen einer Datenbank einzeln zugreifen, aber auch Tabellen verküpfen. Wir wollen uns hier der Einfachkeit halber 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 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; Vorlesung 4 - 2 Einführung in PHP Vorlesung 4: Zugriff auf Datenbanken ü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 nli03 “ ausgeben. ” ” Zuerst muß eine Verbindung von PHP zum Datenbank-Server (d. h. dem Computer, auf dem die Datenbank liegt) hergestellt werden: $verbindung = mysql_connect(” l o c a l h o s t ”,” nobody ”,””); oder bei Zugriff auf einen fremden Datenbankserver z. B. $verbindung = mysql_connect(”db . bbs−l o e n i n g e n . de ”,” n l i 0 3 ”,” h e u t e ”); localhost “ bedeutet, wir fordern eine Verbindung zum selben Computer an, auf dem auch der Webser” ver läuft. Dies funktioniert natürlich nur, wenn Webserver und MySQL-Server auf einem Rechner liegen. Wie im zweiten Beispiel zu sehen, kann aber auch auf einen Datenbankserver auf einem beliebigen anderen Rechner im Internet zugegriffen werden - vorausgesetzt man besitzt die entsprechende Zugangsberechtigung. nobody “ ist der Benutzername für den Datenbankserver (dies wurde vom Datenbank-Verwalter so fest- ” gelegt). “ “ bedeutet, dieser Benutzer benötigt kein Password. Server, Benutzername und Passwort müssen Sie an die Gegebenheiten Ihres Systems anpassen. Wir sollten im Skript auch überprüfen, ob die Verbindung zum MySQL-Server klappt: $verbindung = mysql_connect(”db . bbs−l o e n i n g e n . de ”,” n l i 0 3 ”,” h e u t e ”); 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 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( ” n l i 0 3 ” ); $erg = mysql_query( $abfrage ); Die erste Anweisung wählt die Datenbank nli03 “ aus, die wir abfragen wollen. ” Vorlesung 4 - 3 Einführung in PHP Vorlesung 4: Zugriff auf Datenbanken 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, bräuchten 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 in einen skalaren Array aus: $ergArray = mysql_fetch_row($erg); echo $ergArray[0].” i s t e i n ( e ) ”.$ergArray[1].”<br >\n”; Die Variable $erg enthält nach der Abfrage Zeilen mit jeweils zwei Spalten (Name und Art). mys” ql fetch row($erg) “ gibt genau eine Zeile als skalaren Array aus. Zu Beginn steht eine Art Zeiger auf der ersten Zeile, führt man den Befehl mysql fetch row($erg) “ ” aus, rutscht der Zeiger zur nächsten Zeile usw. Will man alle Zeilen ausgeben, empfiehlt sich eine Schleife: while ( $ergArray = mysql_fetch_row($erg) ) { echo $ergArray[0].” i s t e i n ( e ) ”.$ergArray[1].”<br >\n”; } 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_row($erg); Innerhalb einer while -Schleife: while (list($Name,$Art) = mysql_fetch_row($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); Dies waren nur die einfachsten MySQL-Befehle in PHP, die aber schon für sehr viele Anwendungen ausreichen. Vorlesung 4 - 4 Einführung in PHP 4.5 Vorlesung 4: Zugriff auf Datenbanken Ein weiterer SQL-Befehl 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: $abfrage = ”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. 4.6 Aufgaben zur Vorlesung 1. Schreiben Sie ein PHP-Programm, das aus der Tabelle kneipen in der Datenbank nli03 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 nli03 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 Anzahl der Einträge gezählt und die durchschnittliche Note berechnet werden. Damit die Kneipen besser unterscheidbar sind, wandeln Sie die Namen in Kleinbuchstaben um und entfernen Sie überflüssige Leerzeichen am Anfang und Ende. Hinweis: Bitte geben Sie nur existierende Kneipen ein und geben Sie nur öffentlich vorzeigbare Kommentare ab. 4.7 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: Artikel-Nr 1001 1002 1003 1004 1005 1006 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 Vorlesung 4 - 5 Einführung in PHP Vorlesung 4: Zugriff auf Datenbanken 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 - 6 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 A.2 Raum 101 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 nli01 “ bis nli20 “ eingerichtet. ” ” 1 Einführung in PHP Anhang A: NLI-Kurs A.3 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 kann ü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. Das Verzeichnis Maguma Studio “ enthält die Dateien der Entwicklungsumgebung Maguma Studio ” ” Light“. Anhang A - 2 Einführung in PHP Anhang A: NLI-Kurs 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. Ü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 - 3 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 - 4 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 - 5 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 - 6 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 // Aufbau der Verbindung, Funktions-Parameter dsn-name,user,password $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; // Nix wie raus, klappt heute nicht } // SQL-Anfrage $erg = odbc_exec($verbindung, ”SELECT ∗ FROM K n e i p e n ”); // Zeilenweise Abfrageergebnis holen und auswerten 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 schliessen odbc_close( $verbindung ); ?> </body> </html> Als Ausgabe im Browser sollte das Skript eine Ergebnis wie in der nachfolgenden Abbildung erzeugen. Anhang B - 7