会话变量值不显示

时间:2016-03-11 13:04:37

标签: php session

First.php

class SessionHandling implements SessionHandlerInterface {
    private $db ;

    public function open($path,$name) {
        $db = new PDO("mysql:host=127.0.0.1;dbname=test",'root','') ;
        $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION) ;
        if($db){
            $this->db = $db ;
            return true ;
        } else {
            return false ;
        }
    }

    public function close() {
        $db = null ;
        return true ;
    }

    public function read ($session_id) {
        $query = $this->db->prepare('SELECT session_data FROM sessionhandler '.
            'WHERE session_id = :session_id  AND'.
            ' session_expire > :session_expire ') ;
        $query->bindParam(':session_id',$session_id,PDO::PARAM_INT);
        $query->bindValue(':session_expire',date('Y-m-d H:i:s'),PDO::PARAM_STR);
        $query->execute() ;
        $result = $query->fetchAll(PDO::FETCH_ASSOC) ;
        if(empty($result)){
            return "check again" ;
        } else {
            return $result[0]['session_data'] ;
        }
    }

    public function write ($id,$data) {
        $dataTime = date('Y-m-d H:i:s') ;
        $newDateTime = date('Y-m-d H:i:s',strtotime('+1 month')) ;
        $query = $this->db->prepare('REPLACE INTO sessionhandler '.
            'SET session_id = :sessionId , session_data = :sessionData ,'.
            'session_expire = :sessionExpire ');
        $query->bindParam(':sessionId',$id,PDO::PARAM_INT);
        $query->bindParam(':sessionData',$data,PDO::PARAM_STR);
        $query->bindParam(':sessionExpire',$newDateTime);
        $result = $query->execute() ;
        if($result){
            return true ;
        } else {
            return false ;
        }
    }

    public function destroy($id){
        $query = $this->db->prepare('DELETE from sessionhandler '.
            'WHERE session_id = :sessionId');
        $query->bindParam(':sessionId',$id,PDO::PARAM_INT) ;
        $result = $query->execute() ;
        if($result){
            return true ;
        } else {
            return false ;
        }
    }

    public function gc ($maxLife){
        $query = $this->db->prepare('DELETE FROM sessionhandler '.
            'WHERE session_expire < DATE_SUB(NOW(), INTERVAL :maxlife SECOND)');
        $query->bindParam(':maxlife',$maxLife);
        $result = $query->execute();
        if($result){
            return true ;
        } else {
            return false ;
        }
    }
}

$handler = new SessionHandling() ;
session_set_save_handler($handler,true) ;

second.php

require_once 'First.php' ;
session_start() ;
$_SESSION['var1'] = "asdfsadfsadf" ; 
$_SESSION['var2'] = "tytyrt" ;  

third.php

require_once 'First.php'  ;
session_start() ; 
if(isset($_SESSION)){
    echo $_SESSION['var1']."<br>".$_SESSION['var2'] ; 
} 

我的会话存储在数据库中,但是当我希望看到该值不会显示在third.php上。它将给出错误,如var1和var2是未定义的索引。

第二是当我刷新thrid.php时它会在db中创建空白会话,所以我会避免这种情况。

2 个答案:

答案 0 :(得分:0)

您已在second.php中设置会话并直接运行third.php,因此未设置会话。所以请在third.php之前运行second.php

否则你包括

require_once 'First.php'  ;
require_once 'second.php' ; 
session_start() ; 
if(isset($_SESSION)){
    echo $_SESSION['var1']."<br>".$_SESSION['var2'] ; 
} 

答案 1 :(得分:0)

&#34; session_start()&#34;返回true?你能用&#34; session_id()&#34;来获得会话ID吗?你能打印两个文件的session_id吗?是一样的吗?

如果session_start返回false,请尝试再次调用它。类似的东西:

SslStream

如果session_id不同,则表示您的会话cookie可能有问题(您是否使用某些重定向从second.php获取到third.php)?