PHP 5.6到PHP 7 - 会话/重定向在生产机器上无法正常工作

时间:2017-06-09 18:08:13

标签: php session php-7

我正在尝试从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);
    ?>

显示请求的图片:

enter image description here

它不应该再次从index.php重定向到login.php(index.php包含上面提到的header.php)。

谢谢!

1 个答案:

答案 0 :(得分:1)

尝试更改:

if (! isset ( $_SESSION )) {

if (session_id()) {

我怀疑即使没有会话,也可以在PHP 7中将$_SESSION设置为空数组。

你也可以做一个无条件的session_start()。如果您在已经进行的会话中致电session_start(),则会被忽略。