7

除了设置它们的页面之外,我无法在页面上使用会话变量,IOW 它们就像非会话变量一样。我在六个其他类似的论坛上发现了一个类似的问题,但在其他情况下的答案总是不适用。

这是我的文件:

sess1.php

<?php
session_start();

session_register("userid");
session_register("textvar");

$_SESSION['userid'] = 10333 ;
$_SESSION['textvar'] = TextVariable ;

echo "<p>User ID is: " . $_SESSION['userid'] . "</p>" ;
echo "<p>Another variable is: " . $_SESSION['textvar'] . "</p>" ;
?>
<p>Go to the <a href="sess2.php">next page</a>.</p>

并且, sess2.php

<?php
session_start();

echo "<p>The userid session variable is: " . $_SESSION['userid'] . "</p>";
echo "<p>The other session variable is: " . $_SESSION['newvar']. "</p> ";
?>

每种情况下的浏览器输出为:

sess1.php

用户 ID 为:10333

另一个变量是:TextVariable

转到[下一页]。

并且, sess2.php

userid 会话变量是:

另一个会话变量是:

转到[最后一页]。

有几件事不是:

  • 我确实在两个文件的顶部都有 session_start() 。
  • 变量目录是可写的,会话变量显示在那里。(我有大约一百个名为 sess_b62 的小文件,里面有这个:'userid|i:10333;textvar|s:12:"TextVariable";'。)
  • phpinfo() 告诉我 php.ini 文件被正确读取,并且生命周期设置为默认值 0,即直到浏览器关闭。

我无计可施。有什么建议么?

非常感谢。

4

11 回答 11

7

session_register()不是必需的,可能会在此处引起问题。阅读文档session_register()- 它旨在使用现有变量分配会话变量。

这里开始

好吧, session_register() 告诉 PHP 某个全局变量应该被视为会话变量。这意味着在脚本执行结束时(通常发生会话数据写入时),该全局变量的结果值将使用当前启用的会话处理程序写入。

我认为这是您遇到的问题。在脚本执行结束时,会话变量被覆盖。

于 2009-03-19T18:33:10.280 回答
4

我面临着同样的问题。原因是,在php.ini中,我将 session.cookie_secure参数的值设置为1. 但是我使用的是 http 协议而不是 http s协议;使用 https 协议解决了这个问题。

设置session.cookie_secure = 1表明 cookie 只能通过安全连接发送。因此,在使用 http 时,我在每个新页面上都获得了新的 session_id。

于 2015-04-27T07:31:49.360 回答
2

我看到的一个错误是在您正在设置的第一个文件$_SESSION['textvar']和您正在调用的第二个文件中$_SESSION['newvar']

此外,我在我知道正在运行的服务器上测试了您的代码,并且除了上述错误之外它运行良好。

我也尝试删除session_register(),代码仍然可以正常工作。

于 2009-03-19T18:38:10.953 回答
2

必须以某种方式携带会话 ID,以便可以在多个页面上使用相同的会话。通常这是通过 cookie 完成的(参见session.use_cookies),但也可以在 URL 或表单中完成(参见session.use_trans_sid)。

因此,首先您必须确保传输会话 ID,以便 PHP 可以加载正确的会话和会话数据。

另请参阅我对 PHP 会话的理解是否正确?

于 2009-03-19T18:38:49.330 回答
1

“session_register() 接受可变数量的参数,其中任何一个都可以是包含变量名称的字符串由变量名称或其他数组组成的数组。对于每个名称, session_register() 使用该名称注册全局变量在当前会话中。”

因为您没有具有这些名称的变量,所以结果将不可预测。

只需使用$_SESSION[$key] = $value;

于 2009-03-19T18:39:26.473 回答
1

如果以上所有方法都不能解决问题,我会问一个显而易见的问题:在开始的 php 标记之前不会有任何空格或换行符?

您还可以检查服务器错误日志文件中的消息,它应该告诉您是否定义了变量(尽管我猜这也取决于错误报告的级别)。

于 2009-03-19T19:18:29.093 回答
0

使用某种工具并检查 http 标头,以便查看 cookie 是如何发送的。也许您的网络服务器配置错误,并使用无效的不同域发送 cookie。

您可能希望查看对每个请求执行 session_set_cookie_params() 并确保设置了正确的域、路径等。

于 2009-03-19T18:36:15.513 回答
0

另一个明显的检查:

确保您的磁盘空间未满;这将阻止会话数据被保存。

于 2013-04-09T22:35:33.237 回答
0

知道这是一篇较旧的帖子,但我遇到了类似的问题(不使用 session_register())。

必须将会话转换为 cookie,因为会话超时太频繁,并且由于服务器设置(“特殊”Windows 服务器托管环境(使用 Apache)),无法更改 PHP 会话超时值。

最终结果是/现在转换为延长寿命的 Cookie 后,Cookie 数据仍然丢失(在传输中)?有时。

非常令人沮丧。

我从来没有在 LAMP 环境中发生过这种情况,所以可能要问的问题是您是否使用的是 LAMP 服务器。

希望这可以帮助。我认为这不是 PHP 问题。

于 2013-12-20T21:58:24.330 回答
0

检查您的 PHP 服务器的服务器日志,例如,nginx 或 apache。

您可以在 nginx error.log 中找到为什么会话不起作用的信息。该文件的路径通常是:/var/log/nginx/error.log.

就我而言,它是说无法保存会话数据。事实证明,在同一目录中,旧error.log.1文件的大小为 17 GB,并占用了所有可用磁盘空间。

Simply freeing disk space restored normal behavior of sessions.

于 2016-01-13T17:49:15.107 回答
-1

在两个文件中都使用 session_register,它应该可以工作。

于 2009-03-19T18:38:00.110 回答