Sessions in PHP - Sessions starten
Autor
Flitze
Klicks 206956
Keywords:
PHP-Session-Verwaltung, PHP Sessions verständlich erklärt, Sessions verwalten, $_SESSION, SID+, Sessions starten, PHP, Session, session_start()
Klicks 206956
Rating für Sessions in PHP
8.7 von 10
Bewertungen135
Stand
12.06.2013
8.7 von 10
Bewertungen135
Keywords:
PHP-Session-Verwaltung, PHP Sessions verständlich erklärt, Sessions verwalten, $_SESSION, SID+, Sessions starten, PHP, Session, session_start()
Breadcrumb:
Workshops » Sessions in PHP » Sessions in PHP - Sessions starten
Sessions starten, benutzen und 'am Leben erhalten'
[ADSENSE_LINE]Zum Starten einer Session benutzt man den Befehl session_start. Dieser führt standardmäßig dazu, dass ein Cookie an den Browser gesendet wird, in dem eine 32-stellige Zeichenkette gespeichert wird. Wie man der Referenz zu setcookie entnehmen kann, wird ein Cookie mit Hilfe von HTTP Header Informationen gesendet, weshalb zuvor auf keinen Fall eine Ausgabe stattfinden darf.Zitat:
setcookie() definiert ein mit den HTTP Header-Informationen zu übertragendes Cookie. Wie andere Header auch, müssen Cookies vor jeglicher Ausgabe Ihres Skriptes gesendet werden (dies ist eine Einschränkung des Protokolls). Das bedeutet, dass Sie diese Funktione aufrufen müssen, bevor Sie eine Ausgabe, dazu zählen auch <html>- oder <head>-Tags sowie jede Art von Whitespaces, übermitteln.
Dieses Cookie trägt standardmäßig den Namen "PHPSESSID" und hat als Wert diese eben angesprochenene 32-stellige Zeichenkette, die sich auch Session ID nennt. Intern legt PHP außerdem noch eine Datei auf dem Webserver an (standardmäßig im Verzeichnis /tmp), die den Namen sess_(32-stellige Zeichenkette) hat. Sie könnte z.B. sess_19c179ad7fa02a491947c33d9d2552e8 heißen. In dieser Datei werden die Daten gespeichert, die wir mittels unseres Skriptes übergeben.
Um diese Session verwenden zu können, muss session_start an den Anfang jedes Skriptes geschrieben werden, in dem wir die Informationen, die wir in der Session speichern, benötigen. PHP erkennt dann automatisch (dank des Cookies), dass bereits eine Session existiert und startet keine neue, sondern 'läd' die alte Session.
Daten in der Session speichern
Früher benutzte man session_register um eine neue Session-Variable zu registrieren. Heute gilt diese Methode als veraltet und führt außerdem zu Problemen, wenn register_globals auf off steht (was jedoch aus Gründen der Sicherheit immer der Fall sein sollte!).Stattdessen erzeugt man einfach einen neuen Key der superglobalen Variable $_SESSION. Diese Variable verhält sich wie ein Array, so dass neue Werte einfach mittels $_SESSION['key'] = 'value'; hinzugefügt werden können. Mit echo $_SESSION['key']; z.B. kann man sich die Daten dann anzeigen lassen. Ein kleines Beispielskript dazu
PHP:
<?php
// Session starten
session_start();
// Cookie wird gesetzt
// Datei auf dem Server wird erzeugt
// Den Key 'counter' in der Session erzeugen und
// den Wert 1 zuweisen
$_SESSION['counter'] = 1;
echo $_SESSION['counter']."\n"; // Ausgabe: 1
// 'counter' um eins erhöhen
$_SESSION['counter']++;
echo $_SESSION['counter']."\n"; // Ausgabe: 2
// Zur Abwechslung mal ein Array erzeugen
$_SESSION['array'] = array('foo' => 'bar', 'bla' => 'blubb');
foreach($_SESSION['array'] as $key => $value){
echo "Schlüssel : ".$key."\n";
echo "Wert : ".$value."\n";
}
/* Ausgabe: Schlüssel : foo
* Wert: bar
* Schlüssel : bla
* Wert: blubb
*/
?>
Im obigen Beispiel sehen wir außerdem noch, dass man auch ein Array in der Session speichern kann. Auf diese Daten kann man nun in jedem Skript zugreifen.
Daten aus der Session löschen
Zum Löschen einzelner Daten benutzt man die Funktion unset. Wenn man alle Daten aus der Session löschen will, erstellt man die Session einfach als ein neues Array. Beispiel dazuPHP:
<?php
// Session starten
session_start();
$_SESSION['counter'] = 1;
$_SESSION['foo'] = 'bar';
$_SESSION['bla'] = 'blubb';
if(isset($_SESSION['counter']))
echo $_SESSION['counter'];
else
echo '$_SESSION[\'counter\'] existiert nicht mehr\n';
// Ausgabe : 1
unset($_SESSION['counter']);
if(isset($_SESSION['counter']))
echo $_SESSION['counter'];
else
echo '$_SESSION[\'counter\'] existiert nicht mehr';
// Ausgabe : $_SESSION['counter'] existiert nicht mehr
foreach($_SESSION as $key => $value){
echo "Schlüssel : ".$key."\n";
echo "Wert : ".$value."\n";
}
/* Ausgabe: Schlüssel : foo
* Wert: bar
* Schlüssel : bla
* Wert: blubb
*/
// Session komplett leeren
$_SESSION = array();
foreach($_SESSION as $key => $value){
echo "Schlüssel : ".$key."\n";
echo "Wert : ".$value."\n";
}
// Ausgabe: 'nix'
// hier wirds nochmal deutlich
var_dump($_SESSION);
?>
Theoretisch könnte man auch unset($_SESSION); benutzen um die alle Daten der Session zu löschen. Dabei wird allerdings $_SESSION als superglobale Variable deaktiviert, weshalb man darauf verzichten sollte.
Zitat:
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.
Sessions übergeben
Als größter Vorteil der Session habe ich ja bereits die Lebensdauer über das Skriptende hinaus angeführt. Wie bereits erwähnt muss am Anfang jedes Scriptes session_start stehen, damit die Sessiondaten für das Skript verfügbar sind. Dabei gibt es jedoch noch eine weitere Einschränkung, wenn der Browser des Users keine Cookies akzeptiert oder der User dies manuell ausgeschaltet hat. In diesem Fall würde keine Session ID per Cookie zum Webserver gesendet mittels der dieser die entsprechende Session laden kann.Um diesen Usern nun dennoch die Nutzung einer Session zu ermöglich, gibt es die Möglichkeit, die Session ID 'per Hand', d.h. über die Adresszeile oder über ein Formularfeld, weiterzugeben. Dazu muss an jeden Link der Name der Sessions sowie deren ID als Parameter angehängt werden und in Formularen muss ein Eingabefeld, dass als Namen den Namen der Session und als Wert die Session ID bekommt, erzeugt werden. Woher weiß man nun aber, wie der Name und die ID der Session lauten? Nun, dazu stellt PHP 3 Dinge zur Verfügung:
1. session_name()
2. session_id()
3. Die Konstante SID
1. session_name()
Mit session_name kann man entweder den Namen der Session bestimmen, wenn man diese Funktion vor session_start mit einem String als Parameter aufruft. Oder man ruft diese Funktion ohne Parameter nach session_start auf und bekommt als Rückgabewert den Namen der Session.
Beispiele:
PHP:
<?php
// Session starten
session_start();
echo session_name();
// Ausgabe : PHPSESSID (Standardname)
?>
PHP:
<?php
// Name festlegen
session_name('mySess');
// Session starten
session_start();
echo session_name();
// Ausgabe : mySess
?>
2. session_id()
Diese Funktion tut im Prinzip das gleiche wie session_name, allerdings wird nun nicht der Name sondern die ID gesetzt bzw. ausgelesen. Aus meiner Sicher macht es jedoch keinen Sinn, die Session ID selbst zu erzeugen und außerdem können dadurch Probleme auftreten.
Zitat:
Anmerkung: Falls Session-Cookies verwendet werden und für session_id() eine ID angegeben wird, wird ungeachtet dessen, ob die aktuelle Session-ID mit der neuen identisch ist, bei jedem Aufruf von session_start() ein neues Cookie gesendet.
Beispiele:
PHP:
<?php
// Session starten
session_start();
echo session_id();
// Ausgabe einer 32 stelligen Zeichenkette
?>
PHP:
<?php
// Session ID festlegen
session_id('foobar');
// Session starten
session_start();
echo session_id();
// Ausgabe : foobar
?>
3. Die Konstante SID
Diese Konstante enthält den Namen und die ID der Session, getrennt durch ein Gleichheitszeichen. Sie wird von PHP automatisch dann erzeugt, wenn kein Cookie gesetzt werden konnte. Ansonsten enthält sie einen leeren String.
Beispiele:
PHP:
<?php
/* Anmerkung: Zum besseren Verständnis lege ich den Namen
* und die ID der Session selbst fest
*/
session_name(mySess);
session_id(myID1234567890);
// Session starten
session_start();
echo "Session ID : ".session_id();
// Ausgabe
echo "Session Name : ".session_name();
echo "Konstante SID: ".SID;
/* Ausgabe wenn Cookies aktiviert sind:
* Session ID : myID1234567890Session
* Name : mySessKonstante
* SID:
*/
/* Ausgabe wenn Cookies nicht aktiviert sind:
* Session ID : myID1234567890Session
* Name : mySessKonstante
* SID: mySess=myID1234567890
*/
?>
Um die Sessioninformationen nun von Skript zu Skript per Hand zu übergeben, müssen alle Links um diese Informationen ergänzt werden. Das sieht dann so aus:
PHP:
<?php
echo "<a href=\"index.php?".session_name()."=".session_id()."\">\n";
// oder
echo "<a href=\"index.php?".SID."\">\n";
?>
Müsste ich zwischen diesen beiden Methoden wählen, würde ich die Untere bevorzugen. Bei der Oberen wird auf jeden Fall ein Parameter angehangen, egal ob es nötig ist oder nicht (weil zum Beispiel ein Cookie gesetzt werden konnte). Die Konstante SID enthält hingegen nur dann einen Wert, wenn er auch tatsächlich benötigt wird. Bei Formularen kann man sich das Leben ein wenig leichter machen, indem mann ein hidden Feld erstellt, das den Namen der Session und als Wert die ID der Session enthält.
Beispiel:
PHP:
<?php
echo "<form ".
" action=\"".$_SERVER['PHP_SELF']."\" ".
" method=\"post\">\n";
echo "Name : <input type=\"text\" name=\"Name\">\n";
echo "Vorname :<input type=\"text\" name=\"Name\">\n";
echo "<input type=\"hidden\" name=\"".session_name()."\"
value=\"".session_id()."\">\n";
echo "<input type=\"submit\" value=\"Abschicken\">\n";
echo "</form>\n";
?>
Insgesamt ist es jedoch sehr mühselig, in jeden Link und in jedes Formular die Session ID zu integrieren, deshalb stellt uns PHP die Möglichkeit zur Verfügung, das automatisch zu machen, wenn kein Cookie beim User gefunden werden kann. Dazu muss man entweder in der php.ini den Wert session.use_trans_sid auf 1 setzen oder, wenn man darauf keinen Zugriff hat, den Befehl
ini_set('session.use_trans_sid', 1);
vor dem Starten der Session an den Anfang jedes Skriptes schreiben. PHP hängt nun an jeden relativen Link die Session ID als Parameter an und erzeugt in jedem Formular das o.g. hidden-Feld. Zu beachten ist dabei, dass wirklich nur relative Links ergänzt werden, keine absoluten. Das hat den Grund, dass PHP bei absoluten Links davon ausgeht, dass ein externes Ziel verlinkt ist und dort hat die Session ID natürlich nichts zu suchen.
Zurück zur vorigen Seite:
Sessions in PHP Weiter zur nächsten Seite:
Sessions in PHP - Garbage Collection