session_start()之后的PHP会话变量isset(..)= 1

时间:2011-01-07 10:38:17

标签: php session apache2 session-variables

我想我不理解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(..)函数是非常无用的测试......

提前致谢!

/尼古拉斯

3 个答案:

答案 0 :(得分:3)

代码有几个问题:

  1. 测试!session_id()==""错误,因为!的优先级高于==。它应该写成session_id() != ""。由于隐式转换,它应该正常工作,但我不能说它只是一个错误。
  2. session_destroy仅在 session_start后调用时有效。
  3. 现在,这是完全发生的事情:

    1. 您测试活动会话。由于没有,测试失败并且永远不会调用session_destroy(即使调用它也不会执行任何操作)。
    2. 您测试是否存在$_SESSION["first_date_of_week"]。由于没有活动会话,isset返回false。
    3. 您开始会话。 $_SESSION["first_date_of_week"]现在可用,但仅仅是因为您在某些早期会话中设置了它,而是在您未显示的代码中
    4. 尝试使用此代码以更好地处理正在发生的事情:

      $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";