【问题标题】:Odd Problem with PHP $_SESSIONPHP $_SESSION 的奇怪问题
【发布时间】:2011-05-07 05:14:08
【问题描述】:

我在将变量从第 2 页转移到第 1 页时遇到问题。我有一个多部分表单,如果您决定返回到第 1 页,我们的想法是能够将您的输入保存在会话变量中1(这是包含字段的页面。

页面 1 对页面 2 有一个 POST 操作。然后,在页面 2 中,$_SESSION 变量是从 POST 变量中设置的。请记住,POST 变量设置正确,因为我在第 2 页的后面部分成功地调用了它们

我的问题是:我无法将 $_SESSION 变量设置为第 2 页上的 $_POST 变量的值,并且将其带到第 1 页。我可以设置并输出来自第 2 页上的 POST 变量的 $_SESSION 变量(它只是不会返回到第 1 页)。但是,我可以将 $_SESSION var 设置为字符串,并将其转移到第 1 页。通常,这将证明 POST var 不好,但它们正确地携带了正确的值。

我想做什么: 将第 2 页的 $_POST var 的值放入 $_SESSION var,然后返回到第 1 页。

我的问题: 会话变量不会从第 2 页返回到第 1 页。它们可以携带字符串,但不能携带 POST 变量。 POST变量不是问题,如上所述,所以请不要尝试通过检查POST var有效性等来解决问题。它们输出完美。

我可以在第 2 页上进行会话转储,并且我需要的所有会话变量都已正确填充。

如果我在那之后返回第 1 页,则相关会话变量将设置为 NULL。请记住,我在该特定页面上还有许多其他会话变量。这不是 session_start(); 问题。

zinger - 我可以将会话变量从第 1 页带到第 2 页,没问题。

Page 1 Pastebin

Page 2 Pastebin

【问题讨论】:

  • 返回时是否强制重新加载第 1 页?如果它是缓存页面,您只会看到会话更新之前的旧页面,其中可能未设置这些变量。
  • 这不是缓存问题,无论是服务器端还是浏览器端。我可以完全清除缓存,页面和会话转储是相同的。
  • 你有一个寄存器全局设置为真吗?
  • 转到 PHP ini 并搜索“GLOBAL”,看看是否有任何设置为 true|1|On
  • 请不要转储你的整个文件(这里也不使用第三方服务)。最好将其压缩到问题的本质或创建一个抽象示例。

标签: php


【解决方案1】:

已设置相关会话变量 为空

他们可以携带字符串,但不能携带 POST 变量

您的代码无意中过度写入会话变量。你有这个完全可以的代码:

$retailerName = $_POST["retailerName"];
$description = $_POST["description"];
$savingsDetails = $_POST["savingsDetails"];
$terms = $_POST["terms"];
$phone = $_POST["phone"];
$address = $_POST["address"];
$zone = $_POST["zone"];
$dateExp = $_POST["dateExp"];
$tag = $_POST["tag"];

$_SESSION["rn"] = $retailerName;
$_SESSION["de"] = $description;
$_SESSION["sd"] = $savingsDetails;
$_SESSION["tm"] = $terms;
$_SESSION["ph"] = $phone;
$_SESSION["ad"] = $address;
$_SESSION["zo"] = $zone;
$_SESSION["ex"] = $dateExp;
$_SESSION["tg"] = $tag;

现在如果您通过 GET 请求打开此页面会发生什么?您在会话中保存的 string 将继续,您在会话中保存的 post 变量,例如通过执行 $_SESSION["tg"] = $_POST["tag"] 将变为 NULL。

现在试试这个——在你的 page2 中添加一个计数器变量来计算这个页面被打开的次数:

if(array_key_exists("ViewCount", $_SESSION)==false){
    $_SESSION["ViewCount"] = 0;
}
$_SESSION["ViewCount"]++;
echo $_SESSION["ViewCount"];

告诉我计数器是否意外增加,例如每次发布到该页面时都会增加两次而不是一次。还可以使用网络检查器查看您的浏览器是否在 POST 之后向同一页面发出 GET 请求(FireBug 可以帮助您验证;服务器日志将为您提供更深入的了解)。如果是这种情况,那么您的页面中可能有一个带有src=""<img> 标签。

【讨论】:

  • 确实有一个 src="" 的 img。现在一切都解决了。非常感谢!
【解决方案2】:

您可以serialize POST 变量并将其放在一个会话变量中。

同样,您可以json_encode POST 变量并放入一个会话变量中。

两者都返回一个你说可以携带的字符串。

我推荐 json_encode :)

【讨论】:

  • 我这样做了:$_SESSION["jsonArr"] = json_encode(array($var1, $var2, etc)); 但它在第 1 页上仍然返回为 null null null null。
猜你喜欢
  • 1970-01-01
  • 2020-06-30
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 2020-07-28
  • 2015-12-20
相关资源
最近更新 更多