web-dev-qa-db-fra.com

revenir en arrière avec PHP soumission de formulaire

Donc, voici le contrat, J'utilise des formulaires HTML pour transférer des variables de page en page et un script PHP pour créer des pages basées sur les valeurs soumises. En général, cela ressemble à ceci: dans le catalogue d’articles, sélectionnez ce que vous voulez et la page suivante affiche les détails de cet article. Tout fonctionne parfaitement, sauf une chose:

Chaque fois que j'utilise le bouton Précédent du navigateur, le message d'erreur suivant s'affiche toujours: ERR_CACHE_MISS et je dois actualiser la page, puis confirmer que je souhaite réellement renvoyer les données.

Existe-t-il un moyen de résoudre ce problème afin que mes clients puissent utiliser le bouton de retour comme ils le supposaient?.

Voici le texte intégral que me fournit le navigateur:

Cette page Web nécessite des données que vous avez entrées précédemment pour être correctement affiché. Vous pouvez envoyer ces données à nouveau, mais en le faisant vous répéterez toute action effectuée précédemment par cette page. Recharger cette page Web. Appuyez sur le bouton de rechargement pour soumettre à nouveau les données nécessaires au chargement la page. Code d'erreur: ERR_CACHE_MISS

10
Maxim Ershov

Lorsque vous publiez des formulaires avec php, ou toute autre donnée, vous pouvez revenir à la page et trouver un message dans le navigateur tel que "Document expiré" ou "Confirmer la soumission du formulaire avec Chrome". Ces messages constituent une mesure de sécurité que le navigateur utilise avec des données sensibles telles que les variables de publication. Le navigateur ne vous donnera pas automatiquement la nouvelle page à nouveau. Vous devez recharger la page en cliquant sur Réessayer ou avec un rafraîchissement de la page. Ensuite, il fonctionne comme vous le souhaiteriez. 

Cependant, le codeur php peut contourner le message gênant du navigateur en ajoutant un peu de code dans le script. L’exemple montre quelques lignes de code qui peuvent être ajoutées au-dessus de session_start () afin d’être en mesure d’aller et de revenir à la page lorsque vous publiez sans aucun accrochage. en-tête expiré en premier lieu.

header('Cache-Control: no cache'); //no cache
session_cache_limiter('private_no_expire'); // works
//session_cache_limiter('public'); // works too
session_start();
23
user3877861

** Un peu d’arrière-plan: le mérite revient à Bruce (sqlwork.com) pour son excellente explication.

Cette page Web nécessite des données que vous avez entrées précédemment pour être correctement affichées. Vous pouvez envoyer ces données à nouveau, mais en procédant ainsi, vous répétez toute action effectuée précédemment par cette page. Appuyez sur Recharger pour renvoyer ces données et afficher cette page. 

En raison des pratiques de codage bâclées des développeurs Web, les navigateurs ont été forcés d'ajouter ce message. le scénario est le suivant:

1) l’utilisateur remplit le formulaire et le soumet (messages postaux) 2) le serveur traite les données de l’opération et répond avec une nouvelle page (confirmer) marquée comme non cacheable 3) l’utilisateur accède à une nouvelle page 4) l'utilisateur appuie en arrière:

pour que le navigateur affiche la page à l’étape 2, car il est marqué no-cache, il doit en faire la demande au serveur, c’est-à-dire faire la republication des données (effectuez l’étape 1). le code manquant est entré, s’il s’agissait d’une charge de carte de crédit et que la détection de republication n’était pas sur le serveur, la carte est débitée deux fois. c’était un problème si courant que les navigateurs devaient le détecter et en avertir les utilisateurs.

le meilleur correctif est à la deuxième étape, le serveur envoie une redirection vers la page de confirmation. puis, lorsque l'utilisateur accède à la confirmation via history ou back, il s'agit d'une requête get, et non d'une requête post, et ne montrera pas l'avertissement.

note: le modèle de postback de webform se prête à ce problème. évitez également les transferts de serveur.

Ma solution

$ _SESSION ['home'] utilisé pour stocker les erreurs sur la page d'accueil. 

$ _SESSION ['tempEmail'] utilisé pour faire écho à la valeur sur la forme php.

Remarque: Utilisez une variable de session unique pour chaque page comportant un formulaire HTML pour la gestion des erreurs, ainsi que toute variable de session pour chaque valeur renvoyée en écho sur un formulaire HTML. 

<?php
session_start(); 

//Initialize variables not initialized without overwriting previously set variables.
if(!isset($_SESSION['home'])) {
$_SESSION['home']="";
$_SESSION['tempEmail']="";
}

Facultatif - Si vous êtes connecté, attribuez une adresse électronique à la variable $ _SESSION ['tempEmail'] (si cela n'a pas déjà été fait) pour pré-remplir le formulaire HTML. 

if(isset($_POST['Submit'])){

---your code---


    //Error message(s) examples
    $_SESSION['home'] = "Email and Password do not match, please try again.";
    header("Location: " . $_SERVER['REQUEST_URI']);

    $_SESSION['home'] = "Email address format is invalid.  Please recheck.";
    header("Location: " . $_SERVER['REQUEST_URI']);

    //success
    unset ($_SESSION['home']); //optional, unset to clear form values.
    header ("location: nextpage.php"); 
             ---or---
    header("Location: " . $_SERVER['REQUEST_URI']);  //re-post to same page with the $_SESSION['home'] success message.   
}
?>



<body>

Boîte d'erreur

<span><strong class="error"><?php echo $_SESSION['home'] ?></strong></span>

Formulaire HTML

<form action="#" name="loginform" method="post" >
    <input type="text" name="userEmail" maxlength="50" title="Enter Your email" autocomplete="off" value="<?php echo htmlspecialchars($_SESSION['tempEmail']); ?>" placeholder="enter email" required/>
    <input type="submit" name="Submit" value="Submit">
</form>

</body>

Non recommandé d'utiliser sur la page de paiement, voir la discussion ci-dessus. Testé dans Firefox, Chrome, Safari et IE9. Les messages gênants ont disparu lorsque vous utilisez le bouton Précédent. Assurez-vous que la mise en mémoire tampon de sortie est activée sur votre script php ou php.ini pour éviter les avertissements d'en-tête. Vous pouvez vérifier votre fichier php.ini pour ce qui suit:

output_buffering=On
8
Medeno

J'ai trouvé cela en utilisant simplement:

header('Cache-Control: no cache'); //disable validation of form by the browser

résoudre le problème

4
Mimouni

J'ai essayé cette réponse et ça va . Vous devez mettre ce code avant: session_start():

session_cache_limiter('private, must-revalidate');
session_cache_expire(60);

Bonne chance

2
user5497991
<?php
if(isset($_POST['submit']))
{
 //submission goes here
}
?>

Est-ce ce que vous pensiez?

edit - SQL est vraiment une belle chose à travailler, je vois que cela a été ajouté comme recommandation dans un commentaire, et je suis d’accord pour utiliser SQL si vous le pouvez, rapide, intuitif et efficace.

0
Craig Travis