Grundlegende Anwendung

Hinweis:

Ab PHP 4.1.0 steht $_SESSION genau wie $_POST, $_GET, $_REQUEST und so weiter, als globale Variable zur Verfügung. Im Gegensatz zu $HTTP_SESSION_VARS ist $_SESSION immer global. Deshalb brauchen Sie für $_SESSION nicht das Schlüsselwort global zu verwenden. Bitte beachten Sie, dass in dieser Dokumentation nun überall $_SESSION verwendet wird. Sie können $_SESSION durch $HTTP_SESSION_VARS ersetzen, wenn Sie Letzteres bevorzugen. Beachten Sie auch, dass Sie Ihre Session mit session_start() starten müssen, bevor $_SESSION zur Verfügung steht.

Für die Schlüssel des assoziativen $_SESSION-Arrays gelten die selben Beschränkungen, wie für die Bezeichnungen von regulären Variablen in PHP, d.h. sie dürfen nicht mit einer Zahl, sondern müssen mit einem Buchstaben oder Unterstrich beginnen. Um weitere Details zu erhalten, siehe Abschnitt Variablen.

Falls register_globals deaktiviert ist, können nur Bestandteile des globalen assoziativen Arrays $_SESSION als Session-Variablen registriert werden. Wiederhergestellte Session-Variablen stehen nur im Array $_SESSION zur Verfügung.

Aus Gründen der Verbesserung der Sicherheit und der Lesbarkeit des Codes wird die Verwendung von $_SESSION (oder $HTTP_SESSION_VARS bei PHP 4.0.6 oder niedriger) empfohlen. Mit $_SESSION werden die Funktionen session_register(), session_unregister() und session_is_registered() nicht benötigt. Auf die Session-Variablen kann wie auf jede normale Variable zugegriffen werden.

Beispiel #1 Registrierung einer Variablen mit $_SESSION.

<?php
session_start
();
// Verwenden Sie bei PHP 4.0.6 oder niedriger $HTTP_SESSION_VARS
if (!isset($_SESSION['zaehler'])) {
  
$_SESSION['zaehler'] = 0;
} else {
  
$_SESSION['zaehler']++;
}
?>

Beispiel #2 Aufheben der Registrierung einer Variablen mit $_SESSION und deaktiviertem register_globals.

<?php
session_start
();
// Verwenden Sie bei PHP 4.0.6 oder niedriger $HTTP_SESSION_VARS
unset($_SESSION['zaehler']);
?>

Achtung

Heben Sie NICHT die Registrierung der gesamten $_SESSION mit unset($_SESSION) auf, weil dies die Registrierung von Variablen durch die Superglobale $_SESSION deaktivieren würde.

Warnung

Sie können in Session-Variablen keine Referenzen verwenden, weil es keine praktikable Möglichkeit gibt, eine Referenz in eine andere Variable zurückzuführen.

Wenn register_globals aktiviert ist, kann jede globalen Variable als Session-Variable registriert werden. Beim Neustart einer Session werden diese Variablen als entsprechende globale Variablen wiederhergestellt. Da PHP wissen muss, welche globalen Variablen als Session-Variablen registriert sind, muss der Benutzer Variablen mit der Funktion session_register() registrieren. Sie können das vermeiden, indem Sie einfach Einträge in $_SESSION setzen.

Achtung

Verwenden Sie nicht session_register(), session_is_registered() und session_unregister(), wenn Sie $_SESSION vor PHP 4.3.0 verwenden und register_globals deaktiviert ist. Es ist sowohl aus Sicherheitsgründen als auch wegen der Performance empfehlenswert, register_globals zu deaktivieren.

Wenn register_globals aktiviert ist, dann referenzieren die globalen Variablen und die Einträge von $_SESSION automatisch die selben Werte, die in der vorherigen Instanz der Session registriert wurden. Falls die Variable mittels $_SESSION registriert wird, steht die globale Variable allerdings erst ab der nächsten Anfrage zur Verfügung.

Es gibt einen Fehler in PHP 4.2.3 und früheren Versionen. Wenn Sie eine neue Session-Variable mittels session_register() registrieren, referenzieren der Eintrag im globalen Bereich und der $_SESSION-Eintrag bis zum nächsten session_start() nicht den selben Wert. D.h. eine Änderung an der neu registrierten globalen Variablen wird nicht vom $_SESSION-Eintrag widergespiegelt. Dies wurde in PHP 4.3.0 korrigiert.

add a note add a note

User Contributed Notes 4 notes

up
7
AlexFBP
1 year ago
Regardless, if you need to set the header 'Location:' before closing the session; explicitly close the php script with "exit()" or "die()" functions. Remember that when a php script ends, the session automatically are going to be closed.
up
1
guy at syntheticwebapps dot com
6 months ago
Despite the warning about not being able to use references inside the session space, I've done it in the past and apparently completely successfully. That is, I can do something like this:

<?php
session_start
();
if (!
$_SESSION['favorite']) {
   
$_SESSION['cow'] = "Elsie";
   
$_SESSION['favorite'] =& $_SESSION['cow'];
    echo
"We set cow = '$_SESSION[cow]' and favorite =& cow ($_SESSION[favorite]).<br/>Reload the page to see if both change when one changes later.<br/>";
} else {
    echo
"Having re-entered the session after initial settings were made: cow = $_SESSION[cow] and favorite = $_SESSION[favorite].<br/>";
   
$_SESSION['cow'] = "Bessie";
    echo
"We reassigned cow = $_SESSION[cow] and our restored reference variable favorite = $_SESSION[favorite]<br/>Note the presence of the &s in the var_dump below.<pre>";
   
var_dump($_SESSION);
    echo
"</pre><br/>If you reload, the test will begin again.";
    unset(
$_SESSION['cow'], $_SESSION['favorite']);
   
session_destroy();
}
?>
yields the following after the second request:

Having re-entered the session after initial settings were made: cow = Elsie and favorite = Elsie.
We reassigned cow = Bessie and our restored reference variable favorite = Bessie
Note the presence of the &s in the var_dump below.
array(2) {
  ["cow"]=>
  &string(6) "Bessie"
  ["favorite"]=>
  &string(6) "Bessie"
}
If you reload, the test will begin again.

I've found this ability very useful and storage efficient in the session data.
up
-1
eddie at onefoldmedia dot com
3 months ago
If a session is not saving and you have verified that session_start() is being called, then double check capitalization. $_session can store variables but will not be treated like a session or cause an error.
up
-2
jpleveille at webgraphe dot com
1 year ago
As mentioned in the documentation, using session_write_close() shuts down the session. It is particularly useful if you want to use header('Location: SOMEURL'); to a URL within the same scope of the current script, that will load the session. Why?

When you use this header directive, the browser is requested to redirect the user to the given URL. If that URL is in the scope of the script where header() is called (let's say, same URL), the requested URL "COULD" load the session BEFORE it has actually been shut down in the previous script, and you might end up with the session from the previous request, reverting all modifications to session in the the last script.

<?php
session_start
();

if (!isset(
$_SESSION['hello']))
{
 
$_SESSION['hello'] = 'world';

 
session_write_close();
 
// session is now closed, it's safe to redirect
  // if not closed, $_SESSION['hello'] may not be set properly
  // when loading the page again
  // (in this very case, calls to this script could loop for a while)
 
header('Location: ' . $_SERVER['PHP_SELF']);
}
?>
To Top