PHP $ _SESSION即使在设置值时也返回空数组

时间:2012-05-09 15:29:40

标签: php session

我正在尝试诊断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) {},这是预期的,而botton上的那个返回一个三元数组,也是预期的。
  2. 在查询字段中提交带有内容的表单(以阻止验证)。尽管在上一页加载时设置了$_SESSION个变量,但第一个转储仍会返回array(0) {}
  3. 我在这里简化了我的代码以解决问题,但我有另一个页面正在返回$ _SESSION变量而没有任何困难(并且第一个var_dump生成一个成员数组)。这里的问题是我将表单提交给自己,如果是这样,除了$_SESSION数组之外还有一种方法可以将值从一个页面加载传递到下一个页面吗?我查看了PHP文档并搜索了高低,但没有抓到任何有用的东西。

    我还应该注意,会话ID在页面加载时是相同的,因此会出现从页面加载到页面加载的会话状态。

    提前感谢您的帮助。

6 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

session.use_cookies = 1

另一种方法是会话ID在GET中传递,你必须专门将它附加到你没有做的表单操作。因此,一旦发布值,就不会进行会话。

答案 2 :(得分:0)

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

要添加Jeremy的答案,你也可以拒绝cookie。

答案 3 :(得分:0)

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

但我仍然更喜欢会话,因为它更容易(不必实现更多代码)。

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

另外一个建议:忘记$ _REQUEST,除非你确定它完全是必要的,而只是使用$ _GET或$ _POST来从正确的频道获取数据......

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

我的网站托管服务商刚将我的所有网站都移到了新服务器上。他们很好地搞砸了文件和目录权限,以及运行webserver和php脚本的用户。

似乎

session.auto_start = 1

标志导致尝试读取会话文件的其他用户(我无法分辨哪个)比将其设置为0并使用

session_start();

在我的剧本中。

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