Günther S: Session-Werte nach session_start() nicht verfügbar

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.

  1. 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; }
    
    1. 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

      1. 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; }
        
        1. 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

          1. 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

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. 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

              1. 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