我希望能够在php中的会话之间来回切换。这是我目前的代码:
<?php
session_name("session1");
session_start();
$_SESSION["name"] = "1";
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
session_name("session2");
session_start();
$_SESSION["name"] = "2";
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
session_name("session1");
session_start();
echo "<pre>", print_r($_SESSION, 1), "</pre>";
我希望它输出
Array
(
[name] => 1
)
Array
(
[name] => 2
)
Array
(
[name] => 1
)
但正在输出
Array
(
[name] => 1
)
Array
(
[name] => 2
)
Array
(
[name] => 2
)
可以在这样的会话之间切换吗?我不需要同时运行两个会话,但我确实需要能够在它们之间切换。当我运行此代码时,我得到两个cookie:session1和session2具有相同的值。
感谢您的帮助!
答案 0 :(得分:22)
您需要使用session_id()
代替session_name()
<?php
session_id("session1");
session_start();
echo session_id();
$_SESSION["name"] = "1";
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
session_id("session2");
echo session_id();
session_start();
$_SESSION["name"] = "2";
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
session_id("session1");
echo session_id();
session_start();
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
session_id("session2");
echo session_id();
session_start();
echo "<pre>", print_r($_SESSION, 1), "</pre>";
这将打印:
session1
Array
(
[name] => 1
)
session2
Array
(
[name] => 2
)
session1
Array
(
[name] => 1
)
session2
Array
(
[name] => 2
)
session_id
是会话的标识符,有助于区分会话。 session_name
只是当前会话的命名别名
答案 1 :(得分:0)
正如existing answer的评论所示,提供的解决方案可能并不理想,我想提供一些替代方案。让它成为名为sane_session_name()
的函数,如下所示:
function sane_session_name($name)
{
session_name($name);
if(!isset($_COOKIE[$name]))
{
$_COOKIE[$name] = session_create_id();
}
session_id($_COOKIE[$name]);
}
使用&#34;理智&#34;在OP的原始代码中session_name()
的替换,我们得到:
<?php
sane_session_name("session1");
session_start();
$_SESSION["name"] = "1";
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
sane_session_name("session2");
session_start();
$_SESSION["name"] = "2";
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
sane_session_name("session1");
session_start();
echo "<pre>", print_r($_SESSION, 1), "</pre>";
它将产生所需的输出:
Array
(
[name] => 1
)
Array
(
[name] => 2
)
Array
(
[name] => 1
)
有什么不同?
指出此答案与raidenace's answer之间的区别:
$_SESSION
超全局不同的内容可以存储给访问者Alice和Bob,而在另外两个网站访问者Alice和Bob将共享数据&#34;而且毫无意义地名为PHPSESSID
的cookie,每次都设置值session2并来回发送。安全强>
保护那些&#34;多个(每个用户)会话&#34;从会话固定和会话劫持,我们可以进一步使用这个litte函数
function sane_session_start($name)
{
ini_set("session.use_strict_mode",true);
ini_set("session.cookie_httponly",true);
session_name($name);
if(!isset($_COOKIE[$name]))
{
$_COOKIE[$name] = session_create_id();
}
session_id($_COOKIE[$name]);
session_start();
session_regenerate_id(true);
$_COOKIE[$name] = session_id();
}
让OP的代码看起来像这样:
<?php
sane_session_start("session1");
$_SESSION["name"] = "1";
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
sane_session_start("session2");
$_SESSION["name"] = "2";
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
sane_session_start("session1");
echo "<pre>", print_r($_SESSION, 1), "</pre>";