表单提交后,在输入中显示新值而不是缓存值

cho*_*ata 6 html php forms apache jquery

注意:这不是缓存问题,也不是服务器配置错误,也不是浏览器问题.仔细调查后,我发现问题是由于我的代码中存在问题:愚蠢的是,我的选择查询填充了我的更新查询之前的字段,导致表单始终在更新之前显示值.重新加载后,当然会出现新更新的值,导致我看错了方向.

然而,这个问题展示了面对缓存问题时所有可能解决方案的概述.


我正在构建一个应用程序,其中有表单,由数据库中的值填充.用户可以更改表单的输入值.提交(不是通过AJAX)后,新值将保存到数据库中,并再次显示相同的表单,这次包含直接从数据库加载的新值.但是:我的浏览器(Windows 7上的Chrome v27.0.1453.116m)会缓存旧值.仅当我再次导航到我的页面时才会显示新值.

<form id="edit_form" class="form" action="http://the.same.url/" method="post">
  <input type="text" name="example" value="<?php echo $value_from_database; ?>" />
</form>  
Run Code Online (Sandbox Code Playgroud)

我遇到过几个解决方案,其中没有一个解决了这个问题:

  • autocomplete="off"在表单标记上设置属性:这似乎没有效果.
  • autocomplete="off"在单个输入标签上设置属性:即使与上述解决方案结合使用,也不会产生结果
  • 在页面加载时使用JavaScript重置表单:这会产生一些结果,但显然不会影响单选按钮和其他按钮.
  • 防止通过元标记缓存页面,如下所示:使用<meta>标签关闭所有浏览器中的缓存?此外,通过.htaccess或php标头阻止缓存没有效果.
  • 尝试通过向action-url添加随机数来缓存 - 正如Miro Markarian在下面的评论中所建议的那样

以下是建议解决方案的概述:使页面告诉浏览器不要缓存/保留输入值

我有什么选择?如果可能的话,我想避免异步发布我的表单.它开始看起来好像我别无选择.任何输入都表示赞赏.

请注意,此行为也会出现在其他浏览器中,例如IE10.

我的页面标题与我表单中其中一个输入的值相同,并且在提交新值时也不会更改,我们可以确定这是一个缓存问题.

Google Chromes的Web Developer插件向我展示了以下标题:

Pragma: no-cache
Date: Sun, 30 Jun 2013 09:44:12 GMT
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Apache
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection: Keep-Alive
Keep-Alive: timeout=15, max=100
Expires: Thu, 19 Nov 1981 08:52:00 GMT

200 OK
Run Code Online (Sandbox Code Playgroud)

Sum*_*ai8 1

我感觉您的服务器发送的304: Not Modified数据而不是您通常发送的数据。如果您使用 apache,这个问题可能会对您有所帮助。

我认为这样的事情应该做(但未经测试)。它应该删除If-Modified-Since每个请求 php 文件的请求的标头,强制应用程序发送内容而不是状态Not-Modified

<ifModule mod_headers.c>
<FilesMatch \.php$>
RequestHeader unset If-Modified-Since
</FilesMatch>
</ifModule>
Run Code Online (Sandbox Code Playgroud)