我花了一些时间才解决这个问题,但确实如此:
我有一个会话。我想彻底杀死我当前的会话,并从头开始,一个全新的会议,有一个空白的名单。
所以这就是我的所作所为:
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,而不是旧会话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...' :-)
}
答案 0 :(得分:1)
结帐,http://php.net/manual/en/function.session-regenerate-id.php
session_regenerate_id()
答案 1 :(得分:0)
确保在调用该函数的任何页面上调用session_start。我也会取消注释用于销毁cookie的代码。这可以防止缓存数据的奇怪问题。