3

我正在尝试诊断 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 在页面加载时是相同的,因此看起来会话状态从页面加载到页面加载都在维护。

在此先感谢您的帮助。

4

6 回答 6

4

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

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

如果您初始化$_SESSION为较低级别的脚本,则 `$_SESSION 变量在较高级别中不可访问。

于 2014-07-27T15:59:55.023 回答
2

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

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

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

为我工作。

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

于 2015-07-16T03:42:10.810 回答
0

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

session.use_cookies = 1

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

于 2012-05-09T15:36:46.793 回答
0

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

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

于 2012-05-09T15:40:21.390 回答
0

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

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

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

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

于 2012-05-09T15:40:57.483 回答
0

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

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

看来

session.auto_start = 1

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

session_start();

在我的脚本中。

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

于 2017-06-14T20:20:47.903 回答