Foros del Web » Programando para Internet » PHP »

No refrescar (F5) página para evitar hacer un query 2 veces

Estas en el tema de No refrescar (F5) página para evitar hacer un query 2 veces en el foro de PHP en Foros del Web. Hola que tal, Bueno para hacer el cuento corto: Tengo un form en html que manda los datos a guardar.php, este guardar.php tiene código PHP ...
  #1 (permalink)  
Antiguo 17/04/2006, 01:49
Avatar de CHILENOCES  
Fecha de Ingreso: octubre-2001
Ubicación: Mmm paseando por la vida
Mensajes: 491
Antigüedad: 22 años, 6 meses
Puntos: 0
No refrescar (F5) página para evitar hacer un query 2 veces

Hola que tal,
Bueno para hacer el cuento corto:

Tengo un form en html que manda los datos a guardar.php, este guardar.php tiene código PHP que hace un INSERT INTO bla blabla...

Al llegar a guardar.php todo bien se insertan los datos en la BD y ningun problema.

Mi único problema es que al llegar a guardar.php si yo actualizo la pagina o presiono el botón F5 o algo que recargue la página, los datos que venian en el $_POST se vuelven a insertar en la base de datos.

Existe alguna forma de evitar que eso ocurra??? o de desactivar el actualizar la página no sé algo debe existir para no recargar la página y volver a hacer el query...

Saludos y gracias.
__________________
ChilenoCesar Looking for something new...
  #2 (permalink)  
Antiguo 17/04/2006, 01:49
Avatar de CHILENOCES  
Fecha de Ingreso: octubre-2001
Ubicación: Mmm paseando por la vida
Mensajes: 491
Antigüedad: 22 años, 6 meses
Puntos: 0
Hola que tal,
Bueno para hacer el cuento corto:

Tengo un form en html que manda los datos a guardar.php, este guardar.php tiene código PHP que hace un INSERT INTO bla blabla...

Al llegar a guardar.php todo bien se insertan los datos en la BD y ningun problema.

Mi único problema es que al llegar a guardar.php si yo actualizo la pagina o presiono el botón F5 o algo que recargue la página, los datos que venian en el $_POST se vuelven a insertar en la base de datos.

Existe alguna forma de evitar que eso ocurra??? o de desactivar el actualizar la página no sé algo debe existir para no recargar la página y volver a hacer el query...

Saludos y gracias.
__________________
ChilenoCesar Looking for something new...
  #3 (permalink)  
Antiguo 17/04/2006, 04:06
Avatar de JorgitoAlfajor  
Fecha de Ingreso: enero-2006
Mensajes: 152
Antigüedad: 18 años, 3 meses
Puntos: 1
Lo que deberías hacer es modificar tu guardar.php para que sólo guarde los datos y luego redireccione a otra página, generalmente una que diga que los datos han sido guardados exitosamente. De esta forma, desde el browser nunca va a ser posible recargar la página guardar.php. Seria algo asi:

Código PHP:
<?
//Recuperas los datos del form y conectas con la base de datos
if (mysql_query("INSERT .....")) {
  
header("Location: exito.php"); 
  }
else {
  
header("Location: error.php");
  }
?>
Nos vemos.
__________________
¿Se me entiende la letra?
  #4 (permalink)  
Antiguo 17/04/2006, 04:27
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 19 años, 4 meses
Puntos: 1
Hay otra forma.

Métele a cada formulario un número único de identificación. Cuando insertes los datos, también inserta el número de identificación de tu formulario. Este campo está oculto con un

<input type="hidden" name="num_form" value="1259di39l3p845yu">

De esa forma, antes de insertar los datos verifica que esta información no haya sido ya ingresada anteriormente. Si notas que el número es el mismo, entonces ignora la petición de insertar.

Esta técnica es útil sobre todo porque hay veces en que un usuario hace click varias veces en el botón de enviar y así se evita insertar varias veces la misma información.

Genera tus números de formulario aleatoriamente, yo uso una cadena de 16 caracteres alfanuméricos aleatorios y lo hago con la siguiente función. Hasta pronto y suerte !

Código PHP:
  function randomkey($length)
      {
        
$pattern "1234567890abcdefghijklmnopqrstuvwxyz";

        for(
$i=0;$i<$length;$i++)
            
$key .= $pattern{rand(0,35)};

       return 
$key;
      } 
__________________
"Di no al Internet Explorer" -Proverbio Chino-
  #5 (permalink)  
Antiguo 17/04/2006, 10:26
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por uamistad
Hay otra forma.

Métele a cada formulario un número único de identificación. Cuando insertes los datos, también inserta el número de identificación de tu formulario. Este campo está oculto con un

<input type="hidden" name="num_form" value="1259di39l3p845yu">

De esa forma, antes de insertar los datos verifica que esta información no haya sido ya ingresada anteriormente. Si notas que el número es el mismo, entonces ignora la petición de insertar.

Esta técnica es útil sobre todo porque hay veces en que un usuario hace click varias veces en el botón de enviar y así se evita insertar varias veces la misma información.

Genera tus números de formulario aleatoriamente, yo uso una cadena de 16 caracteres alfanuméricos aleatorios y lo hago con la siguiente función. Hasta pronto y suerte !

Código PHP:
  function randomkey($length)
      {
        
$pattern "1234567890abcdefghijklmnopqrstuvwxyz";

        for(
$i=0;$i<$length;$i++)
            
$key .= $pattern{rand(0,35)};

       return 
$key;
      } 
En resumen si quieres usar esa técnica para validar tu dato .. no es necesario que te bases en un "ID" generado aleatóriamente .. muchas veces el dato a ingresar siempre hay un campo que para nuestra aplicación es "único" o así debe serlo: un "nick" .. un "nombre" .. un "rut,dni ..etc" .. un "n° de contrato" .. basate en ese dato verificando antes de ingresar (hacer tu "INSERT" ) que exista ese dato en tu BBDD y validalo con ese dato.

Así por lo menos no consumes un dato extra en toooooodos los registros de tus tablas implicadas ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #6 (permalink)  
Antiguo 17/04/2006, 10:30
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 19 años, 4 meses
Puntos: 1
Es cierto man, pero si un usuario está en un foro no hay forma de saberlo. El seudónimo es único, el email también, pero al ser un foro en donde un usuario puede insertar varios mensajes, el único que me dice que no está repetido el mensaje es un ID realmente único.
__________________
"Di no al Internet Explorer" -Proverbio Chino-
  #7 (permalink)  
Antiguo 17/04/2006, 10:41
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 19 años, 4 meses
Puntos: 1
Aunque podría estar la forma de comparar si lo que se va a insertar es igual a lo que ya está en el campo que sí varía, por ejemplo en el mensaje y evitaría usar esa cadena en todos los mensajes.

Aunque ya viendo mi aplicación personal, también uso ese dato para enviarle al usuario una URL del estilo:

dominio.com/altas.php?action=activar&clave=jlk34j23l4jl4jlj3

Tiene doble función. =) Cuando el usuario está loggeado, no le mando nada. Cuando no, le solicito que active su mensaje después de que ya ha gastado su tiempo en dedicar una opinión.

Mi foro es algo diferente a otros como este. Ahí no necesitas registrarte, aquí sería algo molesto hacerlo, porque hay personas que opinamos mucho aquí, pero en otro tipo de foros, en donde ver un link que dice Registrate gratis hace que el usuario evite poner un mensaje por la molestia que registro representa, lo manejo mejor así.
__________________
"Di no al Internet Explorer" -Proverbio Chino-
  #8 (permalink)  
Antiguo 17/04/2006, 10:51
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por uamistad
Es cierto man, pero si un usuario está en un foro no hay forma de saberlo. El seudónimo es único, el email también, pero al ser un foro en donde un usuario puede insertar varios mensajes, el único que me dice que no está repetido el mensaje es un ID realmente único.
Ok, por eso decía "muchas veces el dato a ingresar siempre hay un campo que para nuestra aplicación es "único""

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #9 (permalink)  
Antiguo 17/04/2006, 10:53
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Aunque ya viendo mi aplicación personal, también uso ese dato para enviarle al usuario una URL del estilo:

dominio.com/altas.php?action=activar&clave=jlk34j23l4jl4jlj3
Si, .. ese es el uso típico para validar una dirección de e-mail por ejemplo ... En esos casos está totalmente justificado dicha técnica.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #10 (permalink)  
Antiguo 17/04/2006, 11:00
Avatar de asinox  
Fecha de Ingreso: enero-2002
Ubicación: Santo Domingo
Mensajes: 2.712
Antigüedad: 22 años, 2 meses
Puntos: 6
bueno a mi me gusta leer los post de los que en verdad son avanzados en esto... se aprende a lot... yo por lo general utilizo la redireccion.

Saludos
__________________
www.dataautos.com
  #11 (permalink)  
Antiguo 17/04/2006, 11:37
Avatar de CHILENOCES  
Fecha de Ingreso: octubre-2001
Ubicación: Mmm paseando por la vida
Mensajes: 491
Antigüedad: 22 años, 6 meses
Puntos: 0
Cluster viejo tanto tiempo, bueno pues te cuento que estoy haciendo un sistema de anuncios clasificados y bueno de ahi mi pregunta, tengo mas que claro que hacer un header ref blA haria q no carguen la pàgina otra vez pero si somos mas rebuscados nos damos cuenta que si hacen click en el boton stop del navegador podrian parar justo antes que los redireccione y reenviar mil veces los datos, de ahi que empecé a pensar como hacerlo distinto.

Bueno uAmistad agradezco mucho tu respuesta y a ti viejo tambien, espero que chile aun te guste jejeje saludos y muchas gracias.
les comento cualquier avance
__________________
ChilenoCesar Looking for something new...
  #12 (permalink)  
Antiguo 17/04/2006, 12:07
Avatar de JorgitoAlfajor  
Fecha de Ingreso: enero-2006
Mensajes: 152
Antigüedad: 18 años, 3 meses
Puntos: 1
Cita:
Iniciado por CHILENOCES
tengo mas que claro que hacer un header ref blA haria q no carguen la pàgina otra vez pero si somos mas rebuscados nos damos cuenta que si hacen click en el boton stop del navegador podrian parar justo antes que los redireccione y reenviar mil veces los datos, de ahi que empecé a pensar como hacerlo distinto.
A mi modesto entender eso no es posible, ya que desde el navegador no se puede recargar una página que nunca llega a él, dado que sólo contine código del lado del servidor y finaliza con una redirección.

Saludos.
__________________
¿Se me entiende la letra?
  #13 (permalink)  
Antiguo 17/04/2006, 15:22
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por CHILENOCES
Cluster viejo tanto tiempo, bueno pues te cuento que estoy haciendo un sistema de anuncios clasificados y bueno de ahi mi pregunta, tengo mas que claro que hacer un header ref blA haria q no carguen la pàgina otra vez pero si somos mas rebuscados nos damos cuenta que si hacen click en el boton stop del navegador podrian parar justo antes que los redireccione y reenviar mil veces los datos, de ahi que empecé a pensar como hacerlo distinto.

Bueno uAmistad agradezco mucho tu respuesta y a ti viejo tambien, espero que chile aun te guste jejeje saludos y muchas gracias.
les comento cualquier avance
El detalle está que al redireccionar por cabeceras HTTP .. antes de que tu navegador empiece a procesar algo y por ende ese "algo" que pueda procesar lo puedas parar con el "stop" de tu navegador .. las cabeceras HTTP ya se procesaron y se le indicó al navegador que cambie la página por otra (a la que redireccionas) .. Sin embargo si en lugar de redireccionar por cabeceras HTTP (header()) lo haces por ejemplo con javascript .. ahí te doy toda la razón. Lo mejor de todo esto es que hagas tus pruebas.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #14 (permalink)  
Antiguo 17/04/2006, 16:07
Avatar de xyyy7  
Fecha de Ingreso: enero-2004
Ubicación: Maracay.-
Mensajes: 637
Antigüedad: 20 años, 2 meses
Puntos: 5
Cita:
Iniciado por JorgitoAlfajor
Lo que deberías hacer es modificar tu guardar.php para que sólo guarde los datos y luego redireccione a otra página, generalmente una que diga que los datos han sido guardados exitosamente. De esta forma, desde el browser nunca va a ser posible recargar la página guardar.php. Seria algo asi:

Código PHP:
<?
//Recuperas los datos del form y conectas con la base de datos
if (mysql_query("INSERT .....")) {
  
header("Location: exito.php"); 
  }
else {
  
header("Location: error.php");
  }
?>
Nos vemos.
Este arreglo sugerido por JorgitoAlfajor ...ES MUY VALIDO Y EFECTIVO...

Intentalo asi...

Saludos.-
__________________
Maracay Edo Aragua - Venezuela :
Mi Favorita :
http://www.MySQL.Com
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 18:10.