View
2
Download
0
Category
Preview:
Citation preview
11.11.20 1Webtechnologien - WS 2020/21 - Teil 13/PHP-Bibliotheken
Webtechnologien
Teil 13: PHP IV - Bibliotheken
2Webtechnologien - WS 2020/21 - Teil 13/PHP-Bibliotheken
Übersicht
� Zugriff auf Ordner und Dateien
� Iteratoren
� Streams
� Sessions
� Cookies
3Webtechnologien - WS 2020/21 - Teil 13/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() Schließen des Handles
� Für den Zugriff auf Ordner ist die Klasse dir vorgesehen.
� Die Objekte dieser Klasse haben zwei Attribute:– handle
– path
und die folgenden Methoden:
4Webtechnologien - WS 2020/21 - Teil 13/PHP-Bibliotheken
Zugriff auf Ordner (Objektorientiert) II
$d= dir("."); // öffnet Ordner/erstellt Objekt while($Eintrag= $d->read()) { echo "$Eintrag\n";}$d->close();
$d= dir("."); // öffnet Ordner/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 2020/21 - Teil 13/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 2020/21 - Teil 13/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 2020/21 - Teil 13/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 2020/21 - Teil 13/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 2020/21 - Teil 13/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 bessere Version mit Iterator.
$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 2020/21 - Teil 13/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 auch eigene Iteratoren geschrieben werden.
11Webtechnologien - WS 2020/21 - Teil 13/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 2020/21 - Teil 13/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.
� Zeilen (1) und (2) sind äquivalent.
� Zeile (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 2020/21 - Teil 13/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 Streamname.
� Zeilen (1) und (2) sind äquivalent.
� Siehe: http://php.net/manual/de/function.file-put-contents.php
14Webtechnologien - WS 2020/21 - Teil 13/PHP-Bibliotheken
fopen und fclose
� Öffnen und Schließen von Dateien
� Das Handle ist ein Integer-Wert zur Identifikation der geöffneten 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 2020/21 - Teil 13/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.
� Das Ende muss explizit gelesen werden.
$fh= fopen("file.txt","r");while(!feof($fh)) {
....}
feof(Handle)
16Webtechnologien - WS 2020/21 - Teil 13/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 2020/21 - Teil 13/PHP-Bibliotheken
fgets und fgetcsv
� Einlesen ganzer Zeilen mit der maximalen Länge von Länge.
� fgets() liest eine Zeile einschließlich HTML-Tags
� fgetcsv() füllt ein Array aus einer CSV-Tabelle, z. B. von Excel generiert; auch hier wird bei jedem Aufruf nur eine Zeile gelesen und verarbeitet.
Zeile= fgets(Handle,Länge);Array= fgetcsv(Handle,Länge,Trennzeichen);
18Webtechnologien - WS 2020/21 - Teil 13/PHP-Bibliotheken
Beispiele I
$stream= "http://www.bla.de/index.html";$handle= fopen($stream,"r");while(!feof($handle)) { $data= fgets($handle,400); echo "$data";}
� fgets() liest eine Zeile einschließlich HTML-Tags.
� Der 2. Parameter begrenzt die Länge auf eine Maximalzahl von Zeichen.
19Webtechnologien - WS 2020/21 - Teil 13/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 2020/21 - Teil 13/PHP-Bibliotheken
fputs() und fwrite()
� Es wird der String Text in die geöffnete Datei mit dem angegebenen Handle geschrieben.
� Beide Funktionen leisten dasselbe.
fputs (Handle,Text);fwrite(Handle,Text);
21Webtechnologien - WS 2020/21 - Teil 13/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
� Siehe– https://www.php.net/manual/de/ref.strings.php
– http://phpweb.hostnet.com.br/manual/de/ref.strings.php
– https://www.w3schools.com/php/php_ref_string.asp
– https://www.guru99.com/php-strings.html
22Webtechnologien - WS 2020/21 - Teil 13/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 2020/21 - Teil 13/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 2020/21 - Teil 13/PHP-Bibliotheken
Beispiel
$str= "Hello world!";
for($token= strtok($str," ");$token!==false; $token= strtok(" ")) { echo "|$token|";}
|Hello||world!|Output
25Webtechnologien - WS 2020/21 - Teil 13/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 alles, int offset [, int length])Es wird der Teilstring ab dem Index offset in alles 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 alles)In alles werden alle Teilstrings alt durch neu ersetzt.
26Webtechnologien - WS 2020/21 - Teil 13/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 neben den Filterndas Modul ctype.Siehe: http://php.net/manual/de/book.ctype.php
27Webtechnologien - WS 2020/21 - Teil 13/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 2020/21 - Teil 13/PHP-Bibliotheken
Heredoc/Nowdoc-Verkürzung
Zur Vereinfachung von String-Zuweisungen:
$str=
29Webtechnologien - WS 2020/21 - Teil 13/PHP-Bibliotheken
Arrays I
� int count(mixed var)
liefert die Anzahl der Elemente des Arrays var
� 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: entsprechend String-Reihenfolge
Siehe: https://www.php.net/manual/de/function.sort.php
� int array_search(mixed such, mixed alles)
durchsucht das Array alles nach dem String such und liefert den Index oder false.
30Webtechnologien - WS 2020/21 - Teil 13/PHP-Bibliotheken
Arrays II
� int array_push(array stack, mixed var)
fügt var an das Array stack hinten an.
� mixed array_pop(array stack)
entfernt vom Array Stack 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 2020/21 - Teil 13/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 ein Hash ist, wenn associative true ist.
Die Indices dieses Hashes sind die folgenden:
32Webtechnologien - WS 2020/21 - Teil 13/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 2020/21 - Teil 13/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 2020/21 - Teil 13/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 ……
Output unter Windows
� Unter Windows ist der %C-Wert (und noch andere) nicht implementiert. Unter MacOS gibt es auch Ausnahmen.
� Es muss eine Ersatzfunktion benutzt werden.
� Siehe– https://www.php.net/strftime
– https://stackoverflow.com/questions/35358102/charset-encoding-workaround-for-strftime-on-windows
35Webtechnologien - WS 2020/21 - Teil 13/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)
Siehe auch: https://gist.github.com/ianlandsman/3782120
36Webtechnologien - WS 2020/21 - Teil 13/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 2020/21 - Teil 13/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","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-2012 15:00:002012-06-152012-06-15 15:00:00
38Webtechnologien - WS 2020/21 - Teil 13/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:– 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 2020/21 - Teil 13/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");
� Zeile (1) erzeugt einen Cookie, der mit Ende der Sitzung (Terminieren des Browsers) gelöscht wird.
� Zeile (2) dasselbe jedoch mit einer Lebenszeit von 7 Tagen
� Zeilen (3-5) setzen eines Hashs mit mehreren Cookies
40Webtechnologien - WS 2020/21 - Teil 13/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"
� Auch die Cookies sollten mit den Filterfunktionen ausgelesen werden.
� Da Cookies mit JavaScript 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 2020/21 - Teil 13/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/die Surfer/in dies veranlasst 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 2020/21 - Teil 13/PHP-Bibliotheken
Sessions II
� Die Session-ID kann in Cookies gespeichert werden, jedoch immer mit gesetztem Secure-Flag.Alternative: Übergabe in der URL oder in Formularen
� Session-IDs 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 2020/21 - Teil 13/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 2020/21 - Teil 13/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 2020/21 - Teil 13/PHP-Bibliotheken
Probleme und Fall Backs
� In jedem Formular ein verstecktes Feld (type="hidden") mit dem Wert der Session-ID generieren, aber– 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 (Übertragung in der URL, also mit GET):
46Webtechnologien - WS 2020/21 - Teil 13/PHP-Bibliotheken
Lebensdauer von Sessions
� Eine Session endet spätestens, wenn der Session-Cookie verschwindet.
� Die Session-Cookies sollten als temporäre Cookies dem Browser mitgeteilt werden, 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() und session_decode()
� Zum Serialisieren von Objekten:serialize() und unserialize()
47Webtechnologien - WS 2020/21 - Teil 13/PHP-Bibliotheken
Und noch vieles mehr...
� Fehlerbehandlung, z. B. Laufzeitfehler
� 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 2020/21 - Teil 13/PHP-Bibliotheken
Nach dieser Anstrengung etwas Entspannung...
Recommended