SESSION $Globals $_Session
Nicole
- php
0 romy0 Nicole0 romy0 Andreas Korthaus
0 Andreas Korthaus0 Nicole0 Andreas Korthaus0 romy
Hallo erst mal;-)
Ich habe zwar keine wichtige Frage, aber doch
Eine die mich nervt, weil ich keine Antwort finde.
Ich erstelle eine Session und registriere eine Variable.
Zugreifen kann ich sofort darauf mit $_SESSION[test].
Aber bei normalen Variablen kann ich auch mit
$GLOBALS[test] direkt darauf zugreifen, warum also
nicht bei sessions ? Da gehts erst nach erneutem Aufruf.
[GLOBALS] => Array
*RECURSION* //// <--- ACH JA UND WAS BEDEUTET DAS EIGENTLICH ?
[HTTP_SESSION_VARS] => Array
(
[test] => 2
)
[_SESSION] => Array
(
[test] => 2
)
[lang] =>
)
Gruss Nikki
Hi Nicole,
Ich erstelle eine Session und registriere eine Variable.
Zugreifen kann ich sofort darauf mit $_SESSION[test].
mich wundert, das dies klappt, es sollte $_SESSION["test"] bzw. $_SESSION[$test] heissen, ausser test ist eine von definierte Variable, die mittels Define deklariert wurde.
Aber bei normalen Variablen kann ich auch mit
$GLOBALS[test] direkt darauf zugreifen, warum also
nicht bei sessions ? Da gehts erst nach erneutem Aufruf.
da kann ich leider nicht helfen
[GLOBALS] => Array
*RECURSION* //// <--- ACH JA UND WAS BEDEUTET DAS EIGENTLICH ?
Vermutung: das Globals-Array wird rekursiv druchsucht und diese Ausgabe ist nur ein Hinweis darauf bzw. einfach ein Kommentar des Autors.
ciao
romy
Hallo Romy,
Ich erstelle eine Session und registriere eine Variable.
Zugreifen kann ich sofort darauf mit $_SESSION[test].
mich wundert, das dies klappt, es sollte $_SESSION["test"] bzw. $_SESSION[$test] heissen, ausser test ist eine von definierte Variable, die mittels Define deklariert wurde.
Session Variablen sind immer ohne $, mit den Anführungszeichen
hast du allerdings recht.
warum also
nicht bei sessions ? Da gehts erst nach erneutem Aufruf.
da kann ich leider nicht helfen
Auch leider kein Anderer ;-(
[GLOBALS] => Array
*RECURSION* //// <--- ACH JA UND WAS BEDEUTET DAS EIGENTLICH ?
Vermutung: das Globals-Array wird rekursiv druchsucht und diese Ausgabe ist nur ein Hinweis darauf bzw. einfach ein Kommentar des Autors.
Des Autors ? Die Ausgabe entstammt PHP : print_r(...);
Gruss Nikki
Hi Nicole,
»» »» Ich erstelle eine Session und registriere eine Variable.
Zugreifen kann ich sofort darauf mit $_SESSION[test].
mich wundert, das dies klappt, es sollte $_SESSION["test"] bzw. $_SESSION[$test] heissen, ausser test ist eine von definierte Variable, die mittels Define deklariert wurde.
Session Variablen sind immer ohne $, mit den Anführungszeichen
hast du allerdings recht.
es könnte doch sein, dass DU eine Variable namens $test hat, die den Wert test2 enthält und Deine Session auf den Wert test2 hinweist, dann kann man natürlich auch einen Variablenname nutzen
Des Autors ? Die Ausgabe entstammt PHP : print_r(...);
die Funktion print_r hat auch jemand geschrieben und diesen meine ich, wie gesagt nur eine Vermutung
ciao
romy
Hallo!
Ich erstelle eine Session und registriere eine Variable.
Zugreifen kann ich sofort darauf mit $_SESSION[test].
mich wundert, das dies klappt, es sollte $_SESSION["test"] bzw. $_SESSION[$test] heissen, ausser test ist eine von definierte Variable, die mittels Define deklariert wurde.Session Variablen sind immer ohne $, mit den Anführungszeichen
hast du allerdings recht.
Romy hat schon Recht, die von Dir verwendete Syntax ist dazu gedacht wenn Du mit test eine vorhandene Konstante meinst - die es ja nicht gibt, und dann darf PHP anfangen zu raten.
Lies mal im Manual "Warum ist $foo[bar] falsch?":
http://de3.php.net/manual/de/language.types.array.php#language.types.array.donts
Grüße
Andreas
Hallo!
Ich erstelle eine Session und registriere eine Variable.
Zugreifen kann ich sofort darauf mit $_SESSION[test].
ich hoffe nicht mit session_register(), denn laut Manual:
"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."
http://de3.php.net/manual/de/ref.session.php
" Wenn Sie $_SESSION (oder $HTTP_SESSION_VARS) verwenden, sollten Sie nicht session_register(), session_is_registered() und session_unregister() verwenden."
http://de3.php.net/manual/de/function.session-register.php
Du solltest Dir die Seiten im Manual mal genau durchlesen, da werden viele Fragen beantwortet.
Aber bei normalen Variablen kann ich auch mit
$GLOBALS[test] direkt darauf zugreifen, warum also
nicht bei sessions ? Da gehts erst nach erneutem Aufruf.
Zunächst - globale Variablen sollte man nach Möglichkeit vermeiden.
Ein gut konfiguriertes PHP sollte Session-Variablen überhaupt nicht mehr im globalen Namensraum initialisieren.
http://de3.php.net/manual/de/security.registerglobals.php
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. Das ist aber vollkommen unnötig weil man auf Session-Variablen immer über den $_SESSION-Array zugreifen sollte, das heißt sowohl Werte in die Session schreiben, als auch Werte auslesen. Das ist sauberer, performanter und sicherer.
Grüße,
Andreas
Hallo Andreas,
danke für deine Hilfe.
Die Sachen aus dem Manual kenne ich ziemlich gut.
Was Romy betrifft hatte ich auch vorher schon geschrieben,
dass Sie/Er mit den Anführungszeichen recht hatte.
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.
Gruss Nikki
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
Hi Nicole,
Was Romy betrifft hatte ich auch vorher schon geschrieben,
dass Sie/Er mit den Anführungszeichen recht hatte.
^^^^^^^^^^^^^^^^
Sie
bitte bitte ;)))
ciao
romy, die sich immer wieder wundert, wieso dieser Name so unbekannt ist, dass Zweifel entstehen. Romy Schneider müsste doch jeder kennen, oder? *grübelnd*