我正在为自己的学习项目而工作,很有趣,并且在过去的几周里,我一直在撞墙。我有会话变量,它们在应该存在时根本不存在,反之亦然。
在“ example.com/dashboard”上,$_SESSION['user']
存在,然后转到“ example.com/app/list”时,将进行if语句测试,确定是否存在并且已设置。
<?php
session_start();
if(!isset($_SESSION['user'])) {
$_SESSION['errorMessage'] = "You are not logged in yet!";
header('Location: /');
exit;
}
即使我在example.com/dashboard上验证了$_SESSION['user']
的设置,if语句也会返回false并将我扔到登录页面。
*对于我来说,登录页面是我网站根目录上的index.php。
现在,如果设置了$_SESSION['user']
,应立即在登录页面上将您重定向到仪表板。
<?php
session_start();
if(isset($_SESSION['user'])) {
header('Location: /dashboard');
exit();
}
就像我之前说的那样,它已经设置好了,但是某种程度上却没有。刷新时,它会将我发送到仪表板(如果设置了$_SESSION['user']
,应该会发生这种情况。)
那是问题之一。
现在在“ example.com/register”上,虽然未登录(会话使用session_unset,session_destroy等在注销时被销毁),但$_SESSION['user']
不存在。按下提交后,$_SESSION['user']
会以某种方式设置为您登录时的状态。绝对没有其他地方可以将$_SESSION['user']
设置为除登录脚本之外的任何代码。我的注册页面上没有任何内容允许这样做。就像注销后会话一样。
我的根页面又称为登录表单(index.php
)中的代码:
<?php
session_start();
if(isset($_SESSION['user'])) {
header('Location: /dashboard');
exit();
}
来自dashboard.php
的代码:
<?php
session_start();
if(!isset($_SESSION['user'])) {
$_SESSION['errorMessage'] = "You are not logged in yet!";
header('Location: /');
exit;
}
我的logout.php
中的代码(因为它可能与此有关):
<?php
session_start();
if(!isset($_SESSION['user'])) {
$_SESSION['errorMessage'] = "You are not logged in yet!";
header("Location: ../");
die();
}
//clear session from globals
$_SESSION = array();
session_unset();
session_destroy();
unset($_SESSION);
header("Location: ../");
die;
在我的register.php
上:
<?php
session_start();
//register stuff ^^^^^
//eventually, mail to registerer
if (mail($to, $subject, $htmlContent, $headers)) {
$connect->query($sqlInsert);
$_SESSION['register_success'] = true;
header("Location: https://example.com/register-success");
exit;
}
然后在我的register-success.php
上:
session_start();
if(!isset($_SESSION['register_success'])) {
$_SESSION['errorMessage'] = "An error has occured, please try again.";
header("Location: https://example.com/register");
exit;
}
请记住,每当我提交注册时,我都会收到电子邮件,因此应该设置$_SESSION['register_success']
,但是在“ example.com/register-success”上的if语句上仍然会抛出错误。
我尝试过的事情:
session_start();
在每个脚本的开头。session_destroy()
,session_unset()
,$_SESSION = array()
,
unset($_SESSION)
,然后将其全部合并。我绝对不知道为什么会这样。
如果我已经做了非常详尽的解释,请提前道歉。
感谢您阅读。
答案 0 :(得分:-1)
我要在注销页面上说,它不应该检查是否为用户会话设置为IS而不是未设置吗?另外,我会这样写session_destroy。此代码检查用户会话变量是否存在,然后将销毁会话。然后将错误消息放置在session_start();之后重定向到的下一页。我也认为除了session_destroy()之外,您不需要其他任何东西来破坏会话。
<?php
session_start();
if(isset($_SESSION['user'])) {
//clear session from globals
session_destroy();
/* Added a Parameter */
header("Location: ../?disperror=1");
} else {
header("Location: ../");
}
我不确定此errorMessage是否设置正确。您可能必须具有session_start();在../页面上重定向到该页面时,请在session_start之后设置errorMessage会话变量。将其放在session_start()之后的../页面上。
<?php
/* Should go on the Login page */
session_start();
/* Request the parameter */
$disperror = $_REQUEST['disperror'];
/* Establish Error Message */
$errMsg = "You are not logged in yet!";
/* Display this anywhere you want in PHP */
if ($disperror == 1) {
echo '<p>' . $errMsg . '</p>';
/* If you want to turn that into a session variable only if the session was destroyed */
$_SESSION['errorMessage'] = $errMsg;
}
?>