2013-06-27 26 views
1

编辑:4 我去了,并试用了常规会话处理程序,同样的问题可能是一些操作系统错误?PHP session_regenerate_id(true)不工作,因为它应该

session_start(); 
$_SESSION['h0']=5; 
session_regenerate_id(true); 

页面多次重装时,会再次得到了很多会议都具有相同的数据。

为了执行这个脚本的

define('endl', "<br>"); 
$session->start_session(); 
echo session_id().endl; 
session_regenerate_id(true); 
echo session_id().endl; 

当在顶部我使用delete_old_session

session_regenerate_id(真)

布尔session_regenerate_id某种原因([布尔$ delete_old_session = false])

因此,预期的行为是产生一个新的会话,然后删除旧的

如果我执行它通常我有正确的行为...

输出:

d5ips18ji4rg7q63skuf7955b4 
udk903d5o2nbeoq5soujng0bp5 

http://s7.postimg.org/67dbyv3x7/image.png


但如果我重新加载页面多次,(保持按下F5的一对夫妇在o秒......) 它创造了超过60会话


http://s7.postimg.org/442wr744b/image.png

我不知道,如果im实现这个正确。 ..

编辑2: 销毁回调

public function destroy($sessionId) { 
    $qry = "DELETE FROM sessions WHERE id = :id"; 
    if (!isset($this->dStatement)) { 
     $this->dStatement = $this->pdo->prepare($qry); 
    } 
    $this->dStatement->bindParam(':id', $sessionId, PDO::PARAM_INT); 
    if ($this->dStatement->execute()) { 
     return true; 
    } else { 
     echo "error destroy()"; 
     return false; 
    } 
} 

我甚至tryied这种方法insted的的定期sess_reg_id(真)

public function regen_id(){ 
    $sessionId = session_id(); 
    echo $sessionId; 
    $qry = "INSERT INTO sessiondeletequeue VALUES (:id, 0)"; 
    if(!isset($this->regQuery)){ 
     $this->regQuery = $this->pdo->prepare($qry); 
    } 
    $this->regQuery->bindParam(':id', $sessionId, PDO::PARAM_STR); 
    if($this->regQuery->execute()){ 
     session_regenerate_id(); 
     echo "<br>"; 
     $this->forceDelete(); 
     return true; 
    } 
    else{ 
     return false; 
    } 
} 
private function forceDelete(){ 
    $qry = "SELECT id FROM sessiondeletequeue"; 
    foreach($this->pdo->query($qry) as $row){ 
     $this->destroy($row['id']); 
     if(!isset($this->forceQuery)){ 
      $this->forceQuery = $this->pdo->prepare("UPDATE sessiondeletequeue SET deleted = 1 WHERE id = :id"); 
     } 
     $this->forceQuery->bindParam(':id', $row['id'], PDO::PARAM_STR); 
     $this->forceQuery->execute(); 
    } 
    $this->pdo->query("DELETE FROM sessiondeletequeue WHERE deleted = 1 "); 

编辑3: 我知道我能找到办法解决它,但我很好奇,想知道是什么原因到底是创建多个会话! D:

+0

bool session_regenerate_id([bool $ delete_old_session = false]) delete_old_session 是否删除旧的关联会话文件。 –

+0

可能是你的'destroy'回调实现中的缺陷? –

+0

我已经编辑了这篇文章,并在其中加入了破坏 –

回答

0

您可能将PHP的默认会话机制与您的框架或您自己的会话实现混合在一起。

$session->start_session(); // where does $session come from? 
//and then 
session_id(); 

是的,它的工作预期的方式。您将在每个页面重新加载时生成一个新的会话ID。所以新生成的会话ID正在存储在数据库中。

只在需要时重新生成会话ID。您可能不需要在每次请求页面时生成它。

+0

正如他指出的,向session_regenerate_id提供'true'作为arg应该删除旧会话。 –

+0

@FrankFarmer谢谢指出。是的,看起来他正在使用$ session和session_ *函数。编辑我的答案。 – masnun

+0

但是,如果我混合不应该$ _SESSION去温度和我的$会话数据库?仍然是一回事吗? shouldnt session_set_save_handler重写PHP处理会话的方式?继承人我的部分班级http://pastebin.com/iZ2qt37V –

相关问题