2010-06-18 67 views
0

我有一个问题,使用php和mysql从$ _SESSION中检索一些数据。我在php.ini中注释了这一行,告诉服务器使用“文件”存储会话信息,以便使用我的数据库。我有一个类用于将信息写入数据库并且工作正常。当用户传递凭证时,类将被实例化,$ _SESSION变量被设置,然后用户被重定向到索引页面。 index.php页面包含db会话类所在的文件,当实例化calles session_start()和会话变量应该在$ _SESSION中时,但当我做var_dump($ _ SESSION)时,数组中没有任何内容。但是,当我查看mysql中的数据时,所有会话信息都在那里。它的行为像session_start()没有被调用,但通过实例化它的类。在mysql中使用php存储会话数据没有从表中正确检索数据

任何想法可能是错误的?

这里的HTML:

<?php 

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

这里的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(); 

?> 

回答

1

我怀疑如果你的错误报告工作正常,它不工作的原因将是明确的。

您不会转义会话数据,也不应该序列化该ID。巧合的是,你的代码很混乱,记录不完善且效率低下 - 例如(!):你不需要看到,如果你已经有了数据,那么选择做一个插入或更新

$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)."' 
        ) 

和....

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

像您的评论说 - 唐”试着去反序列化处理程序中的数据。

C.

+1

谢谢,我在phpclasses.org上找到了这个类并修改了它供我使用。我想,当我在一个月前尝试其他的东西时,我在那里留下了那个反序列化()。一旦我删除了它,并删除了它的任何序列化的东西。由于你是对的,因此信用证会送给你,而且我更喜欢你的Replace Into代码。谢谢你的帮助! – Ronedog 2010-06-18 23:21:18

0

你对序列化的插入的session_id,但在其他地方。尝试改变...

+0

感谢,我连载的每一个地方使用了$ session_id的,即序列化($ session_id的),但得到了同样的结果。任何其他想法? – Ronedog 2010-06-18 02:16:01