【发布时间】:2014-02-05 22:02:47
【问题描述】:
我正在努力了解 PHP 会话。
我使用 ShortPHP 作为路由器,但 ShortPHP 代码不涉及会话。
模板有session_start()作为第一行:-
<?php
session_start();
include 's.php';
var_dump($_SESSION);
$sid = session_id();
echo $sid;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>
首先为每个页面执行此模板(我添加了前几行(var_dump 等)以进行调试),然后是特定的页面代码。在这种情况下,我使用以下代码:-
<?php
if (!defined('S')) die ("You've got no S"); // part of ShortPHP - irrelevant
if (!isset($_SESSION['login']) || $_SESSION['login'] != "1") {
echo "<p>Session is NOT set</p>";
//header() redirect to login here...
//exit();
}
$sri = session_regenerate_id();
var_dump($sri);
?>
如果我注释掉session_regenerate_id(),那么会话变量(login)在重新加载页面后仍然可用,但启用session_regenerate_id() 后,当我重新加载页面时会话变量将被删除。请注意,session_regenerate_id() 每次都会返回 true。
我什至已经读取了存储在服务器上的会话,并且原始会话的文件中包含会话变量数据,而在重新加载页面后,新会话文件没有变量(文件大小为零)。
我在这里做错了吗?
【问题讨论】:
-
在重置 ID 之前是否有任何输出到浏览器,
session_regenerate_id()返回什么? -
用您的问题的答案编辑了问题:是的和正确的
-
奇怪。如果您在发送标头(输出发送到浏览器)之前使用
session_regenerate_id(),是否会有所不同? -
@jeroen:我已将
session_regenerate_id()放在模板的第三行(在session_start()之后),但没有帮助。登录后它仍然显示会话变量,当我刷新页面时它是空的。 -
对不起,这对我来说是个谜,它应该可以工作......