注意:这不是缓存问题,也不是服务器配置错误,也不是浏览器问题。仔细调查后,我发现问题是由于我的代码中存在问题:愚蠢的是,我的选择查询填充了更新查询之前的字段,导致表单始终在更新之前显示值。重新加载后,当然会出现新更新的值,导致我看错了方向。
但是,这个问题可以很好地概述面临缓存问题时所有可能的解决方案。
我正在构建一个应用程序,其中有表单,由数据库中的值填充。 用户可以更改表单的输入值。提交(不是通过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>
我遇到过几个解决方案,但没有一个能解决这个问题:
autocomplete="off"
:这似乎没有效果。autocomplete="off"
:即使与上述解决方案结合使用,也不会产生结果以下是对提议的解决方案的概述:Make page to tell browser not to cache/preserve input values
我有什么选择?如果可能的话,我想避免异步发布我的表单。它开始看起来好像我别无选择。任何意见都表示赞赏。
请注意,此行为也会出现在其他浏览器中,例如IE10。
我的页面标题与我表单中其中一个输入的值相同,并且在提交新值时也不会更改,我们可以确定这是一个缓存问题。
Google Chromes的Web开发人员插件向我展示了以下标题:
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
答案 0 :(得分:2)
您可以通过一些随机字符串更改输入的名称属性,并将它们存储在隐藏的输入中。
<form id="edit_form" class="form" action="http://the.same.url/" method="post">
<input type="text" name="saejfb27982" value="..." />
<input type="text" name="iuqde37we83" value="..." />
<input type="hidden" name="associativeArray" value='{"example":"saejfb27982","example2":"iuqde37we83"}'>
</form>
(由于每次名称不同,浏览器无法将其与任何形式的缓存,自动完成匹配......)
答案 1 :(得分:1)
this问题的第一个答案建议添加以下标头以禁用浏览器缓存:
<?php
header("Expires: Tue, 01 Jan 2000 00:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>
答案 2 :(得分:1)
我觉得您的服务器发送304: Not Modified
而不是您通常发送的数据。如果您使用的是apache,This question可能对您有所帮助。
我觉得这样的事情应该做(但是没有经过考验)。它应该删除每个请求php文件的请求的If-Modified-Since
标头,强制应用程序发送内容而不是Not-Modified
状态。
<ifModule mod_headers.c>
<FilesMatch \.php$>
RequestHeader unset If-Modified-Since
</FilesMatch>
</ifModule>
答案 3 :(得分:0)
我相信你只是忘了回复$value_from_database
,而<input type="text" name="example" value="<?php echo $value_from_database; ?>">
反过来又默认回到浏览器的缓存值。您应该使用以下输入元素:
$value_from_database
虽然这应该得到正确的{{1}},但我不完全确定为什么你仍然无法完全关闭缓存。
答案 4 :(得分:0)
你不能接受:
<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>
并将其更改为:
value="<?php echo if(isset($_POST['example'])):$_POST['example']?$value_from_database; ?>
其中说明:在提交表单后,查看$_POST
数组中是否已有变量。如果我这样做,请使用该值,如果没有,请从db。
您可能需要设置会话变量($_SESSION['ex'] = $_POST['example']
),并对上面的代码进行调整