我正在将会话保存在数据库中。 我的代码如下:
// session
$_SESSION['userID'] = $user->id;
header('Location: /subdirectory/index.php');
然后在index.php顶部的
session_start()
之后,我已经var_dumped了$_SESSION全局并且userID不在那里。我浏览了 PHP 手册,但 session_write_close
或 session_regenerate_id(true)
都不适合我。
有人知道解决办法吗
我的文件顶部有 session_start() 。当我在标头重定向之前 var_dump 全局会话时,我在其中看到了用户 ID,但在其他文件中看不到,该文件位于此脚本的子目录中
我找到了解决方案(对我来说)。 我在标题后面放了一个出口。
$_SESSION['session'] = 'this is a session';
header('location: apage.php');
exit;
如果:
a) 它出现在重定向之前的会话中
b) 其他键可以工作
80% 的情况下,问题是 register_globals,并在某处使用同名变量 $userID(另外 19% 只是在意想不到的地方进行覆盖,1% 无法在重定向和过时之前写入/锁定会话数据,在这种情况下,您可以在重定向之前尝试 session_write_close() )。不用说,register_globals 应该关闭。
在会话中,您必须做一些事情并进行一些设置:
在客户端启用cookies
如果我看到你的代码,我可以为你提供更多帮助。但是在调试时,请使用 session_id() 检查会话密钥并确保它是相同的。如果您可以尝试,请告诉我我可以继续提供帮助。
我也想知道当我回到会议时这会如何。
,
会话开始();
$_SESSION['userID'] = $user->id;
header('位置:/subdirectory/index.php');
未经测试,但你不能做这样的事情吗:
session_start();
$_SESSION['userID'] = $user->id;
if( $_SESSION['userID'] == $user->id )
{
header('Location: /index.php');
}
我以前从未遇到过这个问题,有趣
对我来说唯一的原因是 $_SESSION['userID'] 正在某处被覆盖或删除。
确保在要添加/访问会话的所有文件中使用 session->start()。
一件重要的事情(可能不适用于您的情况)是,如果使用 cookie 处理会话,则可以使 cookie 只能在特定目录及其下的子目录下访问。 无论如何,在您的情况下,子目录将有权访问会话。
我的问题是“session_start()”的位置。它必须是全局控制器的第一行,而不是视图的第一行。 $_SESSION 在控制器的文件中不可访问,因为它仅在服务器渲染视图时启动。
然后,我在 header('location: xxx.php') 调用之后使用 session_write_close() 来保留下一个请求的会话变量。
例如:
globalController.php:
//First line
session_start();
require_once('Model/Database.php');
require_once('Model/Shop/Client.php');
...
logonController.php:
...
//Users is validated and redirected.
$_SESSION['client'] = $client;
header('location: index.php');
session_write_close();
希望它能解决您的问题。
config.php 我有: 包括“session.php”;
在 session.php 的顶部,我有: 会话开始();
通过将 session_start() 移动到 config.php 文件的顶部,viola...
问题解决了!
exit
强制终止脚本的另一种选择是使用
session_write_close
强制将更改写入会话存储。 但是,如果您的脚本正确终止,则不应发生这种情况。 如有关
session_write_close
的文档所述:
会话数据通常在脚本终止后存储,而无需 需要调用session_write_close(),但是会话数据被锁定 为了防止并发写入,会话中只能运行一个脚本 随时。当将框架集与会话一起使用时,您将 由于这种锁定,体验帧一一加载。你可以 通过结束会话来减少加载所有帧所需的时间 对会话变量的所有更改完成后。
在我的例子中,这只发生在使用
Xdebug
进行调试期间,当我多次触发相同的脚本,因此多个进程试图操作同一个会话时。不知何故,会话将无法再解锁。