7

注意: これはキャッシュの問題でも、サーバーの設定ミスでも、ブラウザの問題でもありません。慎重に調査した結果、コードの問題が原因であることがわかりました。愚かなことに、フィールドに入力する選択クエリが更新クエリよりも前にあるため、更新前の値がフォームに常に表示されます。もちろん、リロード後、新しく更新された値が表示され、間違った方向を見ることになります。

ただし、この質問は、キャッシュの問題に直面したときに考えられるすべての解決策の概要を示しています。


データベースからの値が入力されたフォームがあるアプリケーションを構築しています。ユーザーは、フォームの入力値を変更できます。(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>  

私はいくつかの解決策に出くわしましたが、どれも問題を完全に解決するものではありません:

  • form タグに属性autocomplete="off"を設定する: これは効果がないようです。
  • 個々の入力タグに属性autocomplete="off"を設定します。これも、上記のソリューションと組み合わせても結果が得られません
  • ページの読み込み時に JavaScript を使用してフォームをリセットする: これにより、いくつかの結果が得られますが、明らかにラジオ ボタンなどには影響しません。
  • ここで提案されているように、メタタグを介してページのキャッシュを防止する: <meta> タグを使用して、すべてのブラウザーでキャッシュをオフにしますか? また、.htaccess または php ヘッダーを介してキャッシュを防止しても効果はありません。
  • 以下の Miro Markarian のコメントで示唆されているように、action-url に乱数を追加してキャッシュバストを試みます。

提案された解決策の概要は次のとおりです。入力値をキャッシュ/保存しないようにブラウザーに指示するページを作成します。

私のオプションは何ですか?可能であれば、フォームを非同期で投稿することは避けたいです。他に選択肢がないように見え始めます。どんな入力でも大歓迎です。

この動作は、IE10 などの他のブラウザーでも発生することに注意してください。

私のページのタイトルは、フォームの入力の 1 つの値と同じであり、新しい値を送信しても変更されません。これはキャッシュの問題であると判断できます。

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
4

5 に答える 5

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>  

(名前は毎回異なるため、ブラウザはキャッシング、オートコンプリートのいずれの形式でも一致させることができません...)

于 2013-06-30T11:47:09.233 に答える
1

304: Not Modified通常送信するデータの代わりに、サーバーが送信しているように感じます。この質問は、Apache を使用している場合に役立ちます。

私はこのようなことをすべきだと思います(しかし、それはテストされていません)。If-Modified-SincePHPファイルを要求するすべてのリクエストのヘッダーを削除し、アプリケーションにNot-Modifiedステータスの代わりにコンテンツを送信させる必要があります。

<ifModule mod_headers.c>
<FilesMatch \.php$>
RequestHeader unset If-Modified-Since
</FilesMatch>
</ifModule>
于 2013-06-29T20:33:35.290 に答える