decocode decocode deco    

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:

Quelltext auswählen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?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)!

Grundsätzlich ist bei der Verwendung von Sessions immer zu bedenken, dass diese nur dann funktionieren, wenn der Benutzer in seinem Browser Cookies aktivert hat! Hat er dies nicht getan, oder wird der Cookie während der Session vorsätzlich oder durch Zeitüberschreitung (in der Regel nach 30 Minuten Inaktivität des Benutzers) automatisch gelöscht, so stehen keine Daten (mehr) zur Verfügung, die für die Session von Bedeutung sind. Dies stellt eine Sicherheitslücke dar, und kann zu unerwarteten Ergebnissen führen. Daher ist immer eine Vorkehrung zu treffen, die das Vorhandensein der Session überprüft, bevor Funktionen ausgeführt werden, die von Sessiondaten abhängig sind!