PHP Übungen Andreas Dormann Das sind unsere Themen Installation von XAMPP, Editor und Dokumentation Arbeiten mit Zeichenketten Ausdrücke, Operatoren & Vergleichsoperatoren Kontrollstrukturen Funktionen Includes GET-Methode Abschlussübung 1
1. Installation (Mini)XAMPP www.apachefriends.org PHP Coder www.phpide.com Dokumentation www.php.net/docs.php 1. Installieren Sie die o.g. Programmpakete. Für (Mini)XAMPP befolgen Sie bitte die Anweisungen in README_DE.TXT. 2. Binden Sie die Dokumentation in den PHP Coder ein. 3. Richten Sie auf dem Desktop Verknüpfungen für folgende Programme ein: - PHPCoderPro.exe -APACHE_START.BAT -MYSQL_START.BAT -MYSQL_STOP.BAT 3
2. Das erste Skript <html> <head> <title>mein erstes PHP-Skript</title> </head> <body> <?php $name = "Andreas Dormann"; echo "Hallo, mein Name ist $name.";?> </body> </html> Variante 1: Verwenden Sie statt 'echo' den Befehl 'print'. Variante 2: Setzen Sie hinter "Hallo," einen Zeilenumbruch. Variante 3: Ändern Sie das Skript so, dass der Zeilenumbruch auch im Browser angezeigt wird. 1. Geben Sie im PHP-Editor das obige Skript ein. Speichern Sie es unter c:\minixampp\htdocs\kurse\uebung2.php. 2. Sehen Sie sich die Textausgabe im Explorer und im Quelltext an. Was fällt Ihnen auf? 3. Variante 1: Gibt es einen sichtbaren Unterschied zur Ausgabe mit "echo"? Lesen Sie in der PHP-Dokumentation nach, worin der Unterschied zwischen "echo" und "print" liegt. 4. Variante 2: Wie wirkt sich der Zeilenumbruch aus? 5. Lösung: [...] Hallo,<br>mein Name [...] bzw. [...] Hallo,<br>\nmein Name [...] 4
3. Strings verbinden (1) <?php $zeit = 10; $einheit = "Minute"; echo "Der Upload dauerte $zeit $einheitn.";?> Das obige Beispiel wird nicht funktionieren, denn woher soll PHP wissen, dass Sie die Variable $einheit meinen, wenn Sie $einheitn schreiben? Lösung A (Punktnotation): echo "Der Upload dauerte $zeit $einheit"."n."; Lösung B (komplexe Syntax): echo "Der Upload dauerte $zeit {$einheitn."; 1. Geben Sie das obige Skript ein. Speichern Sie es als uebung3.php. 2. Was stimmt hier nicht? 3. Probieren Sie die Lösungen A und B aus. 5
4. Strings verbinden (2) <?php $zeit = 10; $einheit = "Minuten"; $text = "Der Upload dauerte"; $meldung = $text; $meldung.= " "; $meldung.= $zeit; $meldung.= " "; $meldung.= $einheit; $meldung.= ".<br>\n"; echo $meldung;?> Durch Verwendung von.= wird der rechts stehende Ausdruck an den aktuellen Inhalt der Variablen angehängt. Geben Sie das obige Skript ein. Speichern Sie es als uebung4.php. 6
5. Suchen & Ersetzen $text = "Das ist ein einfaches Beispiel."; //A $pos = strpos($text, "eis"); echo $pos."<br>\n"; echo strpos($text, "ei")."<br>\n"; echo strpos($text,"ei", 12)."<br>\n"; //B $pos = strpos($text, "Das"); if ($pos == 0) { echo "Der gesuchte Text steht ganz am Anfang!<br>\n"; //C $neuertext = str_replace("ein ", "ein dummes ", $text); echo $neuertext; 1. Geben Sie das obige Skript ein (uebung5.php). 2. Abschnitt A: strpos liefert die Position des Suchstrings (beginnend bei 0). Als drittes Argument kann ein Offset angegeben werden. Die Suche beginnt dann erst ab diesem Zeichen. 3. Abschnitt B: Ersetzen Sie "Das" durch "Dies". Was wird ausgegeben? Achtung: Bei Nichtfinden wird FALSE (Wert 0) zurückgegeben. Will man diesen Fall jedoch von dem Auffinden an Position 0 unterscheiden, muss man bei der Auswertung des Ergebnisses nicht allein auf gleichen Wert (==), sondern zusätzlich auf Typgleichheit (===) prüfen. Denn: FALSE hat zwar den Wert 0, ist aber kein Zahlenwert (Integer), sondern vom Typ Boolean. 4. Abschnitt C: Ein (dummes) Beispiel zum Ersetzen von Zeichenketten. 7
6. Regular Expressions <?php $suchmuster = "[A-Z]"; $text = "Das ist ein einfaches Beispiel."; $ergebnis = ereg($suchmuster, $text); if ($ergebnis) { echo "Gefunden!"; else { echo "Nix gefunden!";?> 1. Geben Sie das obige Skript ein (uebung6.php). 2. Verwenden Sie das Suchmuster "^D", um nach einem großen D am Zeilenanfang bzw. am Anfang des Textes zu suchen. 3. Verwenden Sie das Suchmuster "Spiel$", um nach der Zeichenkette Spiel am Zeilenende zu suchen. Erwartungsgemäß wird das Ergebnis FALSE sein. Probieren Sie es deshalb einmal mit der Funktion eregi(). 4. Eine nützliche Anwendung von ereg() ist die Umwandlung der amerikanischen in die deutsche Datumsdarstellung: $datum = "2004-3-11"; if (ereg("([0-9]{4)-([0-9]{1,2)-([0-9]{1,2)", $datum, $regs)) { echo $regs[3].".".$regs[2].".".$regs[1]; else { echo "Kein gültiges Datumsformat: $datum"; Erläuterungen hierzu s. PHP-Dokumentation (CHM-Datei). 8
7. Arrays <?php $navlinks = array("wir über uns","", "Gerichtsbezirk","Bekanntmachungen","Rechtsprechung NRW", "Recht von A-Z","Service","Links"); $anzahl = count($navlinks); echo "Anzahl der Navigationslinks: ".$anzahl."<p>\n"; //Alle Elemente der Reihe nach ausgeben foreach ($navlinks as $link) { echo $link."<br>\n";?> 1. Geben Sie das obige Skript ein (uebung7.php). 2. Ergänzen Sie nach der echo-zeile folgendes: sort($navlinks); Was passiert? 3. Ersetzen Sie die sort()-funktion durch rsort(). 4. Ergänzen Sie am Ende des Skripts folgende Zeilen: $pos = array_search("service", $navlinks); echo "Service ist an Position ".$pos; 9
8. Ausdrücke & Operatoren $a = 100; $b = 12.5; $c = $a + $b; echo $c."<br>\n"; $a *= $b; echo $a."<br>\n"; $d= ++$a; echo $d."<br>\n"; $e = $a++; echo $e."<br>\n"; echo $a."<br>\n"; $f = 20 % 6; echo $f."<br>\n"; Einfache Wertzuweisung und Addition Kombinierte Wertzuweisung/Operation Prä-Inkrement Post-Inkrement Modulus (Divisionsrest) 1. Geben Sie das obige Skript ein (uebung8.php). 2. Vollziehen Sie die einzelnen Beispiele nach. Die Ergebnisse lauten: 112,5 1250 1251 1251 1252 2 10
9. Vergleichsoperatoren $body = "Willkommen auf unserer Homepage.<br>\n"; $body.= "Lesen Sie das <a href=\"grußwort.htm\">grußwort</a>."; Schreiben Sie ein Skript, das nach einem Link in $body sucht. Wird ein Link gefunden, soll die Meldung "Link gefunden" ausgegeben werden, wird keiner gefunden, die Meldung "Kein Link gefunden". Erstellen Sie ein Skript nach den obigen Vorgaben (uebung9.php). Hier eine Liste aller Vergleichsoperatoren: V e r g le ic h s - o p e r a t o r A u s d r u c k E r k l ä r u n g G l e i c h $ a = = $ b T e s t a u f g le i c h e W e r t e. I s t d e r W e r t v o n $ a g l e ic h d e m v o n $ b, so ist d e r A u sd ru ck w a h r (T R U E ). U n g l e i c h $ a! = $ b T e s t a u f u n g l e i c h e W e r t e. I s t d e r W e r t v o n $ a u n g l e i c h d e m v o n $ b, s o is t d e r A u s d r u c k w a h r ( T R U E ). I d e n t i s c h $ a = = = $ b D i e W e r t e v o n $ a u n d $ b u n d d e r e n D a t e n t y p e n m ü s s e n g l e i c h s e i n, d a m i t d e r A u s d r u c k T R U E e r g ib t. N i c h t id e n t i s c h $ a! = = $ b D e r A u s d r u c k i s t T R U E, w e n n d i e W e r t e v o n $ a u n d $ b u n d / o d e r d e r e n D a t e n t y p e n u n t e r s c h i e d l i c h s i n d. K le in e r a ls $ a < $ b T R U E, w e n n d e r W e rt vo n $ a k le in e r ist a ls d e r v o n $ b. G rö ß e r a ls $ a > $ b T R U E, w e n n d e r W e rt vo n $ a g rö ß e r ist a ls d e r vo n $ b. K l e i n e r o d e r $ a < = $ b T R U E, w e n n d e r W e rt vo n $ a k le in e r o de r g le ich d em g l e i c h W e r t v o n $ b i s t. G r ö ß e r o d e r $ a > = $ b T R U E, w e n n d e r W e rt vo n $ a g rö ß e r o d e r g le ic h d e m g l e i c h W e r t v o n $ b i s t. 11
10. Kontrollstrukturen (1) $a = 2; switch ($a) { case 1: echo "eins"; break; case 2: echo "zwei"; break; case 3: echo "drei"; break; case 4: echo "vier"; break; 1. Betrachten Sie das Skript. Welche Ausgabe erwarten Sie? 2. Geben Sie das obige Skript ein (uebung10.php). 3. Was wird tatsächlich ausgegeben? 4. Ergänzen Sie nach jeder echo-zeile Folgendes: break; 12
11. Kontrollstrukturen (2) //For-Schleife for ($i = 1; $i < 10; $i++) { echo $i." "; //While-Schleife $i = 1; while ($i <= 10) { echo $i." "; $i++; //Do-While-Schleife $i = 1; do { echo $i++." "; while ($i <= 10); 1. Geben Sie das obige Skript ein (uebung10.php). 2. Was müssen Sie ändern, damit auch die Zahl 10 ausgegeben wird? 3. Erstellen Sie eine While-Schleife, die die Zahlen 1-10 ausgibt. 4. Erstellen Sie eine Do-While-Schleife, die die Zahlen 1-10 ausgibt. 13
12. Funktionen $x = -12.34; echo abs($x)."<br>\n"; Absoluter Betrag echo ceil($x)."<br>\n"; Aufrunden zur n.h. Ganzzahl echo floor($x)."<br>\n"; Abrunden zur n.n. Ganzzahl echo round($x,1)."<br>\n"; Rundung auf 1 Nachkommastelle $y = array(10,20,25,50,100); echo min($y)."<br>\n"; Niedrigster Wert aus einer Liste echo max($y)."<br>\n"; Höchster Wert aus einer Liste echo pow(5,2)."<br>\n"; 5 hoch 2 echo sqrt(36)."<br>\n"; Wurzel aus 36 echo pi(); Wert von Pi 1. Geben Sie das obige Skript ein (uebung12.php). 2. Vollziehen Sie die einzelnen Beispiele nach. Die Ergebnisse lauten: 12,34-12 -13-12,3 10 100 25 6 3.1415926535898 14
13. Eigene Funktionen A B function Uhrzeit () { $ergebnis = date("h:i")." Uhr"; return $ergebnis; echo Uhrzeit(); echo Uhrzeit(); function Uhrzeit ($fett = false) { $ergebnis = date("h:i")." Uhr"; if ($fett == true) { $ergebnis = "<b>".$ergebnis."</b>"; return $ergebnis; 1. Geben Sie das obige Skript A ein (uebung13.php). Details zur Date()-Funktion s. PHP-Dokumentation. 2. Funktioniert das Skript auch, wenn man die echo-anweisung an den Anfang setzt? 3. Bauen Sie Skript A zu Skript B um. Ihre Funktion besitzt nun einen optionalen Parameter. Wird dieser auf true gesetzt, erscheint die Ausgabe der Uhrzeit fettgedruckt. 15
14. Includes <html><head> <title>include-demo</title> <head><body> <?php include ("./beispiel.inc"); echo "Es ist ".Uhrzeit(true)."!";?> </body></html> 1. Speichern Sie Skript B - ohne die echo-zeile - aus der vorherigen Übung 13 unter dem Namen beispiel.inc. 2. Erstellen Sie nun das obige Skript und speichern Sie es als uebung14.php. 3. Probieren Sie das Skript aus. 4. Was passiert, wenn man./ vor beispiel.inc weglässt? 5. Was passiert, wenn man die Skript-Tags in der Include-Datei weglässt? 16
15. Die GET-Methode <?php $navlinks = array("wir über uns","", "Gerichtsbezirk","Bekanntmachungen","Rechtsprechung NRW", "Recht von A-Z","Service","Links"); if (isset($nr)) { echo "Die Seite <i>".$navlinks[$nr]."</i> wurde aufgerufen!"; else { echo "Ein Parameter wurde nicht übergeben!";?> 1. Geben Sie das obige Skript ein (uebung15.php). 2. Rufen Sie das Skript folgendermaßen auf: http://localhost/kurs/uebung15.php?nr=1 3. Was wird ausgegeben? 17
16. Abschlussübung 1. Erstellen Sie eine Funktion namens HtmlTabelle, die anhand der Parameter Zeilenzahl und Spaltenzahl eine mit fortlaufenden Zahlen gefüllte HTML-Tabelle (border = 1) ausgibt. 2. Speichern Sie die Funktion in einer Datei namens tabelle.inc ab. 3. Erstellen Sie unter Einbeziehung von html.inc ein PHP-Skript tabelle.php, das beim Aufruf tabelle.php?zeilen=5&spalten=10 die enstprechende Tabelle ausgibt. 4. Zusatzaufgabe: Färben Sie alle ungeraden Zeilen gelb. Lösung tabelle.php <?php include "./tabelle.inc"; echo HtmlTabelle($zeilen,$spalten);?> tabelle.inc function HtmlTabelle ($Zeilenzahl, $Spaltenzahl) { $tabelle = "<table border=\"1\">\n"; for ($z = 1; $z <= $Zeilenzahl; $z++) { if ($z % 2) { $tabelle.= "<tr bgcolor=\"yellow\">"; else { $tabelle.= "<tr>"; for ($s = 1; $s <= $Spaltenzahl; $s++) { $inhalt++; $tabelle.= "<td>$inhalt</td>"; $tabelle.= "</tr>\n"; $tabelle.= "</table>\n"; return $tabelle; 18