在标头重定向之前会话未保存

问题描述 投票:0回答:10

我正在将会话保存在数据库中。 我的代码如下:

// 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,但在其他文件中看不到,该文件位于此脚本的子目录中

php session http-headers sessionid
10个回答
14
投票

我找到了解决方案(对我来说)。 我在标题后面放了一个出口。

$_SESSION['session'] = 'this is a session';
header('location: apage.php');
exit;

3
投票

如果:
a) 它出现在重定向之前的会话中
b) 其他键可以工作

80% 的情况下,问题是 register_globals,并在某处使用同名变量 $userID(另外 19% 只是在意想不到的地方进行覆盖,1% 无法在重定向和过时之前写入/锁定会话数据,在这种情况下,您可以在重定向之前尝试 session_write_close() )。不用说,register_globals 应该关闭。


1
投票

在会话中,您必须做一些事情并进行一些设置:

在客户端启用cookies
  • session_start(),
  • 在任何事情发生之前
  • 确保您不会破坏会话(除非他们想注销)
  • PHP session id 必须相同(与cookie有关)
  • 另一个问题可能是 $user->id 返回对下一页上不存在的对象的引用。很可能不会,但请确保。

如果我看到你的代码,我可以为你提供更多帮助。但是在调试时,请使用 session_id() 检查会话密钥并确保它是相同的。如果您可以尝试,请告诉我我可以继续提供帮助。

我也想知道当我回到会议时这会如何。


1
投票


PHP 代码

, 会话开始(); $_SESSION['userID'] = $user->id;

header('位置:/subdirectory/index.php');


0
投票

未经测试,但你不能做这样的事情吗:

session_start(); $_SESSION['userID'] = $user->id; if( $_SESSION['userID'] == $user->id ) { header('Location: /index.php'); }

我以前从未遇到过这个问题,有趣


0
投票

对我来说唯一的原因是 $_SESSION['userID'] 正在某处被覆盖或删除。

确保在要添加/访问会话的所有文件中使用 session->start()。

一件重要的事情(可能不适用于您的情况)是,如果使用 cookie 处理会话,则可以使 cookie 只能在特定目录及其下的子目录下访问。 无论如何,在您的情况下,子目录将有权访问会话。


0
投票


0
投票

我的问题是“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();

希望它能解决您的问题。


0
投票

config.php 我有: 包括“session.php”;

在 session.php 的顶部,我有: 会话开始();

通过将 session_start() 移动到 config.php 文件的顶部,viola...

问题解决了!


0
投票
exit

强制终止脚本的另一种选择是使用

session_write_close
强制将更改写入会话存储。

但是,如果您的脚本正确终止,则不应发生这种情况。

如有关

session_write_close 的文档所述:




  

结束当前会话并存储会话数据。

会话数据通常在脚本终止后存储,而无需 需要调用session_write_close(),但是会话数据被锁定 为了防止并发写入,会话中只能运行一个脚本 随时。当将框架集与会话一起使用时,您将 由于这种锁定,体验帧一一加载。你可以 通过结束会话来减少加载所有帧所需的时间 对会话变量的所有更改完成后。

在我的例子中,这只发生在使用
Xdebug

进行调试期间,当我多次触发相同的脚本,因此多个进程试图操作同一个会话时。不知何故,会话将无法再解锁。

    

© www.soinside.com 2019 - 2024. All rights reserved.