2011-03-12 102 views
0

我有一个基于PHP/MySQL的网站。各形式(POST方法)发送回变量我在会话变量各形式发送时间保存,使用在文件的报头中的一般的代码:更新的php会话变量没有更新,除非点击“刷新”

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

代码工作正常(没有错误,变量正确保存在SESSION中)。形式本身,每个字段具有对SESSION变量的引用,使得当用户回来的形式,从会话中先前选择的变量被召回,例如:

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

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

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

下面是一个例子,使其更清晰:a)用户选择“K”作为第一个元素(这是关于化学=> K =钾)。 b)用户单击确定并获取有关“K”的信息。 c)然后他想修改它并点击“重新启动”。 d)然后,他选择“铅”(铅),然后单击确定(再次)。 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行...请,有人可以帮我吗?提前谢谢了!

朱利安

+0

这个问题似乎是你的“召回”按钮即可。用时间戳添加一个简单的文本输出到你的表单。如果召回按钮没有更新,那确实是一个缓存问题。 – mario 2011-03-13 00:17:34

回答

0

我有同样的问题,我试图阻止缓存和所有其他的事情。我最终解决的唯一方法是使用GET请求而不是POST。或者,我最近通过在返回页面时执行PHP页面刷新来解决了类似的问题。查询参数添加到当他们返回到窗体的URL(这可能会解决问题,因为可能会破坏缓存,因为不同的页面),然后如果查询字符串存在做header("Location: $url")与$ URL设置窗体页的位置,没有查询字符串。

+0

感谢您的回答。首先,我尽量避免使用GET方法,因为我可以有很多变量发回(> 10),并且POST更合适。我尝试了你的主张,但这并没有改变。但是,我应该使用我的Apache和MySQL服务器以及程序MAMP(相当于PC上的EasyPHP)在我的计算机(Mac OS 10.6/Safari)上“离线”工作。我只是尝试在Internet上的服务器上上传文件,现在(这很奇怪)问题消失了!我想这个问题与MAMP中的SESSION在我的Mac上被Safari处理的方式有关... – 2011-03-13 14:42:33

+0

@Julien是的,这很可能是因为在PC上的离线环境中存在更重的缓存苹果机,但这是一个总猜测。很高兴你把事情解决了 – 2011-03-14 18:53:24