Cómo evitar que se vuelva a enviar el formulario cuando se actualiza la página (F5/CTRL+R)
Tengo un formulario simple que envía texto a mi tabla SQL. El problema es que después de que el usuario envía el texto, puede actualizar la página y los datos se envían nuevamente sin tener que volver a completar el formulario. Podría redirigir al usuario a otra página después de enviar el texto, pero quiero que los usuarios permanezcan en la misma página.
Recuerdo haber leído algo sobre cómo darle a cada usuario una identificación de sesión única y compararla con otro valor que resolvió el problema que tengo, pero olvidé dónde está.
También me gustaría señalar que puede utilizar un enfoque de JavaScript window.history.replaceState
para evitar volver a enviar al actualizar y al botón Atrás.
<script>
if ( window.history.replaceState ) {
window.history.replaceState( null, null, window.location.href );
}
</script>
Prueba de concepto aquí: https://dtbaker.net/files/prevent-post-resubmit.php (el enlace ya no funciona)
Todavía recomendaría un enfoque Publicar/Redireccionar/Obtener, pero esta es una solución JS novedosa.
Utilice el patrón Publicar/Redireccionar/Obtener. http://en.wikipedia.org/wiki/Post/Redirect/Get
Con mi sitio web, almacenaré un mensaje en una cookie o sesión, lo redirigiré después de la publicación, leeré la cookie/sesión y luego borraré el valor de esa sesión o variable de cookie.
Puede evitar el reenvío del formulario mediante una variable de sesión.
Primero debes configurar rand()
en un cuadro de texto y $_SESSION['rand']
en la página del formulario:
<form action="" method="post">
<?php
$rand=rand();
$_SESSION['rand']=$rand;
?>
<input type="hidden" value="<?php echo $rand; ?>" name="randcheck" />
Your Form's Other Field
<input type="submit" name="submitbtn" value="submit" />
</form>
Después de eso, verifique $_SESSION['rand']
con $_POST['randcheck']
un valor de cuadro de texto como este:
if(isset($_POST['submitbtn']) && $_POST['randcheck']==$_SESSION['rand'])
{
// Your code here
}
Asegúrate de iniciar la sesión en cada archivo con el que lo estés utilizando.session_start()
Utilizo esta línea de JavaScript para bloquear la ventana emergente que solicita volver a enviar el formulario al actualizar una vez que se envía el formulario.
if ( window.history.replaceState ) {
window.history.replaceState( null, null, window.location.href );
}
Simplemente coloque esta línea al pie de página de su archivo y vea la magia.