我正在尝试从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}");
}
代码段(在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)。
谢谢!
答案 0 :(得分:1)
尝试更改:
if (! isset ( $_SESSION )) {
到
if (session_id()) {
我怀疑即使没有会话,也可以在PHP 7中将$_SESSION
设置为空数组。
你也可以做一个无条件的session_start()
。如果您在已经进行的会话中致电session_start()
,则会被忽略。