【问题标题】:PHP Session variable isset(..)=1 after session_start()PHP 会话变量 isset(..)=1 在 session_start() 之后
【发布时间】:2011-06-05 05:01:12
【问题描述】:

我想我不了解 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 子句永远不会被触发。我从来没有杀死会话,为什么它设置为“”? IE。我刷新页面并希望会话仍然存在。

如果已经设置了 isset(..) 函数,那么测试它是非常无用的......

提前致谢!

/尼克拉斯

【问题讨论】:

  • 提示:!session_id()=="" 被评估为(!session_id()) == "",而不是您(可能?)想到的!(session_id() == "")。使用!= 运算符...

标签: php session apache2 session-variables


【解决方案1】:

代码有几个问题:

  1. 测试!session_id()=="" 是错误的,因为! 的优先级高于==。它应该写成session_id() != ""。由于隐式转换,它应该可以正常工作,但我不能说它只是一个错误。
  2. session_destroy 仅在 session_start 之后调用才有效。

现在,这正是发生的事情:

  1. 您测试活动会话。因为没有,所以测试失败并且永远不会调用 session_destroy(即使调用它也不会执行任何操作)。
  2. 您测试$_SESSION["first_date_of_week"] 的存在。由于没有活动会话,isset 返回 false。
  3. 您开始会话。 $_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;

【讨论】:

  • Nicsoft 指出 session_destroy 永远不会被调用。
  • 但是如果它是同一个页面加载了两次,并且我想在每次加载该页面(一种入口页面)时启动一个新会话,那么会话不应该是活动的并且 session_id== "" 如果不破坏其他地方的会话,则为假?我确实更新了“if(session_id()!="")..." 但行为没有变化。没错,我确实在之前的会话中设置了它。
  • @Nicsoft:如果您不先致电session_start,会话将不会“活动”。请注意,在我的示例中,无论我想注销还是不想注销,我都会这样做。
  • 好的,我现在明白了。您与 Nannes 的评论对我有帮助, session_start 没有开始新的会话,但我认为它确实做到了......在 if 子句解决问题之前添加 session_start 。谢谢!
【解决方案2】:

记住 session_start 不会启动一个新的会话,只是启动“会话”。因此,如果您设置了某些内容(并且您没有破坏它,请参阅@Jon 的回答),那么您将恢复会话:)

【讨论】:

    【解决方案3】:
    session_start();
    if(isset(session_id())) {
        session_destroy();
    }
    $_SESSION['data'] = "something";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-01
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多