2013-10-07 18 views
10

Quindi, ecco l'accordo, Sto utilizzando moduli HTML per trasferire variabili da una pagina all'altra e script PHP per creare pagine basate sui valori inviati. In generale appare così: dal catalogo degli oggetti si seleziona ciò che si desidera e la pagina successiva mostra i dettagli per questo specifico articolo. Tutto funziona perfettamente, tranne una cosa:tornare indietro con l'invio del modulo PHP

Ogni volta che uso il tasto indietro del browser, ho sempre arrivare l'errore: ERR_CACHE_MISS e ho bisogno di aggiornare la pagina e quindi confermare che ho davvero voglia di ripresentare i dati.

C'è un modo per risolvere questo problema, quindi i miei clienti sarebbero in grado di utilizzare solo il pulsante indietro come previsto.

Ecco il testo integrale che il browser mi offre:

This webpage requires data that you entered earlier in order to be properly displayed. You can send this data again, but by doing so you will repeat any action this page previously performed. Reload this webpage. Press the reload button to resubmit the data needed to load the page. Error code: ERR_CACHE_MISS

+2

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

+0

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

+0

È 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. –

risposta

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

E 'questo quello che stavi pensando?

modifica - SQL è davvero una cosa bella con cui lavorare, vedo che è stato aggiunto come una raccomandazione in un commento e concordo di usare SQL se possibile, è veloce, intuitivo ed efficiente.

+2

No, nemmeno un po ' – ElefantPhace

8

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

Quando pubblichi forme con php, o altri dati, è possibile tornare alla pagina e trovare un messaggio nel browser come "Documento scaduto" o "Conferma reinvio modulo Con Chrome". Questi messaggi sono una precauzione di sicurezza che il browser utilizza con dati sensibili come le variabili post. Il browser non ti restituirà automaticamente la nuova pagina. È necessario ricaricare la pagina facendo nuovamente clic su prova o con un aggiornamento della pagina. Quindi funziona come ti aspetteresti.

Tuttavia, il codificatore php può aggirare il fastidioso messaggio dal browser con l'aggiunta di un po 'di codice nello script. L'esempio mostra un paio di righe di codice che possono essere aggiunte sopra session_start() per poter andare avanti e indietro alla pagina quando si registra senza hangup. La modalità 'private_no_expire' significa che il client non riceverà il intestazione scaduta in primo luogo.

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

Ho provato questa risposta ed è ok. Dovete inserire questo codice prima: session_start():

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

Buona fortuna

4

ho scoperto che utilizzando solo:

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

risolvere il problema

Problemi correlati