【问题标题】:PHP $_SESSION Returning Empty Array Even When Values are Set即使设置了值,PHP $_SESSION 也会返回空数组
【发布时间】:2012-05-18 03:43:39
【问题描述】:

我正在尝试诊断 PHP 问题。我将值传递给 $_SESSION 数组,而这些值不会被数组获取。我使用var_dump($_SESSION) 查看返回的内容并得到array (0){}。即使我知道正在设置会话并且正在将值添加到数组中也是如此。

这是我的代码的简化版本(index.php):

<?php
session_start();
var_dump($_SESSION); 

if ($_REQUEST['query'] == "" or is_null($_REQUEST['query'])) {
$errormsg = "You must enter a search term to query.  Please try again.";
}

?>

<form name="product_search" id="product_search" method="post" action="index.php">
<input size="60" type="text" name="query" id="query" <?php echo "value=\"" .  $_REQUEST['query'] . "\" "; ?>/>
<?php if (isset($errormsg)) {echo "<span class=\"errormsg\">" . $errormsg . "</span>";} ?>
<input type="submit" class="searchBtn" value="Search"/>

<?php
    $_SESSION['query'] = 'foo';
    $_SESSION['search_field'] = 'man';
    $_SESSION['results'] = 'chu';
?>

var_dump($_SESSION); //Will dump array(3) {...}

重现错误:

  1. 加载页面。这里没问题;顶部的var_dump($_SESSION) 返回array(0) {},这是意料之中的,底部的返回一个三元数组,也是意料之中的。
  2. 在查询字段中提交带有某些内容的表单(以使验证失效)。尽管在上一页加载时设置了 $_SESSION 变量,但第一个转储仍返回 array(0) {}

我在这里简化了我的代码来解决这个问题,但是我有另一个页面可以毫无困难地返回一个 $_SESSION 变量(并且第一个 var_dump 生成一个成员数组)。这里的问题是我将表单提交给自己吗,如果是这样,除了$_SESSION 数组之外还有其他方法可以将值从一个页面加载传递到下一个页面吗?我查看了 PHP 文档并进行了高低搜索,但没有发现任何有用的信息。

我还应该注意,页面加载时会话 ID 是相同的,因此看起来会话状态从页面加载到页面加载都在保持。

提前感谢您的帮助。

【问题讨论】:

  • 这段代码在我的环境中运行良好。可以包含一些占位符,如果不是代码的全部复杂性?
  • 杰里米,当然。这是整个事情:
  • 您的服务器可能配置不正确 - 没有对会话文件夹的可写访问权限?

标签: php session


【解决方案1】:

在每个网页的顶部使用这一行:

if (!isset($_SESSION)) { session_start(); }

如果将$_SESSION 初始化为较低级别的脚本,则`$_SESSION 变量在较高级别无法访问。

【讨论】:

  • 永远不需要有条件地调用session_start()。在您需要维护会话超全局的任何页面上执行任何操作之前,无条件调用它。
【解决方案2】:

session.cookie_secure = 1 可能会导致此问题

UPD:检查 session.cookie_secure 是否设置为 0 表示非安全连接。

ini_set('session.cookie_secure', '0')

为我工作。

UPD:类似问题PHP session.cookie_secure: Disables sessions when set to true

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
  • 我最近遇到了同样的问题,所以我只是分享一个可能的解决方案。它回答了上面的问题 - 为什么 $_SESSION 返回空数组
  • 它对我有用,我尝试了太多东西,但这是唯一有效的,谢谢兄弟
【解决方案3】:

确保您的服务器配置允许会话 cookie。

session.use_cookies = 1

另一种方法是会话 ID 在 GET 中传递,您必须专门将其附加到您的表单操作中,而您没有这样做。因此,一旦发布了值,就没有会话。

【讨论】:

    【解决方案4】:

    会话是否正确启用?这是 PHP 服务器会话设置的文档 http://www.php.net/manual/en/session.configuration.php

    为了补充 Jeremy 的回答,您也可以拒绝 cookie。

    【讨论】:

      【解决方案5】:

      您仍然可以使用 POST 而不是 SESSION,因为您仍然可以使用它 - 只需将变量及其值打包到一个(或多个)隐藏输入中(您可以从一个提交序列化 POST 并将其插入隐藏输入或者您可以创建尽可能多的隐藏输入,因为您从第一次提交中获得了变量)。然后在第二次提交中(可能是多步表单的第二步)您发布新数据,当然还有第一次提交的数据......

      但我还是更喜欢 session,因为它更容易(不必实现更多代码)。

      您确定 SESSION 不会在每次页面加载/提交时重新生成吗?如果您在页面加载/提交时重新生成会话 ID,则旧会话(及其数据)会丢失,并且数据会插入到新会话 ID 下...

      还有一个建议:忘记 $_REQUEST,除非您确定它是完全必要的,而是仅使用 $_GET 或 $_POST 从正确的渠道获取数据...

      【讨论】:

      • 他在他的问题中说,相同的会话 ID 在页面加载中持续存在。
      • 感谢大家的快速回答。杰里米和其他人....抱歉给您带来了麻烦,但我意识到了我的问题。我没有传递字符串(如上面示例中的chu),而是传递了一个变量,该变量本身的大小足以溢出服务器上的缓冲区。我无权访问错误日志,因此服务器管理员稍后确认。感谢您的跟进!
      【解决方案6】:

      这对游戏来说有点晚了,可能没有人遇到这个配置问题。事实上,我希望不会。

      我的虚拟主机刚刚将我的所有网站移到了新服务器上。他们彻底搞砸了文件和目录权限,以及运行网络服务器和 php 脚本的用户。

      看来

      session.auto_start = 1
      

      标志会导致不同的用户(我不知道是哪个用户)尝试读取会话文件,而不是将其设置为 0 并仅使用

      session_start();
      

      在我的脚本中。

      令人惊讶的权限问题是会话文件已写入但无法读取。所以自动启动会话总是空的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-30
        • 2017-02-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多