7
votes

Après la soumission de formulaire, affichez de nouvelles valeurs à l'intérieur des entrées au lieu de personnes en cache

Attention: ce n'était pas un problème de cache, ni une mauvaise configuration du serveur, ni un problème de navigateur. Après une enquête minutieuse, j'ai trouvé que le problème était dû à un problème dans mon code: strong> assez stupidement, ma requête sélectionnée qui remplit les champs a précédé ma requête de mise à jour, ce qui donne au formulaire de toujours afficher les valeurs avant la mise à jour. Après le rechargement, bien sûr, les valeurs nouvellement mises à jour apparaissent, ce qui me faisait regarder dans la mauvaise direction.

Cette question montre cependant une vue d'ensemble de toutes les solutions possibles lorsqu'elle est confrontée à un problème de mise en cache. P>


Je construis une demande sur laquelle il existe des formes, peuplées de valeurs à partir d'une base de données. L'utilisateur peut modifier les valeurs d'entrée du formulaire. Après avoir soumis (non via AJAX), les nouvelles valeurs sont enregistrées dans la base de données et le même formulaire s'affiche à nouveau, cette fois contenant les nouvelles valeurs, chargées directement de la base de données. Toutefois: mon navigateur (chrome v27.0.1453.116m sous Windows 7) cache les anciennes valeurs. Les nouvelles valeurs ne sont indiquées que lorsque je navigue à nouveau sur ma page. P>

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
  • Définition d'un attribut autocomplete = "OFF" code> sur la balise de formulaire: Cela ne semble pas avoir d'effet. LI>
  • Définition d'un attribut autocomplete = "OFF" code> sur les balises d'entrée individuelles: cela ne donne pas non plus de résultats, même en combinaison avec la solution ci-dessus li>
  • Réinitialisation du formulaire avec JavaScript à la page Load: Cela donne des résultats, mais apparemment n'affecte pas les boutons radio et d'autres. Li>
  • empêchant la mise en cache des pages via des étiquettes méta-balises, comme suggéré ici: Utilisation de Tags pour désactiver la mise en cache dans tous les navigateurs? Aussi, empêchant la mise en cache via .htaccess ou des en-têtes PHP n'a pas d'effet. LI>
  • Essayer de cache-buste en ajoutant un nombre aléatoire à l'URL d'action, comme suggéré par commentaire ci-dessous par Miro Markarian Li> ul>

    Voici un aperçu avec des solutions proposées: Faites de la page pour dire au navigateur de ne pas cacher / conserver les valeurs d'entrée p>

    Quelles sont mes options? Si possible, je voudrais éviter de poster mon formulaire de manière asynchrone. Il commence à regarder comme si je n'ai pas d'autre choix. Toute entrée est appréciée. P>

    Veuillez noter que ce comportement apparaît également dans d'autres navigateurs, tels que IE10. P>

    Mon titre de page est identique à la valeur de l'une des entrées de mon Formulaire et ne change pas non plus à la soumission d'une nouvelle valeur, IMHO, nous pouvons déterminer que ceci est un problème de mise en cache. p>

    Le plug-in du développeur Web de Google Chromes me montre les en-têtes suivants: P>

    <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>  
    


7 commentaires

Une solution possible peut être de retour à URL avec une valeur aléatoire ajoutée à la fin de l'URL ... comme ? Nocache = 875138 qui peut être obtenu avec le rand () fonctionner dans php ..


Merci, je vais l'enquêter immédiatement.


Après enquête, il ne semble avoir aucun effet. Merci quand même. As-tu d'autres idées?


Êtes-vous sûr qu'il est le navigateur et non le serveur qui met la page la page? Votre application envoie-t-elle un en-tête non modifié?


C'est très étrange. Mon point de vue serait si un formulaire est à exemple.com/myform.php et vous soumettez à exemple.com/myform.php?rnd=23215234 qu'il n'y a pas de mise en cache de navigateur de la page. Je pense que vous avez un serveur mal configuré quelque part.


Ajoutez le code suivant à votre fichier php: -> et inspecter la page avant et après la soumission. Si ce commentaire change, il s'agit d'un problème, mais un problème avec votre code lui-même.


Merci! Il y a une différence entre la date échoée avant et après la soumission. Très étrange! Mes valeurs sont correctement transmises par courrier et correctement enregistrées dans la base de données. Le problème n'apparaît que après la poste. Recharger la page après obtenir les bonnes valeurs. Cela pourrait-il être une fonctionnalité de navigateur?


5 Réponses :


1
votes

la première réponse à Cette question suggère Pour ajouter les en-têtes suivants afin de désactiver la mise en cache du navigateur:

<?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 commentaires

Assez étrangement, cela ne résout pas non plus le problème. Dans le même temps, j'ai essayé votre solution uniquement avec des tags méta ... toute autre idée?


Veuillez noter que je peux clairement voir à partir des en-têtes de réponse que ces paramètres sont actifs.



0
votes

Je pense que vous avez juste oublié d'echo $ value_from_database code>, qui, à son tour, retourne par défaut à la valeur mise en cache du navigateur. Vous devriez avoir l'élément d'entrée suivant à la place:

<input type="text" name="example" value="<?php echo $value_from_database; ?>">


1 commentaires

Désolé, c'était une erreur dans mon pseudocode. Il me défait aussi pourquoi ma cache de page est toujours chargée. Je cherchais des conflits dans mon fichier .htaccess, mais je n'ai trouvé aucun. Très étrange en effet. Espérons qu'une réponse apparaîtra.



0
votes

ne pouvez-vous pas prendre: xxx

et le changer à: xxx

qui dit: voir si j'ai déjà une variable Dans le tableau $ _ POST après le formulaire soumis. Si je le fais, utilisez cette valeur, sinon, tirez de db.

Vous devrez peut-être définir des variables de session ( $ _ session ['ex'] = $ _POST ['exemple'] ), et faites les modifications au code ci-dessus


7 commentaires

Bonjour, merci pour votre réponse. Pourriez-vous élaborer sur votre remarque concernant «$ _Session ['ex'] '?


Parfois, le tableau $ _ POST est gonflé, alors prenez les données post-post et la mettant en une variable de session qui l'emporte-t-elle.


Mon titre de page, qui est également tiré de la base de données (nom d'utilisateur), ne change pas également lors de la modification de la valeur dans l'entrée correspondante. Par conséquent, j'ai tendance à penser que c'est une question de mise en cache.


Soumettre arrive via jQuery .Submit () sur soumettre, la même page est chargée. Toutes les pages de mon application résident dans Index.php. Il y a une vérification de l'URL via .htaccess.


Cela change complètement la question. Il semble que c'est une jQuery pas php. Vous n'aborquez pas correctement les valeurs via JS


Les valeurs ne sont pas passées via JS. C'est un poste de formulaire HTTP régulier, seule la soumission est déclenchée via JQuery. La page actualisée sur Soumettre. Des points de vue sur cela?


Je viens d'expérimenter du formulaire manuel Soumettre: aucun changement, semble-t-il.



1
votes

J'ai le sentiment que votre serveur envoie 304: non modifié au lieu des données que vous envoyez normalement. Cette question pourrait vous aider si vous utilisez Apache.

Je pense que quelque chose comme ça devrait faire (mais il n'est pas testé). Il devrait supprimer l'en-tête IF-Modified-depuis pour chaque demande qui demande un fichier PHP, forçant l'application à envoyer du contenu au lieu d'un statut non modifié . < / p> xxx


2 commentaires

@maartenmachiels Le 200 OK signifie que le serveur envoie des données au navigateur. Il envoie chaque en-tête possible pour empêcher la mise en cache, rend les données envoyées expirent quelque part dans le passé pour donner au navigateur une raison supplémentaire d'invalider le cache s'il est mis en cache. Soit il y a un bogue dans le navigateur qui permet d'utiliser le cache de toute façon, une extension de navigateur est en train de gâcher ou que le serveur envoie les mauvaises données. Le serveur pourrait avoir une sorte de cache, mais il semble étrange qu'il envoie n'importe quel cache si aucun si modifié - depuis en-tête existe. Je serais intéressé de voir le code PHP pertinent.


Après la reconstruction du scénario pour mettre en ligne ici, j'ai finalement compris le problème. C'était un cas d'ordre de l'ordre de l'ordre de code ... Mon Select (Pour remplir les champs de formulaire) a précédé ma mise à jour, ce qui permet de toujours afficher les anciennes valeurs. Lors de la rechargement de la page, bien sûr, les valeurs correctes indiquées: me faisant croire que c'était une question de cache! Merci de me pointer dans la bonne direction!



2
votes

Vous pouvez modifier les attributs de nom des entrées par une chaîne aléatoire et les stocker dans une entrée cachée.

<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>  


2 commentaires

+1 J'étais sur le point d'écrire la même chose. Une solution comme celle-ci devrait être la voie à suivre imho


Très bonne suggestion, merci. Le problème est que le formulaire est assez complexe, avec toutes sortes d'intrants et de wysiwygs ... En ce moment, je pense qu'il serait presque impossible de le faire avec toutes les intrants.