【问题标题】:Having trouble checking for existing session检查现有会话时遇到问题
【发布时间】:2013-12-17 21:11:57
【问题描述】:

所以我在我的网站上制作了一个非常基本的登录系统,但我在使用 session_status 检查活动会话时遇到了问题。这是怎么回事:

我有一个注册页面,它同时充当一个表单(当$_SERVER['REQUEST_METHOD'] != 'POST')和一个将用户添加到数据库的脚本(当$_SERVER['REQUEST_METHOD'] == 'POST')。如果一切顺利并且添加了用户,那么我执行以下代码:

session_start();
$_SESSION['username'] = $username;
$_SESSION['password'] = $password;

header('Location: registration-successful.php');
exit();

我知道我的session_start() 不在代码的开头,但这没关系,因为在调用session_start() 之前程序不会输出任何内容。 (事实上​​,可以调用session_start() 的唯一方法是它从不输出任何东西,因为它会在之后立即退出。)

我的 registration-successful.php 代码如下所示:

<?php
    if(session_status() == PHP_SESSION_ACTIVE){
        session_start();
    }
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>Noether Here Nor There - Registration Successful</title>
    <link rel="stylesheet" href="css/main.css" type="text/css" />
</head>
<body>
<h1>Congratulations <?php echo "{$_SESSION['username']}" ?>, you were successfully registered!</h1>
<p>Continue on to <a href="index.php">the main site</a>.</p>
</body>
</html>

就目前而言,此代码不起作用。相反,它会打印出“恭喜,您已成功注册”。也就是说,它无法识别$_SESSION。很明显,session_start() 没有被执行。所以 if 语句失败了。

但我不明白为什么。事实上,当我删除if(session_status() == PHP_SESSION_ACTIVE) 并简单地输入session_start() 时,它就可以工作了。

但我需要能够使用session_status() == PHP_SESSION_ACTIVE,因为在我的主页上,我使用它来确定是显示登录屏幕还是用户主页。

显然,这是可行的——毕竟,如果您未登录,几乎每个网站(例如 Facebook)都可以显示其登录页面,如果您登录了,则可以显示您的主页。所以他们必须以某种方式检查活动会话。我会使用 isset($_SESSION[...]) 之类的东西,但是

a) 我被告知在声明 session_start() 之前不能引用 $_SESSION 变量,并且 b) session_status 函数应该消除对所有那些 hacky 东西的需要。

有人能解释一下吗?我想我开始发疯了。

编辑:这是我的 index.php 页面的代码(链接到 registration-successful.php):

<?php
    if(session_status() !== PHP_SESSION_ACTIVE){
    $active = FALSE;
    } else{
        $active = TRUE;
        session_start();
    }
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>Title</title>
    <link rel="stylesheet" href="css/main.css" type="text/css" />
</head>
<body>
    <h1>Title</h1>
    <?php
        if(!$active){
    ?>
        <a href="login.php">Log In</a>
        <br />
        <a href="register.php">Register</a>
    <?php
        } else {
            echo "Welcome " . $_SESSION['username'] . ".";

        }
    ?>
</body>
</html>

编辑#2:谢谢大家,问题解决了。我误解了 session_status 在做什么以及何时使用它。 更新后的代码只是将 session_start() 放在顶部,然后根据条件“if(isset($_SESSION['username']))”加载适当的东西。

【问题讨论】:

  • 我想我一定不明白 session_status 正在检查什么。我认为它是这样工作的:在 register.php 页面上,会话被创建,并且用户名和密码的会话变量被初始化。然后,在下一页, session_status() 应该返回 PHP_SESSION_ACTIVE,因为我刚刚在前一页创建了一个。换句话说,如果 session_status == PHP_SESSION_ACTIVE 测试成功,我应该只做 session_start() ,否则,他们需要登录。所以我真的不明白为什么它不应该只是 "if(session_status() = = PHP_SESSION_ACTIVE) {session_start();}".
  • “在下一页,session_status() 应该返回 PHP_SESSION_ACTIVE,因为我刚刚在前一页创建了一个”——不,它不是这样工作的。只有在 在当前脚本中 已经开始会话时,您才会获得 PHP_SESSION_ACTIVE - 否则您将获得 PHP_SESSION_NONE(或分别为 PHP_SESSION_DISABLED)。
  • 哦。这似乎有点乏味。那么如何检查某人是否已登录(即会话正在进行(来自上一页))?
  • 我在这里找到了一个较早的讨论:codingforums.com/showthread.php?t=148593,他们说只需检查是否设置了 $_SESSION['username']。这仍然是解决问题的方法吗?我想我已经把这变得不必要的复杂了。
  • 是的。这似乎行得通。谢谢,CBroe。我不知道为什么很难找到像您给出的那样清晰的解释。现在一切正常。

标签: php session


【解决方案1】:
<?
  session_start();    
  if (session_status() !== PHP_SESSION_ACTIVE) {
    session_regenerate_id(true);
    session_start();
  }
?>

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
【解决方案2】:

克里斯,我刚刚发现“ if(session_status() != 2) {session_start();} ”不管 PHP 文档怎么说都不起作用。您必须启动会话,然后检查它。

【讨论】:

    【解决方案3】:

    你可以试试这个,

    <?php
        if (session_status() !== PHP_SESSION_ACTIVE) {session_start();}
    ?>
    

    或者:

    <?php
        if(session_status() != 2) {session_start();}
        // your code
    ?>
    

    此选项可以正常工作而不会发出警告。

    0 = PHP_SESSION_DISABLED
    1 = PHP_SESSION_NONE
    2 = PHP_SESSION_ACTIVE
    

    【讨论】:

    • 它确实显示了用户名,但是当我点击从 registration-successful.php 到我的 index.php 页面的链接时,会话消失了。我也会发布 index.php 的源代码。
    • 在index.php页面也需要改if (session_status() !== PHP_SESSION_ACTIVE) {session_start();}
    • 我不应该使用 session_start() 从上一页恢复会话吗? IE。 if (session_status() == PHP_SESSION_ACTIVE) {session_start(); }?我没有得到的是条件失败似乎表明没有会话处于活动状态,但是我如何获取用户名变量?如果 == PHP_SESSION_ACTIVE 测试失败,那不应该意味着 $_SESSION 变量中没有任何信息吗?或者至少 PHPSESSIONID 为空?对不起,如果我的问题没有多大意义 - 已经很晚了,我对这些东西很陌生。
    • session_status()!==PHP_SESSION_ACTIVE时需要使用session_start()
    • 感谢您的帮助。事实证明,你的答案不是我的问题的答案,而是我认为我遇到的问题的答案。无论如何,这有助于理解实际问题,所以答案就交给你了。
    猜你喜欢
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 2022-11-01
    相关资源
    最近更新 更多