2010-06-18 4 views
0

J'ai un problème pour récupérer des données de $ _SESSION en utilisant php et mysql. J'ai commenté la ligne dans php.ini qui indique au serveur d'utiliser le "fichier" pour stocker les informations de session afin que ma base de données sera utilisée. J'ai une classe que j'utilise pour écrire l'information dans la base de données et son fonctionnement fonctionne bien. Lorsque l'utilisateur transmet ses informations d'identification, la classe est instanciée et les variables $ _SESSION définies, l'utilisateur est redirigé vers la page d'index. La page index.php contient le fichier où se trouve la classe de session db, qui, lorsqu'elle est instanciée, appelle session_start() et les variables de session doivent être dans $ _SESSION, mais quand je fais var_dump ($ _ SESSION) il n'y a rien dans le tableau. Cependant, quand je regarde les données dans mysql, toutes les informations de session sont là. Son action comme session_start() n'a pas été appelée, mais en instanciant la classe c'est.stocker des données de session dans mysql en utilisant php ne récupère pas les données correctement à partir des tables

Une idée de ce qui pourrait être faux?

Voici le HTML:

<?php 

    include_once "classes/phpsessions_db/class.dbsession.php"; //used for sessions 
    var_dump($_SESSION); 
?> 
<html> 
. 
. 
. 
</html> 

est ici la classe DBSession:

<?php 

error_reporting(E_ALL); 

class dbSession 
{ 

    function dbSession($gc_maxlifetime = "", $gc_probability = "", $gc_divisor = "") 
    { 
     // if $gc_maxlifetime is specified and is an integer number 
     if ($gc_maxlifetime != "" && is_integer($gc_maxlifetime)) { 

      // set the new value 
      @ini_set('session.gc_maxlifetime', $gc_maxlifetime); 

     } 

     // if $gc_probability is specified and is an integer number 
     if ($gc_probability != "" && is_integer($gc_probability)) { 

      // set the new value 
      @ini_set('session.gc_probability', $gc_probability); 

     } 

     // if $gc_divisor is specified and is an integer number 
     if ($gc_divisor != "" && is_integer($gc_divisor)) { 

      // set the new value 
      @ini_set('session.gc_divisor', $gc_divisor); 

     } 

     // get session lifetime 
     $this->sessionLifetime = ini_get("session.gc_maxlifetime"); 

     //Added by AARON. cancel the session's auto start,important, without this the session var's don't show up on next pg. 
     session_write_close(); 

     // register the new handler 
     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'); 

     // start the session 
     @session_start(); 
    } 

    function stop() 
    {  
     $new_sess_id = $this->regenerate_id(true); 
     session_unset(); 
     session_destroy(); 

     return $new_sess_id; 
    } 

    function regenerate_id($return_val=false) 
    { 
     // saves the old session's id 
     $oldSessionID = session_id(); 
     // regenerates the id 
     // this function will create a new session, with a new id and containing the data from the old session 
     // but will not delete the old session 
     session_regenerate_id(); 

     // because the session_regenerate_id() function does not delete the old session, 
     // we have to delete it manually 
     //$this->destroy($oldSessionID); 

     //ADDED by aaron 
     // returns the new session id 
     if($return_val) 
     { 
      return session_id(); 
     } 
    } 

    function open($save_path, $session_name) 
    { 
     // global $gf; 
     // $gf->debug_this($gf, "GF: Opening Session"); 
     // change the next values to match the setting of your mySQL database 
     $mySQLHost = "localhost"; 
     $mySQLUsername = "user"; 
     $mySQLPassword = "pass"; 
     $mySQLDatabase = "sessions"; 

     $link = mysql_connect($mySQLHost, $mySQLUsername, $mySQLPassword); 

     if (!$link) { 

      die ("Could not connect to database!"); 

     } 

     $dbc = mysql_select_db($mySQLDatabase, $link); 

     if (!$dbc) { 

      die ("Could not select database!"); 

     } 

     return true; 

    } 

    function close() 
    { 
     mysql_close(); 
     return true; 
    } 

    function read($session_id) 
    { 

     $result = @mysql_query(" 
      SELECT 
       session_data 
      FROM 
       session_data 
      WHERE 
       session_id = '".$session_id."' AND 
       http_user_agent = '".$_SERVER["HTTP_USER_AGENT"]."' AND 
       session_expire > '".time()."' 
     "); 

     // if anything was found 

     if (is_resource($result) && @mysql_num_rows($result) > 0) { 

      // return found data 
      $fields = @mysql_fetch_assoc($result); 
      // don't bother with the unserialization - PHP handles this automatically 
      return unserialize($fields["session_data"]); 

     } 

     // if there was an error return an empty string - this HAS to be an empty string 
     return ""; 

    } 

    function write($session_id, $session_data) 
    { 
     // global $gf; 

     // first checks if there is a session with this id 
     $result = @mysql_query(" 
      SELECT 
       * 
      FROM 
       session_data 
      WHERE 
       session_id = '".$session_id."' 
     "); 

     // if there is 
     if (@mysql_num_rows($result) > 0) 
     { 
      // update the existing session's data 
      // and set new expiry time 
      $result = @mysql_query(" 
       UPDATE 
        session_data 
       SET 
        session_data = '".serialize($session_data)."', 
        session_expire = '".(time() + $this->sessionLifetime)."' 
       WHERE 
        session_id = '".$session_id."' 
      "); 

      // if anything happened 
      if (@mysql_affected_rows()) 
      { 
       // return true 
       return true; 
      } 


     } 
     else // if this session id is not in the database 
     { 
      // $gf->debug_this($gf, "inside dbSession, trying to write to db because session id was NOT in db"); 
      $sql = " 
       INSERT INTO 
        session_data 
         (
          session_id, 
          http_user_agent, 
          session_data, 
          session_expire 
         ) 
        VALUES 
         (
          '".serialize($session_id)."', 
          '".$_SERVER["HTTP_USER_AGENT"]."', 
          '".$session_data."', 
          '".(time() + $this->sessionLifetime)."' 
         ) 
      "; 

      // insert a new record 
      $result = @mysql_query($sql); 

      // if anything happened 
      if (@mysql_affected_rows()) 
      { 
       // return an empty string 
       return ""; 
      } 

     } 

     // if something went wrong, return false 
     return false; 

    } 

    function destroy($session_id) 
    { 

     // deletes the current session id from the database 
     $result = @mysql_query(" 
      DELETE FROM 
       session_data 
      WHERE 
       session_id = '".$session_id."' 
     "); 

     // if anything happened 
     if (@mysql_affected_rows()) { 

      // return true 
      return true; 

     } 

     // if something went wrong, return false 
     return false; 

    } 

    function gc($maxlifetime) 
    { 

     // it deletes expired sessions from database 
     $result = @mysql_query(" 
      DELETE FROM 
       session_data 
      WHERE 
       session_expire < '".(time() - $maxlifetime)."' 
     "); 

    } 

} //End of Class 

    $session = new dbsession(); 

?> 

Répondre

1

Je suppose que la raison pour laquelle cela ne fonctionne pas serait claire si votre rapport d'erreurs fonctionnait correctement.

Vous n'échappez pas aux données de session et vous ne devez PAS sérialiser l'ID. Par coïncidence, votre code est désordonné, mal documenté et inefficace - p. (!): Vous n'avez pas besoin de voir si vous avez déjà des données, puis choisissez de faire une mise à jour ou insérer

$sql = "REPLACE INTO 
       session_data 
        (
         session_id, 
         http_user_agent, 
         session_data, 
         session_expire 
        ) 
       VALUES 
        (
         '".mysql_real_escape_string($session_id))."', 
         '".mysql_real_escape_string($_SERVER["HTTP_USER_AGENT"])."', 
         '".mysql_real_escape_string($session_data)."', 
         '".(time() + $this->sessionLifetime)."' 
        ) 

et ....

// don't bother with the unserialization - PHP handles this automatically 
     return unserialize($fields["session_data"]); 

Comme votre commentaire dit - don » t essayez de désérialiser les données dans le gestionnaire.

C.

+1

Merci, j'ai trouvé cette classe sur phpclasses.org et je l'ai modifiée pour mon utilisation. Je me suis rendu compte que je l'avais quitté unerialize() quand j'essayais autre chose il y a environ un mois ... J'ai alors terminé en tête du projet. Une fois que j'ai enlevé cela et supprimé toutes les choses en série cela a fonctionné. Le mérite revient à vous parce que vous aviez raison et que vous préférez mieux remplacer votre code. Merci de votre aide! – Ronedog

0

Vous sérialisation la id_session sur insert, mais nulle part ailleurs. Essayez de changer cela ...

+0

merci, je sérialisé chaque endroit du id_session de $ a été utilisé, à savoir serialize (id_session $), mais obtenir le même résultat. d'autres idées? – Ronedog

Questions connexes