PHP: Session-Funktionen
Mit Hilfe der Funktion session_start() und des superglobalen Arrays $_SESSION können Daten über mehrere Seitenaufrufe hinweg erhalten werden.
Das folgende Skript (session.php) simuliert eine Folge von Seitenaufrufen mit unterschiedlichen Wirkungen:
<?php
if (!$_GET['page']) {
session_start();
$_SESSION['test'] = "irgendein Inhalt";
$test = "irgendein anderer Inhalt";
echo "<h1>Seite 1 (Session wird erstmalig gestartet)</h1>";
echo "<p>\$_SESSION['test'] = ".$_SESSION['test']."</p>";
echo "<p>\$test = ".$test."</p>";
echo "<p><a href='?page=2'>zu Seite 2</a></p>";
if (isset($_COOKIE[session_name()])) echo "<p>Cookie wurde gesetzt.</p>";
}
if ($_GET['page'] == 2) {
if (isset($_COOKIE[session_name()])) {
echo "<h1>Seite 2 (session_start() wurde vergessen)</h1>";
echo "<p>\$_SESSION['test'] = ".$_SESSION['test']."</p>";
echo "<p>\$test = ".$test."</p>";
echo "<p><a href='?page=3'>zu Seite 3</a></p>";
} else {
echo "<p>Sie müssen Cookies aktivieren!</p>";
echo "<p><a href='session.php'>zurück zum Anfang</a></p>";
}
}
if ($_GET['page'] == 3) {
echo "<h1>Seite 3 (session_start() wurde ausgeführt, nachdem bereits Inhalte gesendet wurden)</h1>";
session_start();
echo "<p>\$_SESSION['test'] = ".$_SESSION['test']."</p>";
echo "<p>\$test = ".$test."</p>";
echo "<p><a href='?page=4'>zu Seite 4</a></p>";
}
if ($_GET['page'] == 4) {
session_start();
echo "<h1>Seite 4 (session_start() wurde korrekt ausgeführt)</h1>";
echo "<p>\$_SESSION['test'] = ".$_SESSION['test']."</p>";
echo "<p>\$test = ".$test."</p>";
echo "<p><a href='?page=5'>zu Seite 5</a></p>";
}
if ($_GET['page'] == 5) {
session_start(); // notwendig, um $_SESSION zu manipulieren
$_SESSION = array(); // notwendig, um Session-Daten zu löschen
setcookie(session_name(), '', time()-42000, '/'); // notwendig, um den Cookie zu löschen
session_destroy; // löscht die Session selbst
echo "<h1>Seite 5 (Session wurde beendet)</h1>";
echo "<p>\$_SESSION['test'] = ".$_SESSION['test']."</p>";
echo "<p>\$test = ".$test."</p>";
echo "<p><a href='session.php'>zurück zum Anfang</a></p>";
}
?>
Auf der ersten Seite wird die Session zunächst mit session_start() gestartet (Zeile 3). Anschließend wird der Variable $_SESSION['test'] ein Wert zugewiesen (Zeile 4). Gleichzeitig wir der Variable $test ebenfalls ein Wert zugewiesen (Zeile 5). Die Variable $test dient lediglich dem Vergleich des Verhaltens einer normalen Variable gegenüber dem Array $_SESSION.
Die Session wird bei dieser Methode in einem Cookie gespeichert. Daher funktionieren Sessions hier nur, wenn der Benutzer in seinem Browser Cookies aktiviert hat. Um zu überprüfen, ob dies der Fall ist, wird mit isset($_COOKIE[session_name()]) die Existenz des Cookies abgefragt. Zeile 10 soll demonstrieren, dass der Cookie allerdings nicht bereits auf der gleichen Seite abgefragt werden kann, auf der er gesetzt wurde. Das geht erst auf der nächsten (Zeile 13). Der Cookie ist praktisch erst dann verfügbar, wenn das Skript durchgelaufen ist, obwohl die Inhalte von $_SESSION sofort verfügbar sind.
Seite 2 soll demonstrieren, dass es notwendig ist, immer erst die Funktion session_start() auszuführen, um auf $_SESSION zugreifen zu können. Dies muss allerdings immer geschehen, bevor irgendwelcher HTML-Code gesendet wurde (genauer gesagt, der Header der Seite). Dies soll Seite 3 veranschaulichen.
Auf Seite 4 kann man nun sehen, dass die Wertzuweisung für $_SESSION['test'] von Seite 1 erhalten geblieben ist, obwohl die Session bereits auf Seite 2 unterbrochen war.
Seite 5 demonstriert nun, wie man die Session am Ende wieder ordentlich beendet. Will man nur die Inhalte von $_SESSION['test'] löschen, würden die Zeilen 38 und 39 grundsätzlich dazu reichen. Um aber sämtliche Spuren der Session zu beseitigen, müssen der Cookie und die Session selbst ebenfalls gelöscht werden (Zeilen 40 und 41). Hierbei ist darauf zu achten, dass man das Array $_SESSION mit $_SESSION = array(); lediglich leert und nicht mit unset($_SESSION); löscht, da diese sonst nicht mehr zur Verfügung stünde (s. Hinweis auf www.php.net)!