Foros del Web » Programando para Internet » PHP »

Evitar reenvío de formulario

Estas en el tema de Evitar reenvío de formulario en el foro de PHP en Foros del Web. Hola, El título lo dice todo, de que forma se puede evitar desde php que un usuario que rellena un formulario HTML, lo envíe y ...
  #1 (permalink)  
Antiguo 09/10/2010, 07:45
 
Fecha de Ingreso: diciembre-2009
Mensajes: 186
Antigüedad: 14 años, 5 meses
Puntos: 5
Evitar reenvío de formulario

Hola,

El título lo dice todo, de que forma se puede evitar desde php que un usuario que rellena un formulario HTML, lo envíe y al actualizar la página con F5 por ejemplo, en PHP se detecte que es el mismo formulario y no guarde los datos.
  #2 (permalink)  
Antiguo 09/10/2010, 07:48
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 14 años, 9 meses
Puntos: 150
Respuesta: Evitar reenvío de formulario

Una forma facil es que donde tengas el codigo que procesa el formulario y lo guarda en la base de datos hagas inmediatamente un:

header("location:pagina.php?mensaje=tal");exit();

De modo que en pagina.php tengas una parte que compruebe si $mensaje=="tal" y muestre el mensaje de "Los datos del formulario se han guardado correctamente". El usuario podra hacer F5 pero se cargara esa pagina con el mensaje, no el formulario.
  #3 (permalink)  
Antiguo 09/10/2010, 08:03
 
Fecha de Ingreso: diciembre-2009
Mensajes: 186
Antigüedad: 14 años, 5 meses
Puntos: 5
Respuesta: Evitar reenvío de formulario

Gracias por responder Vun.

Pero no es esactamente lo que busco, te explico.
Tengo un formulario HTML, una vez enviado tiene que cargar otra vez la misma página.
Si los datos se guardaron, con el formulario en blanco y si no se guardaron, porque alguno de los datos introducidos es erroneo, tiene que rellenar el formulario con los datos pasados por el usuario. (para que no tenga que rellenar otra vez todos los campos).

El problema es que si actualiza la página vuelve a crear otro registro en la base de datos con la misma información (repetido).
  #4 (permalink)  
Antiguo 09/10/2010, 09:37
Avatar de dreamconception  
Fecha de Ingreso: octubre-2010
Ubicación: Mexico-Dinamarca
Mensajes: 22
Antigüedad: 13 años, 6 meses
Puntos: 2
Respuesta: Evitar reenvío de formulario

Para prevenir abuso y errores del usuario, puedes tratar de utilizar PHP sessions.

Creo algo como esto;
Código PHP:
Ver original
  1.  
  2. if(!isset($_SESSION['last_email_sent']) OR $_SESSION['last_email_sent']==null OR $_SESSION['last_email_sent']<time()){
  3. //Let's send mail
  4. set_session("last_email_sent",time()+60*5); // 5 minutes timeout
  5. }else{
  6. //Mail has been send within 5 minutes
  7. }
  #5 (permalink)  
Antiguo 09/10/2010, 09:41
Avatar de dreamconception  
Fecha de Ingreso: octubre-2010
Ubicación: Mexico-Dinamarca
Mensajes: 22
Antigüedad: 13 años, 6 meses
Puntos: 2
Respuesta: Evitar reenvío de formulario

Ah, tu utilizes la base de datos! Es mejor detectar si el correo existe como un duplicado en el sistema (y el correo no ha caducado 5 minutos). Tal vez usuarios desactivar cookies y es no posibilidad utilizar sessions.
  #6 (permalink)  
Antiguo 10/10/2010, 09:33
 
Fecha de Ingreso: diciembre-2009
Mensajes: 186
Antigüedad: 14 años, 5 meses
Puntos: 5
Respuesta: Evitar reenvío de formulario

hola,

gracias por responder dreamconception.

No se si entendí muy bien lo que quieres decir.
En el primero me dices que espere un tiempo hasta que permita volver a enviar un formulario.
Y en el segundo que compruebe en la base de datos si hay un registro igual al que voy a guardar.

La primera solución no puedo aplicarla porque se supone que los usuarios pueden enviar más de un formulario (eso si, con distinta información) sin tener que esperar un tiempo determinado entre envío y envío.
La segunda opción tampoco puedo porque los usuarios pueden crear entradas iguales una a otras (repetidas), pero lo que no quiero es que introduzcan la misma entrada una y otra vez solo con pulsar F5.

Y ya de paso también me gustaría saber si sería recomendable poner un máximo de formularios que cada usuario puede enviar, a la hora, día, etc.

Gracias.
  #7 (permalink)  
Antiguo 10/10/2010, 17:32
Avatar de dreamconception  
Fecha de Ingreso: octubre-2010
Ubicación: Mexico-Dinamarca
Mensajes: 22
Antigüedad: 13 años, 6 meses
Puntos: 2
Respuesta: Evitar reenvío de formulario

Lo siento para mi falta de español.

La segunda (y también la primera) es bien si verificar IP y hora de otra entrada con un demora. Yo pienso un demora de cinco minutos dará una protección suficiente.

Un otra propuesta es utilizar un token un tu URL o POST values, como http://www.something.com/post.php?token=dsa3ff o $_POST['token'].

Registres el token un tu base de datos o en un session value, y verificas si el token es valido o no. Es no bien para protección de abuso más fuerte, pero es suficiente para protección de F5.

Espero que me hice clara y esto le puede ayudar!!
  #8 (permalink)  
Antiguo 10/10/2010, 17:36
 
Fecha de Ingreso: abril-2010
Ubicación: Argentina
Mensajes: 57
Antigüedad: 14 años
Puntos: 1
Respuesta: Evitar reenvío de formulario

Yo creo que la mejor forma es teniendo un CAPTCHA. Es fácil, tenes CAPTCHA's ya hechos como recaptcha.net
  #9 (permalink)  
Antiguo 10/10/2010, 17:43
Avatar de dreamconception  
Fecha de Ingreso: octubre-2010
Ubicación: Mexico-Dinamarca
Mensajes: 22
Antigüedad: 13 años, 6 meses
Puntos: 2
Respuesta: Evitar reenvío de formulario

Recaptcha es muy bien, y lo recomiendo, pero en este caso la problema es en un función actual, y él sólo necesité evitar F5 reload.
  #10 (permalink)  
Antiguo 12/10/2010, 06:33
 
Fecha de Ingreso: diciembre-2009
Mensajes: 186
Antigüedad: 14 años, 5 meses
Puntos: 5
Respuesta: Evitar reenvío de formulario

Hola,

La solución captcha ya la tengo implementada, pero en el formulario de registro. Yo lo quiero para los formularios a los que se accede una vez registrado, y no se, me parece un poco pesado para los usuarios tener que estar introduciendo el captcha cada vez que quieran escribir un comentario.
En cuando a lo del token creo que no es suficiente, porque se supone que se puede registrar cualquiera y ese metodo es muy facil de saltar.

Etiquetas: formulario
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:59.