48
11.11.20 1 Webtechnologien - WS 2020/21 - Teil 13/PHP-Bibliotheken Webtechnologien Teil 13: PHP IV - Bibliotheken

Webtechnologien Teil 13: PHP IV - Bibliothekenwi.f4.htw-berlin.de/users/messer/LV/WI-WT-WS20/Folien/WT-13/WT-13-PHP-V-1.pdfWebtechnologien - WS 2020/21 - Teil 13/PHP-Bibliotheken 6

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

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...