Cómo evitar que se vuelva a enviar el formulario cuando se actualiza la página (F5/CTRL+R)

Resuelto user701510 asked hace 54 años • 21 respuestas

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

user701510 avatar Jan 01 '70 08:01 user701510
Aceptado

También me gustaría señalar que puede utilizar un enfoque de JavaScript window.history.replaceStatepara 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.

dtbaker avatar Aug 13 '2017 02:08 dtbaker

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.

Keverw avatar Jun 12 '2011 04:06 Keverw

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()

Savoo avatar Aug 04 '2016 13:08 Savoo

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.

Mo'men Mohamed avatar Sep 23 '2018 08:09 Mo'men Mohamed