Scope der Session Variable session_id()
Peetchen Punk
- php
Guten Tag,
also bei mier scheint nix mehr zu laufen.
Ich habe mehrere php Seiten. Jede Seite beginnt mit session_start();
Nun arbeite ich mit Klassen und benutze seit kurzem die Funktion session_id() in mehreren Klassen und Funktionen.
Also so wie ich es verstanden habe, weiß die Funktion ob bereits eine Session ID erzeugt wurde und falls nicht erzeugzt sie eine neue.
Jetzt habe ich eine Funktion geschrieben, die die user IP uusammen mit der session id in eine mysql DB einträgt.
Es kommt eine Fehlermeldung, daran habe ich durch zufall erkannt, dass bei jeder Aktualisierung der Seite mit der Fehlermeldung immmer eine andere Session id erzeugt wird.
Wie weit reicht der Scope der Funktion session_id()?
Wenn ich nun auf der php Seite session_start() benutze und in den Kontruktoren der Klassen jeweils $sid = session_id().
Kann ich die dann überall benutzen?
Moin!
Also so wie ich es verstanden habe, weiß die Funktion ob bereits eine Session ID erzeugt wurde und falls nicht erzeugzt sie eine neue.
Nein.
Die Funktion session_id() gibt dir die von session_start() generierte Session-ID zurück.
Wenn du _vor_ dem Aufruf von session_start() einen Parameter an session_id() übergibst, _setzt_ das die Session-ID, welche mit session_start() dann verwendet wird.
Mit anderen Worten:
session_id('einetolleID');
session_start();
verwendet als Session-ID "einetolleID", welches sich im Cookie sowie in der Konstanten SID bzw. den automatisch erzeugten URL-Parametern widerspiegeln müßte. Nachfolgende Aufrufe von session_id() geben ebenfalls den String "einetolleID" zurück.
Hingegen bringt die Abfolge
session_start();
$var = session_id();
eine automatisch generierte Session-ID in die Variable $var.
Jetzt habe ich eine Funktion geschrieben, die die user IP uusammen mit der session id in eine mysql DB einträgt.
Zu welchem Zweck, sei mal dahingestellt. Solltest du aber versuchen, bei weiteren Seitenabrufen zu prüfen, ob Session-ID und User-IP noch zusammenpassen, sei gewarnt: User-IPs können sich aus ganz legitimen Gründen auch während einer Session ändern! AOL-User benutzen zwangsweise eine Proxy-Farm, die mit unterschiedlichen IP-Adressen bei deinem Server Seiten abruft. Und wenn jemand bei seinem Provider alle 24 Stunden eine neue Verbindung aufbauen muß und dabei eine neue IP kriegt, und die Session dummerweise über diese 24-Stunden-Grenze reicht (zehn Minuten vorher angefangen, zehn Minuten später aufhören reicht ja schon), wechselt die IP auch.
Es kommt eine Fehlermeldung, daran habe ich durch zufall erkannt, dass bei jeder Aktualisierung der Seite mit der Fehlermeldung immmer eine andere Session id erzeugt wird.
Dann kennt dein Browser seine Session-ID nicht und teilt sie dem Server beim nächsten Seitenaufruf nicht mit. Es wird somit bei jedem Seitenaufruf eine neue Session gestartet (ach ja, das ist nämlich eine weitere Funktion von session_start(): Gucken, ob per Cookie, GET-Parameter oder POST-Formularfeld eine Session-ID übergeben wird, und sofern session_id() keine andere ID gesetzt hat, mit dieser Session-ID operieren).
Du hast also alle der folgenden Probleme:
1. Es wird kein Cookie gesendet, oder dein Browser akzeptiert es nicht.
2. Es wird keine Session-ID automatisch an alle Links angehängt und in alle Formulare geschrieben.
3. Es wird auch nicht manuell die Konstante SID an die Links und das Ergebnis von session_name() und session_id() in Formulare geschrieben.
Löse eines dieser Probleme, und die Sessions sollten wie gewünscht funktionieren. Dabei spielt die Konfiguration von PHP möglicherweise eine entscheidende Rolle.
Wie weit reicht der Scope der Funktion session_id()?
Weit.
Wenn ich nun auf der php Seite session_start() benutze und in den Kontruktoren der Klassen jeweils $sid = session_id().
Kann ich die dann überall benutzen?
Eigentlich schon.
- Sven Rautenberg
Guten tag,
Mit anderen Worten:
session_id('einetolleID');
session_start();
Danke für die Hilfe.
Allerdings habe ich es nur halb verstanden.
Also ich hätte gerne wenn php die session id erzeugt.
Ich hatte vorher mal eine Funktion geschrieben, die selbst eine erzeugt hat. Aber warum, wenn php das auch selber kann.
Also die session id wird eigentlich immer and ie url angehangen, das funktioniert alles so weit.
Kurz und bündig:
Muss
session_id('einetolleID');
immer vor
session_start(); kommen?
Kann man 'einetolleID' nicht weglasssen? Wenn ich nun diese beiden Zeilen an den Anfang eines jeden Skripts schreibe. Muss ich dann in den FUnktionen der Klassen immer ein global davor setzen?
Danke
Moin!
Also ich hätte gerne wenn php die session id erzeugt.
Dann benutze nur session_start() zum Starten der Session, und gut ist. Die erzeugte Session-ID fragst du _danach_ mittels session_id() ab und verarbeitest sie nach Wunsch.
Ich hatte vorher mal eine Funktion geschrieben, die selbst eine erzeugt hat. Aber warum, wenn php das auch selber kann.
Richtig. Denn das wichtigste bei Session-IDs ist, dass sie zufällig generiert werden. Und da hat PHP eigentlich alles dabei, was genau dieses erledigt - das kann man mit PHP-Mitteln nicht wirklich besser machen. Natürlich: Wenn man einen _echten_ Zufallsgenerator hat, der beispielsweise atomaren Zerfall mißt, dann kann man damit die Session-IDs besser machen, aber wer hat sowas schon.
Also die session id wird eigentlich immer and ie url angehangen, das funktioniert alles so weit.
Wie jetzt: Funktioniert es, oder nicht?
Kurz und bündig:
Muss
session_id('einetolleID');immer vor
session_start(); kommen?
Nein. Muß nie. Kann, wenn man es braucht. Du brauchst es nicht.
Wenn ich nun diese beiden Zeilen an den Anfang eines jeden Skripts schreibe. Muss ich dann in den FUnktionen der Klassen immer ein global davor setzen?
Nein. session_id() ist eine Funktion, die überall aufgerufen werden kann, und keine Variable, die man global machen könnte.
- Sven Rautenberg