Actualizar navegador sin ejecutar POST

les quiero plantear una duda que tengo... Yo tengo un formulario que es enviado a la misma pagina index.php en donde está (action="index.php")...

La FAQ Actualizar navegador sin ejecutar POST tiene

Pertenece a la categoría:

Pregunta
les quiero plantear una duda que tengo... Yo tengo un
formulario que es enviado a la misma pagina index.php en donde está
(action="index.php") mediante el método POST.
Mi problema es el siguiente:




1) El usuario hace el submit del formulario (y almacena los contenidos del
formulario en una base de datos).




2) La página se recarga (sobre si misma) y si, una vez recarada la pagina,
el usuario hace click en el boton ACTUALIZAR del navegador y la consulta
SQL se vuelve a ejecutar. Por lo tanto... sale un error porque no puede
ingresar dos veces el mismo registro, lo cual está bien (ya que uno de los
campos del formulario sirve como clave primaria de una tabla).




Mi pregunta: Cómo puedo hacer para que al recargar la página, por más que
el usuario haga click en el botón ACTUALIZAR del navegador, no se vuelva a
ejecutar el POST que estaba cargado?? Se entiende??


Respuesta de Jorge Molina
Pon una página intermedia que haga el proceso y que reenvié a la página final. De esta forma al actualizar el usuario solo recargara la página que le dice que todo se hizo correctamente.




La pagina intermedia debe redireccionar mediante un header a la pagina de "envío correcto" o de "error" según corresponda. Para este redireccionamiento deberías usar un header del tipo:


header("Location:paginaok.php");




Y recordar que en esta pagina no se debe imprimir nada solo redireccionar a la página con contenido.

Complementar la respuestaComplementar la respuesta
Volver al árbol de categoríasVolver al árbol de categorías

Comentarios
Fueron enviados 11 comentarios a la faq
11 comentarios revisados:
Por: Santiago Balaguer
06/9/06
Más facil!! Crea una variable de formulario hidden en el formulario original con el valor: salvar. Luego, cuando envies el formulario, comprueba que esta variable sea igual a esto, si lo es inserta los datos en la BD, cambiale al valor vacio.
Por: Roberto
06/9/06
ACTUALMENTE, ME PASA ALGO SIMILAR, YO LO HAGO ASI,
AUNQUE ESTE EN ASP ESTO ESPERO QUE TE DE UNA IDEA DE COMO HACERLO EN DONDE NECESITES

1.- LA PAGINA ESTA DIVIDIDA EN DOS PARTES CON Y SIN FORM

if request.form="" then
Muestro Formulario
else
Inserto en la base de datos
Muestro Mensaje OK
Vinculo al Inicio
end if

ASI TE AHORRAS HACER DOS PAGINAS


2.-ASIGNALE UN IDENTIFICADOR A LA BASE DE DATOS COMO UNA CLAVE, Y VALIDA SI ESTA ANTES DE INGRESAR. TE ESCRIBO EL SQL, ASI EN MUCHO SEUDO CODIGO

select clave from mi tabla

SI ESTA VACIO ESTE RECORDSET, LO AGREGAS

insert into mi_tabla (dato1,dato2, etc..)

SI EXISTE MANDA UN MENSAJE EN LA HOJA PARTE DEL FORM

"Esta informacion ya ha sido capturada"

AUNQUE TAMBIEN YA VALIDANDO SI EXISTE, PODRIAS ACTUALIZARLO

update mi tabla set columna_1 = dato_nuevo where clave = Clave

TODO JUNTO SERIA

if request.form="" then
Muestro Formulario
Else

Set rs = select clave from mi tabla
if not rs
Inserto en la base de datos
insert into mi_tabla (dato1,dato2, etc..)
Muestro Mensaje OK
Then
"Esta informacion ya ha sido capturada"
end if
Vinculo al Inicio
end if
if request.form="" then
Muestro Formulario
Else

Set rs = select clave from mi tabla
if not rs
Inserto en la base de datos
insert into mi_tabla (dato1,dato2, etc..)
Muestro Mensaje OK
Then
Actualizo
update mi tabla set columna_1 = dato_nuevo where clave = Clave
Muestro mensaje “Actualizado”
end if
Vinculo al Inicio
end if



ESPERO HABERME EXPLICADO :)
SI NO NO DUDES EN ESCRIBIR
Por: mario
06/9/06
Bueno si tienes un campo llave entu Base de datos lo que puedes hacer es preguntar a la Base de datos si existe este registro i no existe que Inserte y si existe pues no inserta con If then else arreglas lo del mensaje de error de la Base de datos ya lo demas es pura logica
Por: Jorge Molina
07/9/06
Aunque estoy de acuerdo en que las tres opciones presentadas son buenas creo que la más practica es la primera debido a que al recargar no aparecerá el mensaje de "Desea reenviar la información" y lo que es más importante se prevendrá que el usuario presione en "No" ante este mensaje con lo que saldría una pagina en blanco y el usuario quedaría "colgado" en esta pagina si no sabe usar los botones "Atras" y "Adelante".
Por: Marcelo
07/9/06
Hola!

Otra solución sería que no tengas un botón tipo submit sino uno tipo button. Este último debe llevar OnClick con una función JS que haga submit al formulario.

Ejemplo:
<html>
..
function enviar() {
document.forms[0].submit();
};

<body>
..
<input name="Bot_GRABAR" type="button" value="Grabar" onClick="enviar();">
..
</body>
</html>

Ojalá te sirva... desde hace tiempo que no hago páginas web.
Por: Wolfgang Wagner
08/9/06
Yo suelo utilizar un campo del tipo "hidden" que me controla eso. Y cuando ejecuto sobre la misma pagina el ingreso de los datos del formulario chequeo el parametro utilizado en el "hidden" si coincide el valor o no. Asi evito que el usuario al pulsar el boton "actualizar" del navegador el programa vuelva a introducir los datos. Aparte de usar otros controles como por ejemplo verificar si el campo email ya se encuentra registrado o no. Asi no tengo necesidad de usar una pagina secundaria. Ah! y por supuesto inicializo el valor del dato usado en el campo "hidden" ;)
Por: camilo
16/10/06
si la clave principal yaexiste
1. Ejecutas la instruccion select * from tabla;
2.La recorres y incrementas el contador en el while
3.
si el contador es igual a cero haces el insert sino le dices que hay un error
Por: Andrés Pepinosa
10/11/06
Mira genera una variable $mivariable como campo Hidden que lleva la cuenta de la ejecución de la inserción, cuando esa cuenta se superior no ejecuta el query... pasas <input type='Hidden' name='cuenta' value=0> ademas de una variable que se evalue para ejecutar la acción que tú quieres.
//Evaluas
$cuenta++;
if($cuenta>1 && $opcion='Ejecutar')
{echo "Error<br>";
}
else
{$consulta=pg_query([conexion],[sql a ejecutar]);
//esto para el cado de postgres
}

Espero te sirva
Por: jonas fut
01/1/07
Tuve el mismo problema, y como estoy empezando no me quedó muy claro qué tan "elegante" podía ser. El mismo problema se me presentó en el caso del libro de visita (taller) de dllo web.

Tambien el mismo problema se presenta en el caso de envio de email sobre la web.

Lo solucioné haciendo una consulta a base datos. Si el registro ( al actualizar) es el igual al anterior...o alguno de los campos ( como "comentario" por ejemplo) era identico al anterior, no graba por segunda vez
Por: Luis Caceres
04/3/08
Como el formulario se llama a si mismo, la idea es validar que el registro no exista y luego grabar. Ahora, si existe, puedes enviar un alert mediante javascript avisando que se está tratando de ingresar nuevamente la información
Por: Javier
25/3/08
muy facil, en la programacion verifica si el registro se guarda, una ves echo eso con un control if por ejemplo envia un valor para que no pueda volver a hacerlo, ocultando el boton o desabilitandolo.

Volver al árbol de categoríasVolver al árbol de categorías
Alojados en el grupo