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 volver a llenar 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 acerca de darle a cada usuario una identificación de sesión única y compararlo con otro valor que resolvió el problema que tengo, pero olvidé dónde está.
POST
solicitudPOST
datos. En este caso, lo necesitaSELECT
desde DB. Por ejemplo, cuando crea la factura, se le redirige a/invoices/53
la pantalla que muestra la factura completa en lugar de solo 'éxito'Respuestas:
Use el patrón Publicar / Redirigir / Obtener. http://en.wikipedia.org/wiki/Post/Redirect/Get
Con mi sitio web, almacenaré un mensaje en una cookie o sesión, 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.
fuente
También me gustaría señalar que puede utilizar un enfoque de JavaScript,
window.history.replaceState
para evitar un reenvío al actualizar y el botón Atrás.Prueba de concepto aquí: https://dtbaker.net/files/prevent-post-resubmit.php
Todavía recomendaría un enfoque Post / Redirect / Get, pero esta es una nueva solución JS.
fuente
Realmente debería usar un patrón de obtención de redireccionamiento posterior para manejar esto, pero si de alguna manera terminó en una posición en la que PRG no es viable (por ejemplo, el formulario en sí está incluido, evitando redireccionamientos), puede modificar algunos de los parámetros de solicitud hacer una cadena basada en el contenido y luego verificar que aún no la haya enviado.
fuente
session_start();
al principio del archivo. w3schools.com/php/php_sessions.asp dice Nota: La función session_start () debe ser lo primero en su documento. Antes de cualquier etiqueta HTML.Utilizo esta línea de JavaScript para bloquear la ventana emergente que solicita el reenvío del formulario al actualizar una vez que se envía el formulario.
Simplemente coloque esta línea al pie de página de su archivo y vea la magia
fuente
Puede evitar el reenvío de formularios mediante una variable de sesión.
Primero debe configurar
rand()
en un cuadro de texto y$_SESSION['rand']
en la página del formulario:Después de eso, verifique
$_SESSION['rand']
con el$_POST['randcheck']
valor del cuadro de texto como este:fuente
<input type="hidden" name="randcheck" id="randcheck" value="<?php echo microtime(); ?>" />
en su lugar$_POST
de los datos del formulario, la misma página se vuelve a cargar para restablecer la sesión y publicar las variables. Además, la creación de variables debe realizarse después de verificar si las variables coinciden. Porunset
lo tanto no es necesario.Cuando se procesa el formulario, redirige a otra página:
También puede redirigir a la misma página.
si está haciendo algo como comentarios y desea que el usuario permanezca en la misma página, puede usar Ajax para manejar el envío del formulario
fuente
Encontré la próxima solución. Puede escapar de la redirección después de procesar la
POST
solicitud manipulandohistory
objeto.Entonces tienes el formulario HTML:
Cuando procesa este formulario en su servidor, en lugar de redirigir al usuario
/the/result/page
configurando elLocation
encabezado de esta manera:Después de procesar los
POST
datos ed, se vuelve pequeño<script>
y el resultado/the/result/page
El
<script>
que debes renderizar:El resultado es:
como puede ver, los datos del formulario se
POST
editan alprocess.php
script.Este script procesa
POST
datos y renderiza/the/result/page
a la vez con:POST
datos cuando actualiza la página (F5)POST
cuando navega a la página anterior / siguiente a través del historial del navegadorUPD
Como otra solución, solicito que la función solicite al equipo de Mozilla FireFox que permita a los usuarios configurar el
NextPage
encabezado que funcionará comoLocation
encabezado y crearápost/redirect/get
obsoleto el patrón.En breve. Cuando el servidor procesa los
POST
datos de forma satisfactoriamente:NextPage
encabezado en lugar deLocation
POST
datos del formulario tal como se representaría para laGET
solicitud en elpost/redirect/get
patrónEl navegador a su vez cuando ve el
NextPage
encabezado:window.location
conNextPage
valorGET
solicitud enNextPage
lugar de volver aPOST
formar los datos.Creo que esto sería excelente si se implementa, ¿no?
=)
fuente
Use el encabezado y redirija la página.
header("Location:your_page.php");
Puede redirigir a la misma página o a una página diferente.Desarme $ _POST después de insertarlo en la base de datos.
unset($_POST);
fuente
unset
? Agregue alguna explicación a su respuesta para que otros puedan aprender de ellaUna forma bastante segura es implementar una identificación única en la publicación y almacenarla en caché
Luego, en su código, haga esto:
fuente
Este método me funciona bien, y creo que este es el más simple para hacer este trabajo.
La idea general es redirigir al usuario a otras páginas después del envío del formulario, lo que detendría el reenvío del formulario al actualizar la página. Aún así, si necesita mantener al usuario en la misma página después de enviar el formulario, puede hacerlo de varias maneras, pero aquí estoy describiendo el método de JavaScript.
Método Javascript
Este método es bastante fácil y bloquea la ventana emergente que solicita el reenvío del formulario al actualizar una vez que se envía el formulario. Simplemente coloque esta línea de código javascript en el pie de página de su archivo y vea la magia.
fuente
Javascript
Este método es bastante fácil y bloquea la ventana emergente que solicita el reenvío del formulario al actualizar una vez que se envía el formulario. Simplemente coloque esta línea de código javascript en el pie de página de su archivo y vea la magia.
fuente
Simplemente rediríjalo a la misma página después de hacer uso de los datos del formulario, y funciona. Lo he intentado
fuente
Una versión refinada de la publicación de Moob. Cree un hash de la POST, guárdelo como una cookie de sesión y compare los hash en cada sesión.
fuente
Básicamente, debe redirigir fuera de esa página, pero aún puede causar un problema mientras su Internet se ralentiza (encabezado de redireccionamiento desde el servidor)
Ejemplo de escenario básico:
Haga clic en el botón Enviar dos veces
Forma de resolver
Lado del cliente
Lado del servidor
fuente
Cómo evitar el reenvío de formularios PHP sin redireccionar. Si está utilizando $ _SESSION (después de session_start) y un formulario $ _POST, puede hacer algo como esto:
En su formulario html ponga esto:
Por lo tanto, cada vez que se envía el formulario, se genera un nuevo acto, se almacena en sesión y se compara con el acto posterior.
Ps: si está utilizando un formulario Get, puede cambiar fácilmente todas las POST con GET y también funciona.
fuente
Después de insertarlo en la base de datos, llame al método unset () para borrar los datos.
sin establecer ($ _ POST);
Para evitar la inserción de datos de actualización, realice una redirección de página a la misma página o a una página diferente después de insertar el registro.
header ('Ubicación:'. $ _ SERVER ['PHP_SELF']);
fuente
unset
necesita esa llamada? ¿Qué pasaría si te lo saltaras?Usar la opción Publicar / Redirigir / Obtener patrón de Keverw es una buena idea. Sin embargo, no puede permanecer en su página (y creo que esto era lo que estaba pidiendo). Además, a veces puede fallar :
Otra opción sería almacenar en una sesión si el texto se debe escribir en su base de datos SQL de esta manera:
fuente
Como otros han dicho, no es posible dejar de usar post / redirect / get. Pero al mismo tiempo, es bastante fácil hacer lo que quieres hacer del lado del servidor.
En su página POST, simplemente valida la entrada del usuario, pero no actúa sobre ella, sino que la copia en una matriz SESSION. Luego redirige nuevamente a la página principal de envío. Su página principal de envío comienza verificando si la matriz SESSION que está utilizando existe, y si es así, cópiela en una matriz local y desarmela. Desde allí puedes actuar en consecuencia.
De esta manera, solo haces todo tu trabajo principal una vez, logrando lo que quieres hacer.
fuente
Luego busqué una solución para evitar el reenvío en un gran proyecto. El código funciona altamente con $ _GET y $ _POST y no puedo cambiar el comportamiento de los elementos de formulario sin el riesgo de errores imprevistos. Entonces, aquí está mi código:
Solo funciona para evitar el reenvío de $ _POST, no $ _GET. Pero este es el comportamiento que necesito. ¡El problema de reenvío no funciona con la carga de archivos!
fuente
Lo que funciona para mí es:
Y en tu forma
fuente
Este
form.php
ejemplo muestra cómo usar PRG correcto (cuando el formulario es válido o no).fuente
fuente
$everything_fine
viene?¿Por qué no simplemente usar la
$_POST['submit']
variable como una declaración lógica para guardar lo que esté en el formulario? Siempre puede redirigir a la misma página (en caso de que se actualicen, y cuando lleguengo back
al navegador, la variable de publicación de envío ya no se establecerá. Solo asegúrese de que su botón de envío tenga unaname
yid
desubmit
.fuente