4. Serverseitige Verarbeitung und PHP
Transcription
4. Serverseitige Verarbeitung und PHP
4. Serverseitige Verarbeitung und PHP Inhalt: CGI (Common Gateway Interface) PHP Einführung in die Sprache Formularverarbeitung mit PHP Dateizugriff aus PHP-Skripten PHP: Cookies, Sessions Datenbankzugriff aus PHP-Skripten Exkurs: Relationale Datenbanken und SQL Exkurs: Microsoft ASP (Active Server Pages, IIS, .NET) Peter Sobe Internettechnologien 1 3-Tier-Architekturen Bislang betrachtet: 2-Tier Architekturen 3-Tier Architekturen Javascript Javascript Webbrowser Webbrowser JavaScript JavaScript HTML, XML, +eingebettete Formate server-seitiges Scripting Webserver Peter Sobe Webserver Internettechnologien PHP 2 ng CGI Common Gateway Interface client < html> <head> <title>Test</title> <br> <p>Die Lottozahlen</p> <!-- #exec cgi=“/cgi-bin/lottozahlen.cgi“ -- > browser </body> </html> server HTTP web-server Common Gateway Interface (CGI) Grossmann/Sobe #!"C:\xampp\perl\bin\perl.exe" my $l1=2; my $l2=$l1+1; CGI – … Programm printf “%d %d %d %d %d %d”, $l1,$l2,$l3,$l4,$l5,$l6; 3 ng CGI CGI-Referenzen aus Webseiten (HTML) Die Skripte befinden sich auf dem Serverrechner in einen dem Webserver per Konfiguration bekannten Verzeichnis (cgi-bin). Skripte werden über eine cgi-bin-Referenz verlinkt und darüber aufgerufen. Die Ausgabe eines Skripts (dessen Konsolenaugabe, stdout) bestimmt die Antwort des Webservers. Mehrere Möglichkeiten zur Skript-Einbindung: CGI-Skript als Link: Beim Folgen des Links wird in Server das Skript aufgerufen. Die Ausgabe des Skripts bestimmt, was im Browser nach dem Folgen des Links angezeigt wird . <a href=”/cgi-bin/erzeugeDynHTML.pl”> Link folgen! </a> CGI-Skript anstelle eines Bildes: Eine Bild-Referenz kann auf ein CGI-Skript verweisen, das als Ausgabe ein Bild erzeugt. Die Ausgabe muß im GIF- oder JPG-Format erfolgen. <img src=”/cgi-bin/erzeugeBild.pl” /> Peter Sobe 4 CGI Inline-Aufruf, s.g. Server-Side-Include Ein externes Skript kann mit seine Ausgaben dynamischen Inhalt an eine ausgewählte Stelle im HTML-Dokument einfügen. <!-- #exec cgi=“/cgi-bin/create_content.pl“ -- > CGI-Skript als Redirektion der aufgerufenen Webseite: Eine Webseite kann durch ein meta-Tag das Laden einer anderen Webseite, oder auch das Ausführen eines CGI-Skripts veranlassen, ohne eigenen Inhalt als HTML zu kodieren. <head> <meta http-equiv=“refresh” content=“0, URL=/cgi-bin/erzeugeDynHTML.pl”/> </head> CGI-Skript als Formularaktion: Ein Formular kann beim Absenden ein externes serverseiteigs Skript aufrufen. Das Skript erhält die Formulardaten (z.B. Request-Body bei POST) als Eingabe (stdin). <form action=”/cgi-bin/auswertung.pl” method=”POST”> Peter Sobe 5 ng CGI CGI-Skripte werden als normale Prozesse auf dem Server-Betriebssystem ausgeführt und laufen unter jenem Nutzernamen, von dem aus der Webserver gestartet wurde. In UNIX/Linux Systemen ist das oft der Nutzer ”www”. Über CGI-Skripte können auch Dateien geschrieben und später wieder gelesen werden. Peter Sobe 6 CGI und Server-APIs CGI - Nachteile: • Über CGI startet der Webserver externe Prozesse zur Ausführung der Skripte. Das ist vergleichsweise teuer, wenn hochfrequentierte Server viele kleine Skripte ausführen müssen. → Hohe CPU-Last der Web-Server → Schlechte Antwortzeiten bei Belastung Weiterhin müssen Daten zwischen verschiedenen Prozessen (unterschiedliche Adressräume) bewegt werden. Technische Lösung: Der Webserver wurde später mit internen Schnittstellen und Modulen zur Interpretation der Skripte ausgestattet, s.g. Server Application Programming Interfaces. Die oben aufgeführten Nachteile erübrigen sich dadurch. Beispielsysteme: Apache Webserver + PHP Internet Information Server + ASP Grossmann/Sobe 7 Integrierte Server-APIs < html> <head> <title>Test</title> <br> Hallo PHP </body> </html> browser client server PHP (module) .php <?php $str=“Hallo PHP” If ($var==$res) echo $str; ?> DB (MySQL) Apache web-server PHP as integrated Apache module Grossmann/Sobe 8 serverseitige Verarbeitung Serverseitige Programmierschnittstellen: Netscape: NSAPI (Netscape Server Application Programming Interface), für Netscape Enterprise Server, Programmierschnittstelle, die es erlaubte, den Server zu erweitern, z.B. um server-sided JavaScript Hintergrund: Netscape war eine der esten Firmen, die einen Web-Browser und eine Webserver bereitstellten (ab ca. 1994). Wurden inzwischen von AOL und Sun übernommen Microsoft: ISAPI (Internet Server Application Programming Interface), darauf aufbauend ASP mit Visual Basic Script und Jscript Apache-Projekt: integriertes PHP-Modul (PHP ist inzwischen auch für Microsoft-Plattformen verfügbar) Grossmann/Sobe 9 ASP: Active Server Pages ASP Active Server Pages HTTP-Response client HTTP-Request Build-InObjects Script-engine Component A ADO Component B WWW Server ADO – ActiveX Data Objects, u.a. ADODB Objekt für Datenbanken Grossmann/Sobe DB DB 10 ASP: Active Server Pages Allgemeines: ASP ist die serverseitige Schnittstelle zu Skripten/Programmen ausgehend von Microsoft Internet Information Server (z.B. in Windows Server enthalten) Skript- und Programmiersprachen ASP 2/3: Visual Basic Skript und JSkript ASP.NET: mehrere Sprachen im Rahmen von .NET: Visual Basic C/C++ C# Grossmann/Sobe 11 ASP Konzept/Varianten: eingebetteter Code (Inline, durch <% … %> eingefasst). Mischung von Webseitencode in HTML mit Programmcode (Visual Basic oder C#) Code-behind Modell: gesonderte Quelltextmodule mit Klassen, die Methoden für Web-Elemente bereitstellen Durch ASP-Framework werden auch Elemente zur clientseitigen Interaktion mittels JavaScript bereitgestellt Der Programmcode wird übersetzt und innerhalb des IIS (Microsoft Webserver) ausgeführt. Entwicklungsumgebung: Microsoft Visual Studio mit Visual Web Developer (lokaler Webserver) Peter Sobe Internettechnologien 12 ASP: eingebetteter Visual Basic Code Beispiel für eine ASP.NET- Webseite: <%@ Page Title="Beispiel" Language="vb" MasterPageFile="~/Site.Master" AutoEventWireup="false“ CodeBehind="Default.aspx.vb„ Inherits="WebAppASPNET._Default" %> <asp:Content ID="HeaderContent" runat="server„ HTML-, Head- und Body-Tags ContentPlaceHolderID="HeadContent"> werden serverseitig </asp:Content> automatisch erzeugt. <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> <h2> Eine ASP.NET-Beispielanwendung </h2> <% For i = 1 To 3 %> gewöhnliche HTML- Elemente <p> Hallo </p> <% Response.Write(i) eingebetteter Code (hier Visual Basic) Next %> </asp:Content> Peter Sobe Internettechnologien 13 ASP: Nutzer-Interaktion Das Request-Objekt stellt die notwendigen Daten und Methoden bereit, um Eingaben vom Client auszuwerten. Das Request-Objekt besteht aus (Auflistung nicht vollständig): Form-Collection: um Formulardaten zu lesen, die mit der Methode POST abgesendet wurden Query-String-Collection: für mit der GET-Methode abgesendete Formulardaten ServerVariables-Collection: für Daten aus dem HTTP-Header Cookies-Collection: um s.g. Cookies auszulesen TotalBytes- und BinaryRead-Properties: um Datei-Uploads zu behandeln Grossmann/Sobe Internettechnologien 14 Einführung PHP (1) PHP (Hypertext Processor) zur Skriptverarbeitung innerhalb Hypertext (HTML) PHP gehört zur C-Sprachfamilie, d.h. die Syntax ist weitgehend an C bzw. C++ angepasst PHP wurde 1994 von Rasmus Lerdorf als Tool zur Programmierung seiner Homepage entwickelt. PHP ist eine serverseitige Skriptsprache zur Entwicklung von dynamischen Webseiten. PHP dient u.a. dem Zugriff auf serverseitige Datenbanken. (PHP und MySQL) Peter Sobe Internettechnologien 15 Einführung PHP (2) Erkennt der Server den Aufruf von PHP-Seiten oder HTML-Seiten mit integrierten PHP-Inhalten, so übergibt er diese an ein Modul, das diese interpretiert. Die Skripte erzeugen in der Regel HTML-Texte oder anderen Inhalt, die in das HTML-Dokument ausgegeben werden. Erst danach wird das Dokument vom Server zum Browser übertragen. Der Server erkennt am Dateityp “php“ (anstelle htm/html), dass das Dokument PHP-Skripte enthält. Dabei ist es auch möglich, dass das gesamte Dokument nur aus einem Skript besteht. Ist der Dateityp htm oder html, so müssen Skriptteile, die serverseitig abgearbeitet werden, durch spezielle Tags, die in der XMLTechnologie als Verarbeitungsanweisungen (processing instructions) bezeichnet werden, gekennzeichnet werden. Diese Tags sind: <?ziel ….?> z.B. <?xml …?>, <?xml-stylesheet …?>, <?php …?>. Peter Sobe Internettechnologien 16 Einführung PHP (3) Andere PHP-Dateien können dann statisch oder dynamisch über die PHP-Anweisungen require(…); bzw. include(); eingebunden werden. statische Einbindung: erfolgt über die PHP-Anweisung require(″Pfad/Dateiname″); z.B. require(″Skripte/Bibliothek1/Ausgabe.php″); Bei der statischen Einbindung wird der Text vor der Ausführung durch den Interpreter an diese Stelle eingefügt. dynamische Einbindung: erfolgt über die PHP-Anweisung include(″Pfad/Dateiname″); z.B. include(″Skripte/Bibliothek1/Ausgabe.php″); Bei der dynamischen Einbindung wird der Text erst während der Ausführung durch den Interpreter an dieser Stelle wie eine Funktion ausgeführt. Damit ist es möglich, durch Verwendung einer return-Anweisung ein Ergebnis, dass durch dieses Skript erzeugt wurde, an das Dokument zu übergeben. Peter Sobe Internettechnologien 17 Einführung PHP (4) Unterschiede gegenüber C und JavaScript: Die Bezeichnungen von Variablen beginnen immer mit dem Zeichen $. Variable müssen nicht deklariert werden, ihr Typ (integer, single, string, array, object, … ) wird mit der ersten Zuweisung festgelegt. Da es im Gegensatz zu C einen impliziten Typ String gibt, sind auch String-Operatoren, wie z.B. ″.″ für die Verkettung von Zeichenketten, definiert. Da keine Deklarationen existieren, ist eine Funktion isset(…) vorhanden, um die erfolgte Zuweisung zu einer angegebenen Variablen festzustellen. Mit der Funktion unset(…) kann man eine Variable löschen. Peter Sobe Internettechnologien 18 Einführung PHP (5) Die PHP-Version sowie weitere Details der PHP-Installation lassen sich auf einer Plattform durch die PHP-Funktion phpinfo() anzeigen. <?php phpinfo(); ?> Peter Sobe Internettechnologien 19 Einführung PHP (6) PHP-Kommentare sind identisch zu C-Kommentaren, d.h. ein Kommentar, der bis zum Zeilenende wirkt, wird durch // eingeleitet. Ein mehrzeiliger Kommentar beginnt mit der Zeichenkombination /* und endet mit der Zeichenkombination */. → wie in JavaScript PHP-Ausgabe von Daten Die Ausgabe von Inhalten, die durch ein Skript erzeugt wurden, in ein HTML-Dokument ist sehr wichtig. Für die Ausgabe stehen zwei Funktionen echo; und print(); zur Verfügung. Ausgabe von HTML-Code: Sollen z.B. Werte auf neue Zeilen ausgegeben werden, so können in echo innerhalb von Zeichenketten auch HTML-Tags, wie z.B. <br /> (neue Zeile) ausgegeben werden. Peter Sobe Internettechnologien 20 Einführung PHP (7) Beispiel für Ausgabe und Kommentare: <?php //Hier steht ein einzeiliger Kommentar echo 'Das Skript enthält 2 Kommentare, ', " einen 'einzeiligen' und einen \"mehrzeiligen\" Kommentar!"; /* Die echo-Anweisung kann eine Liste von Werten, die durch Komma getrennt sind ausgeben. String-Werte werden in " oder in ' eingeschlossen, durch Wechsel zwischen " und ' können innere Zeichenketten gebildet werden. Soll in einer Zeichenkette das gleiche Begrenzungszeichen verwendet werden, muss \" oder \' kodiert werden. */ /* Hier steht ein mehrzeiliger Kommentar, gleichzeitig ist damit das Skript beendet */ ?> Peter Sobe Internettechnologien 21 Einführung PHP (8) Unterschied zwischen echo und print(): print() ist eine Funktion, die einen Funktionswert zurückgibt. Ist print() erfolgreich, so wird der Wert 1 zurück gegeben, sonst 0. Dieser Wert kann einer Variablen zugewiesen werden, und später abgefragt werden. Ein Wert 0 wird zurück gegeben, wenn z.B. der Nutzer die Verbindung zum Webserver unterbrochen hat. PHP-Variable: PHP-Variable werden durch einen Bezeichner gekennzeichnet, der mit einem $-Zeichen beginnt, z.B. $test, $_zahl_1. Es gibt auch reservierte Variable, wie z.B. $_POST. Es wird unterschieden zwischen lokalen Variablen und globalen Variablen. Peter Sobe Internettechnologien 22 Einführung PHP (9) Lokale Variable Lokale Variable gelten in dem Block, in dem sie benutzt werden. Als Block gilt dabei ein Tag <?php …?> oder eine Funktion, deren Körper in {…} eingeschlossen ist. Eine Verbundanweisung, wie z.B. if ($x>0) {……} gilt nicht als Block. globale Variable Superglobale Variable, wie z.B. $_REQUEST gelten überall. Wenn Variable, die in einem Block definiert sind, auch in anderen Blöcken (innere Blöcke oder parallele Blöcke) gelten sollen, müssen sie in diesen Blöcken als global gekennzeichnet werden. Das geschieht, indem das Wort global vor die Variable geschrieben wird: z.B. global $zahl; Peter Sobe Internettechnologien 23 Einführung PHP (10) dynamische Variable Dynamische Variable sind Variable, deren Wert (als Zeichenkette) der Name einer weiteren Variablen ist. Damit besteht die Möglichkeit, quasi eine Adress-Ebene über die Werte-Ebene zu legen. Die dynamischen Variablen sind eine Art Zeiger auf weitere Werte, die die Variablen haben, deren Namen als Wert der dynamischen Variablen vorhanden ist. Der Substitutionsmechanismus wird ausgelöst, indem vor die dynamische Variable noch $-Zeichen gesetzt wird, d.h. es stehen dann zwei $-Zeichen nebeneinander. Beispiel: $Variable=“normaler Wert“; $dynVar=“Variable“; echo $$dynVar;//es wird “normaler Wert“ ausgegeben! Peter Sobe Internettechnologien 24 PHP – Arbeit mit Variablen Funktionen zur Arbeit mit Variablen (Auswahl) isset($Variable) Der Rückgabewert ist 1, falls die Variable schon angelegt wurde, sonst 0. empty($Variable) Der Rückgabewert ist 1, falls die Variable $Variable einen Wert 0 oder als Wert die leere Zeichenkette besitzt, sonst 0. unset($Variable) Diese Funktion löscht die Variable $Variable. gettype($Variable) Der Rückgabewert ist eine Zeichenkette: „integer“, falls die Variable $Variable eine ganze Zahl ist, „string“, falls die Variable $Variable eine Zeichenkette ist, „double“, falls die Variable $Variable eine Gleitkommazahl ist, „array“, falls die Variable $Variable ein Feld (array) ist, „object“, falls die Variable $Variable ein Objekt ist, „unknown type“, falls die Variable einen Wert unbekannten Typs hat. Peter Sobe Internettechnologien 25 PHP - Konstanten Konstante Konstante werden im Skript direkt kodiert: Beispiele: -36, 1.4142, 234.5e-4, ″Wort″, ΄neu΄ Werden bestimmte Konstante im Script häufig benutzt, ist es zweckmäßig, diese unter einem Namen zu vereinbaren: define(″pi″, ″3.141593″); Der vereinbarte Name wird ohne $-Zeichen benutzt. Den Wert einer Konstanten kann durch Zuweisung nicht geändert werden. Es gibt einige vordefinierte Konstanten, wie PHP_VERSION, PHP_OS, NULL, TRUE, FALSE usw. Peter Sobe Internettechnologien 26 PHP – Operatoren und Zuweisungen PHP benutzt bis auf wenige Ausnahmen die gleichen Operatoren, mit der gleichen Priorität wie die Sprache C (und damit wie JavaScript). Das betrifft auch die Zuweisungen. Operationen mit Zeichenketten Ausnahme bilden hier die Zuweisungen von Zeichenketten, da hier im Gegensatz zu C der Typ string existiert. Viele Operationen mit Zeichenketten werden aber auch wie in C über Standardfunktionen ausgeführt. Wichtige String-Funktionen sind: int strlen(string str); … gibt die Länge eines Strings zurück int strcmp(string str1, string str2); … vergleicht zwei Strings, Rückgabe 0 bei Gleichheit int strpos (string haystack, string needle, int [offset]); … sucht den Teilstring needle in haystack und gibt Position innerhalb haystack zurück string strrev (string str); … kehrt einen String um string substr (string string, int pos, int [len]); …gibt eine Teilzeichenkette zurück Peter Sobe Internettechnologien 27 PHP – Operatoren und Zuweisungen Zusammenketten einzelner Strings: Durch den Punkt-Operator wird ein zweiter String an einen ersten String angehangen. $zielstring = $string1.$string2; Beispiel: $name=‘Max‘.‘Mustermann‘; // erzeugt MaxMustermann Formatiertes Anhängen von Variablenwerten an Strings: Variablenwerte werden in Strings konvertiert und an linksseitigen String angehangen. $outstring = "e=".e($anz) ."<br />Anzahl Iterationen: ".$anz; e($anz) ist ein Funktionsaufruf, siehe Beispiel efunction.php Peter Sobe Internettechnologien 28 PHP – Operatoren und Zuweisungen Operationen mit Datums- und Zeitwerten Datum und Zeit sind keine zugelassenen Typen in PHP (auch nicht in C). Praktisch wird aber häufig in Algorithmen die Manipulation von solchen Werten benötigt. In PHP ist dazu eine Reihe von Standardfunktionen vorhanden. Wichtige Funktionen sind: date(), jdmonthname(), jddayofweek(), getdate(), checkdate(), mktime(), time(), gettimeofday(). Ausschnitt aus statement_date.php <? echo "<br /><b>heutiges Datum auslesen und zerlegen</b><br />"; $d=getdate(); echo "<br />Wochentag: ".$d['weekday']; echo "<br /><br />Datum: ".$d['mday'].".".$d['month'].".".$d['year']; echo "<br /><br />Zeit: ".$d['hours'].".".$d['minutes']." Uhr"; ?> Peter Sobe Internettechnologien 29 PHP – Steuerfluss Zum imperativen Paradigma einer Programmiersprache gehören unverzichtbar neben der Sequenz von Zuweisungen, einige so genannte Kontrollstrukturen. Damit sind gemeint: Alternativen (if-Anweisungen) Mehrfachalternativen (switch-Anweisungen) kopfgesteuerte Zyklen (while-Anweisungen) fußgesteuerte Zyklen (do-while-Anweisungen) Zählzyklen (for-Anweisungen) Diese Kontrollstrukturen sind syntaktisch und semantisch vollkommen identisch zur Sprache C in PHP übernommen worden. Zusätzlich gibt es noch einen for-each-Zyklus. Hier deshalb nur kurz die Syntax der einzelnen Kontrollstrukturen… Peter Sobe Internettechnologien 30 PHP – Steuerfluss: Alternativen if (Bedingung) true-Anweisung; else false-Anweisung; Der else-Teil kann fehlen. Statt einzelner Anweisungen können auch Anweisungsblöcke, eingefaßt in {} durch if-else gesteuert werden. Beispiele: statement_else.php, statement_endif.php Mehrfachalternativen: switch(Fallvariable) { case Wert1: Anweisungen-Fall-1; break; case Wert2: Anweisungen-Fall-2; break; … case Wertn: Anweisungen-Fall-n; break; default: Anweisungen-Fall-sonst; } Peter Sobe Bei switch-case werden mehrere Anweisungen je Fall nicht in {} eingefaßt. Internettechnologien 31 PHP – Steuerfluss: Zyklen (1) kopfgesteuerte Zyklen (while-Anweisungen) while (Bedingung) { Anweisungen-Zyklus; } fußgesteuerte Zyklen (do-while-Anweisungen) do { Anweisungen-Zyklus; } while (Bedingung) Beispiel: Peter Sobe <?php $counter = 0; $test = 6; do { echo "Aktueller Zähler: $counter<br>"; $counter++; } while ($counter <= $test) ?> Internettechnologien 32 PHP – Steuerfluss: Zyklen (2) Zählzyklen (for-Anweisungen) for (LV=aw; Lauf-Bedingung; LV-verändern) { Anweisungen-Zyklus; } Mit der Lauf-Bedingung wird der Abbruch des Zyklus festgestellt (Endwert erreicht?). Mit LV-verändern wird die Schrittweite für LV realisiert. Peter Sobe Internettechnologien 33 PHP – Steuerfluss: Zyklen (3) for-each-Zyklen foreach (Feldname as Variable) { Anweisungen-Zyklus; } Mit dieser Zyklusanweisung können z.B. bequem Feldelemente aus einem array ausgelesen werden, ohne dass deren Anzahl bekannt ist. Beispiel: statement_foreach.php Peter Sobe Internettechnologien 34 PHP – Felder (1) PHP erlaubt Felder (Arrays) als gereihte Elemente, auf deren Werte über einen Index oder über einen Schlüssel (Namen) zugegriffen werden kann. Variante 1: indizierte oder numerische Felder –Zugriff auf Elemente über Index Variante 2: assoziative Felder – Zugriff auf Elemente über Variableninhalt Dem PHP-Variablenkonzept folgend, muss ein Feld nicht deklariert werden, sondern das Feld entsteht dynamisch durch Zuweisungen zur Laufzeit. Abweichend zu üblichen Programmiersprachen müssen die Elemente von PHP-Feldern nicht den gleichen Datentyp besitzen. Peter Sobe Internettechnologien 35 PHP – Felder (2) Indizierte Felder: Zuweisungen an Elemente können wie folgt kodiert werden: Beispiel: $Person[]=″Lehmann″; $Person[]=″Kurz″; $Person[]=″Schulz″; $Person[]=″Bernhardt″; Die Reihenfolge der Zuweisungen legt dann den Index fest. In die Indexklammern hätte man auch den Index von 0 beginnend eintragen können. Beim späteren Zugriff auf die Werte der Feldelemente muss aber der Index angegeben werden. Eine weitere Möglichkeit der Zuweisung von Werten besteht mit der array-Funktion: Beispiel: $Person=array(″Lehmann″, ″Kurz″,″Schulz″,″Bernhardt″); Peter Sobe Internettechnologien 36 PHP – Assoziative Felder (1) Die Zuweisungen an Elemente können folgendermaßen kodiert werden: $Person[″Direktor″]=″Lehmann″; $Person[″Abteilungsleiter″]=″Kurz″; $Person[″Programmierer″]=″Schulz″; $Person[″Verkäufer″]=″Bernhardt″; Anstelle des Index wird ein Schlüssel (key) angegeben und danach der Wert (value) des Feldelementes. Beim späteren Zugriff auf die Werte der Feldelemente muss der Schlüssel angegeben werden. Peter Sobe Internettechnologien 37 PHP - Assoziative Felder (2) Eine weitere Möglichkeit der Zuweisung von Werten besteht mit der array-Funktion, hier aber unter Angabe der Schlüssel-WertPaare. Beispiel: $Person=array(″Direktor″=> ″Lehmann″, ″Abteilungsleiter″=>″Kurz″, ″Programmierer″=>″Schulz″, ″Verkäufer″=>″Bernhardt″); Beispiele: array_simple.php, array_assoziative.php Peter Sobe Internettechnologien 38 PHP – Zugriff auf Feldelemente Beim späteren Zugriff auf die Werte der Feldelemente muss entweder der Index (bei indizierten Feldern) oder der Schlüssel (bei assoziativen Feldern) angegeben werden. Eine andere Möglichkeit des Zugriffs besteht über die Anwendung der each()-Funktion. Beispiel: while ($Jeder=each($Person)) echo ″<br />″.$Jeder[″value″].″ arbeitet als ″.$Jeder[″key″]; Peter Sobe Internettechnologien 39 PHP – mehrdimensionale Felder Die Zuweisungen an Elemente können folgendermaßen kodiert werden: $mitarbeiter = array("M1" => array("Clemens", "Krause"), "M2" => array("Janine","Bünning"), "M3" => array("Carolin","Scholz"), "M4" => array("Carolin","Schröder") ); D.h. der Mitarbeiter M1 hat zwei Elemente (Spalten). Das erste Element (Index 0) ist der Vorname und das zweite der Nachname. Der Zugriff wäre damit: echo "<br />Vorname=".$mitarbeiter[“M1“][0]; echo "<br />Nachname=".$mitarbeiter[“M1“][1]; Beispiel: array_multi.php Peter Sobe Internettechnologien 40 PHP – Formatierte Ausgabe (1) Mit der Funktion printf() können analog zur Programmiersprache C formatierte Zeichenketten und Variableninhalte geformt werden. Syntax: printf(String formatstring, mixed [args] …); Im Formatstring kann ein konstanter String angegeben werden, der mit einer variablen Anzahl von Umwandlungsangaben angereichert ist. Für jede Umwandlungsangabe wird der Wert einer Variablen eingesetzt. Die Variablen sind als weitere Argumente (args) in der Reihenfolge ihrer Umwandlungsangaben angegeben. Beispiel: printf(“Seit dem letzten Aufruf der Webseite sind %d Tage vergangen\n“, $delta_tage); Umwandlungsangabe Peter Sobe Variable Internettechnologien 41 PHP – Formatierte Ausgabe (2) Beispiel: printf(“<p> Das Datum ist: %02d. %02d. %04d </p>\n“, $tag,$mon,$jahr); Die Umwandlungsangaben sind hier %02d, %02d und %04d. Am Platz von %02d, %02d, %04d werden die Werte von tag, mon, jahr als 2- bzw. 4-stellige Dezimalzahlen ausgebeben. Im Beispiel werden führende Nullen vorangestellt (wegen 02d anstatt 2d). Ausgabe: Das Datum ist: 24. 02. 2011 Peter Sobe Internettechnologien 42 PHP – Formatierte Ausgabe (3) printf Umwandlungen: Umwandlungszeichen Argument; Umwandlung in d,i int; dezimal mit Vorzeichen. o int; oktal ohne Vorzeichen (ohne führende Null). x,X int; hexadezimal ohne Vorzeichen (ohne führendes 0x oder 0X) u int; dezimal ohne Vorzeichen. c int; int einzelnes Zeichen, nach Umwandlung in unsigned char. s char*; aus einer Zeichenkette werden Zeichen ausgegeben f double; dezimal als [-]mmm.ddd, wobei die Genauigkeit die Anzahl der d festlegt. Voreinstellung ist 6; bei 0 entfällt der Dezimalpunkt. e,E double; dezimal als [-]m.dddddde±xx oder [-]m.ddddddE±xx, wobei die Genauigkeit die Anzahl der d festlegt. Voreinstellung ist 6; bei 0 entfällt der Dezimalpunkt. g,G double; %e oder %E wird verwendet, wenn der Exponent kleiner als -4 oder nicht kleiner als die Genauigkeit ist; sonst wird %f benutzt. Null und Dezimalpunkt am Ende werden nicht ausgegeben. Peter Sobe Internettechnologien 43 PHP – Funktionen (1) PHP benutzt im Wesentlichen das Funktionskonzept der Sprache C. Häufig wiederkehrende Anweisungsfolgen können als Funktion zusammengefasst werden und unter dem Funktionsnamen aufgerufen werden. Es wird unterschieden zwischen Definition und Aufruf der Funktion. Funktionen sind parametrisierbar (Call-by-Value- und Call-byReference-Parameter sind möglich) Ein Rückkehrwert kann (muss nicht) erzeugt werden. Im Gegensatz zu allen derzeit genutzten Programmiersprachen lässt PHP Seiteneffekte bei Funktionen zu. Peter Sobe Internettechnologien 44 PHP – Funktionen (2) Da PHP kein explizites Typkonzept hat, wird auch in der Kopfzeile der Funktionsdefinition anstelle des Typs des Rückkehrwertes nur function geschrieben. Durch eine innere return-Anweisung liegt dann implizit der Typ fest. Damit ist der syntaktische Rahmen wie folgt zu kodieren: Definition: function fname($par1, $par2,…,&$p1,&$p2,…) { lokale Deklarationen; Anweisungen; [return Ausdruck;] Call-by} Call-by-Value Reference Aufruf: [$wert =] fname($pa1,$pa2, …,$po1,$po2); Peter Sobe Internettechnologien 45 PHP – Funktionen (3) Eine Funktion bildet einen eigenen Gültigkeitsbereich für Variable, die im Teil lokale Deklarationen angegeben sind oder Parameter darstellen. In der Kopfzeile sind die Parameter angegeben, wobei die Parameterliste auch leer sein kann. Sind Parameter über ein vorangestelltes & gekennzeichnet, so sind das Ergebnisparameter (call by reference). Die return-Anweisung kann auch fehlen, dann gibt es keinen Rückgabewert. Es können auch rekursive Funktionen kodiert werden. Peter Sobe Internettechnologien 46 PHP – Funktionen (4) PHP-Beispiel einer Funktion: Funktion e mit einem Referenzparameter function e(&$a) {$s=1.0; $p=1.0; $f=1.0; $a=0;$i=1; while ($p>0.0000001) { $f=$f*$i; $p=1.0/$f; $s=$s+$p; $i=$i+1; $a=$a+1; } return $s; } e 1 i! i 0 Aufruf der Funktion e mit einem Argument: echo "e=".e($anz) ."<br />Anzahl Iterationen: ".$anz; Peter Sobe Internettechnologien 47 PHP – Funktionen, Globale Variablen Werden in einer Funktion globale Variablen benutzt, so sind diese als global zu deklarieren. Beispiel: $xmitte=300; $ymitte=300; $radius=150; function kreispunkt($winkel, &$xpos, &$ypos) { global $xmitte; global $ymitte; global $radius; $xpos = $xmitte + sin($winkel) * $radius; $ypos = $ymitte - cos($winkel) * $radius; Die Funktion kreispunkt () berechnet die Koordinaten eines Punktes auf einem Kreis, der einem gegebenen Winkel entspricht. Die Kreisparameter werden als globale Variablen übernommen. winkel } Peter Sobe Internettechnologien 48 PHP – Formularverarbeitung (1) Die superglobalen Variablen $_GET bzw. $_POST enthalten als Feld Informationen, die auf der Clientseite in Formularelemente, wie INPUT-Elemente, RADIO-, CHECK-Felder usw. eingetragen wurden und serverseitig abrufbar sind. Die Namen der superglobalen Variablen weisen dabei auf die Übertragungsart hin. Ist man nicht sicher, welche Methode, GET oder POST verwendet wurde, sollte anstelle dieser, die superglobale Variable $_REQUEST verwendet werden. Die superglobalen Variablen $_GET, $_POST, $_COOKIE, $_SERVER, $_FILES, $_ENV, $_REQUEST sind assoziative Felder. Peter Sobe Internettechnologien 49 PHP – Formularverarbeitung (2) Formular in PHP <FORM method="POST" action=“auswertung.php" > <INPUT NAME="fname" TYPE="text" VALUE=“”> <INPUT NAME="Name" TYPE="text" VALUE=""> <INPUT NAME="sex" TYPE="radio" VALUE="male" CHECKED> <INPUT NAME="sex" TYPE="radio" VALUE="femal"> <INPUT NAME="user" TYPE="text" VALUE=""> <INPUT NAME="psw" TYPE="password" VALUE=""> </FORM> auswertung.php … $fn=$_POST['fname'] ; $n=$_POST['Name'] ; $s=$_POST['sex'] ; $u=$_POST['user'] ; $p=$_POST['psw'] ; … Peter Sobe Internettechnologien 50 PHP – Formularverarbeitung (3) Im assoziativen Feld muss der Name des betreffenden Formularelementes (Wert des Name-Attributes) als Index angegeben werden. Angenommen es existiert im Formular ein Inputfeld: <INPUT type=″text″ name=″Vorname″ /> so kann im Skript mit dem PHP-Ausdruck $_POST['Vorname'] der eingetragene Wert übernommen werden. Sollte die Herkunft des Wertes über GET, POST oder COOKIE keine Rolle spielen, ist zweckmäßigerweise die superglobale Variable $_REQUEST für die Übernahme zu verwenden. Ob ein Werteeintrag erfolgte, kann mit der PHP-Funktion isset() getestet werden. Beispiel: $_REQUEST['Vorname'] Peter Sobe Internettechnologien 51 PHP – Formularverarbeitung (4) Upload von Dateien durch Formulare: Formular auf Webseite: <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="datei"><br> <input type="submit" value="Hochladen"> </form> PHP-Skript, das per HTTP-POST-Operation aufgerufen wird: move_uploaded_file($_FILES['datei']['tmp_name'], "uploaddatei.txt"); Der Dateiinhalt und die Angaben zur Datei werden automatisch im Body des HTTP-Requests transportiert und können durch das PHP-Skript in der Variable $_FILES abgefragt werden. Die Datei wird als temporäre Datei auf Serverseite abgelegt. Den Namen der temporären Datei fragt man mit $_FILES['datei']['tmp_name'] ab. Der Bezeichner ‘datei’ stellt die Beziehung zu dem im Formular angegebenen Identifikator her. Peter Sobe Internettechnologien 52 PHP – Dateiarbeit (1) Das Dateikonzept von PHP hat auch große Ähnlichkeit mit dem Dateikonzept der Sprache C. Die meisten Funktionen zum Öffnen, zum Schließen, zum Lesen und zum Schreiben sind identisch. Es stehen mehr als 50 Funktionen für Dateiarbeit bereit. Hier werden nur die wichtigsten Funktionen behandelt. Unterschiede bestehen gegenüber Unix bei der Arbeit mit Verzeichnissen. Durch PHP kann auf Serverseite auch auf Pfade zugegriffen werden kann, die außerhalb des Publikationsverzeichnisses des Webservers liegen. Peter Sobe Internettechnologien 53 PHP – Dateiarbeit (2) Das Schema der Arbeit mit Dateien besteht aus folgenden Schritten: Das Öffnen einer Datei erfolgt mit fopen(). Es wird ein Handle (Adresse) angelegt; evtl. wird eine nicht existierende Datei zum Schreiben angelegt; wenn Fehler auftreten werden diese behandelt Treten keine Fehler auf, werden zum Lesen geöffnete Dateien bis zur Erkennung des Datei-Ende (EOF) gelesen, z.B. mit fread(); zum Schreiben geöffnete Dateien werden solange wie notwendig geschrieben, z.B. mit fwrite() Das Schließen einer Datei erfolgt mit fclose() Vor dem Öffnen der Datei kann geprüft werden, ob die Datei existiert oder es können auch Operationen mit dem Verzeichnis vorgenommen werden. Peter Sobe Internettechnologien 54 PHP – Dateiarbeit (3) file_exists() Eine Datei kann mit dieser Funktion auf Vorhandensein geprüft werden. Als Argument ist der Pfad einschließlich Dateinamen anzugeben. Im Erfolgsfall gibt die Funktion true zurück. is_file() Eine Datei kann mit dieser Funktion auf die Eigenschaft reguläre Datei geprüft werden, also z.B. kein Verzeichnis. Als Argument ist der Pfad einschließlich Dateinamen anzugeben. Im Erfolgsfall gibt die Funktion true zurück. is_readable() / is_writeable() Eine Datei kann mit diesen Funktionen auf Vorhandensein des Leserechts /Schreibrechts geprüft werden. Als Argument ist der Pfad einschließlich Dateinamen anzugeben. Im Erfolgsfall gibt die Funktion true zurück. Beispiel: file_check.php Peter Sobe Internettechnologien 55 PHP – Dateiarbeit (4) Eine Formatierte Datei- Eingabe wird durch die PHP-Funktionen fscanf() erreicht: mixed fscanf(ressorce handle, string formatstring [, string var ] ) Die gelesenen Variablen können dem zurückgegebenen Array oder den Parametern nach formatstring entnommen werden. Beispiel: <?php $handle= fopen(“meinedatei.txt“,“r“); while ( $info = fscanf($handle, “%s \t %s \n“, )) { list($wert1, $wert2)= $info; // verarbeite wert1 und wert2 } fclose ($handle); ?> Peter Sobe Internettechnologien 56 PHP – Dateiarbeit (5) Funktionen zum Datei-Management: copy, rename, unlink (Löschen) Verzeichnis-Zugriff: mkdir, chdir, rmdir, opendir, readdir, rewinddir Schnittstelle und Verhalten der Funktionen weitestgehend nach Clib-Schnittstelle (C- Standardbibliothek) Programmausschnitt zum Auflisten eines Verzeichnisses: $verzeichisname = "/"; $verzeichnis = opendir($verzeichnisname); while($dateiname = readdir($verzeichnis)) printf("%s <br/>\n",$dateiname); closedir($verzeichnis); Peter Sobe Internettechnologien 57 PHP – Dateiarbeit (6) Objektorientierte Variante der Verzeichnisarbeit mit Benutzung der ´dir-Klasse: $verzeichnis = dir("/"); while($dateiname=verzeichnis->read()) printf("%s <br/>\n",$dateiname); $verzeichnis->close($verzeichnis); Peter Sobe Internettechnologien 58