我想我不理解PHP中会话变量或会话本身的范围,因此这个问题:
这是我的代码
if(session_id()!=""){
echo "Getting rid of session"."</br>";
session_destroy();
}
echo "Before session_start(): ".isset($_SESSION["first_date_of_week"])."</br>";
session_start();
echo "After session_start(): ".isset($_SESSION["first_date_of_week"])." ".$_SESSION["first_date_of_week"]->format("Y-m-d")."</br>";
输出结果为:
Before session_start():
After session_start(): 1 2011-01-09
为什么在会话变量上执行isset(..)时,它会在启动会话后直接设置,即使我还没有使用它或设置它?但它仍然具有与以前相同的价值。
此外,session_id()=“”因为永远不会触发if子句。我从来没有杀过这个会议,为什么它被设置为“”?即我刷新页面并期望会话仍然存在。
如果已经设置了,那么使用isset(..)函数是非常无用的测试......
提前致谢!
/尼古拉斯
答案 0 :(得分:3)
代码有几个问题:
!session_id()==""
错误,因为!
的优先级高于==
。它应该写成session_id() != ""
。由于隐式转换,它应该正常工作,但我不能说它只是一个错误。session_destroy
仅在 session_start
后调用时有效。现在,这是完全发生的事情:
session_destroy
(即使调用它也不会执行任何操作)。$_SESSION["first_date_of_week"]
。由于没有活动会话,isset
返回false。$_SESSION["first_date_of_week"]
现在可用,但仅仅是因为您在某些早期会话中设置了它,而是在您未显示的代码中。尝试使用此代码以更好地处理正在发生的事情:
$logout = true; // play with this
session_start();
if ($logout) {
session_destroy();
echo "Logged out.";
die;
}
if (!isset($_SESSION['counter'])) {
$_SESSION['counter'] = 1;
}
else {
++$_SESSION['counter'];
}
echo "The counter value is ".$_SESSION['counter'];
die;
答案 1 :(得分:2)
请记住,session_start不会启动 new 会话,只需启动“会话”即可。所以,如果你已经设定了某些东西(并且你没有将其破坏,请参阅@Jon的回答),那么你将得到你的会话:)
答案 2 :(得分:2)
session_start();
if(isset(session_id())) {
session_destroy();
}
$_SESSION['data'] = "something";