11

我已经阅读了这个问题的 php 手册,这似乎是一个很常见的问题,但我还没有找到解决方案。我将会话保存在数据库中。我的代码如下:

// session
$_SESSION['userID'] = $user->id;        
header('Location: /subdirectory/index.php');

然后在 index.php 之后的顶部session_start(),我已经 var_dumped 全局 $_SESSION 并且用户 ID 不在那里。正如我所说,我查看了 PHP 手册(http://php.net/manual/en/function.session-write-close.php),但既不为我工作,session_write_close也不session_regenerate_id(true)为我工作。有人知道解决方案吗?

编辑:我的文件顶部有 session_start() 。当我在标头重定向之前对会话全局进行 var_dump 时,我在其中看到了用户 ID,但在该脚本的子目录中的另一个文件中看不到

4

10 回答 10

14

我知道这是一个老话题,但我找到了解决方案(对我来说)。我在标题后面放了一个出口。

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

这对我有用

于 2011-04-01T09:23:07.860 回答
4

@Matt(尚无法评论...):如果:
a)它出现在重定向之前的会话中
b)其他键有效

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

于 2010-06-04T17:12:19.503 回答
1

我还没有听说过这个问题,但我没有太多使用会话。

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

  • 在客户端启用 cookie
  • session_start(),在任何事情发生之前
  • 确保你不破坏会话(除非他们想注销)
  • PHP 会话 id 必须相同(与 cookie 有关)

另一个问题可能是 $user->id 正在返回对下一页上不存在的对象的引用。很可能不是,但请确保。

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

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

于 2010-06-06T19:07:52.230 回答
1

您应该在使用会话数组之前启动会话。

PHP 代码,
session_start();
$_SESSION['userID'] = $user->id;

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

于 2017-04-16T04:02:52.327 回答
0

我最近遇到了同样的问题。我正在为学校编写一个定制的 MVC 网站,正如大家所说,start_session() 必须在第一行代码中编写。

我的问题是“session_start()”的位置。它必须是全局控制器的第一行,而不是视图的第一行。$_SESSION 在控制器的文件中不可访问,因为它仅在服务器呈现视图时启动。

然后,我在 header('location: xxx.php') 调用之后使用 session_write_close() 来保留下一个请求的会话变量。

前任:

全局控制器.php:

//First line
session_start();
require_once('Model/Database.php');
require_once('Model/Shop/Client.php');
...

登录控制器.php:

...
//Users is validated and redirected.
$_SESSION['client'] = $client;
header('location: index.php');
session_write_close();

希望它能解决你的问题。

于 2013-04-29T01:52:01.147 回答
0

你有 session_start(); 在顶端?

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

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

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

于 2010-06-03T18:37:19.317 回答
0

userID 没有任何关键字状态。

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

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

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

于 2010-06-04T11:36:37.167 回答
0

确保两个页面是相同的php版本(php5、php4有时有不同的会话路径)

于 2010-06-06T14:41:52.397 回答
0

这很烦人,但我终于找到了解决方案。

config.php 我有:包括'session.php';

在 session.php 的顶部,我有: session_start();

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

问题解决了!

于 2013-07-07T10:31:16.870 回答
0

除了强制终止脚本之外,另一个选择exit是使用session_write_close强制将更改写入会话存储。

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

作为关于session_write_close状态的文档:

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

会话数据通常在脚本终止后存储,无需调用 session_write_close(),但由于会话数据被锁定以防止并发写入,任何时候只有一个脚本可以对会话进行操作。将框架集与会话一起使用时,由于这种锁定,您将体验到一个一个加载的框架。您可以通过在会话变量的所有更改完成后立即结束会话来减少加载所有帧所需的时间。

在我的情况下,这只发生在调试期间Xdebug,当我多次触发相同的脚本并因此多个进程试图操纵同一个会话时。不知何故,会话可能不再被解锁。

于 2019-04-12T20:21:49.120 回答