5 Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn 5 5. Server-seitiges Scripting mit PHP Geschichtlicher Überblick entwickelt 1995 von Rasmus Lerdorf. PHP stand für Personal Home Page Tools, und war ein System, das die Zugriffe auf die Web-Seite Autors protokollierte. Heute bedeutet PHP PHP Hypertext Preprocessor. Rasmus Lerdorf Die aktuelle Version ist PHP 5.2 seit November 2006. 2009 erscheint PHP 5.3 mit name spaces, late static binding und zusätzlichen funktionalen Sprach-Eigenschaften. Stärken sehr große Menge von Funktionen gute Datenbankanbindung Hohe Verfügbarkeit auf Web-Servern 5-2
5.1. Einbettung in HTML SGML-Stil: XML-Stil: ASP-Stil: JavaScript-Stil: <? code?> <?php code?> (empfohlen) <% code %> <script language="php"> code </script> Eingebetteter PHP-Code <html><head> <title> Suchergebnis für "<?php print $anfrage;?>" </title> </head><body> Vergleich zur Perl-Lösung print "<html><head>\n"; print "<title>\n"; print "Suchergebnis für \"$anfrage\"\n"; print "</title>\n"; print "</head><body>\n"; 5-3 Einbinden von Dateien <?php $title = "All about PHP on the Web"; include "header.inc";?> ermöglicht Strukturierung von Web-Anwendungen und Wiederverwendung. Die eingebundene Datei wird im HTML-Modus interpretiert. Die Variablen der einbindenden Datei sind in der eingebundenen Datei verfügbar. header.inc könnte also so aussehen: <html> <head> <title><?php echo $title;?></title> </head> 5-4
5.2. Sprachelemente von PHP PHP hat eine Java- bzw. C-artige Syntax <?php for ($loop = 5; $loop < 5; $loop++) { if ($loop < 0) { echo " "; elseif ($loop > 0) { echo "+"; while( $loop) { switch($loop % 2) { case 0: echo "Even<br>\n"; break; case 1: echo "Odd<br>\n"; break;?> 5-5 Variablen Die Namen von PHP-Variablen beginnen mit einem $: $counter $first_name Sie werden nicht explizit definiert und sind dynamisch typisiert. Dynamische Variablen in PHP bekommen ihren Namen aus String-wertigen Variablen: $var_name = "counter"; $$var_name = 1000; echo $$var_name; echo $counter; Beispiel: Hash-Keys in initialisierte Variablen wandeln: foreach ($myarray as $name => $value) { $$name = $value; 5-6
Gültigkeit von Variablen Globale Variablen: gültig auch in inkludierten Dateien: $title = "Skriptsprachen 2006"; include "header.inc"; Lokale Variablen: Innerhalb von Funktionen. Zugriff auf globale Variablen mit global: function print_title() { global $title; $tag = "<title>". $title. "</title>"; echo $tag; Statische Variablen: lokal definierte Variablen mit globaler Lebensdauer: function next_id() { static $id = 1; return ++$id; 5-7 Grundtypen Zahlen Literale: 1234, 0377, 0xff, 5.3, 10e2 Zeichenketten Literale: "abc", 'abc' Wahrheitswerte Literale: true, false Automatische Typkonvertierung echo 5 + "1.5" + "10e2"; // ergibt 1006.5 echo 5. "1.5". "10e2"; // ergibt "51.510e2" Explizite Typkonvertierung durch cast-operatoren $var = (int) "123"; Andere cast-operatoren: (real), (string), (array), (object) 5-8
Arrays Indiziert oder assoziativ. Auch beliebig gemischt. Indiziert $a[0] = 1; $a[1] = "foo"; $a[] = 1.57; Assoziativ $catch_it['cat'] = "mouse"; $catch_it['dog'] = "cat"; foreach ($catch_it as $key => $value) { echo "catch_it[$key] = $value<br>\n"; // Oder: while (list($key, $value) = each($catch_it)) //... 5-9 Funktionen für Arrays Array-Erzeugung $a = array("jan", "Feb", "Mar"); $a enthält die angegebenen Elemente $a = range(1, 100); $a enthält die Zahlen von 1 bis 100 Array-Durchlauf count($a) oder sizeof($a) liefert die Anzahl der Elemente in $a each($a) liefert das nächste Schlüssel/Wert-Paar von $a array_walkeach($a, funcname) wendet Funktion auf alle Array-Elemente an 5-10
Arrays Sortieren von Arrays sort($a) sortiert $a usort($a, cmp_funcname) sortiert $a mit Vergleichsfunktion ksort($a) sortiert $a nach Schlüsseln shuffle($a) mischt $a zufällig durch 5-11 Funktionen für Strings substr $s = substr($str, 4, 2); $s enthält das fünfte und sechste Zeichen von $str explode $a = explode(" ", $str); trennt $str an den " "-Zeichen auf. split $a = split( regexpr, $str); trennt $str an durch regexpr beschriebenen Stellen. htmlspecialchars $s = htmlspecialchars("mäßiger <Erfolg>"); erzeugt "Mäßiger <Erfolg>" htmlentities $s = htmlentities("mäßig < völlig"); erzeugt "Mäßig < völlig" strcmp strcmp($s1, $s2) String-Vergleich: liefert Zahl <, =, > 0 für $s1 <, =, > $s2 5-12
Reguläre Ausdrücke POSIX-Stil oder Perl-Stil für die regulären Ausdrücke. Im Perl-Stil: echo preg_replace('/will be ([\w\s]+).*/', 'has been \1!', 'This string will be modified.'); liefert This string has been modified! Weitere Funktionen des Perl-Stils preg_match( pattern, subject) preg_match_all( pattern, subject, resultarray) preg_split( pattern, subject) 5-13 Benutzer-definierte Funktionen Definition function soundcheck($one, $two, $three) { return "Test, $one, $two, $three"; Referenz-Parameter function inc_counter(&$count) { $count++; Aufruf soundcheck("eins", "Zwei", "Tschschsch"); inc_counter($i); Default-Werte für Parameter function subject($title="no Subject") { return "<h1>$title</h1>"; 5-14
Objektorientierung class Cart { var $items; function add_item($artnr, $num) { $this >items[$artnr] += $num; Vererbung class NamedCart extends Cart { var $owner; function NamedCart($name) { $this >owner = $name; Anwendung $c = new NamedCart("MeinEinkauf"); $c >add_item(1223, 2); 5-15 Ein- und Ausgabe <html> <head> <title>www wbs Processor Information</title> </head> <body> <h1>www wbs Processor Information</h1> <pre> <?php readfile("/proc/cpuinfo");?> </pre> </body> </html> 5-16
Ein- und Ausgabe Lesen einer Datei $file = fopen("sample.txt", "r"); while (!feof($file)) { echo fgets($file, 1024), "<br>"; fclose($file); Lesen einer Webseite $file = fopen("http://www.upb.de/index.html", "r"); fclose($file); Schreiben einer Datei $file = fopen("agent.log", "a"); fputs($file, $HTTP_USER_AGENT. "\n"); fclose($file); 5-17 CGI-Variablen PHP speichert die Daten einer HTTP-Anfrage in globalen assoziativen Arrays: GET-Variablen in $_GET POST-Variablen in $_POST Cookie-Variablen in $_COOKIE <form method="post" action="test.php"> <input type=text name="user"> <input type=submit value="ok"> </form> belegt das Array-Element $_POST['user']mit dem eingegebenen Formulartext. Diese speziellen Arrays sind überall automatisch als globale Variablen verfügbar. Sie müssen nicht als global deklariert werden ( superglobals ). Array $_REQUEST umfasst alle diese CGI-Variablen, ist aber unsicher, da z.b. einfach über den Query-String zu manipulieren. 5-18
Automatisches Maskieren von Sonderzeichen Standardmäßig maskiert PHP in Anfragedaten die Zeichen ", ' und \ mit einem Backslash \. Damit können diese Daten z.b. in Datenbankabfragen direkt eingesetzt werden. Diese Maskierung muss evtl. rückgängig gemacht werden: <form method="post" action="test.php"> <input type=text name="user" value="it's tricky\smart"> <input type=submit value="ok"> </form> PHP-Skript test.php: <?php $text = $_POST['user']; echo $text; // Ausgabe: It\'s tricky\\smart if (get_magic_quotes_gpc()) // autom. Maskieren an? $text = stripslashes($text); echo $text; // Ausgabe: It's tricky\smart?> Im Bedarfsfall kann die Umkehrfunktion addslashes zum expliziten Maskieren von Daten verwendet werden. 5-19 Projekt: Gästebuch 5-20
Projekt: Gästebuch <html> <head> <title>my Guestbook</title></head> <body> <h1>welcome to my Guestbook</h1> <h2>please write me a little note below</h2> <form action="<?php echo $_SERVER['PHP_SELF']?>" method="post"> <textarea cols=40 rows=5 name="note" wrap=virtual> </textarea> <input type=submit value="send it"> </form> 5-21 Projekt: Gästebuch <?php $fname = "notes.txt"; &, <, > if (isset($_post['note'])) { werden zu $entry = $_POST['note']; & < und > if (get_magic_quotes_gpc()) $entry = stripslashes($entry); $entry = htmlspecialchars($entry); $fp = fopen($fname, "a"); fputs($fp, '<p>'. nl2br($entry). '</p>'); fclose($fp);?> ein <br> vor <h2>the entries so far:</h2> jedes Newline Zeichen <?php readfile($fname);?> </body> </html> 5-22