我正在使用PHP和会话创建一个超级简单的票证跟踪系统,我遇到了一些麻烦,我有以下几页:
如果没有设置会话,当你转到admin.php时,它会转到login.php。
在login.php中,如果设置了会话,则会将您带到admin.php。
用户名和密码以明文形式存储在login.php文件中,因为安全性不是这里的主要问题,它只是一个用户名和密码。
这是admin.php中的代码
<?php
include "includes/header.php";
include "includes/config.php";
include "includes/db.php";
session_start();
$admin = isset($_SESSION['myAdmin']) ? $_SESSION['myAdmin'] : false;
if(!$admin){
header('Location: login.php');
}
$db = connect();
$stmt = $db->query('SELECT * FROM tickets');
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
这是login.php中的代码
<?php
include "includes/header.php";
session_start();
$admin = isset($_SESSION['myAdmin']) ? $_SESSION['myAdmin'] : false;
if(isset($_SESSION['myAdmin'])){
header('Location: admin.php');
}
$user = 'myUsername';
$pass = 'myPassword';
$username = isset($_POST['username']) ? $_POST['username'] : false;
$password = isset($_POST['password']) ? $_POST['password'] : false;
if($username && $password){
if($user == $username && $pass == $password){
$_SESSION['myAdmin'] = true;
header('Location: admin.php');
}
}
?>
它在localhost上运行奇迹,但我不能让它在我的服务器上工作。两者都运行PHP 7.0并且所有数据库配置都很好。
这是发生的事情:
当我登录并输入正确的用户名和密码时,它只需重新加载login.php,现在如果我转到admin.php它会显示管理页面,就好像会话已创建一样。
即使我删除所有浏览数据或以隐身模式尝试也是如此。它仍然是一样的。有什么我没看到的吗?提前致谢。
顺便说一下,这是注销码:
<?php
session_start();
unset($_SESSION['myAdmin']);
header('Location: login.php');
?>
当我打开admin.php时,我可以看到注销链接,当我点击它时,我会登录login.php,但如果我在浏览器中输入它,我仍然可以访问admin.php。
什么让我失望的是我不知道如何调试,因为当变量为null或undefined或false / true时,echo不会显示任何内容。
编辑:好的,所以,在每个header
线后,我添加了这个exit();
,页面在登录后显示为空白或默认情况下在管理员中显示。现在我可以清楚地看到问题。
标头(重定向)不起作用。使用ini_set时('display_errors','On');错误说:
警告:无法修改标头信息 - 已经发送的标头,它使用header
指向该行。我怀疑session_start()可能与它有关。
session_start()和header('Location:login.php')应该在header.php之前
session_start();
if(!$_SESSION['myAdmin']){
header('Location: login.php');
}
include "includes/header.php";
无论何时调用header(),都必须在页面上的任何其他输出之前调用它。否则您将收到以下错误:
警告:无法修改标头信息 - 已发送的标头
而不是使用PHP重定向,请尝试:
`<?php echo '<script>window.location.replace("url")</script>'?>`