【发布时间】:2015-09-28 19:15:33
【问题描述】:
为什么我在打印时只得到最后一个会话的输出?我需要为每个用户 id 保存一个会话并发送密码重置电子邮件。当用户单击链接并更改密码时,我需要从服务器清除会话。
这就是我使用 PHP 的方式。
$res = array();
$uniqueId = uniqid();
echo $uniqueId . "<br>";
session_id($uniqueId);
session_start();
echo session_id() . "<br>";
$_SESSION['session_id'] = session_id();
$_SESSION['event_id'] = 'event1';
$_SESSION['user_id'] = 'user1';
$res[] = json_encode($_SESSION);
$uniqueId2 = uniqid();
echo $uniqueId2 . "<br>";
session_destroy();
session_id($uniqueId2);
session_start();
echo session_id() . "<br>";
$_SESSION['session_id'] = session_id();
$_SESSION['event_id'] = 'event2';
$_SESSION['user_id'] = 'user2';
$res[] = json_encode($_SESSION);
echo "<br>";
print_r($res);
print_r 的输出:
Array (
[0] => {"session_id":"5609187f586da","event_id":"event1","user_id":"user1"}
[1] => {"session_id":"5609187f588e1","event_id":"event2","user_id":"user2"}
)
现在在一个新页面中,当我尝试像这样处理两个会话的每个事件 ID 时,我只得到最后一个会话的 event_id 而不是两者。首先它说
Notice: Undefined index: event_id in C:\xampp\htdocs\test\test.php on line 12
这就是我在新页面中所做的。
$id1 = '560915a8c0875';
$id2 = '560915a8c0d51';
session_id($id1);
session_start();
echo $_SESSION['event_id'];
echo "<br>";
session_id($id2);
echo $_SESSION['event_id'];
这不能用 PHP 还是什么?
【问题讨论】:
-
您在新页面中做什么?也请分享..
-
你到底想在这里实现什么?如果这是为了保护您的密码重置端点——应该通过生成一个随机令牌来完成,该令牌将存储到数据库中。为此使用会话不是一个好方法(尤其不是您现在尝试这样做的方式。)
-
一个会话可能在用户检查他们的电子邮件时已经过期,如果他们从另一台设备检查他们的电子邮件,cookie 也可能毫无意义。执行此操作的常用方法是随机令牌,将其存储到数据库中。如果您因为没有使用数据库而不想这样做,您还可以使用一些明文参数的组合(例如用户的电子邮件地址、他们请求重置密码的时间等)。 ),以及这些参数的哈希值和一个秘密。这样,您可以通过再次计算哈希来检查参数是否真实。
-
您必须更改 PHP 清除旧会话数据的设置。但同样,为什么你坚持使用会话来做到这一点?它们不是这项工作的正确工具。
-
那么是什么让您认为它是适合这项工作的工具......?每当您认为必须在一个 PHP 脚本实例中处理多个会话时,这表明您可能正在做一些没有意义的事情。
标签: php session cookies session-variables session-timeout