2012-10-21 11 views
0

我正在使用會話將用戶登錄到我的網站。這是我的PHP會話的問題嗎?

登錄表單將輸入發送到login-exec文件,然後查詢db並驗證登錄信息。我已經把session_start();在登錄-EXEC文件的開頭,然後用下面的代碼片段將數據寫入到會話:在account.php文件的開頭

session_regenerate_id(); 
$member = mysql_fetch_assoc($result); 
$_SESSION['SESS_MEMBER_ID'] = $member['id']; 
$_SESSION['Username'] = $member['username']; 
$_SESSION['key'] = $member['Serial']; 
session_write_close(); 
header('Location: account.php'); 

我已經要求auth.php到驗證會話。

account.php:require_once('auth.php');

auth.php:

<?php 
//Start session 
session_start(); 

//Check whether the session variable SESS_MEMBER_ID is present or not 
if(!isset($_SESSION['SESS_MEMBER_ID']) || (trim($_SESSION['SESS_MEMBER_ID']) == '')) { 
    header("Refresh: 5; url=login.php"); 
    //echo $_SESSION['SESS_MEMBER_ID']; 
    die("Access Denied!"); 
    exit(); 
} 
?> 

始終在它的第一次記錄返回訪問被拒絕。當腳本重定向回到登錄頁面時,我再試一次它總是能夠正常工作......我已經將我的php文件保存爲UTF-8沒有BOM,因爲我原本以爲在會話開始之前就有了空白。這並沒有解決這個問題,我真的不知道這一點。

任何想法爲什麼會發生這種情況?

+0

它可能對session_write_close()有一些幫助。呼叫。我對這些代碼片段的執行順序感到困惑。 –

+0

我想刪除'session_write_close()'調用。 –

+0

我刪除了session_write_close(),並且發生了相同的結果。 事件觸發的順序如下所示:將登錄帖子數據登錄到login-exec.php,驗證並將驗證的信息寫入會話,然後login-exec.php將用戶轉發給account.php。在account.php中,我要求auth.php檢查是否已設置SESS_MEMBER_ID。 IT是auth.php,它首次拋出該問題,但後來隨時可以工作,只要我不清除緩存即可。 – Drew

回答

0

我相信問題是我的login-exec.php腳本中的重定向url。例如:

如果我通過登錄http://www.mydomain.com/mysubdirectory/login.php加載login.php腳本,並且login-exec.php中的標頭重定向指向http://subdomain.mydomain.com/account.php,則由於域更改而重新生成PHPSESSID。

所以我改變了標題重定向到account.php而不是完整的url,這解決了這個問題。

我本來可以使用完整的URL subdomain.mydomain.com或mydomain.com/subdirectory/,但這樣做會限制用戶和腳本的可移植性。這麼簡單的答案..確保域保持不變。如果不是,你可以設置會話名稱,我很肯定會解決這個問題。但在我的情況header('Location: script.php');做了伎倆。

-1

擺脫session_write_close();

如果這樣不能解決問題,可能是因爲您在account.php文件中丟失了會話。

在需要auth.php頁面之前致電session_start();

+0

完成和結果是一樣的。 – Drew

+0

@Drew:你爲什麼在這個腳本中調用session_regenerate_ID()?順便說一句,這意見並沒有解決問題是不是-1的原因... ... - 這意味着還有更多問題需要解決。 – Sylverdrag

+0

我沒有投票你...別人必須擁有。我已經嘗試刪除session_regenerate_ID(),它仍然不起作用。 – Drew