簡體   English   中英

這是我的PHP會話問題嗎?

[英]Is this an issue with my PHP Session?

我正在使用會話將用戶登錄到我的網站。

登錄表單將輸入發送到login-exec文件,該文件隨后查詢數據庫並驗證登錄信息。 我已經放置了session_start(); 在login-exec文件的開頭,然后使用以下代碼段將數據寫入會話:

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');

在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文件保存在沒有BOM的UTF-8中,因為我本來以為在開始會話之前會有空白。 那不能解決問題,我真的無法弄清楚。

有什么想法為什么會這樣?

我相信問題是我的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'); 做到了。

擺脫session_write_close();

如果那不能解決問題,則可能是您丟失了account.php文件中的會話。

調用session_start(); 在需要auth.php頁面之前。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM