【问题标题】:Ending A Session, Reset Variables Not Working?结束会话,重置变量不起作用?
【发布时间】:2012-10-15 02:24:33
【问题描述】:

我正在编写一个脚本,该脚本应该结束用户的会话,并将他们从系统中注销,从而将他们返回到登录页面。

我的注销脚本如下所示:

<?php

$_SESSION['signin'] = null;

session_destroy();

header("Location: /test/index.php");

?>

最初我以这种方式重置 signin 变量,即使会话没有被破坏,该变量也应该至少发生变化,以便系统认为用户已注销。

在我的登录页面顶部,如果他们已经登录,我有一个条件将它们转发到主页,这样一旦已经登录就无法访问登录页面。这部分看起来像这样:

<?php
session_start();
if($_SESSION['signin'] == 5)
{
        header("Location: /test/home.php");
}
?>

简而言之,当有人登录并单击链接注销时,它会利用第一个代码块注销,然后转发到包含第二个代码块的页面。

但是,这个页面仍然让我回到主页,相信用户仍然登录,因此我猜测 signin 变量没有重置。

关于如何解决我的问题的想法?

【问题讨论】:

  • 我认为,那个问题是你没有在 header(); 之后写 exit使用 var_dump; 之类的东西检查会话的值

标签: php session redirect session-variables logout


【解决方案1】:

session_destroy() 不会取消设置会话中的任何全局变量。简单地使用:

session_unset();

要取消设置所有全局变量,或仅取消设置指定变量,请使用:

unset($_SESSION['signin']);

【讨论】:

  • 注意:来自 PHP 手册:“仅将 session_unset() 用于不使用 $_SESSION 的旧不推荐代码”!!!
  • 绝对,很好的发现。关于您的回答,PHP 手册还建议应始终避免使用 unset($_SESSION) 并且您还(出于某种原因)在您自己的代码中使用上述已弃用的 $HTTP_SESSION_VARS。
  • +1 呵呵。 Touche 很快就会从代码库中删除并提交(双赢);)
【解决方案2】:

你可以试试这样的。

session_unset() 

【讨论】:

    【解决方案3】:

    你不必使用

    $_SESSION['signin'] = null;
    

    使用session_destroy(); 就足够了

    我并不完全了解 PHP 的深层内容,但是如果您将 $_SESSION 变量设置为 NULL,PHP 可以读取它,因为它设置为 NULL,这意味着“它已设置”? (虽然不确定)

    【讨论】:

    • 是的,$var = null,被设置为值为 null 的变量;但是 isset($var), 将返回 false;但同时 is_null($var) 将返回 true :) 如此有趣的语言:P
    【解决方案4】:

    在这种情况下,如果你想销毁一个变量,你可以这样做: 有一个名为 logout.php 的页面,每当用户需要注销时,将他/她重定向到该页面。现在,您将在该页面中输入以下内容,在这里我将向您解释它的作用:

    <?php
    session_start(); //Initializes the session
    unset($_SESSION['thenameofyoursession']); //This unsets a specific session, so the user is logged out, in this case it would unset "thenameofyoursession".
    $URL="/test/home.php"; //This is the redirect URL
    header ("Location: $URL"); //This basically will send the user back to the redirect URL using header.
    die(); //terminates the PHP script from running
    ?>
    

    你应该没问题。

    【讨论】:

      【解决方案5】:

      您的程序相当明显,与我们使用的程序相似,但是,如果其中没有任何内容有效,最好unset() 整个会话。 -- 如果他们没有登录,则不应该存在会话变量。

      我的logout.php 脚本包括:

      session_start();
      
      session_register("loginMessage");
      session_unregister("authenticatedUser");
      session_destroy();
      
      // relocate back to login page
      header("Location: /");
      

      哪个有效。 session_unset() 在历史上是多余的。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2013-10-05
        • 1970-01-01
        • 1970-01-01
        • 2017-03-17
        • 2013-11-10
        • 2015-09-30
        • 2013-04-12
        • 2012-08-17
        • 2014-05-16
        相关资源
        最近更新 更多