Andreas Korthaus: SESSION $Globals $_Session

Beitrag lesen

Hallo!

Warum es grundsätzlich nicht im selben Script funktionieren kann liegt daran, dass die Session-Variablen im (und das auch nur im [schlechten] Fall von register-globals=on) erst am Ende des Scriptes in die Session geschrieben werden, und erst beim erneuten Aufruf von session_start() (also beim nächsten Request) als globale Variablen initialisiert werden.

Eben dass ist nicht der Fall, ich shreibe etwas in eine Session
ziemlich am Anfang des Scriptes . Später erst kommt die
Abfrage $Globals["test"]. Noch dazwischen zum testen verändere
ich aber mehrmals $_SESSION["TEST"] und lasse es ausgeben (echo...)
Das klappt, aber eine Ausgabe mit $GLOBALS["TEST"] eben nicht.

Steht das im selben Script, wid also bei _einem_ Request beides abgearbeitet? Dann geht es nicht.

Mal ein Zitate von http://de3.php.net/manual/de/ref.session.php

"Die Unterstützung von Sessions erlaubt Ihnen, eine beliebige Anzahl von Variablen zu registrieren und diese über Anfragen hinweg zu erhalten. Wenn ein Besucher Ihre Website aufruft, überprüft PHP automatisch (falls session.auto_start  auf 1 gesetzt ist) oder auf Anfrage (explizit durch session_start() oder implizit durch session_register()), ob mit der Anfrage schon eine bestimmte Session-ID gesendet wurde. Wenn dies der Fall ist, wird die zuvor gespeicherte Umgebung wiederhergestellt.
 Alle registrierten Variablen werden serialisiert, nachdem die Anfrage beendet ist."

Siehst Du das Problem? Du möchtest gerne die globalen Variablen verwenden (was man nicht mehr machen sollte wie mehrfach in der Doku beschrieben wird), aber das kann nicht funktionieren.

Das ganze läuft so ab:

1. Browser sendet Request
2. PHP-Script startet
3. session_start() prüft ob es eine Session gibt - wenn ja erzeugt es (den Array $_SESSION mit den Variablen die in der Session-Datei im temp-Verzeichnis stehen, und ggfs. auch die globalen Variablen.[SCHLECHT!])
4. Du schreibst ein Element in den $_SESSION Array
5. Du willst eine globale Variable mit demselben Namen wie das Element im $_SESSION Array auslesen - geht nicht da es bisher nur in $_SESSION steht, das auslesen/verändern des Session-Array klappt natürlich!
6. Das Script wird beendet
7. Die Ausgabe wird an den Browser geschickt
8. alle Elemente in $_SESSION werden in die Session-Datei im temp-Verzeichnis geschrieben.

9. neuer Request vom selben Browser
10. start_session() liest alle Werte aus der Session-Datei aus und erzeugt wieder einen $_SESSION-Array und evtl. globale Variablen, und diesmal ist das soeben erzeugte $_SESSION Element nicht nur wieder im Session-Array, sondern auch als globale Variable verfügbar, weil sie die Variable ja diesmal in der Session-Datei stand, beim letzten Request ja nich nicht, erst _nach_ Beendigung des Scriptes werden die Session-Daten geschrieben.

Naja, und was kann man dagegen tun - vergiss die globalen Variablen! Verwende immer $_SESSION[]!!!

<?php
session_start();

// Willst Du einen Wert in die Session schreiben:
$_SESSION['key'] = 'val';

// Willst Du einen Wert auslesen
echo $_SESSION['key'];

// Willst Du einen Wert verändern
$_SESSION['key'] = 'val2';

// Willst Du den geänderten Wert verwenden:
echo $_SESSION['key'];
?>

Das ist dich wirklich einfacher als alle anderen Varianten.

Du kannst $_SESSION überall verwenden, in jeder Funktion/methode... da superglobal. Ich sehe absolut keinen Grund für die globalen Variablen, das ist wie gesagt unsauberer, unsicherer und langsamer ;-)

Grüße
Andreas