【发布时间】: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。我不知道为什么很难找到像您给出的那样清晰的解释。现在一切正常。