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中创建空白会话,所以我会避免这种情况。
答案 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)?