Webtechnologien Teil 9: PHP IV -...
Transcript of Webtechnologien Teil 9: PHP IV -...
15.12.18 1Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Webtechnologien
Teil 9: PHP IV - Bibliotheken
2Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Übersicht
• Zugriff auf Ordner und Dateien auf dem Server
• Iteratoren
• Streams
• Standard-Funktionen
• Sessions
3Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Zugriff auf Ordner (Objektorientiert) I
Methode Erläuterung
dir(Pfad) Konstruktor der Klasse
read Auslesen des Ordnereintrags
rewind Zurücksetzen des Ordnerzeigers
close(Handle) Schließen des Handles
• Für den Zugriff auf Ordner ist die Klasse dir vorgesehen.
• Die Objekte der Klasse dir haben zwei Attribute:– handle
– path
und die folgenden Methoden:
4Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Zugriff auf Ordner (Objektorientiert) II
$d= dir("."); // öffnet Ordner und erstellt Objektwhile($Eintrag= $d->read()) { echo "$Eintrag\n";}$d->close();
$d= dir("."); // öffnet Ordner und erstellt Objektwhile($Eintrag= $d->read()) { if (is_dir($Eintrag)) { echo "Ordner $Eintrag\n"; } else { echo "Datei $Eintrag\n"; }}$d->close();
bool is_dir(string path)liefert true, wenn die Datei path ein Ordner ist
5Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Zugriff auf Dateien I - Beispiele
string getcwd() liefert den Dateinamen des Arbeitsordners
chdir(string Pfad) wechselt das Arbeitsverzeichnis zu Pfad
copy(string source, string destination)
kopiert eine Datei
rename(string alt, string neu) benennt eine Datei um
unlink(string Pfad) löscht eine Datei
mkdir(string Pfad) legt einen Ordner an
rmdir(string Pfad) löscht einen Ordner
Das sind Bibliotheksroutinen, die nicht-objektorientiert verwendet werden.Die Prozeduren liefern ein True-Wert, wenn es geklappt hat.
6Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Zugriff auf Dateien II - Beispiele
bool is_dir(string Pfad) true falls Datei ein Ordner ist
bool is_executable(string Pfad) true falls Datei ausführbar ist
bool is_file(string Pfad) true falls Datei eine normale Datei ist
bool is_link(string Pfad) true falls Datei ein Link ist
bool is_readable (string Pfad) true falls Datei lesbar ist
bool is_writable (string Pfad) true falls Datei beschreibbar ist
bool file_exists(string Pfad) true falls Datei existiert
string filetype(string Pfad) Typ der Datei als String
Das sind Bibliotheksroutinen, die nicht-objektorientiert verwendet werden.
• filetype() gibt den Typ der Datei als String zurück,mögliche Werte sind:– "file", "dir", "link" und "unknown" (und noch weitere).
– Siehe http://de.php.net/manual/de/function.filetype.php
7Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Iteratoren I
• Das obige Beispiel noch einmal in nicht-objektorientierter Form
• Diese Version hat sowohl hier und auch oben einen Fehler:Was passiert, wenn es eine Datei mit dem Namen "0" gibt?
• Hinweis: "0" wird in false konvertiert.
$dir=".";$d= opendir($dir);while($entry= readdir($d)) { echo "$entry\n";}closedir($d);
8Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Iteratoren II
• Die obige Lösung ist nun korrekt.
• Unten dasselbe mit einem Iterator-Objekt, das die Probleme berücksichtigt.
$d= opendir(".");while(false!==($entry= readdir($d))) { echo "$entry\n";}closedir($d);
foreach (new DirectoryIterator(".") as $entry) { echo "$entry\n";}
9Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Iteratoren III - Es wird noch schlimmer
• Läuft die obige Version unter Windows? Schauen Sie sich die Trenner zwischen Ordner und Dateinamen an.
• Unten steht die die korrekte Version mit Iterator, vorausgesetzt, dass unter dem angegebenen Ordner die Inhalte vorhanden sind.
$dirname= '/opt/www/'; $dir= opendir($dirname);while(false!==($Entry= readdir($dir))) { if (is_file($dirname.DIRECTORY_SEPARATOR.$Entry)) { echo "File $Entry\n"; } }closedir($dir);
foreach (new DirectoryIterator("/opt/www/") as $Entry) { if (!$Entry->isDir()) { echo "$Entry\n"; }}
10Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
DirectoryIterator-Methoden
string getPath() Liefert den Pfad ohne Datei
string getFilename() Liefert den Dateinamen
string getPathname() Liefert den Pfad mit Dateinamen
bool isDir() True falls Datei ein Verzeichnis ist
bool isDot() True falls Datei ein Verzeichnis mit den Namen "." oder ".." ist
• Es gibt für viele Anwendungsfälle vorgefertigte Iteratoren.• Neben diesen "Grunditeratoren" gibt es noch Filter, die wie in einer
Kette hintereinander geschaltet werden können.• Es können eigene Iteratoren geschrieben werden.
11Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Streams
• Stream = Abstrakte Schnittstelle zu Datenquellen
• Streams realisieren eine einheitliche Schnittstelle zu verschiedenen Datenquellen. Auch das ist eine Form von Wrapper-"Klassen".
• Es gibt u.a. Streams für folgende Datenquellen:– Dateien (file)
– http und https
– ftp
– Standard-Ein/Ausgabe (php)
• Namen von Streams haben folgenden syntaktischen Aufbau:
"Quelle://Objekt"
Objekt ist in der Regel der Dateiname bzw. die URL.
12Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
(1) $data= file_get_contents("file://opt/www/index.html");
(2) $data= file_get_contents("/opt/www/index.html");
(3) $data= file_get_contents("http://www.google.de/index.html");
(4) $data= file_get_contents("Klasse.php",true);
Beispiele I - file_get_contents
• Es wird der gesamte Dateiinhalt in die Variable $data eingelesen.
• (1) und (2) sind äquivalent.
• (3) zeigt, wie auf das Web zugegriffen werden kann.
• Der 2. Parameter in (4) bewirkt, dass die Datei entsprechend dem Include-Pfad in mehreren Ordnern gesucht wird.Dieser Pfad wird in der php.ini-Datei definiert.
• Siehe: http://php.net/manual/de/function.file-get-contents.php
13Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
(1) file_put_contents("file://opt/www/index.html",$data);
(2) file_put_contents("/opt/www/index.html",$data);
Beispiele II - file_put_contents
• Aus der Variablen $data wird deren gesamter Inhalt als Datei geschrieben.
• Der erste Parameter ist der Dateiinhalt.
• (1) und (2) sind äquivalent.
• Siehe: http://php.net/manual/de/function.file-put-contents.php
14Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
fopen und fclose
• Öffnen und Schließen von Dateien
• Das Handle ist ein Integer-Wert zur Identifikation der Datei.
• Modi:
Handle= fopen(Dateiname,Modus);
fclose(Handle);
Modus Erläuterung
r Read, Zeiger auf Anfang
r+ Read/Write , Zeiger auf Anfang
w Write, Zeiger auf Anfang, Neuanlage einer bestehenden Datei
w+ Read/Write , Zeiger auf Anfang, Neuanlage einer bestehenden Datei
a Write, Zeiger ans Ende
a+ Read/Write , Zeiger ans Ende
$fh= fopen("data.txt","r");
fclose($fh);
15Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Abfrage auf End-of-File (EOF)
• Abfrage auf End of File (EOF)Diese Funktion liefert true, wenn das Ende der Datei erreicht ist, ansonsten false.
$fh= fopen("file.txt","r");while(!feof($fh)) {
....}
feof(Handle)
16Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Beispiel für Benutzung von Dateien
• Derselbe Code kann auch mit anderen Quellen arbeiten, z.B. mit$stream= "http://www.bla.de/index.html";
$stream= "http://www.bla.de/robots.txt";
In diesen Fällen wird eine Verbindung mit den entsprechenden Servern aufgebaut und über diese der Dateiinhalt geholt.
$stream= "index.php";$handle= fopen($stream,"r");while(!feof($handle)) { $data= fread($handle,1024); echo "$data";}fclose($handle);
17Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
fgets, fgetss, fgetcsv
• Einlesen ganzer Zeilen mit der maximalen Länge von Länge.
• fgets() liest eine Zeile einschließlich HTML-Tags
• fgetss() liest eine Zeile und entfernt HTML-Tags, die durch Leerzeichen eersetzt werden. Diese Funktion ist ab PHP 7.3 nicht mehr zu benutzen.
• fgetcsv() füllt ein Array aus einer CSV-Tabelle, z. B. von Excel generiert; auch hier wird bei jedem Aufruf nur eine Zeile gelesen.
Zeile= fgets(Handle,Länge);Zeile= fgetss(Handle,Länge); // ab PHP 7.3 nicht mehrArray= fgetcsv(Handle,Länge,Trennzeichen);
18Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Beispiel I
$stream= "http://www.bla.de/index.html";$handle= fopen($stream,"r");while(!feof($handle)) { $data= fgetss($handle,400); echo "$data";}
• fgets() liest eine Zeile einschließlich HTML-Tags.
• fgetss() liest eine Zeile und entfernt HTML-Tags(es werden dann meist Leerzeilen entstehen).
19Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Beispiele II
1,Kritik der reinen Vernunft,Kant,"17,80",Philosophie2,Hamlet,Shakespeare,"32,00",Drama3,Die Leiden des jungen Werthers,Goethe,"15,20",Drama4,Die Physiker,Dürrenmatt,"7,50",Drama
$handle= fopen("Book.csv","r");$data= fgetcsv($handle,400);var_dump($data);fclose($handle);
array(5) { [0]=> string(1) "1" [1]=> string(26) "Kritik der reinen Vernunft" [2]=> string(4) "Kant" [3]=> string(5) "17,80" [4]=> string(11) "Philosophie"}
20Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
fputs() und fwrite()
• Es wird das String/Array Text auf die Datei geschrieben.
• Beide Funktionen leisten dasselbe.
fputs (Handle,Text);fwrite(Handle,Text);
21Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Strings I (Auszug)
Operation Erläuterung
string strtoupper(string a) Konvertierung zu Großbuchstaben
string strtolower(string a) Konvertierung zu Kleinbuchstaben
bin2hex(string c) Konvertiert nach Hexadezimal
int strlen(string s) Liefert die Länge des Strings s
Variable[Index] Zugriff auf ein Zeichen im String
22Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Beispiel
01-10
Dies ist ein Beispiel für eine Routine, die eine 0 liefert,wenn beide Strings gleich lang sind, eine 1, wenn dererste länger und eine -1, wenn der erste kürzer als derzweite String ist.
function CompLen($s1,$s2) { if(strlen($s1)==strlen($s2)) { return 0; } return((strlen($s1) > strlen($s2)) ? 1 : -1);}
echo CompLen("a","a")."\n";echo CompLen("ab","a")."\n";echo CompLen("a","ab")."\n";echo CompLen(42,"ab")."\n";
23Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Strings II
Operation Erläuterung
explode(char c, string a [, int limit])
Teilt syntaktisch den String a anhand des Trenners c und liefert ein Array
implode(string a, array src) Setzt Array-Elemente durch a getrennt zu einem String zusammen
strtok(string a[, int delim])
Zerlegt Zeichenkette in Token, die einzeln bei jeden Aufruf geliefert werdensiehe: http://php.net/manual/de/function.strtok.php
Diese Routinen dienen der Analyse komplexer Eingaben.
24Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Beispiel
$str= "Hello world!";
for($token= strtok($str," ");$token!==false; $token= strtok(" ")) { echo "|$token|";}
|Hello||world!|Output
25Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Strings III – Auszüge aus der langen Liste
int strpos(string alles, string such [, int offset])Es wird die Zeichenkette such im String alles ab der Positionoffset gesucht und deren Position bestimmt bzw. false geliefert.
int substr_count(string alles, string such)Wie strpos, nur dass die Häufigkeit von such in alles geliefertwird
string substr(string s, int offset [, int length])Es wird der Teilstring ab dem Index offset in s bis zur maximalenLänge length geliefert.
string substr_replace(string s,string neu,int offset [,int length])Der Bereich in s wird ab der Position offset mit der maximalenLänge length durch neu ersetzt.
string str_replace(string alt, string neu, string s)In s werden alle Teilstrings alt durch neu ersetzt.
26Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Strings IV - Sonderfunktionen
Name Erläuterung
addslashes Setzt \ vor Sonderzeichen: ' " \ NUL
quotemeta Setzt \ vor Sonderzeichen: . \ + * [ ] ^ ( $ )
html_specialchars Ersetzt folgende Zeichen nach HTML: & " < >
ltrim Entfernt führende Leerzeichen (links)
rtrim Entfernt angehängte Leerzeichen (rechts)
trim Entfernt Leerzeichen vorne und hinten
Zur Überprüfung der Eingaben dient auch das Modul ctype.http://php.net/manual/de/book.ctype.php
27Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Strings V - Formatierungen
string sprintf($Format, $arg1, $arg2 ...)
$Datum= sprintf("%04d-%02d-%02d", $year, $month, $day);
printf($Format, $arg1, $arg2 ...)
printf("%04d-%02d-%02d", $year, $month, $day);
Daneben gibt es noch die Funktionen sscanf etc. wie aus C und Java bekannt...
Dokumentation des Format-Strings:http://de3.php.net/manual/de/function.sprintf.php
28Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Heredoc-Verkürzung
Zur Vereinfachung von String-Zuweisungen:
$str= <<<EOS Dies ist ein mehrzeiliger String, in dem auch PHP-Variablen ersetzt werden - es werden aber keine Escape-Zeichen vor einem " oder ' benötigt, was die Sache wirklich vereinfacht. EOS
• Statt "EOS" kann auch ein anderer String verwendet werden; dieser begrenzt den String auf der rechten Seite der Zuweisung.
• Das beendende "EOS" muss in der 1. Spalte der Zeile stehen, ein Einrücken ist nicht möglich.
• Der String "EOS" kann im Text selbst benutzt werden, aber nicht in der 1. Spalte einer Zeile stehend.
29Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Arrays I
• int count(mixed var)
liefert die Anzahl der Elemente von var, z. B. von einem Array
• sort(array a [, int sorttyp])
sortiert das Feld a entsprechend der Sortierungsangabe sorttyp.Es stehen folgende Möglichkeiten zur Verfügung:
SORT_REGULAR: normale Sortierung (Default)
SORT_NUMERIC: numerische Sortierung (nach internem Wert)
SORT_STRING: alphanumerische Sortierung (nach Zeichenordnung)
• int array_search(mixed such, mixed alles)
durchsucht das Array alles nach dem String such und liefert den Index oder false
30Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Arrays II
• int array_push(array stack, mixed var)
fügt var an das Array stack nach der Stack-Methode an.
• mixed array_pop(array stack)
entfernt vom Array Stack nach der Stack-Methode das letzte Element.
• int array_unshift(array queue, mixed var [, mixed var ...])
fügt die Elemente var etc. an den Anfang des Array queue an und liefert die neue Anzahl von Elementen.
• mixed array_shift(array queue)
liefert das erste Element und löscht dieses (nach vorne schieben).
31Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Datum und Zeit
Index Erläuterung Index Erläuterung
tm_sec Sekunden tm_year Jahr (2-/3-stellig)
tm_min Minuten tm_wday Tag der Woche (0..6)
tm_hour Stunden tm_yday Tag des Jahres
tm_mday Tag im Monat tm_isdst Flag auf Sommerzeit
tm_mon Monat (0..11)
int time()
liefert die UNIX-Zeit in Sekunden seit 1.1.1970
array localtime(int UNIXZeit [, bool associative])
Es wird die Zeit UNIXZeit in ein Array konvertiert, das einHash ist, wenn associative true ist.
Die Indices dieses Hashes sind die folgenden:
32Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Beispiel
$now= time();
$what= localtime($now, true);echo $what['tm_mday']."\n";
$Monate= Array("Januar","Februar","März","April","Mai","Juni", "Juli","August","September","Oktober","November","Dezember");$jetzt= localtime(time(), true);$jetzt['tm_year']+= 1900; // auf 4 Stellen bringen
$Monat= $jetzt['tm_mon'];echo "Heute haben wir den Monat $Monate[$Monat]\n";
15Heute haben wir den Monat Juni
33Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Formatieren der Ausgabe I
Deskriptor Erläuterung Deskriptor Erläuterung
%a, %A Abgekürzter, ausgeschriebener Wochentag %n Neue Zeile
%b, %B Abgekürzter, ausgeschriebener Monat %p "am" bzw. "pm"
%c Default %S Sekunden 00..59
%C Jahrhundert 00-99 %t Tabulator
%d Tag des Monats %u Tag der Woche
%H, %i Stunde 00..23, 01..12 %V Kalenderwoche 01..53
%j Tag des Jahres 001..366 %y, %Y Jahr 00..99, YYYY
%m Monatzahl 01..12 %Z Zeitzone
%M Minute 00..59 %% %
string strftime(string format [, int UNIXZeit])
entsprechend den Deskriptoren in format wird die aktuelle Zeit bzw. die in UNIXZeit angegebene Zeit als String geliefert.
Deskriptoren für format:
34Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Formatieren der Ausgabe II
echo strftime("%A, der %d. %B %Y")."\n";echo strftime("%d.%m.%Y %H:%M:%S")."\n";echo strftime("Wir leben im %C.Jahrhundert, oder?")."\n";
Friday, der 15. June 201215.06.2012 20:54:59Warning: Invalid CRT parameters detected in ……
Unter Windows ist der %C-Wert (und noch andere) nicht implementiert.
Es muss eine Ersatzfunktion benutzt werden.
Output unter Windows
35Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Formatieren der Ausgabe III - Windows
echo strftime_win32("%A, der %d. %B %Y")."\n";echo strftime_win32("%d.%m.%Y %H:%M:%S")."\n";echo strftime_win32("Wir leben im %C.Jahrhundert, oder?")."\n";
Friday, der 15. June 201215.06.2012 20:57:59Wir leben im 20.Jahrhundert, oder?
Dies ist zwar nicht richtig, aber von PHP korrekt realisiert, da %C die erstenbeiden Ziffern des Jahres liefert.
Output unter Windows (mit der Ersatzfunktion)
36Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Konvertieren des Datums
int mktime(int hour, int minute, int second, int month, int day, int year)
erzeugt eine UNIX-Zeit aus den Parametern.
$Zeit= mktime(2,0,5,11,5,1980);echo strftime("Der %d.%m.%y war ein %A", $Zeit);
Bitte beachten:Das Datum für SQL-Abfragen gehorchtnicht dem deutschen Format!
37Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Zeitangaben in SQL-Abfragen
Siehe: http://dev.mysql.com/doc/refman/5.1/de/date-and-time-functions.htmlDie obige Routine stammt aus der PHP-Doku-mentation.
function format_date($original, $format) { $format=($format=='date' ? "%m-%d-%Y" : $format); $format=($format=='datetime' ? "%m-%d-%Y %H:%M:%S": $format); $format=($format=='mysql-date' ? "%Y-%m-%d" : $format); $format=($format=='mysql-datetime'?"%Y-%m-%d %H:%M:%S": $format); return (strftime($format, strtotime($original)));} echo format_date("15.06.2012 15:00:00")."\n";echo format_date("15.06.2012 15:00:00","date")."\n";echo format_date("15.06.2012 15:00:00","datetime")."\n";echo format_date("15.06.2012 15:00:00","mysql-date")."\n";echo format_date("15.06.2012 15:00:00","mysql-datetime")."\n";
06/15/201206-15-201206-15-2012 15:00:002012-06-152012-06-15 15:00:00
38Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Cookies I - Setzen
• Durch setcookie() wird ein Cookie generiert, das mit der korrespondierenden HTTP-Antwort zum Client gesendet wird.
• Name, Wert, Pfad und Domain sind Strings;Secure ist ein Boole'sches Flag
• Expiration ist das Verfallsdatum im UNIX-Zeit;dazu gibt es folgende Routinen (siehe oben):– time() liefert die aktuelle Uhrzeit als UNIX-Zeit
– mktime(hh,mm,ss,MM,DD,YYYY) generiert aus den Integer-Parametern die korrespondierende UNIX-Zeit
setcookie(Name, Wert, Expiration [, Pfad, Domain, Secure]);
39Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Beispiele
(1) setcookie("Name","Ferdinand I");(2) setcookie("Name","Ferdinand I",time()+7*24*60*60);
(3) setcookie("Essen[Name]","Amore");(4) setcookie("Essen[Sorte]","Spaghetti");(5) setcookie("Essen[Groesse]","Mega");
• (1) erzeugt einen Cookie, der mit Ende der Sitzung (Terminieren des Browsers) gelöscht wird
• (2) dasselbe jedoch mit einer Lebenszeit von 7 Tagen
• (3)-(5) setzen eines Hashs mit mehreren Cookies
40Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Cookies II - Auslesen
• Die empfangenen Cookies werden über die CGI-Schnittstelle gelesen und im folgenden Hash abgelegt: $_COOKIE['CookieName'].
• In dem obigen Beispiel gibt es folgende Cookie-Werte:– $_COOKIE['Name'] mit dem Wert "Ferdinand I"
– $_COOKIE['Essen'] als Hash mit folgenden Werten:� $...['Name'] =="Amore"� $...['Sorte'] =="Spaghetti"� $...['Groesse']=="Mega"
• Da Cookies erzeugt oder verändert werden können, muss vor jeder Benutzung der Inhalt geprüft werden.
Es muss alles, was von draußen kommt, geprüft werden, alsoauch der Inhalt von Cookies.
41Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Sessions I
• Session = Zuordnung von Variablen zu einem Benutzer, wobei diese Zuordnung über mehrere HTTP-Requests besteht
• Session-ID = zufälliger 32 bit-Schlüssel zur Identifikation eines Benutzers
• Alle HTTP-Requests mit derselben Session-ID führen dazu, dass registrierte Variablen allen Skripten zur Verfügung stehen
• Eine PHP-Session endet, wenn der Browser die Seite verlässt oder eine bestimmte Zeit der Inaktivität vergangen ist.
• Sessions lassen sich aber auch anders realisieren, d.h. ohne den PHP-internen Mechanismus zu benutzen.
42Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Sessions II
• Die Session-ID kann in Cookies gespeichert werden, jedoch immer mit gesetztem Secure-Flag.Alternative: Übergabe per URL
• Sensible Dinge sollten immer per TLS übertragen werden, da unverschlüsselte Cookies/URLs erschnüffelt und auch von Proxies und Firewalls protokolliert werden können.
bool session_start()erzeugt eine Session oder setzt sie fort; liefert true, wenn es klappte.
string session_id([string key])liefert den 32 bit-Schlüssel zurück. Wird ein Parameter angegeben, so überschreibt dieser den aktuellen Wert.
bool session_destroy()löscht alle gespeicherten Daten der Session,danach ist session_start() notwendig
43Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Beispiele
$Klappt_es= session_start();if($Klappt_es) { echo "Wow! ID= ".session_id();} else { echo "Schaaade";}
session_start();echo "Sie heißen $_SESSION['Name']";
session_start();$_SESSION['Name']= "Elisabeth Müller";$_SESSION['KundeNr']= "4711";
Definition derSession-Variablen
Spätere Benutzungder Session-Variablen
44Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Bemerkungen
• session_start() muss vor dem ersten Generieren von Daten, d.h. ganz am Anfang, aufgerufen werden.
• Ausnahmen:– Ändern des Sessionnamens mit session_name(NeuerName);– Beim Hinzufügen von Objekten zu Sessions muss die
Objektdefinition vollständig geladen sein bevor session_start() aufgerufen wird.
• Es ist beim erstmaligen Zugriff auf eine Session-Variable deren Registrierung zu prüfen:
Beispiel:
if (isset($_SESSION['$CustomNumber'])) { $KundNr= $_SESSION['$CustomNumber'];}
45Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Probleme und Fall Backs
• In jedem Formular ein verstecktes Feld (type="hidden") mit dem Wert der Session-ID generieren.Nicht so gute Lösung, denn– sie funktioniert nur innerhalb von Formularen, d.h. alles muss dann
per Formular abgehandelt werden.
– Oder die Session-ID wird als Teil einer einer URL verwendet (s.u.)
– dies ist nur bei der Methode POST sicher, denn es wird bei jedem Link über GET die Session-ID mit geliefert. Im Referer steht dann die Session-ID. Bei der URL-Verwendung wird immer GET verwendet.
Was ist, wenn keine Cookies benutzt werden können?
Beispiel:
<a href="...URL.../Scriptname?SID=<?php echo $SID?>">wenn in $SID die Session-ID abgelegt ist.
46Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Lebensdauer von Sessions
• Eine Session endet spätestens, wenn der Session-Cookie verschwindet.
• Die Session-Cookies werden als temporäre Cookies dem Browser mitgeteilt, was bedeutet, dass sie mit dem Terminieren des Browsers gelöscht werden.
• Temporär werden sie dadurch, dass ihr Verfallsdatum in der Vergangenheit liegt.
• Wenn die Session-Daten später noch verwendet werden sollen, müssen sie serialisiert als String in eine Datenbank gebracht bzw. in eine Datei geschrieben werden.
• Zum Serialisieren von Sessions gibt es die Funktionen:– session_encode()
– session_decode()
• Zum Serialisieren von Objekten: serialize() und unserialize()
47Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Und noch vieles mehr...
• Fehlerbehandlung, z. B. Laufzeitfehler
• Freie Socket-Programmierung
• Erstellen und Bearbeiten(!) von Grafiken
• Generieren von PDF
• FTP-Zugriffe
• Behandlung von XML
In PHP ist noch folgendes möglich:
und noch viele weitere Bibliotheken, die täglich mehr werden....
48Webtechnologien - WS 2018/19 - Teil 9/PHP-Bibliotheken
Nach dieser Anstrengung etwas Entspannung...