我花了一些时间来解决这个问题的确切原因,但这似乎是正在发生的事情:
我有一个会议。我想彻底终止我当前的会话并从头开始,使用一个全新的会话,它有一个空白。
所以这就是我所做的:
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...' :-)
}