自己试着写了个session_handler
但是总是失败
插入数据库的时候,sql 语句 echo出来一点问题没有,但是+----+------------+--------------+--------------+
| id | session_id | session_data | session_time |
+----+------------+--------------+--------------+
|  1 | 1198919176 | count|i:1;   |   1198919176 |
+----+------------+--------------+--------------+数据库里的值居然成了这个
session_id字段和session_time居然都是一样的值谁帮我看看先行谢过[code]
<?php
/**
* ISCC_Session

* @author  sskaje
* @version  1.0.0
* @todo   session handler
* @example 
* session_set_save_handler(
*   array(&$this, 'open'), 
*   array(&$this, 'close'),
*   array(&$this, 'read'),
*   array(&$this, 'write'), 
*   array(&$this, 'destroy'), 
*   array(&$this, 'gc') 
*  );
*/
class ISCC_Session
{
public $iscclass;public function __construct()
{
}public function session_start()
{
  //启用自定义handler
  ini_set('session.save_handler', 'user');
  session_set_save_handler(
   array(&$this, 'open'),  //open
   array(&$this, 'close'),  //close
   array(&$this, 'read'),  //read
   array(&$this, 'write'),  //write
   array(&$this, 'destroy'),  //destroy
   array(&$this, 'gc')   //gc
  );
  
  register_shutdown_function('session_write_close');
  
  session_start();
  
  session_regenerate_id(true);
  //重新生成ID但是数据不变,并删除原有的session
}
public function open($sess_path, $sess_name) 
{
  return true;
}
public function close() 
{
  return true;
}
public function read($sess_id) 
{
  echo $query = "SELECT * FROM `{$this->iscclass->dbprefix}sessions` WHERE `session_id` = '{$sess_id}';";
  $result = $this->iscclass->db->query($query) or die($this->iscclass->db->error);
  if (!$result->num_rows) 
  {
   $query = <<<QUERY
INSERT INTO 
  `{$this->iscclass->dbprefix}sessions` 
SET
  `session_id`='{$sess_id}',
  `session_time`='{$this->iscclass->current_time_stamp}';
QUERY;
   $this->iscclass->db->query($query);
   return '';
  } 
  else 
  {
   $row = $result->fetch_assoc();
   $query = <<<QUERY
UPDATE 
  `{$this->iscclass->dbprefix}sessions` 
SET
  `session_time` = '{$this->iscclass->current_time_stamp}' 
WHERE
  `session_id` = '{$sess_id}';"
QUERY;
   $this->iscclass->db->query($query);
   return $row['sess_data'];
  }
}
public function write($sess_id, $data) 
{
  $this->iscclass->db->query("UPDATE `{$this->iscclass->dbprefix}sessions` SET `session_data` = '$data', `session_id` = {$this->iscclass->current_time_stamp} WHERE `session_id` = '{$sess_id}';");
  return true;
}
/**
  * session_destroy
  *
  * @param string $sess_id
  * @return boolean
  */
public function destroy($sess_id) 
{
  $query = <<<QUERY
DELETE 
  `{$this->iscclass->dbprefix}sessions`, `{$this->iscclass->dbprefix}online` 
FROM 
  `{$this->iscclass->dbprefix}sessions` 
LEFT JOIN 
  `{$this->iscclass->dbprefix}online` 
ON 
  `{$this->iscclass->dbprefix}sessions`.`session_id` = `{$this->iscclass->dbprefix}online` .`ol_sessionid`
WHERE  
  `session_id` = '{$sess_id}';
QUERY;
  $this->iscclass->db->query($query);
  return true;
}
/**
  * session_gc
  *
  * @param int $sess_maxlifetime
  * @return boolean
  */
public function gc($sess_maxlifetime) 
{
  $query = <<<QUERY
DELETE 
  `{$this->iscclass->dbprefix}sessions`, `{$this->iscclass->dbprefix}online` 
FROM
  `{$this->iscclass->dbprefix}sessions` 
LEFT JOIN
  `{$this->iscclass->dbprefix}online` 
ON
  `{$this->iscclass->dbprefix}sessions`.`session_id` = `{$this->iscclass->dbprefix}online` .`ol_sessionid`
WHERE
  `{$this->iscclass->dbprefix}sessions`.`session_time` + {$sess_maxlifetime} < {$this->iscclass->current_time_stamp};
QUERY;
  $this->iscclass->db->query($query);
  return true;
}
}
/*
*/
?>
[/code]
PS:
我在read()的三个$query前都echo了下
发现,sql语句完全正确
但是
第一个select 永远没有结果,这样就进入了insert但是看了数据库之后,就发现session_id全都是session_time的值

解决方案 »

  1.   

    <?php
    /**
    * ISCC_Session

    * @author  sskaje
    * @version  1.0.0
    * @todo   session handler
    * @example 
    * session_set_save_handler(
    *   array(&$this, 'open'), 
    *   array(&$this, 'close'),
    *   array(&$this, 'read'),
    *   array(&$this, 'write'), 
    *   array(&$this, 'destroy'), 
    *   array(&$this, 'gc') 
    *  );
    */
    class ISCC_Session
    {
    public $iscclass;public function __construct()
    {
    }public function session_start()
    {
      //启用自定义handler
      ini_set('session.save_handler', 'user');
      session_set_save_handler(
       array(&$this, 'open'),  //open
       array(&$this, 'close'),  //close
       array(&$this, 'read'),  //read
       array(&$this, 'write'),  //write
       array(&$this, 'destroy'),  //destroy
       array(&$this, 'gc')   //gc
      );
      
      register_shutdown_function('session_write_close');
      
      session_start();
      
      session_regenerate_id(true);
      //重新生成ID但是数据不变,并删除原有的session
    }
    public function open($sess_path, $sess_name) 
    {
      return true;
    }
    public function close() 
    {
      return true;
    }
    public function read($sess_id) 
    {
      echo $query = "SELECT * FROM `{$this->iscclass->dbprefix}sessions` WHERE `session_id` = '{$sess_id}';";
      $result = $this->iscclass->db->query($query) or die($this->iscclass->db->error);
      if (!$result->num_rows) 
      {
       $query = <<<QUERY
    INSERT INTO 
      `{$this->iscclass->dbprefix}sessions` 
    SET
      `session_id`='{$sess_id}',
      `session_time`='{$this->iscclass->current_time_stamp}';
    QUERY;
       $this->iscclass->db->query($query);
       return '';
      } 
      else 
      {
       $row = $result->fetch_assoc();
       $query = <<<QUERY
    UPDATE 
      `{$this->iscclass->dbprefix}sessions` 
    SET
      `session_time` = '{$this->iscclass->current_time_stamp}' 
    WHERE
      `session_id` = '{$sess_id}';"
    QUERY;
       $this->iscclass->db->query($query);
       return $row['sess_data'];
      }
    }
    public function write($sess_id, $data) 
    {
      $this->iscclass->db->query("UPDATE `{$this->iscclass->dbprefix}sessions` SET `session_data` = '$data', `session_id` = {$this->iscclass->current_time_stamp} WHERE `session_id` = '{$sess_id}';");
      return true;
    }
    /**
      * session_destroy
      *
      * @param string $sess_id
      * @return boolean
      */
    public function destroy($sess_id) 
    {
      $query = <<<QUERY
    DELETE 
      `{$this->iscclass->dbprefix}sessions`, `{$this->iscclass->dbprefix}online` 
    FROM 
      `{$this->iscclass->dbprefix}sessions` 
    LEFT JOIN 
      `{$this->iscclass->dbprefix}online` 
    ON 
      `{$this->iscclass->dbprefix}sessions`.`session_id` = `{$this->iscclass->dbprefix}online` .`ol_sessionid`
    WHERE  
      `session_id` = '{$sess_id}';
    QUERY;
      $this->iscclass->db->query($query);
      return true;
    }
    /**
      * session_gc
      *
      * @param int $sess_maxlifetime
      * @return boolean
      */
    public function gc($sess_maxlifetime) 
    {
      $query = <<<QUERY
    DELETE 
      `{$this->iscclass->dbprefix}sessions`, `{$this->iscclass->dbprefix}online` 
    FROM
      `{$this->iscclass->dbprefix}sessions` 
    LEFT JOIN
      `{$this->iscclass->dbprefix}online` 
    ON
      `{$this->iscclass->dbprefix}sessions`.`session_id` = `{$this->iscclass->dbprefix}online` .`ol_sessionid`
    WHERE
      `{$this->iscclass->dbprefix}sessions`.`session_time` + {$sess_maxlifetime} < {$this->iscclass->current_time_stamp};
    QUERY;
      $this->iscclass->db->query($query);
      return true;
    }
    }
    /*
    */
    ?>
      

  2.   

    刚才用zend studio跟了一回
    发现在这个cgi的环境下插入数据库的内容是正确的,但是,加在httpd下还是不行
      

  3.   

    http://blog.csdn.net/system128
    看我的Blog.
    有数据库和memcache两种方式的实现代码.
      

  4.   

    很奇妙,我用zend stuidio调试
    一步一步,一点问题都没有但是,直接用httpd肯定不行后来在调试的时候,直接测试step over,发现,只要稍微快一点,session id 全都成了 time()
    大概弄个一秒多的时差,数据就正常XD
      

  5.   

    搞定了anyway, tyvm SysTem128