PHP会话变量未保留

时间:2009-03-19 18:29:29

标签: php session session-variables

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

以下是我的文件:

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

  

用户名是:10333

     

另一个变量是:TextVariable

     

转到[下一页]。

和, sess2.php

  

userid会话变量是:

     

另一个会话变量是:

     

转到[最后一页]。

有些事情不是:

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

我的智慧结束了。有什么建议吗?

非常感谢。

11 个答案:

答案 0 :(得分:7)

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

here

  

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

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

答案 1 :(得分:3)

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

设置session.cookie_secure = 1表示只应通过安全连接发送cookie。因此,我在使用http。

时在每个新页面上获得了新的session_id

答案 2 :(得分:2)

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

另外,我在我知道正在运行的服务器上测试了你的代码,除了上面的错误之外它还运行正常。

我也尝试删除session_register(),但代码仍能完美运行。

答案 3 :(得分:2)

会话ID必须以某种方式携带,以便可以在多个页面上使用相同的会话。一般情况下,这是通过Cookie完成的(请参阅session.use_cookies),但也可以在网址或表单中完成(请参阅session.use_trans_sid)。

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

另见Is my understanding of PHP sessions correct?

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

如果上述所有方法都无法解决问题,我只会问明显:在开启php标签之前不会有任何空格或换行符?

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

答案 6 :(得分:0)

使用某种工具并检查http标头,以便您可以看到Cookie的发送方式。也许您的网络服务器配置错误,并发送带有无效不同域的cookie。

您可能希望在每个请求上查看session_set_cookie_params(),并确保设置正确的域,路径等。

答案 7 :(得分:0)

要检查的另一个显而易见的事情是:

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

答案 8 :(得分:0)

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

由于会话过于频繁而导致会话超时,并且由于服务器设置('特殊'Windows服务器托管环境(使用Apache)),因此无法更改PHP会话超时值。

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

非常令人沮丧。

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

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

答案 9 :(得分:0)

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

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

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

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

答案 10 :(得分:-1)

两个文件中使用session_register,它应该有效。