无法检查现有会话

克里斯·米德尔顿

因此,我在自己的网站上制作了一个非常基本的登录系统,并且在使用session_status检查活动会话时遇到了麻烦。这是怎么回事:

我有一个注册页面,该页面同时充当表单(when $_SERVER['REQUEST_METHOD'] != 'POST')和将用户添加到数据库的脚本(when $_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在声明之前不能引用变量session_start(),并且b)session_status函数应该消除了对所有棘手内容的需求。

请问有人对此有所启示吗?我想我开始发疯了。

编辑:这是我的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']))”加载适当的内容。

克里希·R。

你可以试试这个吗

<?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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法正确检查现有的Cookie

来自分类Dev

无法通过geckodriver附加到现有的Selenium会话

来自分类Dev

我无法获取mysqli_query来检查现有的数据库值

来自分类Dev

无法检查现有的用户名Google App Engine

来自分类Dev

Laravel 5.2-添加到现有会话数组将覆盖现有会话

来自分类Dev

检查所有控制器的会话?

来自分类Dev

检查facebook会话是否有效

来自分类Dev

检查所有控制器的会话?

来自分类Dev

有可能绕过PHP会话检查吗?

来自分类Dev

使用PostgresQL检查现有列的约束

来自分类Dev

条纹api检查现有卡

来自分类Dev

检查现有和已定义的元素

来自分类Dev

检查Java中的某些现有对象

来自分类Dev

Firebase快速检查现有用户

来自分类Dev

选择之前检查现有数据

来自分类Dev

检查现有用户是否参与

来自分类Dev

检查现有数据并环回

来自分类Dev

如何检查ioctl上的现有参数

来自分类Dev

将现有项目检查到 VSTS

来自分类Dev

Mongodb 查询 - 检查现有文档

来自分类Dev

在现有的vim会话中打开文件(Cygwin / mintty)

来自分类Dev

如何查询现有postgres会话的事务隔离级别?

来自分类Dev

PowerShell使用现有的会话状态来填充InitialSessionState

来自分类Dev

向现有会话添加键和值

来自分类Dev

重新连接到现有的屏幕会话

来自分类Dev

simplesamlphp IDP使用现有会话启动的身份验证

来自分类Dev

获取connect-redis上的现有会话列表

来自分类Dev

如何从现有的登录会话中调用ID?

来自分类Dev

Vue添加到现有会话存储阵列