2012-07-31 28 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()和其他棘手的比特头痛。此外,这解决了如何在会话之间共享一些信息(如当前用户)的问题。