5

我有一个域 (domain.com),其中包含多个具有不同会话的子页面(默认情况下),我希望其中一些子页面共享一个会话。

因此,例如我有domain.com/section1/staff/and domain.com/section2/staff/。我正在使用该$_SESSION变量来存储当前登录用户的信息,并且我希望能够登录一次,section1/staff/并且在我转到section2/staff/.

从阅读其他帖子来看,这似乎是会话应该工作的默认方式,并且在两个页面中都没有设置域并且路径是“/”,session_get_cookie_params()所以它应该是同一个会话,但它不共享$_SESSION变量,甚至当我称session_destroy()它不会破坏其他会话。

有没有办法明确地将它们设置为使用相同的(或其他地方来查找不会出现在session_get_cookie_params()数组中的默认设置)?

4

3 回答 3

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() 和其他棘手的问题。另外,这解决了如何在会话之间共享一些信息(例如当前用户)的问题。

于 2012-08-01T02:48:01.123 回答
0

处理时通常的建议$_SESSION是确保session_start(); 在所有 PHP 脚本的顶部调用,然后再调用。

例子:

<?php // file1.php

session_start();

// other stuff...

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

?>

<?php // file2.php

session_start();

// other stuff...

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

?>
于 2012-07-31T21:45:36.733 回答
0

问题是一个部分将 URL 强制为 domain.com,而另一部分将其强制为 www.domain.com。

于 2012-07-31T22:00:39.507 回答