Übungsblatt 9: Cookies und Sessions

Aufgabe 1: Amazone III Cookies

Im Gegensatz zu Computerprogrammen besitzen Webanwendungen zunächst keine Möglichkeit, Benutzereinstellungen zu speichern. Eine Möglichkeit, dieses Problem zu lösen, besteht darin, die erforderlichen Daten auf dem Server zu speichern. Dieser Ansatz hat zwei Nachteile: Zunächst besteht per se keine Verbindung zwischen den Daten und dem Benutzer. Um diese herzustellen, müsste eine Benutzerverwaltung, mit Erfassung des Benutzernamens und eines Passworts etc., eingeführt werden. Ebenfalls würden die gespeicherten Anwendungsdaten die Bereitstellung einer vom Benutzeraufkommen abhängigen Menge von Speicherplatz auf dem Server erfordern, nebst einer Verwaltung dieser Daten.

Cookies lösen dieses Problem durch für den Benutzer transparentes Speichern der Anwendungsdaten auf dem Rechner des Benutzers. Dabei werden die Daten automatisch mit der zugehörenden Website assoziiert.

Aus PHP heraus ist es möglich, Cookies auf dem Rechner des Anwenders zu platzieren und von dort, beim nächsten Aufruf des zugehörenden PHP-Scripts, wieder einzulesen. Die Cookie-Daten werden bei Aufruf der PHP-Seite automatisch im HTML-Header mit übertragen. Mittels Cookies ist es also auf einfache Art möglich, zunächst flüchtige PHP-Variablen in statische Variablen umzuwandeln, deren Werte zwischen den Aufrufen der PHP-Seite erhalten bleiben und so dauerhafte Einstellungen bzw. Daten zu speichern.

Website-Betreiber benutzen Cookies häufig, um den Rechner eines Surfers mit einer ID zu versehen, die auch dann funktioniert, wenn der/die Surfer/-in dynamisch IP-Adressen zugeteilt bekommt. Auf diese Weise kann der Rechner - und damit mit hoher Wahrscheinlichkeit auch der vormalige Besucher der Webseite - wiedererkannt und ein Profil der von ihm/ihr besuchten Webseiten erstellt werden. Derartige Informationen werden dann z. B. für Marktforschungszwecke eingesetzt. Der Gebrauch derartiger "Tracking-Cookies" hat diese Technologie in Verruf gebracht. Aus diesem Grund besteht für Benutzer die Möglichkeit, den Gebrauch von Cookies in ihren Browsern einzuschränken oder zu deaktivieren. Hierfür existieren in den Browsern recht umfangreiche Cookie-Manager.

Nichtsdestotrotz sind Cookies ein einfaches Hilfsmittel, eine/-n Surfer/-in persönlich anzusprechen und sie oder ihn persönliche Einstellungen abspeichern zu lassen.

In der ersten Übung probieren wir die Cookie-Technologie an Hand eines Zugriffszählers aus. Ein derartiger Zähler kann benutzt werden, um neue Besucher, die eine Webseite zum ersten Mal aufsuchen, zu identifizieren, sie entsprechend zu begrüßen und ggf. Hilfeinformation zum Gebrauch der Webanwendung anzuzeigen. Später kann der Zugriffszähler dann z. B. benutzt werden, um aktuelle (Sonder-)Angebote einzublenden, die sich ebenfalls an den persönlichen Vorlieben des Benutzers orientieren können. Bei häufigerem Aufruf der Webseite könnte der Benutzer auch dazu animiert werden, Vertragskunde zu werden.

Abb.1-2: Unterschiedliche Begrüßungen durch Cookies
  1. Implementieren Sie einen Zugriffszähler für ihren Webshop "Amazone" in der Art, dass bei Erstaufruf des Webauftritts eine Begrüßungsmeldung erscheint, die den Kunden gleichzeitig - unter Gewährung eines Einkaufsgutscheines - dazu animiert, seine/ihre Kundendaten einzugeben, siehe Abb. 1. Sie brauchen das Webformular für die Eingabe der Kundendaten aber nicht zu programmieren.

    Weitere Aufrufe führen dann zur Anzeige aktueller (fiktiver) Sonderangebote (s. Abb. 2).

    Auch hier gilt, dass Sie den Link auf die Sonderangebote nicht explizit programmieren müssen. D. h., Sie brauchen keine HTML-Seite mit Sonderangeboten zu erstellen.

    Hinweis: Wählen Sie eine relativ kurze Verfallszeit von 60s oder weniger für ihren Cookie, damit Sie durch wiederholtes Abschicken von Anfragen zwischen den verschiedenen Meldungen automatisch umschalten können.

  2. Erweitern Sie die Darstellung der Suchergebnisse derart, dass nun auch die Anzahl der gefundenen Suchergebnisse ausgegeben wird. Die Anzahl steht im Objekt des Suchergebnisses in der Eigenschaft num_rows.



Abb.3: Ausgabe der Anzahl der Suchergebnisse

Aufgabe 2: Amazone III Sessions

Bisher haben die Kunden des Online-Shops "Amazone" nur die Möglichkeit nach Büchern zu suchen - sie können die gefundenen Bücher noch nicht kaufen. Was fehlt, ist also ein Warenkorb, dem der Kunde die gewünschten Bücher hinzufügen kann, um schließlich auf der Grundlage des Inhalts des Warenkorbs eine Bestellung abzuschicken. In dieser Übung werden wir den Online-Shop dahingehend erweitern, dass der/die Kund/-in ausgewählte Bücher in einen Warenkorb legen und sich den Inhalt des Warenkorbs anzeigen lassen kann. Den Bestellvorgang selbst werden wir nicht implementieren.

Abb.4: Webshop mit Warenkorb

Um einen Warenkorb zu erstellen, benötigen wir eine Möglichkeit, die Daten einer Sitzung temporär zwischenzuspeichern. Anderenfalls würden einmal ausgewählte Bücher einfach verschwinden, sobald wir eine neue Suchanfrage an den Server schicken.

Cookies, Serverdateien und statische Variablen scheiden in diesem Zusammenhang aus, da Cookies sich nicht für die Abspeicherung größerer Datenmengen eignen und ggf. im Browser deaktiviert sind. Serverdateien lassen auf der anderen Seite keine implizite Zuordnung zu einem bestimmten Kunden zu. Eine Kundenverwaltung wäre zusätzlich zu implementieren. Die Werte statischer Variablen bleiben schließlich nur zwischen Funktionsaufrufen innerhalb derselben PHP-Datei erhalten, aber nicht zwischen den Aufrufen einer PHP-Datei.

Wie in der Vorlesung erläutert, bietet uns PHP aber die Möglichkeit, Daten einer Sitzung mittels einer so genannten "Session" zwischenzuspeichern. Durch das Starten einer Session erhält der jeweilige Besucher eine eindeutige ID, die so genannte Session-ID. Diese wird automatisch vergeben und entweder benutzerseitig in einem Cookie des Browsers abgelegt oder in der URL übermittelt, sofern beim Besucher die Benutzung von Cookies im Browser deaktiviert ist.

  1. Passen Sie zunächst die Formatierung der Suchresultate in der PHP-Datei ihres "Amazone"-Shops so an, dass am Ende einer jeden Zeile der Ergebnisliste nun zusätzlich ein Link erscheint, mit dem das zugehörende Buch einem Warenkorb hinzugefügt werden kann. (Abb. 4)

  2. Der Link dient dazu, eine zum Warenkorb gehörende PHP-Datei basket.php aufzurufen. Die Aufgabe dieses Scripts besteht darin, das ausgesuchte Buch im Warenkorb abzulegen und danach den momentanen Inhalt des Warenkorbs anzuzeigen. Zu diesem Zweck wird im Script eine Sessionvariable erzeugt (s. u.), in der die Daten des Buchs abgespeichert werden können. Dafür ist es erforderlich, die Information, welches Buch ausgewählt wurde, in das Script zu transferieren. Hierfür eignet sich am besten eine Variable mit der ID, die das Buch in der Datenbank besitzt. Die PHP-Datei wird also wie folgt aufgerufen:

    <a href = 'basket.php?buy=$row[ID]' target='Warenkorb'>Hinzufügen</a> 

    In diesem Beispiel wird die ID des ausgesuchten Buches der Spalte "ID" der zum Buch gehörenden Zeile der Ergebnistabelle der Suchanfrage entnommen. Die Zeile ist im Feld $row abgelegt. Die ID wird in der Variable buy an basket.php geliefert.

    Die Angabe eines Ziels mit target bewirkt, dass die Ausgaben der aufgerufenen PHP-Datei in einem Browser-Fenster mit Namen "Warenkorb" angezeigt werden. Dieses wird geöffnet, wenn es noch nicht existiert. Auf diese Weise ist die Implementierung einer Rückkehrfunktion in der aufgerufenen PHP-Datei vermeidbar, da das alte Browser-Fenster mit der Eingabemaske für Suchanfragen erhalten bleibt.

  3. In der Datei basket.php wird zunächst mit session_start() eine Session erzeugt oder wiederhergestellt. Da session_start() versucht, einen Cookie anzulegen und somit Header-Information transferiert, ist es wichtig, dass diese Funktion aufgerufen wird, bevor irgendeine Ausgabe mit echo() aus PHP heraus erfolgt.

    Nach Anlegen der Session wird einer Sessionvariable $_SESSION["basket"] die in der Variable buy gelieferte Buch-ID als nächstes Feldelement zugewiesen.

  4. Um den Inhalt des Warenkorbs ausgeben zu können, ist es erforderlich, die Daten, d. h. Autorname, Buchtitel etc., der ausgewählten Bücher zu restaurieren, da in der Session nur die IDs dieser Bücher hinterlegt sind. Nur diese wurden ja an basket.php übergeben.
    Die Buchinformationen lassen sich aus der Buchdatenbank unter den gegebenen IDs mit einer entsprechenden Suchanfrage wiederherstellen. Es wird daher zunächst eine Verbindung zum MySQL-Server aufgebaut und nachfolgend für jedes im Array $_SESSION["basket"] eingetragene Buch der zur ID des Buches gehörende Datensatz ausgelesen. Die Daten werden dann wieder - wie in Abbildung 5 und 6 zu sehen - in Tabellenform angezeigt.

Abb.5-6: Warenkorb mit einem und zwei Artikeln

Gestalten Sie ihren Warenkorb wieder mit Hilfe von CSS.