2017-06-09 63 views
1

我試圖從PHP 5.6遷移到PHP 7.0。我一直在我的開發機器上進行一些測試,並且無法按預期工作。從PHP 5.6到PHP 7 - 會話/重定向在生產計算機上無法正常工作

應用程序的一部分需要用戶登錄。如果他們沒有登錄,並嘗試訪問網站的受限制部分,他們將被重定向到登錄頁面。會話用於存儲用戶是否登錄。這可以在我的開發機器(使用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)。

謝謝!

+0

你打算寫「有**沒有**能夠讓它按預期工作嗎?」? – Barmar

+0

檢查錯誤日誌中是否有'headers already sent'錯誤。 – Barmar

+0

在日誌中沒有錯誤,我很害怕。 – KellyMarchewa

回答

1

嘗試改變:

if (! isset ($_SESSION)) { 

if (session_id()) { 

我懷疑$_SESSION可以在PHP 7被設置爲空數組,即使沒有會議。你也可以做一個無條件的session_start()。如果您在進行中的會話時致電session_start(),則會被忽略。

+0

感謝和好點。不幸的是,它沒有解決這個問題,但它仍然是一個很好的觀察。 – KellyMarchewa