【发布时间】:2017-06-09 18:08:12
【问题描述】:
我正在尝试从 PHP 5.6 迁移到 PHP 7.0。我一直在我的开发机器上进行一些测试,但无法让它按预期工作。
应用程序的一部分要求用户登录。如果他们没有登录,并试图访问网站的受限部分,他们将被重定向到登录页面。会话用于存储用户是否登录。这适用于我的开发机器(使用 PHP 7.0)和生产机器,使用 PHP 5.6。它确实在生产机器上使用 PHP 7.0 工作。
如果我输入了错误的用户名和密码,它会显示相应的错误消息。但是,如果我输入正确的用户名和密码,登录屏幕就会再次显示。没有错误,也没有返回 URL。我怀疑阅读课程有问题,但我不能肯定。但是,我不确定为什么会这样 - php.ini 文件中的 session.save_path 是相同的。
我非常感谢有关该主题的任何指导。我只是不确定如何解决这个问题,因为它在我的开发机器上运行良好。
登录界面:
<?php
include_once("config.php");
include(INCLUDEROOT . "includes/header.php");
$return = "teammember/index.php";
?>
<div class='row adminHeader topSection'><div class='col-md-12'><h2>Login</h2></div></div>
<?php
if(isset($_GET['failed'])) {
echo "<span class='error'>Invalid login.</span>";
}
if(isset($_GET['returnURL']) && $_GET['returnURL'] != "") {
$return = formatInput($_GET['returnURL']);
}
?>
<form method='post' action='includes/login.php'>
<input type='hidden' name='returnURL' value='<?php echo $return; ?>' />
<div class='form-group'><label class='control-label'>Username: </label><input type="text" class='form-control' name="user"></div>
<div class='form-group'><label class='control-label'>Password: </label><input type="password" class='form-control' name="pass"></div>
<button class='btn btn-primary pull-right' name="login" value="Login">Login</button>
<div class='clearfix'></div>
</form>
<?php
include(INCLUDEROOT . "includes/footer.php");
?>
登录后端/脚本
<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
include_once("../config.php");
$dbContext = new DBContext();
session_start();
$error;
$username = formatInput($_POST["user"]);
$pass = formatInput($_POST["pass"]);
$returnURL = formatInput($_POST['returnURL']);
if ($dbContext->getUser($username, $pass) != false) {
$_SESSION["userLevel"] = $dbContext->getUser($username, $pass);
if ($dbContext->getUser($username, $pass) != 1) {
// header("Location: " . ROOT . "teammember/index.php");
header("Location: " . ROOT . $returnURL);
} else {
// header("Location: " . ROOT . "teammember/adminPanel.php");
header("Location: " . ROOT . $returnURL);
}
} else {
header("Location: " . ROOT . "login.php?failed=true&returnURL={$returnURL}");
}
如果用户尚未登录,则重定向用户的代码 sn-p(在 header.php 中):
<?php
if (! isset ( $_SESSION )) {
session_start ();
}
if (empty ( $_SESSION ['userLevel'] )) {
$returnURL = $_SERVER["REQUEST_URI"];
$returnURL = substr($returnURL, 1); /// remove leading slash
header ( "Location: " . ROOT . "login.php?returnURL=$returnURL" );
}
$isAdmin = ((isset ( $_SESSION ['userLevel'] ) && $_SESSION ['userLevel'] == 1) ? true : false);
?>
显示请求的图片:
它不应该再次从 index.php 重定向到 login.php(index.php 包含上面提到的 header.php)。
谢谢!
【问题讨论】:
-
您是否打算写“没有能够让它按预期工作。”?
-
检查您的错误日志中的
headers already sent错误。 -
恐怕日志中没有错误。
-
var_dump($_SESSION);显示什么? -
var_dump 显示 array(1) { ["userLevel"]=> string(1) "2" }