session丢失问题
点<a href="ab.php">离开本页</a>
没打印出值
数据库CREATE TABLE `session` (
  `sesskey` char(32) NOT NULL,
  `expiry` varchar(20) NOT NULL default '0000-00-00 00:00:00',
  `value` varchar(3000) default NULL,
  PRIMARY KEY  (`sesskey`),
  UNIQUE KEY `sesskey` (`sesskey`)
) ENGINE=MyISAM DEFAULT CHARSET=gb2312;<?php
/*class_sessions.php*/class clsSessions {
private $sess_life;
private $sess_dbh="";
private $host;
private $user;
private $pwd;
private $database;
private $sess_maxlifetime;function __construct($host='localhost',$user='root',$pwd='123456',$database='cbweb')
{
    $this->sess_maxlifetime=get_cfg_var("session.gc_maxlifetime");
    $this->host=$host;
    $this->user=$user;
    $this->pwd=$pwd;
    $this->database=$database;
    $this->sess_life = get_cfg_var('session.gc_maxlifetime') ? get_cfg_var('session.gc_maxlifetime'):1440;
    session_set_save_handler(    array (& $this, "_sess_open"),                                array (& $this, "_sess_close"),
            array (& $this, "_sess_read"),
            array (& $this, "_sess_write"),
            array (& $this, "_sess_destroy"),
            array (& $this, "_sess_gc")
            );
    return true;
    }
//---------------------------------------------------------------------------------------------------------------
    function _sess_open($save_path, $session_name) {
        return true;
    }    function _sess_close() {
        return true;
    }    function _sess_read($key) {
        $db = new mysqli($this->host,$this->user,$this->pwd,$this->database);
        $value_query = $db->query("select value from session where sesskey = ' $key ' and expiry > '" . time() . "'");
        $value = $value_query->fetch_assoc();
        if (isset($value['value'])) {
            return $value['value'];
        }
        return false;
    }    function _sess_write($key,$val) {
         $db = new mysqli($this->host,$this->user,$this->pwd,$this->database);
        $expiry = time() + $this->sess_life;
        //$value = $val;
        $check_query = $db->query("select count(*) as total from session where sesskey = '$key'");
        $check = $check_query->fetch_assoc();        if ($check['total'] > 0) {
            return $db->query("update session set expiry = '$expiry', value = '$val' where sesskey = '$key'");
        } else {
            return $db->query("insert into session values ('$key', '$expiry', '$val')");
        }
    }    function _sess_destroy($key) {
         $db = new mysqli($this->host,$this->user,$this->pwd,$this->database);
        return $db->query("delete from session where sesskey = '$key'");
    }    function _sess_gc($maxlifetime) {
         $db = new mysqli($this->host,$this->user,$this->pwd,$this->database);
        $db->query("delete from session where expiry < '" . time() . "'");
        return true;
    }
}
?><?php
/*
testclass.php
*/include("class_sessions.php");
$b=new clsSessions;session_start();if (!isset($_SESSION['name'])||!isset($_SESSION['pwd'])){
$_SESSION['name']="abcd";
$_SESSION['pwd']="99999999999";
}
echo $_SESSION['name']."<br />";
echo $_SESSION['pwd']."<br />";
//unset($_SESSION['name']);
//session_destroy();
echo time()."<br />";echo session_id();
?>
<a href="ab.php">离开本页</a><?php
//ab.phpinclude("class_sessions.php");
$bb=new clsSessions;
session_start();
//$_SESSION['bbb']="bbbbb";
echo $_SESSION['name']."<br />";
echo $_SESSION['pwd']."<br />";
echo time()."<br />";
echo session_id();
?>

解决方案 »

  1.   

    MySql 数据库保存session,想写个类,代码如下,当前页session 正常,跳转页面后,session 值丢失,网上搜索说可能是session_id重新生成了,经测试,session_id未丢失,就是值丢失,页面打开后,进入mysql后台查询,不跳转的情况下,value有正常已序列化的变量,一跳转后,此值就变成了空值.导致session 值丢失,不知道什么原因,可能是类的问题,希望高手能给予指点,谢谢.
      

  2.   

    先确认 php.ini 中
    session.auto_start = 0
      

  3.   

    不加
    include("class_sessions.php");
    $b=new clsSessions;
    时是正常的加载类了不知道我为什么session就不起作用了
      

  4.   

    session_start();
    要放在以下2个的前面,它前面什么也不能有~~~~~~~
    include("class_sessions.php");
    $b=new clsSessions;
      

  5.   

    session 从 session_start(); 以后开始生效,session没有生效之前,就调用了class_sessions.php,so....
      

  6.   

    session_start(),应该放在页面代码的最前面,它的前面最好不要有其他代码,否则会出错
      

  7.   

    session_start(),应该放在页面代码的最前面
    不可能是这个原因
      

  8.   

    session_id未丢失
    session值丢失!echo $_SESSION['name']."<br />";echo $_SESSION['pwd']."<br />";//没有值了。空!!!
    这是为什么呢?
      

  9.   


    你确定session_id没有丢失?需要使用 isset($_SESSION['name']) 来判断是否存在这个关键字,因为,php把不存在的变量都用空代替的或者用 var_dump($_SESSION)看看是否有关键字
      

  10.   

    看看session_start(); 有没有在文件第一行,然后看看session_id,然后把代码搞到别的机子上试试
      

  11.   

    如果問題是: 
        一個頁面設置session,到另外一個頁面使用的時候顯示不了值,那你必須得在session_start()之前加session_id(PHPSESSID);PHPSESSID是你設置session_id的名字,與你的配置文件php.ini設置的名字一樣,有些設成SID,那就寫SID
      

  12.   


    & 3Q A LOT