相关:会话变量未结转
问题
当我从一个页面导航到另一个页面时,任何 $_SESSION[""] 变量都会丢失,尽管我session_start();
在尝试访问它们之前正在使用它们。
似乎session_start()
它将自动启动一个新会话,除非将 asession_name()
或 asession_id()
传递给它以指定要恢复的会话。
因此,当需要从服务器端显示/隐藏按钮时,按钮永远不会显示,尽管经过验证的用户之前已经过身份验证。
我在几篇文章中读到了可以解决问题的文章setcookie()
。
编辑
我必须为会话 ID 手动设置 cookie,如下所述:
Can I restore a PHP SESSION by its ID?
代码示例
login.php
<?php
require_once "logout.php";
require_once "../data/data_access.php";
$sid = session_id();
if (empty($sid)) session_start();
$userName = "";
$password = "";
if (isSet($_REQUEST["userName"])) $userName = $_REQUEST["userName"];
if (isSet($_REQUEST["password"])) $password = $_REQUEST["password"];
echo login($userName, $password);
function login($login, $pass) {
if (isAuthenticUser($userName, $password)) {
session_regenerate_id(true);
$_SESSION["authenticated"] = true;
setcookie("cookie_name", session_id(), time() + 1200);
} else $_SESSION["authenticated"] = false;
return $_SESSION["authenticated"];
}
another_file.php
<?php
$sid = session_id();
if (empty($sid)) session_start($_COOKIE["cookie_name"]); // Will this make it?
?>
通过检索会话 id 就足够了,$_COOKIE["cookie_name"]
还是我应该做其他事情以便能够继承我的会话变量值?
更新
经过更深入的挖掘,我发现在正常情况下,不需要使用 cookie 来恢复会话,因为 PHP 通过 PHPSESSID cookie 自动完成,我不必关心。
但是,我使用 jQuery$.post()
和$.ajax()
函数与 PHP 服务器进行通信,因此它不能像往常一样使用 URL 自动获取/发布 SID。
考虑到这一点,我设法找到了一种手动使用 cookie 的方法,因此我不会将会话和 cookie 与另一个 SO 用户提到的会话和 cookie 混为一谈:
更新#2
根据我收到的答案,我已经验证了 PHP.ini 配置文件以查看是否启用了 cookie 等。
这里是:
session.save_path = "c:/wamp/tmp"
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 100
session.gc_maxlifetime = 1440
饼干和会话就是这样!尽管这种配置在大多数情况下都可以完美运行,但它不起作用。该session_start()
函数总是从一个新会话开始。最好的例子是当我转到一个session_start()
已调用 a 并且我无法访问我的$_SESSION["authenticated"]
.