PHP session_regenerate_id(true)不能正常工作

时间:2013-06-27 18:14:46

标签: php sql session pdo

编辑:4 我去尝试使用常规会话处理程序,同样的问题可能是一些操作系统错误吗?

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

再次重新加载页面时,您将获得所有具有相同数据的A LOT会话。

出于某种原因执行此脚本时

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

在顶部,我正在使用delete_old_session

     

session_regenerate_id(真)

     

bool session_regenerate_id([bool $ delete_old_session = false])

     

所以预期的行为是生成一个新会话,然后删除旧会话

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

输出:

d5ips18ji4rg7q63skuf7955b4
udk903d5o2nbeoq5soujng0bp5

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


但如果我多次重新加载页面,(按住f5几秒钟......) 它创造了60多个会议


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

我不知道我是否正确实现了这个......

编辑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;
    }
}

我甚至尝试过这种常规sess_reg_id(true)

的方法
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:

1 个答案:

答案 0 :(得分:0)

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

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

是的,它正在以预期的方式运作。您正在每次重新加载页面时生成新的会话ID。因此,新生成的会话ID存储在数据库中。

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