(CGI-Skripte)!
Transcription
(CGI-Skripte)!
Reaktion des Servers auf Anfragen? Common Gateway Interface (CGI-Skripte)! • Beispiele: – Webblogs, Flickr, YouTube, ... – Anzahl Seitenzugriffe (Hits) – Suchmaschinen (google, yahoo, Bahn-Auskunft, ...) – DB-Anfragen (Adressabfragen) – Bestellformulare, Gästebücher, ... – Content Management Systeme (CMS mit diff. Zugriffsrechten) • Skripte (hier) = ausführbare Programme, die vom Client aus auf dem Server aktiviert werden und auf dem Server ausgeführt werden. Problematisch unter Sicherheitsaspekten kann die Ausführung der Skripte sein (i.d.R. ist es nur dem Systemadministrator erlaubt, Skripte zu installieren) 1 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Interaktive, Dynamische Dokumente CGI - Common Gateway Interface Server Browser sendet eine Anfrage (Request) Client mit Web-Browser Server schickt komplettes Dokument CGIProgramm Dateien Datenbank "andere" Programme Server-Site 2 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 1 Client-Server: cgi-Programmierung • Client sendet mit Hilfe von Formularen Daten an den Server zurück: http://www.e-shop.de/shop.php/id220263?ware=kaufen&produkt=corn+flakes • Aufgaben, die der Client übernehmen kann – Eingabe prüfen, Berechnungen, Simulationen – Vorteile: Kommunikation, Server wird entlastet – Sicherheitsüberlegungen (Thin Clients) – Clientseitige Elemente: JavaScript, DHTML, Java Applets • Aufgaben, die der Server übernehmen kann – Daten sammeln (monitoring, e-shops, ...), – Anschluss an weitere Komponenten – Serverseitige Elemente: PHP, Perl, Java Servlets, JSP, SSI, ... 3 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 3-Ebenen-Architektur Client: Präsentation, Interaktion, Navigation, Benutzerunterstützung, Eingabevorverarbeitung Server: Anwendungslogik, semantische Prüfung, kommunikationsspezifische Aspekte, Sicherheit Datenbankanbindung, Ansteuerung klassischer hostbasierter Programme, Warenwirtschaft, Logistik, Batchprogramme, Number Crunching 4 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 2 CGI-Beispiel <FORM action="http://www.mein-server.de/auswertung.php" enctype=”application/x-www-form-urlencoded” method = "get"> ... bel. Markups insbesondere Formularelemente ... </FORM> 5 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Form-Attribute (I) • action: Skript, welches aufgerufen/ausgeführt wird; die Angabe erfolgt als URL. Eingaben aus Eingabefeldern, Auswahllisten, Buttons, ... werden angehängt. Wenn das action-Attribut fehlt, wird die URL der HTML-Datei verwendet Mit Anklicken eines Submit-Buttons wird das Formular abgesendet (Ausnahme: onSubmit-Behandlung liefert false) • target: Fenster oder Frame in dem die Antwort dargestellt wird (optionales Attribut) 6 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 3 Form-Attribute (II) • enctype: application/x-www-form-urlencoded Angabe, wie Anfragen kodiert werden: Leerzeichen und Sonderzeichen werden als 2stelligen Hexcode übertragen (beginnt mit ‘%‘). Leerzeichen werden wegen ihres häufigen Auftretens auch durch ‘+‘ ersetzt. Mit der Angabe text/plain kann diese Kodierung ausgeschaltet werden, wobei das Attribut nicht von jedem Browser ausgewertet werden muss 7 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Form-Attribute (III) • method: get oder post Abfrage von Umgebungsvariablen: – get: char *str = getenv ("QUERY_STRING"); – post: Eingabe wird auf stdin erwartet und muss von dort gelesen werden gelesen In diesem Fall dürfen Sie nicht erwarten, dass die Eingabe etwa mit einem EOF abschließen. Sie müssen die Umgebungsvariable CONTENT_LENGTH auswerten! • Die Aufbereitung der übertragenen Paare (Name=Wert), damit diese im PHP-Skript als Variable zur Verfügung stehen, werden vom PHPInterpreter ausgeführt 8 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 4 Skripte • Ausgaben erfolgen nach stdout Der Ausgabe muss ein Hinweis auf den MIME-Typ vorausgehen (MIME = Multipurpose Internet Mail Extension) MIME-Typ: printf ("Content-type: text/html \n\n"); • Beispiele application/x-www-form-urlencoded image/gif text/css text/html HTML-Formular an CGI GIF-Datei CSS-Style-Sheet-Datei HTML-Datei ... • Die Interpretation eines PHP-Skriptes übernimmt diese Aufgabe 9 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Beispiel: Counter (Zugriffszähler) #include <stdio.h> main () { FILE *CounterFile; int Counter; printf("Content-type: text/html\n\n"); printf("<HTML><HEAD><TITLE>Test-Skript</TITLE>"); printf("</HEAD><BODY><H1>Hallo!</H1>"); if (CounterFile = fopen("counter.dat", "r+")) { fscanf(CounterFile, "%d", &Counter); printf("Diese Seite wurde schon %d", ++Counter); printf("mal abgerufen."); rewind(CounterFile); fprintf(CounterFile, "%d", Counter); fclose(CounterFile); } else printf("Fehler beim Öffnen der Datei."); printf("</BODY></HTML>\n"); } 10 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 5 Environmentvariable (I) • Alle Environment-Variable sind vom Typ char * Environment Variable Bedeutung AUTH_TYPE Authentifizierungsmethode, mit der ein Benutzer überprüft wird Anzahl Bytes, die übertragen werden bei der POST-Methode i.d.R. “application/x-www-form-urlencoded” Das Verzeichnis, aus dem Web-Dokumente gelesen werden CONTENT_LENGTH CONTENT_TYPE DOCUMENT_ROOT 11 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Environmentvariable (II) GATEWAY_INTERFACE HTTP_ACCEPT HTTP_FROM HTTP_USER_AGENT Gibt Name der CGI Schnittstelle an (z.B. CGI/1.1) Gibt mit Leerzeichen getrennt alle MIMETypen an, die der Browser akzeptiert; Bem.: Variable wird nicht von allen Browsers unterstützt E-Mail Adresse des Benutzer, der die Abfrage angestoßen hat. Wird nicht von jedem Browser unterstützt Gibt den (Produkt-)Namen des Browsers an, der aktuell anfragt 12 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 6 Environmentvariable (III) PATH_INFO PATH_TRANSLATED QUERY_STRING REMOTE_ADDR REMOTE_HOST Pfadangabe zusätzlich zu dem Servernamen; sollte mit ‚/‘beginnen Komplette Pfadangabe in lokalen Dateisystem Gesendeter String bei <ISINDEX> oder Get-Methode IP-Adresse des Browser-Rechners; Falls ein Proxy-Server benutzt wird, können versch. Browser die gleiche IP-Adresse haben! Hostrechnername/-adresse des Browsers 13 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Environmentvariable (IV) REMOTE_IDENT REQUEST_METHOD REMOTE_USER SCRIPT_NAME SERVER_NAME SERVER_PORT SERVER_PROTOCOL SERVER_SOFTWARE Benutzername (freiwillige und unsichere Angabe des Benutzers am Browser) GET oder POST Benutzername unter dem authentifiziert wurde Dateiname unter dem das aktuelle cgi-Programm gestartet wird Symbolischer Servername (z.B. www.h-da.de) Angabe des Ports (häufig 80) Angabe des verw. Protokolls (‘HTTP/1.0‘) Name und Version der Serversoftware 14 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 7 PHP: “Personal Home Page“ Server-Programmierung mit PHP • http://www.php.net • PHP ("PHP: Hypertext Preprocessor") besitzt sämtliche Fähigkeiten einer Programmiersprachen und ist unmittelbar in HTML eingebettet: – PHP wird auf dem Server ausgeführt – Das Ergebnis wird (in Form eines HTML-Dokumentes) an den Clienten gesendet – PHP wird interpretiert 15 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling PHP allgemein (I) • Die Verwendung von PHP-Konstrukten ist recht einfach. Alle Information, die an den Server (zurück-)gesendet werden, stehen in Form von Variablen zur Verfügung. • Die PHP-Anweisungen sind in der HTML-Datei verteilt. Die Anweisungen orientieren sich abgesehen von ein paar Vereinfachungen (kein strong Typing; es gibt eine eval Funktion, die einen String auswertet als wäre es PHP-Code; einfache Ausgaben mit echo, ...) an der C-Syntax. • PHP unterscheidet zwischen Groß- und Kleinbuchstaben. Alle Variable beginnen mit einem '$'-Zeichen. Die Typisierung ist dynamisch, d.h. sie kann durch eine Zuweisung geändert werden. 16 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 8 PHP allgemein (II) • Umgebungsvariable stehen zur Verfügung. Die Elemente des QUERYStrings stehen als Variable zur Verfügung und können im PHP-Skript genutzt werden. Im Formular der HTML-Datei werden Eingabeelemente dazu mit dem Attribut name und einem Wert versehen • Erkannt werden PHP-Dateien an der Endung *.php (oder *.php3, *.php4) • Eine PHP-Anwendung besteht aus einem oder mehreren verlinkten Skripten - HTML-Dateien, die mit PHP-Anweisungen angereichert sind • ruft ein Anwender ein mit PHP-Anweisungen angereichertes Dokument ab, dann werden die Anweisungen interpretiert, und es entsteht in diesem Moment ein HTML-Dokument, das zum Client übertragen wird 17 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Einbettung von PHP in HTML (I) • Im Gegensatz zu allen bisher betrachteten Verknüpfungen mit HTML wird nicht auf PHP verwiesen, sondern PHP ist komplett in HTML eingebettet (oder umgekehrt): • 1. Variante: <?php echo ("Hallo "); $botschaft = "Welt"; echo ( $botschaft ); ?> • 2. Variante: <? echo ("Hallo Welt"); ?> 18 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 9 Einbettung von PHP in HTML (II) • 3. Variante: <script language=”php”> echo ("Hallo Welt"); /* einige Editoren mögen keine PIs! */ </script> • 4. Variante: <% echo ("Hallo "); $botschaft = "Welt"; %> ... <%= $botschaft; %> • Ergebnis (in allen Fällen): Hallo Welt 19 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling PHP-Anweisungen • Konstante • Schleifen • Bedingungen • Funktionen define (Beispiel, 17); $feld[0] = Beispiel; while ( expr ) ... do ... while ( expr ); for ( expr1; expr2; expr3 ) ... if ( expr ) ... else Function beispiel ( $param ) { return $param + 1; } Parameter können auch als Referenzen übergeben werden – &$wert - oder dies wird beim formalen Parameter angegeben; dann erfolgt immer der Aufruf per Referenz 20 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 10 Typen • Es gibt drei (Standard-)Typen: String, Integer und Float • Zusätzlich gibt es Felder (Arrays), Strings und Objekte • Eine Variable wird im Moment der ersten Verwendung auch deklariert. der Typ spielt keine große Rolle; PHP konvertiert nach Bedarf zwischen den Typen: $wert $wert $wert $wert $feld = = = = = “3“; // $wert + 1; // $wert * 1.6; // (int)$wert; // (array)$wert; // String (“3“) Integer (4) Float/Double (6.4) casting: Integer (6) $feld[0] enthält Integer (6) $obj = (object)$wert;// $obj->scalar enthält Integer (6) 21 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Arrays • Funktion bei Felder – count ($array) liefert die Anzahl der Elemente in einem Feld – foreach (...), reset($array), each ($array), list ($key, $value): foreach ($array as $value) statement foreach ($array as $key => $value) statement reset ( $array ); while ( list($key, $value) = each( $array ) ) statement reset ( $array ); while ( list(, $value) = each( $array ) ) statement 22 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 11 Globale Variable PHP kann lokale und globale Variable unterscheiden; die beiden folgenden Funktion sind gleichbedeutend $a = 1; $b = 2; – Function sum1 () { global $a, $b; $c = 3; $b = $a + $b + $c; } – Function sum2 () { $c = 3; $GLOBALS[$b] = $GLOBALS[$a] + $GLOBALS[$b] + $c; } 23 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling PHP – objektorientiert (I) • Ein einfaches Beispiel: Wert, wenn der <?php Parameter fehlt class beispiel { var $eins, $zwei; var $break; function beispiel ($anf=“Hello“, $ende=“Bye Bye“) { $this->eins = $anf;//ohne this: $eins ist sonst lok. Var! $this->zwei = $ende; $this->break = "<br>\n"; } 24 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 12 PHP – objektorientiert (II) function sayhello () { echo $this->break; echo $this->eins; } function saygoodbye () { echo $this->break; echo $this->zwei; } function allgGruss() { echo "<p>allg. Gruß</p>"; } }// class ?> 25 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling PHP – objektorientiert (III) <html> <head><title>Beispiel PHP objektorientiert</title></head> <body><h1>Beispiel PHP objektorientiert</h1><p> <?php $bsp1 = new beispiel("guten Tag", "auf Wiedersehen"); $bsp2 = new beispiel("Anfang", "Ende"); $bsp1->sayhello(); $bsp1->saygoodbye(); $bsp2->sayhello(); $bsp2->saygoodbye(); beispiel::allgGruss(); oder $bsp2->allgGruss(); stat. Methoden ?> </p></body></html> 26 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 13 Verknüpfung mit cgi-Parameter • Beispiel: <form action=”http://www.meinserver.de/auswertung.php”> <input type = "text" name = "username" value = "root" size = "10" maxlength = "20" > <input type=“submit“ name=“senden“> </form> Î Effekt: Die Variable $username steht zum Zeitpunkt der Ausführung als Variable (mit dem eingegebenen Wert) zur Verfügung. 27 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Beispiel für eine cgi-Anfrage http://www.e-shop.de/shop.php/id220263?ware=kaufen&produkt=corn+flakes Server, Pfad und Skript PATH_INFO CGI Parameter In PHP: $PATH_INFO hat den Wert id220263 zusätzlich zu den Umgebungsvariablen stehen folgende Variable zur Verfügung: $ware hat den Wert “kaufen“ $produkt hat den Wert “corn flakes“ 28 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 14 Session Tracking • Wie bereits angesprochen wurde, ist die Verbindung zwischen Client und Server zustandslos. Dies ist von Nachteil, wenn sich zwischen Client und Server eine Kommunikation über mehrere Stufen entwickelt (Die Identifikation über die IP-Adresse des Clienten ist nicht ausreichend, da der Zugriff auf den Server über einen Proxy-Server erfolgen kann und damit wechselt) • Dennoch ist das ein Aspekt, der interessant ist: – schrittweise Konkretisierung einer Anfragen (z.B. Bahnverbindung) – Benutzerverhalten in gewissem Rahmen beobachten (wer besucht wann und wie oft welches Angebot) – Benutzerkomfort (personalifizierte Informationen, spezieller Kontext, ...) – e-Shops (Warenkorbmodellierung) 29 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Beispiel Warenkorbmodellierung • Es ist eine virtuelle (Ver-)Kaufssituation gegeben, bei der – der potentielle Käufer den Verkaufsraum betritt und einen Warenkorb nimmt – Waren in einen Warenkorb wandern, – die Käuferin oder der Käufer sich zwischendurch über den aktuellen Bestand – Inhalt und Warenwert – informiert - vielleicht sogar der Verkäufer! – Waren unter Umständen wieder entfernt werden und – am Ende der Bezahlvorgang stattfindet und den Verkaufsraum verläßt • Dabei müssen die einzelnen Aktionen in PHP-Skripte umgesetzt werden 30 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 15 Benutzerauthentifizierung – User Authorization • Zugangskontrolle erfolgt durch Account (Benutzername und Passwort) Kontrolle erfolgt auf dem Host; d.h. der Host muß konfiguriert werden • mit Aufwand verbunden (! Individualisierte Information) • erfordert besondere Zugriffsrechte • mühsam bei speziellen Anpassungen (und vielen verschiedenen Benutzern) 31 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Versteckte Formularfelder - Hidden Form Fields (I) • Mit versteckten Formularfeldern, die in Forms eingebettet werden, können in der HTML-Datei selbst spezifische Informationen für den Clienten mitgeliefert werden • Diese Information ist spezifisch von dem Server für den Clienten erzeugt. Dadurch können spezielle Daten von Anfrage zu Anfrage weitergegeben werden 32 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 16 Versteckte Formularfelder - Hidden Form Fields (II) • (sehr) einfaches Beispiel: <form ... > ... <INPUT TYPE="HIDDEN" NAME="unsichtbar" VALUE="Gast ist Stammkunde"> ... </form> • Ihre Anzahl ist nicht begrenzt; bei einer größeren Menge wird deren Handhabung aber möglicherweise recht aufwendig, da die versteckten Formularfelder von HTML-Datei zu HTML-Datei weitergegeben werden müssen. 33 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling URL Erweiterungen - URL Rewriting • Eine andere Möglichkeit besteht darin, auf Serverseite spezielle Informationen zu einer Sitzung zu sammeln und zu pflegen. Die spezielle Verknüpfung erfolgt dann über eine Erweiterung der URL zum nächsten CGI-Script. Mit der URL kann dann das nächste CGIScript aufgerufen werden sowie etwa ein Pfad und ein Dateiname zu einer Datei weitergegeben werden, die die jeweiligen Informationen beinhaltet. Die Environment Variable PATH_INFO enthält dann diese Angabe. • Beispiel für eine URL, die einem action-Attribut steht: http://www.mein-server.de/auswertung.php/ special_information_on_customer/wiedling 34 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 17 URL Erweiterungen/Rewriting: Beispiel • http://www.meinserver.de/cgi-bin/meinprogramm Server findet im Verzeichnis cgi-bin meinprogramm und führt es aus • http://www.meinserver.de/cgi-bin/meinprogramm/pid17052002 Der Server arbeitet die Pfadangabe Verzeichnis für Verzeichnis ab bis er zu einer Datei kommt. Der Rest (hier: /pid17052002) der Pfadangabe wird als Wert an die Umgebungsvariable PATH_INFO weitergegeben: • http://www.meinserver.de/cgi-bin/meinprogramm/september/5 • PATH_INFO: /september/5 http://www.meinserver.de/cgi-bin/meinprogramm/8/7/andreas PATH_INFO: /8/7/andreas 35 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Persistente Cookies • Im Rahmen von HTTP können zwischen Server und Client - i.d.R. unbemerkt und unsichtbar für den Benutzer - (kurze) Informationen weitergeben werden. Der Server sendet einmal ein Cookie, welches dann mit jedem Request zurückgesendet wird. Es werden nur die Cookies an den Server zurückgesendet, die auch von diesem gesendet wurden • Die Restriktionen dabei sind, dass – es höchstens 300 Cookies auf dem Client geben darf – ein Cookie (Name und Wert) maximal 4 KB groß sein darf – 20 Cookies von einem Server oder einer Domäne sein dürfen • Erläuterungen zum Umgang mit Cookies unter PHP: www.php.net! 36 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 18 Persistente Cookies mit PHP • Cookies müssen vor dem HTML-Dokument gesendet werden: • In PHP setcookie ( string name[, string value[, int expire[, string path [, string domain[, int secure ]]]]] ) • Beispiele: setcookie (“special“, “cookie test“, time()+3600); //1 Std. Gültigkeit setcookie (“special“) löscht das entsprechende Cookie auf dem Client 37 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Persistente Cookies mit JavaScript (I) • setzen document.cookie = Name + “=“ + escape(Wert) + “;“; • lesen var i = name.length; var j = i + 1; if (document.cookie.substring(0, i) == name) { var ende = document.cookie.indexOf(";"); if (ende == -1) ende = document.cookie.length; alert (unescape(document.cookie.substring(j, ende) ) ); } else ... kein passendes cookie ... 38 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 19 Persistente Cookies mit JavaScript (II) <script> if (document.cookie) document.write (unescape(document.cookie.substr(4,document.cookie.length))); function show() { if (document.cookie) alert (unescape(document.cookie.substr(4,document.cookie.length))); else alert (“No Cookie!"); } 39 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Persistente Cookies mit JavaScript (III) function setzen(f) { var Verfall = 1000 * 60*60*24 * 10; /* entspricht 10 Tagen! */ var jetzt = new Date(); var Auszeit = new Date(jetzt.getTime() + Verfall); document.cookie = “bsp" +"="+escape(f.cwert.value)+";expires=“ + Auszeit.toGMTString() + ";"; } function loeschen(f) { document.cookie = “bsp="; } </script> 40 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 20 Persistente Cookies mit JavaScript (IV) ... <form> <input type="text" name="cwert" size="10" maxlength="10"> <input type="button" name="butt" value="setzen" onclick="setzen(this.form)"> </form> <a href="javascript:show()">anzeige</a> <a href="javascript:loeschen()">reset</a> ... 41 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling SessionIDs (ab PHP4) • Mit SessionIDs wird unter PHP der tatsächliche Mechanismus (Cookie oder Pfaderweiterung) zum Austausch von Informationen über einen längeren Dialog gekapselt • Notwendig ist nur, dass eine Session gestartet wird und entsprechende Variable angemeldet werden. Danach sind sie aus Anwendungssicht transparent verfügbar: – – – – – – session_start(); verwenden Sie $_SESSION[]! session_register ( string name [, string name ...]); session_is_registered( string name); session_unregister ( string name); session_destroy (); string session_id ([string id]); 42 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 21 Hinweis: “Variables from outside PHP“ • Der PHP-Interpreter stellt im Rahmen der Ausführung komfortabel (Umgebungs)Variable zur Verfügung: – aus einem Formular (via GET oder POST) – Sitzungsorientierte Variable (Cookies und registrierte Variable) • Dabei sollte man über die Reihenfolge, in der die Variable zur Verfügung gestellt werden, keine Vermutungen anstellen • Es wird empfohlen, globale Felder zu nutzen (z.B. $_SERVER[‘QUERY_STRING‘]): – $HTTP_GET_VARS[] oder $_GET[], – $HTTP_POST_VARS[] oder $_POST[], – $HTTP_COOKIE_VARS[] oder $_COOKIES[], – $_SESSION[], – $_SERVER[]... 43 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Datenbankanbindung (I) • PHP kennt folgende Datenbank-Zugriffs-Funktionen für MySQL (Auswahl): – mysql_connect(hostname, benutzername, passwort); stellt eine Verbindung mit der Datenbank her und liefert eine Verbindungs-kennung – mysql_select_db(datenbankname, verbindungsId); selektiert eine Datenbank – $result= mysql_query(sql, verbindungsId); führt die SQL-Anweisung aus und liefert im Fall von select ein spezielles Resultatfeld 44 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 22 Datenbankanbindung (II) – mysql_num_fields(result); gibt die Anzahl der Spalten zurück – mysql_field_type(result, spaltennummer); gibt den Datentyp der Spalte zurück – $array=mysql_fetch_array(result[, resulttype]); gibt die Spaltenwerte der Zeile als Array zurück; der Resultattyp sagt etwas über die Art des Arrays (numerisch oder assoziativ 45 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Beispiel: Datenbank anlegen CREATE TABLE ( id INT NOT NULL AUTO_INCREMENT, Anrede VARCHAR(10), Nachname VARCHAR(50), Vorname VARCHAR(50), Strasse VARCHAR(75), PLZ INT(5), Ort VARCHAR(50), Telefonnummer VARCHAR(20), EMail VARCHAR(40), WWW VARCHAR(40), PRIMARY KEY(id) ); 46 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 23 Datenbankzugriff - Rahmen allgemein $verbindung = mysql_connect ($host, $user, $pass); // verbinden if ( !$verbindung ) echo("es konnte keine Datenbankverbindung hergestellt werden."); mysql_select_db ("Adressen", $verbindung); $sql = "SELECT Nachname, Vorname, id FROM Adressen WHERE Nachname LIKE '$bereich%' ORDER BY Nachname"; $ergebnis = mysql_query ($sql, $verbindung); ... mysql_free_result($ergebnis); // Löschen mysql_close ($verbindung); // Verbindung beenden 47 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Datenbank - Abfrage in Form bringen echo ("<table>"); while ( $row = mysql_fetch_object ($ergebnis) ) { echo("<tr><td>", $row->Vorname, " ", $row->Nachname); echo("<td>\n"); echo("<a href=‘detail.php?id=$row->id'>Detail</a>"); echo("<a href=‘delete.php?id=$row->id'>Löschen</a>"); echo("<a href='edit.php?id=$row->id'>Bearbeiten</a>"); echo("</tr>\n"); } echo ("</table>\n"); echo ("<p><a href='edit.php?aktion=neu'>Neuer Eintrag</a>\n"); 48 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 24 Datenbank ändern $sql = "UPDATE Adressen SET Anrede='$Anrede', Vorname='$Vorname', Nachname='$Nachname', Strasse='$Strasse', PLZ='$PLZ', Ort='$Ort', Telefonnummer='$Telefonnummer', EMail='$EMail', WWW='$WWW'" WHERE id='$id'; $ergebnis = mysql_query ($sql, $verbindung); if (!$ergebnis) echo("Fehler mit der Datenbank aufgetreten!\n"); else echo("Datensatz wurde erfolgreich geändert\n");49 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Formatierte Ausgabe • float round (float value[, int precision]); rundet; wird der zweite Parameter angegeben, wird an der entsprechenden Position gerundet (precision positiv: Position hinter dem Komma ) • printf (string format [, mixed args]); Ausgabe eines formatierten Strings wie in der Notation unter C, C++, d.h. etwa %s für String, %d für Integer, %x für Hexadezimalwert • string number_format ( float number [, int decimals [, string dec_point [, string thousands_sep]]]); formatiert den Parameter number; mit decimals Nachkommastellen und dec_point als Dezimalzeichen und thousands_sep als Trenner zwischen Tausenderstellen 50 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 25 Spezielle Elemente (I) • isset ( $a ); • empty ( $a ); liefert true, wenn die Variable existiert • include(string ); • require(string ); fügt die Datei bei Ausführung ein und führt sie aus fügt die Datei ein und führt aus • set_time_limit(60); Begrenzung der Ausführzeit eines Skriptes in Sek. • $PHP_SELF Name der PHP-Skriptdatei • php_info (); Anzeige verfügbarer/konfigurierter PHP-Merkmale 51 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Spezielle Elemente (II) • Verzeichnisse: $dir = dir($path); $file = $dir->readdir(); $dir->rewind(); $dir->closedir(); $f = file(string filename); $werte=fgetcsv($datei,100,";") “Pseudo object-oriented mechanism for reading a directory“ liest aktuelles Verzeichniselement positioniert Verzeichniszeiger neu Verzeichnis Handle wird geschlossen Datei wird zeilenweise in ein Feld eingelesen Zeile aus $datei wird im “csv-Format” in Array eingelesen • Möglichkeit in HTTP, Browseranfrage umzulenken Header erzeugen - Location: header (“Location: http://www.mein-server.de/escape.html“); 52 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 26 Serverseitiges Erzeugen von Bildern <?php header (“Content-type: image/gif“); MIME-Type erzeugen $string = “MM und WWW“; $im = imagecreatefromgif (“images/button1.gif“); Image erzeugen $orange = ImageColorAllocate ($im, 220, 210, 60); Farbe erzeugen $px = imagesx ($im) 7.5 * strlen ($string) / 2; ImageString($im, 3, $px, 9, $string, $orange); Img, Font, x,y, Str, Farbe ImageGif( $im ); Ausgabe erzeugen ImageDestroy ( $im ); Aufräumen ?> Buttons werden on-the-fly erzeugt: ein vorhandenes GIF-Bild wird als Hintergrund verwendet und aktueller Text wird in das Bild geschrieben 53 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Upload - Dialog Dateien können nicht nur auf dem Server (als Downloads) angeboten werden, sie können auch per Formular auf den Server geladen (Upload) und in die Webpräsenz eingefügt werden: 54 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 27 Upload - Send&Receive Begrenzung der Dateigröße <form enctype="multipart/form-data" action="receive.php" method="post"> Ihre Dateiauswahl: <input type="hidden" name="MAX_FILE_SIZE" value="400000"> <input name="userfile" type="file"> <input type="submit" value="Datei senden"> </form> receive.php: ... <? copy ($userfile, "angebot.doc"); ?> Datei-Upload war erfolgreich.<br> Die Datei ist jetzt abrufbar.<br> Test: <a href="angebot.doc">Angebote</a> ... Daten werden in der Datei angebot.doc abgelegt 55 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Abschließende Bemerkung zu CGI Mit Hilfe von CGI leitet ein Server Anfragen an einen externen Prozess weiter: Request CGI1 Request CGI2 Request CGI1 Prozess für CGI1 Prozess für CGI2 Prozess für CGI1 Web-Server mit CGI Mit jeder Anfrage wird ein separater Prozess gestartet. Problem: bei vielen (kurzen) Anfragen ist der Aufwand, den Prozess zu starten, zu synchronisieren und zu beenden (=Overhead), relativ hoch! 56 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 28 Fast-CGI: Der wesentliche Unterschied zwischen CGI und Fast-CGI ist der, dass Fast-CGI für jedes externe Skript ein persistenter (Sohn-)Prozess exisitert: Request CGI1 Prozess für CGI1 Request CGI2 Prozess für CGI2 Request CGI1 Web-Server mit CGI Prozess bleibt bestehen. + Overhead wird reduziert, Verbesserung der Performanz (Antwortverhalten) - es existiert nur 1 Prozess pro Skript! 57 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling Servlets (Java-basiert): Anfragen werden als Threads beantwortet: Servlets starten einen Thread Web-Server mit CGI Request CGI1 Thread Servlet1 Request CGI2 Thread Request CGI1 Thread Servlet2 Servlets sind stärker in den Web-Server eingebettet + Skalierung dynamisch 58 Fb I: KoSi – Entwicklung webbasierter Anwendungen Prof. Dr.-Ing. Hans-Peter Wiedling 29