Cómo evitar volver a enviar un formulario. Reenvío de datos del formulario al actualizar la página. Evitar el reenvío de formularios mediante una redirección de cliente
En un momento me desconcertó la pregunta: cómo proteger las páginas del sitio para que no vuelvan a enviar los datos del formulario durante la actualización de la página (si antes de eso hubo un envío, por supuesto).
Todo webmaster y desarrollador probablemente sepa que si en el sitio hizo clic en el botón "enviar" al completar un formulario, luego de enviarlo, si intenta actualizar la página, el navegador mostrará un mensaje confirmando el reenvío.
En algunos momentos, esto es inaceptable. Por ejemplo, en el caso de la forma elemental realimentación... Cuando el usuario llenó el formulario y envió un mensaje, y luego, por alguna razón que él conocía, actualizó la página, la carta desapareció nuevamente. Este puede, por supuesto, no ser un caso tan fatal, solo como un ejemplo. Todo es mucho más doloroso, por ejemplo, al enviar un pedido en una tienda online.
Así que me planteé la cuestión de encontrar una solución a este problema y me di cuenta de que solo hay una solución: usar la redirección después de enviar el formulario de encabezado ("ubicación: dirección"). Aquellos. todo es simple: después del envío, llamamos a un redireccionamiento (incluso puedes ir a la misma página) ¡y eso es todo! La actualización de la página será limpia, sin POST ni GET llenos.
Todo está bien, pero personalmente tuve algunos problemas con esto. Son los siguientes. Anteriormente, sin usar redireccionamientos, el mecanismo para enviar datos en mis sitios funcionaba de la siguiente manera:
El usuario completa el formulario, hace clic en "enviar", el script acepta los datos enviados, verifica su exactitud (validez, integridad de los datos requeridos, etc.) y da una respuesta: la operación fue exitosa o se produjo un error y una lista de errores (por ejemplo: error - el campo "nombre" no está lleno. Y en la página de envío, a su vez, se muestra el mensaje correspondiente: el envío es exitoso o no exitoso.
Si el envío no es exitoso, el formulario permanece en la pantalla y sus campos se llenan con los datos que ingresó el usuario. Aquellos. los datos se toman de la variable $ _POST (si Método POST) y entrar en los campos correspondientes (es decir, vuelven de la publicación a sus campos para no volver a introducirlos). Después de todo, todos se enfurecen cuando llenó el formulario, y Dios no permita que haya indicado algo incorrectamente y cuando intente enviarle un mensaje se muestra que algo se completó incorrectamente, y el formulario se actualiza y vuelve a estar vacío. Y debe volver a completarlo debido a un campo llenado incorrectamente.
Entonces, como dije, en caso de llenado incorrecto, el formulario permanece lleno con datos tomados de $ _POST, y el usuario puede corregir los datos incorrectos y enviar el formulario nuevamente.
Todo estuvo bien y todo funcionó.
Pero luego hice un envío usando redirección y resultó que después de presionar el botón "enviar", en caso de llenado incorrecto, el formulario se actualizó y los campos llenos ya no podían permanecer en él, porque Anteriormente, se llenaban automáticamente desde la matriz $ _POST, pero ahora, después de que se produjo la redirección, $ _POST se borró como si no hubiera ningún envío.
Pero incluso en este caso, había una salida. Utilice sesiones. Aquellos. antes de llamar al encabezado, transfiera los datos de POST a las variables de sesión y solo entonces, después de la redirección, opere con ellas.
Como resultado, el código se volvió mucho más complejo. La depuración se ha vuelto más difícil porque en general, es difícil determinar qué sucede con las funciones en el momento en que se produce una redirección. Si cometió algún error en los códigos (que aparece exactamente en el momento del envío), entonces ni siquiera se mostrará, porque Se producirá una redirección y ni siquiera verá el mensaje de error.
En general, después de la introducción del encabezado en mis códigos, se me hizo más difícil trabajar con mis aplicaciones. La búsqueda de desarrollo / revisión / error se ha vuelto más difícil. Pero tampoco puedo rechazarlo.
Y me sigo preguntando: ¿hay otras soluciones más elegantes?
Proceso de envío Formularios HTML pueden pasar unos segundos antes de que el formulario se envíe correctamente y se muestre la página de respuesta. Los usuarios que no son lo suficientemente pacientes pueden hacer clic en el botón Enviar varias veces, lo que hace que se vuelva a enviar el formulario. Por lo general, esto no es un problema, pero en algunos casos puede evitar que esto suceda.
A continuación encontrará dos trucos sencillos para evitar la duplicación de mensajes, puede utilizar uno o una combinación de estos.
Evitar múltiples envíos con Javascript
Probablemente usar Javascript para evitar volver a enviar el formulario es lo más de una manera fácil... Cuando el usuario envía el formulario, puede deshabilitar el botón "Enviar" y cambiar su nombre a algo más comprensible "Enviando, por favor espere ..."
El primer paso es establecer un identificador único identificación, por ejemplo id = "myButton":
El segundo (y último) paso es configurar dos comandos Javascript en la etiqueta