** Un po 'di storia: il merito va a bruce (sqlwork.com) per la sua eccellente spiegazione.
Questa pagina Web richiede dati inseriti in precedenza per essere visualizzati correttamente. È possibile inviare nuovamente questi dati, ma così facendo si ripeterà qualsiasi azione eseguita in precedenza su questa pagina. Premi Ricarica per inviare nuovamente i dati e visualizzare questa pagina.
A causa delle pratiche di codifica sciatta degli sviluppatori Web, i browser sono stati costretti ad aggiungere questo messaggio. lo scenario è il seguente:
1) utente compila in forma e presenta (messaggi formano) 2) il processo server i dati postali e risponde con una nuova pagina (conferma) contrassegnato come non cacheable 3) l'utente naviga a una nuova pagina. 4) l'utente premere indietro:
per il browser per visualizzare la pagina nel passaggio 2, perché contrassegnato senza cache, deve richiederlo dal server, in altre parole eseguire il repost dei dati (fare passo 1). ecco dove è arrivata la codifica sciatta, se si trattava di un addebito sulla carta di credito, e il rilevamento del repost non era sul server, la carta viene addebitata due volte. questo era (è) un problema così comune, che i browser dovevano rilevarlo e avvertire gli utenti.
la soluzione migliore è nel passaggio due, il server invia un reindirizzamento alla pagina di conferma. quindi quando l'utente accede alla conferma via cronologia o viceversa, è una richiesta get, non una richiesta post e non mostrerà l'avviso.
nota: il modello di postback di webform si presta a questo problema. evitare anche i trasferimenti del server.
La mia soluzione
$ _SESSION [ 'casa'] usato per memorizzare gli eventuali errori sulla home page.
$ _SESSION ['tempEmail'] utilizzato per echo valore su modulo php.
Nota: Utilizzare una variabile di sessione univoco per ogni pagina che ha un form HTML per la gestione degli errori e anche qualsiasi variabile di sessione per ogni valore che fa eco il form HTML.
<?php
session_start();
//Initialize variables not initialized without overwriting previously set variables.
if(!isset($_SESSION['home'])) {
$_SESSION['home']="";
$_SESSION['tempEmail']="";
}
Opzionale - Se il login, assegnare l'indirizzo e-mail alla variabile $ _SESSION [ 'tempEmail'] (se non precedentemente fatto) per pre-compilare il modulo 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>
dialogo Errore
<span><strong class="error"><?php echo $_SESSION['home'] ?></strong></span>
modulo 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>
Si raccomanda di non usare su pagina di pagamento, vedi discussione di cui sopra. Testato su Firefox, Chrome, Safari e IE9. I fastidiosi messaggi scompaiono quando si utilizza il pulsante Indietro. Assicurati che il buffering dell'output sia attivato "on" nel tuo script php o php.ini per evitare avvisi di intestazione. Puoi controllare il tuo file php.ini per quanto segue;
output_buffering=On
Sei aperto a utilizzare un server fine archiviazione dei dati? MySQL, Redis? Il modo migliore è quello di memorizzare i dati sul server mentre l'utente naviga intorno. –
e con questo intendi che ho bisogno di memorizzare tutti i valori dai moduli inviati durante la sessione dell'utente? Posso usare lo storage di sessione per questo? –
È possibile utilizzare l'archiviazione di sessione, ma non è molto scalabile e diventa il modo sbagliato di andare se la quantità di dati va da un po 'a più di un po'. Direi che per l'archiviazione delle sessioni di compiti a casa va bene, per la produzione non è sufficiente. –