所以我在我的网站上建立了一个非常基本的登录系统,我在使用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']))”加载适当的东西。
答案 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)
答案 2 :(得分:0)
<?
session_start();
if (session_status() !== PHP_SESSION_ACTIVE) {
session_regenerate_id(true);
session_start();
}
?>