【发布时间】: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 行... 请有人帮帮我吗?非常感谢!
朱利安
【问题讨论】:
-
问题似乎出在您的“召回”按钮上。将简单的文本输出添加到带有时间戳的表单中。如果召回按钮没有更新,这确实是一个缓存问题。