2012-07-31 63 views
4

我有一個域(domain.com),它有多個具有不同會話的子頁面(默認情況下),我希望其中一些子頁面共享一個會話。跨越同一域的子頁面的PHP會話

因此,例如我有domain.com/section1/staff/domain.com/section2/staff/。 我正在使用$_SESSION變量來存儲當前登錄用戶的信息,我希望能夠在section1/staff/中登錄一次,並且當我轉到section2/staff/時仍然登錄。

從閱讀other postings好像這是默認的方式,會議應工作,並在兩個頁面的域名並沒有設置和路徑是「/」,在session_get_cookie_params()所以它應該是相同的會話,但它不共享$_SESSION變量,甚至當我打電話session_destroy()它不會破壞其他會話。

有沒有辦法明確設置它們使用相同的(或其他地方去尋找,不會在session_get_cookie_params()數組中顯示默認設置)?

回答

0

的問題是,一個部分被迫的URL domain.com和其它它被迫www.domain.com。

0

處理$_SESSION時的常見建議是確保在所有PHP腳本的頂部調用session_start();

實施例:

<?php // file1.php 

session_start(); 

// other stuff... 

$_SESSION['user'] = 'josh'; 

?> 

<?php // file2.php 

session_start(); 

// other stuff... 

echo $_SESSION['user']; // should print "josh" 

?> 
+1

是的,有沒有道理,如果你合理利用會話功能對同一域中的所有網頁不會與默認會話設置工作。 – 2012-07-31 21:48:10

+0

在一個部分我已經在session_start()立即在<?後的PHP文件的開始,但在其他部分,它加載了幾個變量和定義一些常量之後調用。儘管如此,在此之前沒有任何內容被髮布到網頁上這足以讓它成爲一個單獨的會議嗎? – Mike 2012-07-31 21:54:42

4

默認情況下,PHP將爲同一個域上的所有腳本使用相同的會話。注意domain.com和www.domain.com之間的彈跳,因爲它們可能沒有相同的會話。

而是每個版塊都創建了完全獨立的會話,爲什麼不使用一個單一的全球性會議用戶和節斷的?沒有理由$ _SESSION不能是一個多維數組。

//// things needed in multiple sections could go into a common grouping: 
$_SESSION['common']['user'] = 'josh'; 
$_SESSION['common']['privileges']['section_access'] = array('section1'=>"yes", 'section2'=>"no", 'section5'=>"security-prompt"); 

//// while things that were section specific could be grouped by section: 
$_SESSION['section1']['agreed_to_terms'] = true; 

//// you could also group by logical functionality: 
$_SESSION['staff']['badge_no'] = 44815; 

採用這種結構,就必須在每個腳本提供給你的所有信息,但只使用你所需要的零件。

此外,這節省了你在你的邏輯中雜耍session_name()和其他棘手的比特頭痛。此外,這解決了如何在會話之間共享一些信息(如當前用戶)的問題。