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 Cookies 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 2026 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);                 // gilt bis zum Schließen des Browsers
setcookie("TestCookie", $value, time() + 3600);  // verfällt in 1 Stunde
setcookie("TestCookie", $value, [
    'expires'  => time() + 3600,
    'path'     => '/',
    'secure'   => true,   // nur über HTTPS übertragen
    'httponly' => true,   // für JavaScript nicht lesbar
]);

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

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

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

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

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

// Zum Debuggen/Testen alle Cookies anzeigen
print_r($_COOKIE);

Serverseitige Datenhaltung – Sessions in PHP

Beginnen einer Session

Mit Hilfe einer Session können unterschiedliche Daten abhängig vom Benutzer auf dem Server gespeichert werden. Der Client bekommt nur eine zufällige Session-ID, die eigentlichen Daten verlassen den Server nicht.

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

php_session_01.png

Fortführen der Session

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

php_session_02.png

Beispiel: Besuchererfassung

<?php
  session_start();

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

ergibt beim ersten Aufruf

Zum ersten Mal auf der Seite ...

Bei 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. Am Ende des Skripts werden die Daten automatisch auf dem Server gespeichert.

<?php
  // Session beginnen
  session_start();

  // Zähler anlegen, wenn er noch nicht in der Session gespeichert ist
  if (!isset($_SESSION['zaehler'])) {
    $_SESSION['zaehler'] = 0;
  }

  // Zähler erhöhen
  $_SESSION['zaehler']++;
?>
<p>
    Du hast die Seite <?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. Damit auch der Browser die Session-ID vergisst, wird zusätzlich das Cookie gelöscht.

<?php
  session_start();

  // Alle Inhalte löschen, Session bleibt bestehen
  session_unset();

  // Session-Cookie im Browser löschen
  setcookie(session_name(), "", time() - 3600, "/");

  // Session auf dem Server löschen
  session_destroy();
?>

Aufgabe: Webapplikation mit geschütztem Bereich

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

Lade dazu das Grundgerü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 wird 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