【问题标题】:PHP session variables not being maintaned未维护 PHP 会话变量
【发布时间】:2011-05-20 12:01:25
【问题描述】:

我有一个使用会话变量的应用程序没有问题。我在使用 when 的每个页面上的标题之前开始会话,它一直很好,然后当我导航到设置会话变量的页面以外的页面时,似乎突然之间我遇到了未定义的索引错误。 但仅限于某些浏览器。有时会保留会话,有时则不会。

似乎有时没有存储 cookie。我已经使用不同的浏览器进行了检查,有时会存储 cookie,有时不会。

我做了一个实验。我正在使用 Firefox 来使用应用程序,并且我一直在关注存储会话的 tmp 文件夹。我把它清理干净了。使用 firefox,我开始使用该应用程序,使用会话正在使用的所有页面,最后我检查了 tmp 文件夹,其中有一个会话文件。

对 Internet Explorer 进行了完全相同的操作,现在有 7 个不同的会话文件。

我正在使用带有 WAMP 堆栈的 PHP 5.3.0。阿帕奇 2.2.11。在我的 phpinfo() 中启用了会话支持。

我在第一页调用 var dump 并打印出会话数据。在任何后续页面上,会话变量都是空的。

<?php var_dump($_SESSION); ?>

array(0){}

谁能帮我解决这个问题?

更新 - PHP INI 会话设置

Directive        Local Value     Master Value
session.auto_start Off           Off 
session.bug_compat_42 On         On 
session.bug_compat_warn On       On 
session.cache_expire 180         180 
session.cache_limiter nocache    nocache 
session.cookie_domain 82.68.26.169   82.68.26.169 
session.cookie_httponly Off      Off 
session.cookie_lifetime 0        0 
session.cookie_path /            / 
session.cookie_secure Off        Off 
session.entropy_file no value    no value 
session.entropy_length 0         0 
session.gc_divisor 1000 1000 
session.gc_maxlifetime 1440      1440 
session.gc_probability 1         1 
session.hash_bits_per_character 5 5 
session.hash_function 0 0 
session.name PHPSESSID           PHPSESSID 
session.referer_check no value   no value 
session.save_handler files       files 
session.save_path c:/wamp/tmp    c:/wamp/tmp 
session.serialize_handler php    php 
session.use_cookies On           On 
session.use_only_cookies On      On 
session.use_trans_sid 0          0 

更新 - 解决方案

因为我的应用程序使用 iframe 从另一个域(我创建)中提取页面,所以我试图设置的 cookie 被阻止。设置一个P3P头,问题似乎解决了!

【问题讨论】:

  • 我再次阅读了您的问题,发现主题与内容不符。你应该澄清你的问题是什么:值是没有存储在会话中还是没有从数据库中检索到。

标签: php cookies session-variables wamp session-cookies


【解决方案1】:

我通过清除旧会话的 \tmp 目录在本地 WAMP 上解决了这个问题。

【讨论】:

    【解决方案2】:

    当为每个请求创建新的会话 ID 时,很可能是您的会话路径(save_path 和 cookie_path)有问题,如果您在一台服务器上托管不同的应用程序(共享托管),发生这种情况的可能性更大并且其中一些应用程序还实现了会话。 这会导致 /tmp 目录中的冲突。 您可以更改 ini 文件的配置,但最好在运行时配置这些参数。

    session_set_cookie_params(0, "/app", ".domain.com");//set session cookie parameters
    session_save_path("/home/../public_html/app/sess");//set directory of this app's session data
    session_start();//start session
    

    希望对遇到此问题的每个人都有帮助。 #代码开启

    【讨论】:

      【解决方案3】:

      我来自your previous question 的建议仍然有效:请比较会话 ID。

      解决方案可能很简单,因为您的浏览器不接受会话 cookie。

      您通过调用session_id() 检索会话ID。在session_start() 之后立即执行此操作,它应该为您提供一个常量值如果会话相同。否则,对于每个请求,都会实例化一个新会话。

      同时检查C:\wamp\tmp。此目录中的海量文件可能会指示每个请求的新会话。

      编辑 由于我们已确认每个请求的新会话,现在是时候确定是否接受会话 cookie。检查浏览器的设置并确认可以找到名称为 PHPSESSID 的域 cookie(我猜是“localhost”)。

      【讨论】:

      • 是的,我认为您的最后一点可能是正确的。我清除了 tmp 的内容。刷新我的页面有 2 个新文件。导航到一个新页面并获得了额外的 3 个新文件。这可能是问题吗?
      • 是的。我们越来越近了。这是每个请求的新会话的指示。查看我的编辑。
      • 对于初学者来说,使用 Firefox 是不错的选择。关注Firefox' Support KB 了解如何启用/禁用 cookie。
      • 一个名为 PHPSESSID 的 cookie 不在我的 cookie 列表中。但奇怪的发现。当我在另一台计算机上检查它时,会话工作正常。在同一台计算机上,我在 chrome 上检查它工作正常,但该计算机上的 Firefox 出现会话问题
      • 嘿,我仍然遇到这个问题,这确实给我的项目带来了一些问题。在某些浏览器上,会话是在整个站点上维护的,而在其他浏览器上则不是 :( 任何更多的帮助都非常感谢
      【解决方案4】:

      您是否在每个访问会话数据的页面上调用session_start()

      编辑:您每次收到相同的会话 ID 吗?
      此外,由于设置,您是否会丢失一些错误或警告(例如已发送的标头)?

      【讨论】:

      • 是的,我在每个页面上都有 session_start()。在它停止保存会话之前一直很好
      • 我根本没有会话数据...当我执行 var_dump($_SESSION) 时,我得到了空。会话存储在 www/tmp 中。我删除了所有文件并刷新了设置它们的页面,该文件出现在 tmp 目录中。我仍然去另一个页面,它仍然是空的。我将如何获得会话 ID?
      • 在_start后致电session_id()。您应该每次都获得相同的 ID。您还可以检查浏览器请求 (Cookie: PHPSESSID=...)。
      【解决方案5】:

      查看您的会话设置。你有一个完整的列表:

      <?php
      
      phpinfo();
      
      ?>
      

      向下滚动到“会话”表。

      尤其要确保session.save_path 目录存在并且是可写的。

      【讨论】:

      • 嗨,我已将表格添加到我的问题中,并确认该目录是可写的。
      【解决方案6】:

      这就是意义

      while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC))
      {
        $_SESSION['saveddata'] = $row;
      }
      

      它在每次迭代时重写$_SESSION['saveddata'] 值。可能你的意思是像

       $_SESSION['saveddata'][] = $row;
      

      $atid = $_SESSION['saveddata']['autotaskid']; 有意义

      【讨论】:

      • 谢谢,尽管如此,为什么我的会话变量不能跨页面维护?我已经在设置会话的页面和另一个页面上使用 var dumps 更新了我的问题
      猜你喜欢
      • 1970-01-01
      • 2013-06-24
      • 2013-06-02
      • 2012-03-08
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      相关资源
      最近更新 更多