Session Hanlder Klasse: Fehlermeldung + Session geht verloren.

xtramen01

Erfahrenes Mitglied
Hallo Leute,

ich habe eine Klasse um die Sessions in der Datenbank abzuspeichern.
Leider bekomme ich eine Fehlermeldung, die ich mir nicht erklären kann.

Warning: Unknown: Failed to write session data (user). Please verify that the current setting of session.save_path is correct (D:\SERVER\tmp) in Unknown on line 0

Das Verzeichnis ist vorhanden und hat auch die nötigen Schreibrechte.
Wenn ich ohne diese Klasse arbeite, dann werden die Sessions, so wie es sein sollte, in den Ordner geschrieben.

Ich denke mal dieser Fehler ist auch dafür verantwortlich, das die Session (bzw. die Variablen darin) verloren geht, wenn ich eine neue Seite aufrufe.

Ich bin leider ratlos und hoffe darauf das jemand einen Fehler findet, den ich übersehe.
Anbei mal die komplette Klasse. Vielen Dank!

UPDATE:

Der check query in der Funktion _write bringt mir ebenfalls einen SQL Fehler, ich glaube das wird das Problem sein.

"No database selected".

Die Verbindung zur Datenbank steht aber definitiv. Wenn ich im __Construct zum Test ein Query ausführe, dann klappt das.....

PHP:
class SessionHandler{

        public function __construct(){

        session_set_save_handler(array(&$this, '_open'), array(&$this, '_close'), array(&$this, '_read'), array(&$this, '_write'), array(&$this, '_destroy'), array(&$this, '_gc'));

        register_shutdown_function('session_write_close');

        session_start();
    }




        public function _open($save_path, $session_name){
            return true;
        }




        public function _close(){
            return true;
        }




        public function _read($id){

            $query = SQL::Query("SELECT value FROM sessions WHERE id = '" . mysql_real_escape_string($id) . "' LIMIT 1");

            if(SQL::NumRows($query) > 0){
                $erg = SQL::FetchArray($query);
                return $erg['value'];
            }

            return '';
        }




        public function _write($id, $sess_data){

            $check = SQL::Query("SELECT id FROM sessions WHERE id = '" . $id . "'");

            if(SQL::FetchArray($check) > 0){
                $query = SQL::Query("UPDATE  sessions SET last_updated ='" . mysql_real_escape_string(time()) . "', value = '" . mysql_real_escape_string($sess_data) . "' WHERE id = '" . $id . "'");
            }else{
                $query = SQL::Query("INSERT INTO sessions (id, last_updated, start, value) VALUES ('" . mysql_real_escape_string($id) . "', '" . mysql_real_escape_string(time()) . "', '" . mysql_real_escape_string(time()) . "', '" . mysql_real_escape_string($sess_data) . "')");
            }

            return mysql_affected_rows();
        }




        public function _destroy($id){

            $query = SQL::Query("DELETE FROM sessions WHERE id = '" . mysql_real_escape_string($id) . "'");

            $_SESSION = array();

            return mysql_affected_rows();
        }




        public function _gc($maxlifetime) {

            $maxlifetime = strtotime("-20 minutes");

            $query = SQL::Query("DELETE FROM sessions WHERE last_updated < '" . $maxlifetime . "'");

            return mysql_affected_rows();
        }





    }
 
Zuletzt bearbeitet:
Dann müsste man mal deine SQL klasse sehen bzw wo wird die verbindung aufgabut?
es wird ja nirgendwo eine Objekt der SQL-Klasse instanziiert, sondern nur mit statischen aufrufen gearbeitet.. eher ungewöhnlich für eine datenbankklasse, die ja über die gesamte laufzeit normalerweise eine geöffnete datenbankressource bereitstellen muss.
 
Hi. Die Datenbankverbindung wird im Controller aufgebaut und auch nicht manuell beendet.
Die Methoden werden dann alle statisch aufgerufen. Ich arbeite mit Namespaces.

Ich habe im __construct mal ein session_write_close() hinzugefügt.
Jetzt klappt es. Allerdings steht der Wert $sess_data in der Funktion _write nicht mehr zur Verfügung.
Die $id kann ich mir ausgeben lassen. Zum Test direkt im Funktionsaufruf. Der Wert $sess_data bleibt leer.

Jemand eine Idee?
 
Zurück