(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 &Ouml;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">&nbsp;
<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&ouml;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&auml;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