Session-Werte nach session_start() nicht verfügbar
Günther S
- php
Hallo zusammen,
ich habe mit meinen Sessions unter PHP 5.0.5 (teste gerade lokal, mit xampp) das Problem, dass (eigentlich gesetzte) Session-Werte direkt bei Seitenaufruf nicht mehr verfügbar sind oder schon wieder gelöscht werden.
Ich habe einen eigenen MySQL-basierten Session-Handler geschrieben, der bis zu dem Zeitpunkt, an dem Werte in die DB geschrieben werden, auch super funktioniert.
Bsp:
ich rufe ein Script mit folgenden Zeilen auf:
session_start();
$_SESSION['login_id'] = 410;
echo session_id(); // für mich als info zum testen
Jetzt (nach erstmaligem Scriptaufruf) sehe ich in der DB auch den entsprechenden Eintrag.
Nun folgendes Script:
session_start();
echo $_SESSION['login_id'];
echo session_id(); // für mich als info zum testen
wirft eine Notice aus, dass der key 'login_id' nicht existiert. Die Session-ID ist aber dieselbe.
Für mich sieht das ganze aus, als wäre da ein GC zu gründlich und würde selbst die Daten dieser noch aktiven Session beim Aufruf von session_start() löschen (aber wirklich nur die Daten - und die Session samt ID weiter existieren lassen).
Kann mir jemand weiterhelfen?
Gruß,
Günther
PS:
Noch ein Bsp (von http://de.php.net/session):
session_start();
if (!isset($_SESSION['zaehler'])) {
$_SESSION['zaehler'] = 0;
} else {
$_SESSION['zaehler']++;
}
echo "<br>" . session_id();
Das Script kann ich sooft aufrufen wie ich will, der Zähler bleibt immer bei 0 und wird nicht erhöht, obwohl die Session-ID gleich bleibt.
hi,
Ich habe einen eigenen MySQL-basierten Session-Handler geschrieben, der bis zu dem Zeitpunkt, an dem Werte in die DB geschrieben werden, auch super funktioniert.
Aha.
Und danach?
session_start();
echo $_SESSION['login_id'];
>
> wirft eine Notice aus, dass der key 'login\_id' nicht existiert.
Wie hast du die Session-Daten wieder aus der DB rausgeholt?
> Für mich sieht das ganze aus, als wäre da ein GC zu gründlich und würde selbst die Daten dieser noch aktiven Session beim Aufruf von session\_start() löschen (aber wirklich nur die Daten - und die Session samt ID weiter existieren lassen).
Und wie sieht dein GC bzw. die Löschfunktion aus?
gruß,
wahsaga
--
/voodoo.css:
#GeorgeWBush { position:absolute; bottom:-6ft; }
Hallo wahsaga,
Wie hast du die Session-Daten wieder aus der DB rausgeholt?
ich nehme an du meinst den session handler "read"?
Und wie sieht dein GC bzw. die Löschfunktion aus?
Hier mal meine komplette Session-Handling Klasse:
class Session
{
function Session()
{
session_set_save_handler(array('Session', '_open'),
array('Session', '_close'),
array('Session', '_read'),
array('Session', '_write'),
array('Session', '_destroy'),
array('Session', '_gc'));
}
function _open(){
// db verbindung bereits hergestellt
}
function _close(){
// db verbindung wird am ende des scripts geschlossen
}
function _read($unique_id){
global $db;
return $db->getRow("SELECT * FROM " . DBPREFIX . "sessions WHERE unique_id = " . Tools::escape4sql($unique_id));
/* ergibt z.B. folgendes Array:
Array
(
[unique_id] => 41b254ed2f638bd05fdb06442e0952b7
[last_access] => 2006-10-04 15:22:02
[session_data] => zaehler|i:0;
)
*/
}
function _write($unique_id, $session_data){
global $db;
return $db->query("REPLACE INTO " . DBPREFIX . "sessions SET unique_id = " . Tools::escape4sql($unique_id) . ", last_access = NOW(), session_data = " . Tools::escape4sql($session_data));
}
function _destroy($unique_id){
global $db;
return $db->delete("sessions", "unique_id = " . Tools::escape4sql($unique_id));
/* gleichbedeutend mit mysql_query("DELETE FROM sessions WHERE unique_id = " . Tools::escape4sql($unique_id) */
}
function _gc($session_lifetime = SESSION_LIFETIME){
global $db;
return $db->delete("sessions", "last_access < DATE_SUB(NOW(), INTERVAL " . $session_lifetime . " MINUTE)");
/* gleichbedeutend mit mysql_query("DELETE FROM sessions WHERE last_access < DATE_SUB(NOW(), INTERVAL " . $session_lifetime . " MINUTE)" */
}
}
Gruß,
Günther
PS: Hier noch einige Daten von phpinfo():
session
Session Support enabled
Registered save handlers files user sqlite
Registered serializer handlers php php_binary wddx
Directive Local Value Master Value
session.auto_start Off Off
session.bug_compat_42 On On
session.bug_compat_warn On On
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_secure Off Off
session.entropy_file no value no value
session.entropy_length 0 0
session.gc_divisor 100 100
session.gc_maxlifetime 1440 1440
session.gc_probability 1 1
session.hash_bits_per_character 4 4
session.hash_function 0 0
session.name PHPSESSID PHPSESSID
session.referer_check no value no value
session.save_handler files files
session.save_path C:\Programme\xampp\tmp C:\Programme\xampp\tmp
session.serialize_handler php php
session.use_cookies On On
session.use_only_cookies Off Off
session.use_trans_sid 0 0
hi,
Hier mal meine komplette Session-Handling Klasse:
class Session
{
function Session()
{
session_set_save_handler(array('Session', '_open'),
array('Session', '_close'),
array('Session', '_read'),
array('Session', '_write'),
array('Session', '_destroy'),
array('Session', '_gc'));
}
Und das wurde auch schon abgearbeitet, sprich eine neue Instanz dieser Klasse Session erstellt, bevor du session\_start() aufrufst?
gruß,
wahsaga
--
/voodoo.css:
#GeorgeWBush { position:absolute; bottom:-6ft; }
Hallo,
Und das wurde auch schon abgearbeitet, sprich eine neue Instanz dieser Klasse Session erstellt, bevor du session_start() aufrufst?
Ja, ich vergaß folgende Zeile direkt vor der Definition der Klasse:
// class_session.php
$session = new Session();
class Session
{
//... (siehe vorherigen Post von mir)
}
// Ende der Datei
Direkt beim Einbinden der class_session.php in das eigentlihe Script, wird also gleich eine Instanz erstellt.
Gruß,
Günther
hi,
Direkt beim Einbinden der class_session.php in das eigentlihe Script, wird also gleich eine Instanz erstellt.
Dann prüfe doch mal durch Kontrollausgaben in den Handler-Funktionen, ob diese auch aufgerufen werden.
gruß,
wahsaga
Hallo,
Dann prüfe doch mal durch Kontrollausgaben in den Handler-Funktionen, ob diese auch aufgerufen werden.
Soo... das hab ich jetzt gemacht und zusätzlich noch ein paar Infos einblenden lassen. Also, bei session_start() werden wohl Session::_open() und Session::_read() ausgeführt.
Bei Session::_read() wird erst mal folgendes Array korrekt aus der DB ausgelesen:
Array
(
[unique_id] => 41b254ed2f638bd05fdb06442e0952b7
[last_access] => 2006-10-04 17:00:24
[session_data] => zaehler|i:0;
)
session_start(); // Session::_read() wird ausgeführt, liefert korrektes Array
// Hier scheint das Problem zu liegen
var_dump($_SESSION); // liefert array(0) { } - irgendwo unterwegs scheint das Array verlorengegangen zu sein...
Der Rest ist dann wieder folgerichtig (in meinen Beispielen von oben).
$_SESSION['zaehler'] existiert nicht, wird also auch nicht erhöht, sondern neu erstellt und auf 0 gesetzt und wieder korrekt in die DB geschrieben.
Weißt du, wo mein Problem liegen könnte?
Gruß,
Günther
Hallo,
bin jetzt durch Probieren auf die Lösung gekommen.
Es lag am Return-Wert von Session::_read();
Bisher hatte ich das ganze array $row
zurückgegeben, dabei war ja nur der Key $row['session_data']
benötigt.
Danke für deine Hilfe wahsaga, solche Denkanstöße braucht man manchmal einfach ;)
Gruß,
Günther