【问题标题】:PHP 5.6 to PHP 7 - Sessions / Redirect Not Working Properly on Production MachinePHP 5.6 到 PHP 7 - 会话/重定向在生产机器上无法正常工作
【发布时间】: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" }

标签: php session php-7


【解决方案1】:

尝试改变:

if (! isset ( $_SESSION )) {

if (session_id()) {

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

你也可以只做一个无条件的session_start()。如果您在已经有会话正在进行时调用session_start(),则会被忽略。

【讨论】:

  • 谢谢,好点。不幸的是,它并没有解决问题,但这是一个很好的观察结果。
猜你喜欢
  • 2013-08-10
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
相关资源
最近更新 更多