Inhalt

Sessions mit PHP - Benutzeridentifikation und Weitergabe von Daten

Wenn ein Benutzer auf die Website kommt, dann ist jeder Zugriff unabhängig von jedem anderen Zugriff. Die PHP-Applikation weiß nicht, ob 10 verschiedene Benutzer die Webseite abrufen oder ob ein Benutzer die Seite 10 mal lädt.

Das bezeichnet man als stateless (zustandslos). Das Gegenteil ist stateful (zustandsbehaftet), wobei die Applikation die Benutzer wiedererkennt.

Lokale Datenhaltung – Cookies in PHP

So wie in JavaScript können Cookies auch über PHP gesetzt und gelesen werden.

Ein Cookie besteht aus bis zu 4096 Bytes, die der Server auf dem Client (Webbrowser) lokal speichern lassen kann. Bei jedem Zugriff auf den Webserver werden die Cookies wieder an den Server mitgeschickt.

Dabei werden nur diejenigen Cookie zurückgeschickt die der jeweilige Server gesetzt hat, der Browser sendet die Cookies nie an andere Server.

Setzen und Löschen von Cookies

Neue Cookies können mit setcookie() gesetzt werden. Sie werden mit den Header-Informationen übertragen.

Set-Cookie: style=yellow
Set-Cookie: style=yellow; path=/admin/
Set-Cookie: style=yellow; expires=Tue, 29-Dec-2022 19:30:42 GMT; path=/admin/

setcookie() definiert ein mit den HTTP-Header-Informationen zu übertragendes Cookie. Wie andere Header auch, müssen Cookies vor jeglicher Ausgabe des Skripts gesendet werden (dies ist eine Einschränkung des Protokolls). Das bedeutet, dass diese Funktion vor jeglicher Ausgabe, einschließlich der Ausgabe von <html>- oder <head>-Tags sowie jeder Art von Whitespace, aufgerufen werden muss.

$value = 'Some Value';

setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time() + 3600);  /* verfällt in 1 Stunde */
setcookie("TestCookie", $value, time() + 3600, "/some_path/", "example.com", 1);

Um ein Cookie zu löschen muss der Verfallszeitpunkt auf die Vergangenheit gesetzt werden.

setcookie("DeleteMe", 123, time() + (3600 * 24) );

// Löschen eines Cookies: Verfallszeitpunkt auf die Vergangenheit setzen
setcookie("DeleteMe", "", time() - 3600);

Sind die Cookies einmal gesetzt, kann beim nächsten Seitenaufruf anhand des $_COOKIE-Arrays auf diese zugegriffen werden. Die Cookie-Werte können auch in $_REQUEST (Sammlung von $_GET und $_POST) vorhanden sein.

// ein bestimmtes Cookie ausgeben
echo $_COOKIE["TestCookie"];

// Ein anderer Weg zu Debuggen/Testen ist, alle Cookies anzuzeigen
print_r($_COOKIE);

Serverseitige Datenhaltung – Sessions in PHP

Beginnen einer Session

Mit Hilfe einer Session können unterschiedliche Daten anhängig vom Benutzer auf dem Server gespeichert werden.

Mit dem Befehl session_start() passiert folgendes beim ersten Aufruf:

php_session_01.png

Fortführen der Session

Mit dem Befehl session_start() passiert folgendes bei jedem weiteren Aufruf:

php_session_02.png

Beispiel: Besuchererfassung

<?php
  session_start();
  
  if ( !isset ($_COOKIE["PHPSESSID"] )) {
      echo "Zum ersten Mal auf der Seite ...";
  } else {
      echo ("Session-ID: " . $_COOKIE["PHPSESSID"] );
  }
?>

ergibt beim ersten Aufruf

Zum ersten Mal auf der Seite ...

Beim jedem weiteren Aufruf

Session-ID: dc863c7ed80085be1553e33ab48765ef

Das superglobale Array $_SESSION

Werte setzen

Um einen neuen Wert zu speichern, muss lediglich ein Wert ins $_SESSION-Array zugewiesen werden. Gibt es diesen Eintrag noch nicht, wird ein neuer Eintrag angelegt.

<?php
  // Session beginnen
  session_start();
  
  // Zähler erhöhen, wenn dieser bereits in der Session gespeichert ist
  if (!isset($_SESSION['zaehler'])) {
    $_SESSION['zaehler'] = 0;
  } else {
    $_SESSION['zaehler']++;
  }
  
  // Beenden der Session und Speichern der Variablen
  //(wird am Ende der Seite automatisch gemacht)
  session_write_close(); 
?>
<p>
    Sie haben die Seiten <?php echo $_SESSION['zaehler']; ?> mal aufgerufen.
</p>

Werte löschen

Um einen Wert zu löschen kann der Befehl unset() verwendet werden.

<?php
  session_start();
  unset($_SESSION['zaehler']);
?>

Session löschen

Die gesamte Session kann mit den Befehlen session_unset() und session_destroy() gelöscht werden.

<?php
  session_start();
  
  // Alle Inhalte löschen, Session bleibt bestehen
  session_unset();
  
  // Session löschen
  session_destroy();
  
  // Superglobales Array löschen
  $_SESSION = array();
?>

Aufgabe: Webapplikation mit geschütztem Bereich

Erstelle eine Webapplikation mit einem geschützten, deren Inhalte nur angezeigt werden, wenn sich der Benutzer einloggt.

Lade dazu das Gründgerüst der Applikation hier:
Grundgerüst der Applikation: Sessions-in-PHP.zip

Die Applikation besteht aus mehreren Dateien:


Aufgabe 1: Login-Screen

Beim Starten der Applikation soll automatisch der Login-Screen angezeigt werden:

php_session_login.png Beispielhafte Umsetzung des Login-Screens

In der Datei index.php wird dazu die Session-Variable $_SESSION["user"] abgefragt. Ist sie gesetzt werden die Inhalte angezeigt, ansonsten auf die Login-Seite weitergeleitet:

<?php
	include "functions.php";

	if ( !isset ($_SESSION["user"])) {
		header("Location: login.php");
		exit;
	} 
?>

Todo:


Aufgabe 2: Darstellung der Inhalte

Ist der Benutzer eingeloggt, so werden die Inhalte angezeigt:

php_session_app.png Beispielhafte Umsetzung der Darstellung der Inhalte

Todo:


Aufgabe 3: Logout

Durch Klick auf den Link Logout soll die Session zurückgesetzt und das entsprechende Cookie gelöscht werden.

Todo:



Zusatzaufgabe: Aufzeichnen des Benutzerverhaltens

Zeichne auf, wie sich der Benutzer auf der Seite verhält und speichere diese Informationen in Session-Variablen:

Erstelle eine Datei statistics.php, die diese Informationen ausgibt. Die Informationen sollen ebenfalls nur angezeigt werden, wenn der Benutzer eingeloggt ist.

php_session_stats.png Beispielhafte Umsetzung der Statistik

Ressourcen

Grundlagen von PHP