Optionen und weiterführende Links



In der Datenbank befinden sich derzeit 477 Specials. Alle Specials anzeigen...

Sitzungen

Sitzungen

Beim Schreiben einer Webanwendung stellt sich oft die Frage, wie man einen einzelnen User auf der Seite identifizieren kann. Der Grund für das Dilemma liegt darin, daß das HTTP-Protokoll (die «Sprache», in der sich Webserver und Browser verständigen) zustandslos ist. Das bedeutet, daß der Webserver keine Verbindung zwischen den einzelnen Anfragen der Browser herstellen kann. Warum das ein Problem ist, könnt Ihr an folgendem Beispiel sehen: Im Administrationsbereich eines Webforums muß man sich natürlich mit Username und Passwort ausweisen, bevor man beispielsweise einen User sperren darf. Aber woher soll der Webserver wissen, ob sich hinter der Anfrage "Sperre User XY" der Admin verbirgt, der sich ein Dutzend Anfragen vorher im Adminbereich eingeloggt hat? Die Anfragen sind ja unabhängig voneinander ...

Dieses Problem ist in PHP recht elegant mit sogenannten Sessions gelöst. Innerhalb einer solchen Session bekommt der User (bzw. sein Browser) eine SessionID zugewiesen, durch die Ihr ihn in Eurem Skript identifizieren könnt. Praktischerweise müßt Ihr Euch um diese Identifizierung noch nicht einmal selbst kümmern. PHP legt auf Wunsch Variablen sozusagen mehrfach an, für jede SessionID einmal, mit unabhängigen Werten. Das bedeutet, für alle Anfragen mit der UserID 1 kann die Variable $eingeloggt true sein und für alle Anfragen mit der UserID 2 false.

Auch an dieser Stelle (wie schon bei der Wertübergabe) hat es beim Schritt zur Version 4.2 eine Veränderung gegeben. Seither befinden sich alle Variablen, die für verschiedene SessionIDs verschiedene Werte haben sollen, im superglobalen Array $_SESSION. Die oben erwähnte Variable $eingeloggt müßte also eigentlich $_SESSION['eingeloggt'] heißen. Mit $_SESSION könnt Ihr ganz normal arbeiten (Werte eintragen und wieder auslesen), die Werte sind nur für jede SessionID unabhängig

echo "Hallo, " . $_SESSION['username'] . "<br>";
echo "du hast folgende Rechte:<br>";
if ($_SESSION['schliessen'] != 0)
  echo "Themen schließen<br>";
if ($_SESSION['loeschen'] != 0)
  echo "Beiträge löschen<br>";
if ($_SESSION['sperren'] != 0)
  echo "Benutzer sperren<br>";

Eine solche Session eröffnen könnt Ihr mit der Funktion session_start(). Wenn der anfragende Browser bereits eine SessionID hat, nimmt session_start() diese bestehende Session wieder auf. Daher solltet Ihr die Funktion am Anfang jedes Skripts aufrufen, in dem Ihr $_SESSION verwendet. Damit ist nämlich sichergestellt, daß der Browser eine SessionID hat, auch wenn er das jeweilige Skript direkt aufruft (und nicht beispielsweise über die Login-Seite kommt).

Wichtig ist hier am Anfang, weil die SessionID mit den sogenannten HTTP-Headern verschickt wird. Diese werden an den Browser geschickt, sobald die erste HTML-Ausgabe ausgewertet wurde. Und wenn die Header erst mal verschickt sind, könnt Ihr sie logischerweise nicht mehr ergänzen. Folgendes Beispiel führt also zu einer Fehlermeldung

...
<h1>Herzlich Willkommen auf meiner Seite</h1>
<h3>Bitte loggen Sie sich ein</h3>

<?php
session_start(); // Session starten
?>
...

Ein anderer Stolperstein ist ein bestimmter Eintrag in der php.ini. Die verschiedenen Werte in $_SESSION für die verschiedenen SessionIDs müssen natürlich auch irgendwo gespeichert werden. Dazu benutzt PHP ein Verzeichnis auf dem Server, das in der php.ini angegeben ist. Da PHP auf und für Linux entwickelt wird, ist der Standard für dieses Verzeichnis /tmp. Das wird PHP aber auf Windows-Rechnern vergeblich suchen und entsprechend mit einer Fehlermeldung reagieren. Die könnt Ihr damit beheben, daß Ihr in der php.ini einfach ein existierendes Verzeichnis eintragt, in dem PHP seine Daten speichern kann. Die php.ini ist (wie gewohnt) eine normale Textdatei, die Ihr mit dem Texteditor Eurer Wahl bearbeiten könnt.

Beendet wird eine Session entweder automatisch, wenn der User alle Browserfenster (nicht nur das mit Eurer Seite!) schließt oder Ihr die Session explizit selbst beendet. Für letzteres gibt es die Funktion session_destroy. Gespeichert wird die SessionID auf dem Client-Rechner in Form eines Cookies. Das bedeutet, Eure User müssen Cookies akzeptieren, um auf Eurer Seite surfen zu können, wenn Ihr Sessions verwendet.

Der Vollständigkeit halber noch kurz die Beschreibung der «alten» Methode vor PHP 4.2. Damals mußtet Ihr Eure Variablen bei der Session registrieren, und zwar mit der Funktion session_register(). Dann konntet Ihr die Variablen ganz normal verwenden, ähnlich wie Ihr es bei der Werteübergabe vor PHP 4.2 gesehen habt. Allerdings hatte dieses Verfahren auch die gleichen Sicherheitslücken wie die alte Version der Wertübergabe, daher wurde $_SESSION eingeführt.



Special vom: 16.01.2003
Autor dieses Specials: Henning Kockerbeck
Die weiteren Unterseiten dieses Specials:
Die reine Lehre - HTML
Stilvoll - CSS
Kleiner Grundkurs Programmieren
Jetzt wird's dynamisch - JavaScript
Die andere Seite der Dynamik - PHP
Neue Gefilde - XML
Weiterführende Links
Zurück zur Hauptseite des Specials


?>