varios validar quedarse pagina mostrar misma mensaje link formulario envio enviar ejemplos despues confirmacion botones boton bloquear antes php forms get refresh back

quedarse - validar formulario php antes enviar



Impedir que se vuelva a enviar el formulario al pulsar el botón Atrás (6)

Debe eliminar la solicitud de los datos POST del historial del navegador

history.replaceState("", "", "/the/result/page")

Ver this respuesta

También puedes seguir el patrón Post/Redirect/Get .

He buscado muchas publicaciones aquí y en otros lugares, pero parece que no puedo encontrar una solución a mi problema. Tengo una página que muestra las entradas de la base de datos: database.php. Estas entradas se pueden filtrar con un formulario. Cuando los filtro y solo muestro los que me interesan, puedo hacer clic en una entrada (como enlace) que me lleva a esa página de entradas (a través de php GET). Cuando estoy en esa página de entradas (es decir, "view.php? Id = 1") y pulsa el botón Atrás (volver a database.php), el formulario de filtro requiere confirmar la nueva presentación del formulario. hay alguna forma de prevenir esto?

Aquí hay algunos ejemplos de código (simplificado):

Database.php:

<form> <select> <option>1</option> <option>2 <option> </select> <input type="submit" name="apply_filter" /> </form> <?php if ( isset( $_POST[ "apply_filter" ] ) ) { // display filtered entries $filter = $_POST[ "filter" ]; $q = "Select * from table where col = ''" . $filter . "''"; $r = mysql_query( $q ); } else { // display all entries $q = "Select * from table"; $r = mysql_query( $q ); } while ( $rec = mysql_fetch_assoc( $r ) ) { echo "<a href=''view.php?id=" . $rec[ "id" ] . "''>" . $rec[ "name" ] . "</a><br />"; // this is where the link to the view.php page is... } ?>

Ahora como mencioné, si hago clic en el enlace, me lleva a "view.php? Id = lo que sea". En esa página, acabo de obtener el ID de la URL para mostrar esa única entrada:

view.php:

<?php $id = $_GET[ "id" ]; $q = "Select * from table where id = ''" . $id . "''"; $r = mysql_query( $q ); while ( ) { // display entry } ?>

Si ahora presiono el botón Atrás, el formulario en database.php (el que se usa para filtrar los resultados de la base de datos) requiere confirmación para volver a enviar. Esto no solo es muy molesto, también es inútil para mí.

¿Cómo puedo arreglar esto? Espero que los ejemplos de código y la explicación de mi problema sean suficientes. Si no es así, hágamelo saber y trataré de especificar.


Hay dos maneras que conozco para hacer esto. La forma simple y la forma difícil.

Independientemente de la forma, cuando se trata de una página basada en estado (utilizando $_SESSION ), lo que debería hacer para mantener sus páginas "en vivo" y bajo su control, es evitar el almacenamiento en caché de todas las páginas como esta:

<?php //Set no caching header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); ?>

La forma más difícil consiste en generar una identificación y almacenarla en algún lugar de la página como una entrada oculta o una cookie de &_SESSION . Luego almacena la misma ID en el servidor como $_SESSION . Si no coinciden, una serie de declaraciones preprogramadas if no hacen que no suceda nada con la página se vuelve a enviar (que es lo que intenta hacer al hacer clic en Atrás).

La forma más sencilla es simplemente redirigir al usuario a la página de envío del formulario si el formulario se envió correctamente, así:

header(''Location: http://www.mydomain.com/redirect.php'');

¡Espero que esto ayude!


Sé que esta pregunta es antigua, pero teniendo este problema yo mismo, dos líneas que descubrí que funcionan son:

header("Cache-Control: no cache"); session_cache_limiter("private_no_expire");


Una cosa que podría ayudar es hacer que su forma de filtro use un método GET lugar de POST .

Los navegadores generalmente evitan que la entrada POST a enviar automáticamente, lo cual es algo que no hacen cuando se usa la entrada GET . Además, esto permitirá a los usuarios enlazar a su página utilizando un filtro.


Una solución alternativa que también funciona si / cuando se recarga la página implica verificar la originalidad de la publicación usando $ _SESSION. En pocas palabras, compruebe si hay una cadena única o aleatoria.

En el formulario, agregue un elemento de entrada con un valor establecido usando rand () o microtime ():

<input type="hidden" name="formToken" value="<?php echo microtime();?>"/>

Y luego envuelva la función PHP para validar y analizar los datos del formulario en un bloque if:

if(!isset($_SESSION[''formToken'']) || $_POST[''formToken''] !== $_SESSION[''formToken''])){ $_SESSION[''formToken''] = $_POST[''formToken'']; /*continue form processing */ }


Utilicé la respuesta en ¿Cómo detecto si un usuario ha llegado a una página con el botón Atrás? para detectar si la visita se activó o no con un clic en el botón de retroceso del navegador, y si ese era el caso, usé JavaScript para volver a cargar la página. Cuando se recarga la página, mi código ya maneja las validaciones correspondientes para asegurarse de que el formulario nunca se envíe dos veces. La parte importante en mi caso fue forzar la recarga de la página cuando el formulario fue revisado después de hacer clic en el botón de retroceso del navegador. Este es mi código en la URL donde quise aplicar esta validación:

<script type="text/javascript"> if (window.performance && window.performance.navigation.type == window.performance.navigation.TYPE_BACK_FORWARD) { location.reload(); } </script>