2017-04-20 43 views
0

我有一個頁面login.php,它處理用戶名和密碼,如果成功,它將設置會話變量,然後將用戶重定向到home.php。 login.php中的相關部分是在這裏:在設置會話變量時是否有延遲?僅在第一次嘗試時失敗

if ($pwdHash == $storedpass) { 
      $success = true; 
      $sessionStatus = session_status(); 
      if ($sessionStatus !== PHP_SESSION_ACTIVE) { 
       session_start(); 
      } 
      $_SESSION['user_id'] = $user; 
      $_SESSION['logged_in'] = true; 
      session_write_close(); 
      header('Location: http://www.examplesite.com/home.php'); 
      header("HTTP/1.1 303 See Other"); 
      die("redirecting"); 
     } 

然後home.php嘗試收集會話變量

$sessionStatus = session_status(); 
if ($sessionStatus !== PHP_SESSION_ACTIVE) { 
    session_start(); 
} 
$loggedIn = $_SESSION['logged_in']; 

的問題是,在第一登錄嘗試,$ _SESSION [」 logged_in']未定義,即使login.php成功,也會生成錯誤。

Notice: Undefined index: logged_in 

$ _SESSION的的var_dump返回一個空數組,但sessionStatus報道說,會議已經開始,它沒有執行在session_start。

這迫使用戶第二次登錄,然後一切都很好。那麼,重定向發生得太快,會話變量無法設置?我應該延遲重定向嗎? (以及我該怎麼做?)或者這是我做錯了什麼?

編輯:我已經根據對類似問題的回答檢查了我的主機,並確認一個會話永遠不會由多個服務器提供服務,並且不需要啓用粘滯會話或類似的任何事情。我還根據下面提供的答案和其他一些研究更新了上面的代碼,但錯誤仍然存​​在。

+0

讓我們在上次編輯後的幾天後,這個問題似乎已經解決了。至少現在。 –

回答

0

當腳本結束時,會話可能會自動保存。您在腳本結束之前重定向。

你的腳本真正結束需要多長時間取決於其他代碼需要放棄哪些內容。明確地保存會話更好。

如何做到這一點取決於你使用什麼樣的會話。一類可以關閉這樣的:

http://php.net/manual/en/function.session-write-close.php

如果這是你正在使用這樣做的一個:

if ($pwdHash == $storedpass) { 
    $success = true; 
    $_SESSION['user_id'] = $user; 
    $_SESSION['logged_in'] = true; 
    session_write_close(); 
    header('Location: http://www.examplesite.com/home.php'); 
    header("HTTP/1.1 303 See Other"); 
    die("redirecting"); 
} 

當你重定向會議應提供給下一個頁面。

如果您的會話工作不同,當然您必須修改代碼。我試圖做的是:永遠不要在代碼中拖延。這是不可靠的,毫無意義的。只需在重定向之前保存會話即可。

+0

我不知道有不同種類的會話,但這不起作用。我仍然得到錯誤「注意:未定義的索引:logged_in in ...」會話調用您在代碼中看到的是我使用的第一個,是否需要以某種方式初始化會話?仍然有點奇怪,它在第二次登錄時工作正常。 –

+0

經過一些Google搜索之後,我在設置變量之前添加了一個session_start(),但仍然得到相同的錯誤。 –

+0

仍然失敗。我已經更新了代碼並在上面添加了一些新的信息。 –

相關問題