1

我花了一些时间来解决这个问题的确切原因,但这似乎是正在发生的事情:

我有一个会议。我想彻底终止我当前的会话并从头开始,使用一个全新的会话,它有一个空白。

所以这就是我所做的:

public function unregister_session()
{
    // I COMMENTED THOSE SECTIONS THAT I WASNT SURE WHAT THEY WERE DOING, BUT PROBLEM PERSISTS.
    //session_regenerate_id();
    //$params = session_get_cookie_params();
        // setcookie(session_name(), '', time() - 42000,
            // $params["path"], $params["domain"],
            // $params["secure"], $params["httponly"]);
    unset($_SESSION);
    $_SESSION=array();
    echo '<br> destroying session. old SID:'.session_id(); //echos 'qqhu7on0n...'
    session_unset();
    session_destroy();
    echo '<br> limbo SID:'.session_id(); //echos nothing.
    session_start();
    echo '<br> new SID:'.session_id();  //echos 'qqhu7on0n...'
}   

好吧,我认为应该发生的是我有一个新的会话。好吧,这很有效,因为上一届会议的所有内容似乎都被遗忘了,至少如果我看一下$_SESSION.

但是每当我回显 session_id 时,它仍然会给我旧的会话 ID!当我将任何值写入 $_SESSION 时,它们不会转移到下一页,而是下一页$_SESSION是空的!

编辑:我在脚本的多个位置(从上到下)回显 session_id(),我总是显示相同的 session_id。进入谷歌开发者工具查看我的 cookie,我看到 PHPSESSID 的不同 ID。我看到了当我尝试在下一页上回显 session_id() 时将看到的确切 ID...

为什么会发生这种情况,我做错了什么?如何让 session_id() 显示新的会话 ID,而不是旧的?如何将值写入 NEW $_SESSION 变量,以便它们实际上被转移到下一页?

编辑 - 解决方案

public function unregister_session()
{
    // DUNNO IF THE COMMENTED SECTIONS MAKE A DIFFERENCE
    //$params = session_get_cookie_params();
        // setcookie(session_name(), '', time() - 42000,
            // $params["path"], $params["domain"],
            // $params["secure"], $params["httponly"]);
    unset($_SESSION);
    $_SESSION=array();
    echo '<br> destroying session. old SID:'.session_id(); //echos 'qqhu7on0n...'
    session_unset();
    session_destroy();
    echo '<br> limbo SID:'.session_id(); //echos nothing.
    session_start();
    session_regenerate_id(TRUE); //THIS DOES THE TRICK! Calling it after session_start. Dunno if true makes a difference.
    echo '<br> new SID:'.session_id();  //echos '7b2jn...' :-)
}   
4

2 回答 2

1

结帐,http ://php.net/manual/en/function.session-regenerate-id.php

session_regenerate_id()

于 2013-11-02T02:49:12.113 回答
0

确保在调用该函数的任何页面上调用 session_start。我还将取消注释用于销毁 cookie 的代码。这可能会防止缓存数据出现奇怪的问题。

于 2013-11-02T02:49:50.210 回答