【问题标题】:Updated php session variable not updated unless click "refresh"除非单击“刷新”,否则不会更新更新的 php 会话变量
【发布时间】:2011-03-12 23:54:33
【问题描述】:

我有一个基于 PHP/MySQL 的网站。每次发送表单时,每个表单(POST 方法)都会返回我保存在 SESSION 变量中的变量,使用文件头中的通用代码:

session_start(); foreach ($_POST as $key => $value) {
if ($key != "submit") {
    $_SESSION[$key] = $value;
}
foreach ($_SESSION as $key => $value) $$key = $value;

代码工作正常(没有错误,变量正确保存在 SESSION 中)。在表单本身中,每个字段都有一个对 SESSION 变量的引用,因此当用户返回表单时,会调用之前从 SESSION 中选择的变量,例如:

<input type="text" name="fmElement" id="fmElement" size="5" maxlength="2" value="<?php echo @$fmElement; ?>">

($_POST['fmElement']保存在一个SESSION变量$_SESSION['fmElement']中,保存在变量$fmElement之后很快)

我有一个名为“restart”的按钮,它只是调用页面(不是“返回”javascript;我真的记得页面),并允许用户修改表单中输入的值,然后再次提交他们更新的请求。我的主要问题是,虽然 SESSION 变量已正确更新,但它不会显示 SESSION 变量中的最新更改,而是显示之前保存的更改。但是,当我强制浏览器刷新页面时,字段 fmElement 会随之更新!

下面是一个更清楚的例子: a) 用户选择“K”作为第一个元素(这是关于化学 => K = 钾)。 b) 用户点击OK,得到关于“K”的信息。 c) 然后他想修改这个并点击“重启”。 d) 然后,他选择“Pb”(铅)并单击“确定”(再次)。 e) 表格正确地考虑了这一变化并显示了“Pb”的结果。 f)但是,这是错误...当他第二次单击“重新启动”时,浏览器将在 fmElement 字段中发送回“K”(而不是“Pb”)... WTF?!? (为这种尴尬的表达道歉)。 g) 仅当用户强制刷新页面时,fmElement 字段正确显示“Pb”,证明 SESSION 变量 $_SESSION['fmElement'] 已被第二次请求正确更新(点 d)。

我已经尝试了以下方法,但这些都不起作用... 1)通过发送隐藏的“刷新”变量来强制刷新页面,并强制浏览器使用javascript刷新(介于...之间),例如...

    if (@$_POST['refresh'] == "1") echo "<script type='text/javascript'>window.reload();</script>";

2) 强制浏览器不要使用这样的元数据保存在缓存中:

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">

我可以将完整的原始代码发送给您,但这总共需要超过 500 行... 请有人帮帮我吗?非常感谢!

朱利安

【问题讨论】:

  • 问题似乎出在您的“召回”按钮上。将简单的文本输出添加到带有时间戳的表单中。如果召回按钮没有更新,这确实是一个缓存问题。

标签: php session refresh


【解决方案1】:

我遇到了同样的问题,我尝试阻止缓存和所有其他事情。我最终解决它的唯一方法是使用 GET 请求而不是 POST。或者,我最近通过在您返回页面时执行 PHP 页面刷新解决了类似的问题。在将查询参数返回到表单时在 url 上添加一个查询参数(这可能会解决问题,因为可能会因为不同的页面而中断缓存),然后如果该查询字符串存在,则执行 header("Location: $url") 并将 $url 设置为表单页面的位置,没有查询字符串。

【讨论】:

  • 感谢您的回答。首先,我确实尽量避免使用 GET 方法,因为我可以有很多变量要发回 (>10),而 POST 更合适。我试过你的提议,这并没有改变。但是,我应该准确地说,我是在我的计算机(Mac OS 10.6 / Safari)上使用我的 Apache 和 MySQL 服务器和程序 MAMP(相当于 PC 上的 EasyPHP)“离线”工作的。我刚刚尝试将我的文件上传到 Internet 上的服务器上,现在(这很奇怪)问题消失了!我猜这个问题与我的 Mac 上的 Safari 处理 MAMP 中的 SESSION 的方式有关......
  • @Julien 是的,这可能与 pc 和 mac 上的离线环境中涉及的缓存要重得多这一事实有关,但这是一个完全的猜测。很高兴你把它整理好了
猜你喜欢
  • 2012-07-31
  • 2021-05-14
  • 1970-01-01
  • 2012-11-12
  • 2018-04-16
  • 1970-01-01
  • 2022-07-19
  • 2015-07-02
  • 2011-12-07
相关资源
最近更新 更多