2012-12-15 12 views
5

Mi chiedo quali sono le tecniche che posso utilizzare per evitare che gli utenti postino il modulo due volte quando aggiornano la pagina e scelgono di inviare nuovamente?

ad es. Ho un modulo all'interno di regiter.php e lo elaboro anche all'interno di register.php.

potevo elaborare in un altro file, ad es. register_process.php e reindirizzare a register.php, ma poi devo creare circa 20 nuove pagine e ricollocare un sacco di codice, non voglio quell'opzione.

secondo ho potuto giocare con headers mi ricordo trucco esatta, ma avuto qualche brutta esperienza con questo - gli utenti visto vecchi dati a pagina dopo l'aggiornamento è ...

3 ° ho potuto solo reindirizzare in caso di successo ad alcuni dummy.php e da dummy.php salto indietro al register.php quindi anche se refresh della pagina del browser non sarebbe ri-post, tuttavia non protegge contro di loro utilizzando pulsante indietro ec Hoose re-post, so che potrei scadere della pagina, ma trovo che un'esperienza fastidiosa per me e probabilmente altri utenti di vedere l'errore di pagina scaduta.

utilizzare una "chiave di accesso" univoca per ogni modulo una volta caricata la pagina che pubblicherà con modulo e una volta utilizzata non può essere riutilizzata, tuttavia mi piace lottare con le logiche di quella funzionalità. come si fa a sapere che la chiave è stata utilizzata senza memorizzarla nel DB MySQL, penso che l'accento basato sul tempo non sia eccezionale perché alcuni utenti possono impiegare molto tempo tra la pagina aperta e il modulo submit.

Ho bisogno di ulteriori suggerimenti su come evitare che gli utenti si riposino nuovamente.

risposta

1

Prova questo:

<?php 
session_start(); 
if(strcasecmp($_SERVER['REQUEST_METHOD'],"POST") === 0) { 
    $_SESSION['postdata'] = $_POST; 
    header("Location: ".$_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING']); 
    exit; 
} 
if(isset($_SESSION['postdata'])) { 
    $_POST = $_SESSION['postdata']; 
    unset($_SESSION['postdata']); 
} 

Questo sarà essenzialmente salvare i dati POST e causare il browser a ri-richiesta come una richiesta GET.

+0

Ho fatto qualcosa di simile, tuttavia usato più righe di codice :) Il problema è se refresh della pagina prima di inviare modulo, '$ _SESSION [ 'postdata']' non sarà più lì P.S. Qualsiasi vantaggio nell'uso di 'strcasecmp ($ _ SERVER ['REQUEST_METHOD']," POST ")' invece di '$ _SERVER ['REQUEST_METHOD'] ==" POST "'? –

1

quinto. Utilizzare AJAX o jQuery e quando si fa clic sul modulo sulla pagina, inviare i dati in background. Emette una risposta allo schermo. Contrassegna tale modulo come inviato o salva in una sessione e quando si aggiorna non sarà più possibile inviare nuovamente il modulo.

A mio parere è comunque il modo migliore di farlo. Ho avuto un quadro di valutazione con 20 o più moduli è stato fatto molto bene per inviare i dati senza aggiornare. Puoi restituire una risposta e rendere la pagina molto professionale. Usando jQuery puoi anche usare una validazione di grande forma per assicurarti che stiano inviando i campi richiesti.

+0

No grazie non voglio usare qualsiasi forma di JavaScript a causa del problema di compatibilità solo html e php –

0

Quando si considera la prima opzione, non conosco il design (progettazione di programmazione ^^) del proprio sito Web, ma è necessario solo 1 pagina. Diciamo che chiami redirect.php con tutti i parametri, dovresti chiamare il controller e il controller dovrebbe sapere a prescindere dai parametri che cosa fare con loro.

È una buona abitudine essere in grado di fare un po 'di astrazione e un buon design durante la programmazione, aiuta molto in quelle situazioni.

+0

stavo pensando che ancora considerando cosa è meglio fare. –

0

Penso che la soluzione migliore sarebbe qualcosa di simile:
* creare un MD5 o Base64 dei dati pubblicati
* confronta hash con una variabile di sessione (chiamiamolo $ _SESSION [ 'ripubblicare'])
* se gli hash corrispondono, saltare qualunque cosa questo salvataggio dovrebbe fare ed emettere un avvertimento
* se gli hash non corrispondono, o hash non è presente
* assegnare variabile di sessione con hash corrente
* non qualunque salvare dovrebbe fare

+0

base64 non _non_ crea hash ma codifica i dati a 8 bit in caratteri ASCII indipendenti dalla codepage. la codifica di 8mb di dati con base64 sarà maggiore di 8mb, la creazione di un hash md5 di 8mb di dati comporterà un hash lungo 16 byte. – hmundt

0

L'altro modo è st ORE l'ultimo post nella variabile di sessione, e verificare se è uguale, come questo:

<?php 
... program ... 
if ($_SESSION['PREPOST'] == $_POST) { 
    // DO SOMETHING 
} 
... program ... 
$_SESSION['PREPOST'] = $_POST; 
?> 
Problemi correlati