【发布时间】:2010-06-30 14:44:41
【问题描述】:
我想在一个 PHP 脚本中使用两个独立的 $_SESSION。
我已尝试使用以下代码验证这是否可行。
error_reporting(-1);
session_name('session_one');
session_start();
$_SESSION = array();
$_SESSION['session_one_var'] = 'test_one';
$output1 =
(
"session_id(): '" . session_id() . "'.<br/>\n" .
"session_name(): '" . session_name() . "'.<br/>\n" .
print_r($_SESSION, true)
);
session_write_close();
$_SESSION = array();
session_name('session_two');
session_start();
$_SESSION['session_two_var'] = 'test_two';
$output2 =
(
"session_id(): '" . session_id() . "'.<br/>\n" .
"session_name(): '" . session_name() . "'.<br/>\n" .
print_r($_SESSION, true)
);
session_write_close();
$_SESSION = array();
echo "$output1<br/>\n<br/>\n$output2";
输出:
session_id(): 'f19aecd8d3ce0c5d444456d2387c6e35'.
session_name(): 'session_one'.
Array ( [session_one_var] => test_one )
session_id(): 'f19aecd8d3ce0c5d444456d2387c6e35'.
session_name(): 'session_two'.
Array ( [session_one_var] => test_one [session_two_var] => test_two )
我希望输出显示名为“session_one”的会话包含数组(“session_one_var”=>“test_one”),而名为“session_two”的会话包含数组(“session_two_var”=>“test_two”)。相反,“session_two”似乎与“session_one”是同一个会话。
如果我插入一行 'session_regenerate_id();'在第二个 'session_start();' 之后行,为“session_two”报告了不同的会话 id,但输出是相同的。见下文。
session_id(): 'f19aecd8d3ce0c5d444456d2387c6e35'.
session_name(): 'session_one'.
Array ( [session_one_var] => test_one )
session_id(): '3bcc74a7bcbac30e680c5b94fadcede1'.
session_name(): 'session_two'.
Array ( [session_one_var] => test_one [session_two_var] => test_two )
我做错了什么?
我知道以前在这个论坛上也有人问过类似的问题,here 和 here,但到目前为止提供的答案都未能启发我。
任何帮助将不胜感激。
【问题讨论】:
-
发现这个:php.net/manual/en/function.session-start.php#91759 用数字键试试。然而,正如文档中所说:“访问您网站的访问者被分配了一个唯一的 ID,即所谓的会话 ID。这要么存储在用户端的 cookie 中,要么在 URL 中传播。”
-
我要求一个会话独立于可能存在的任何其他会话,因为我正在尝试实现一个密码登录脚本以包含在任意页面的顶部。密码登录脚本将提示任何未登录的用户输入用户名和密码。在成功登录的情况下,用户先前提供了正确的用户名和密码的事实将存储在会话中。该脚本需要处理任意页面,因此它不会干扰访问受限页面可能使用的任何会话。
-
使用现有会话的唯一问题是覆盖同名的会话变量。你可以在它们前面加上一些独特的东西,比如
$_SESSION['__login_successful'] = true;