无法检查现有会话

时间:2013-12-02 08:15:46

标签: php session

所以我在我的网站上建立了一个非常基本的登录系统,我在使用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之前你不能引用session_start()个变量, 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']))”加载适当的东西。

3 个答案:

答案 0 :(得分:1)

你能试试吗,

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

OR:

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

此选项在没有警告的情况下正常工作。

0 = PHP_SESSION_DISABLED
1 = PHP_SESSION_NONE
2 = PHP_SESSION_ACTIVE

答案 1 :(得分:1)

克里斯,我刚发现&#34; if(session_status()!= 2){session_start();}&#34;无论PHP文档说什么,都不能工作。您必须启动会话,然后检查它。

答案 2 :(得分:0)

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