【问题标题】:PHP Session Variables Not Preserved未保留 PHP 会话变量
【发布时间】:2020-03-29 13:33:56
【问题描述】:

除了设置它们的页面之外,我无法在页面上使用会话变量,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,即直到浏览器关闭。

我已经束手无策了。有什么建议吗?

非常感谢。

【问题讨论】:

  • 你检查过是否使用了相同的会话ID吗?
  • 其中一个页面是否通过 SSL?
  • 您运行的是什么版本的 PHP? (也来自 phpinfo())

标签: php session session-variables


【解决方案1】:

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

来自here

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

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

【讨论】:

  • 是的,session_register() 已经被弃用了一段时间,绝对不应该再使用它了。我不知道它是否导致了这个特定问题,但无论如何它都不应该出现在该代码中。
  • 有趣。我正在使用 07 年版权的介绍性 PHP/SQL 书籍,代码几乎是直接引用。不幸的是,删除 session_register() 行似乎并不能解决问题。非常感谢您提供的信息。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    另见Is my understanding of PHP sessions correct?

    【讨论】:

    • 感谢您的帮助。 phpinfo() 似乎可以确认我正在使用 cookie 并且正在传输 ID。 session.use_cookies 为“On”,session.use_trans_sid 为 0。Set-Cookie 记录了第一个页面创建的 cookie,该页面被命名为 referer。
    • 两个页面上的会话ID是一样的吗?发送了 Set-Cookie 标头字段并不意味着 cookie 已被接受并与第二个请求一起发送。尝试比较两个页面中的session_id() 返回值。
    • 粗鲁。会话 ID 不同。现在怎么...?
    • 那么我假设你的浏览器不接受那个cookie。您是否已经尝试过其他浏览器?
    【解决方案4】:

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

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

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

    【讨论】:

    • 好眼光——“newvar”是一个错字,是我将代码复制到新的更简单的文件时留下的。但是 session_register() 解决方案在我的系统上不起作用。非常感谢您的建议。
    • 您是否尝试过清除 cookie(或删除此站点 cookie)并将此页面作为您再次访问的第一个页面访问?另外,您确定上面没有其他文本或
    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

          另一个明显的检查:

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

          【讨论】:

            【解决方案9】:

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

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

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

            非常沮丧。

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

            希望这会有所帮助。我认为这不是 PHP 问题。

            【讨论】:

              【解决方案10】:

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

              您可以在 nginx error.log 中找到会话无法正常工作的信息。该文件的路径通常是:/var/log/nginx/error.log

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

              只需释放磁盘空间即可恢复会话的正常行为。

              【讨论】:

                【解决方案11】:

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

                【讨论】:

                • 感谢您的建议。我尝试了两种方式,两个文件中都有 session_register() 行,没有。行为未出现任何变化。
                • session_register 已弃用:如果可以避免,请不要使用它
                • @Jason:愿意分享一些表明已弃用的 URL 吗?应该改用什么?
                猜你喜欢
                • 2023-03-19
                • 1970-01-01
                • 2011-04-01
                • 2011-04-09
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多