Foros del Web » Programando para Internet » PHP »

Evitar qeu se envie

Estas en el tema de Evitar qeu se envie en el foro de PHP en Foros del Web. tengo un problema. sucede que mediante un formulario, mis usuarios pueden agregar cosas a una base de datos... en ocasiones parece ser que se carga ...
  #1 (permalink)  
Antiguo 27/02/2005, 16:07
Avatar de mafima  
Fecha de Ingreso: abril-2003
Ubicación: Medellin-Colombia
Mensajes: 1.109
Antigüedad: 14 años, 8 meses
Puntos: 24
Evitar qeu se envie

tengo un problema.
sucede que mediante un formulario, mis usuarios pueden agregar cosas a una base de datos... en ocasiones parece ser que se carga mucho despues de que hacen click en enviar en procesar el contenido del FORM, entonces ellos vuelven y presionan el boton, dando como resultado la insercion de esos datos, dos veces...
cual es la mejor alternativa para solucionar?
__________________
SEO en Medellin
  #2 (permalink)  
Antiguo 27/02/2005, 16:23
 
Fecha de Ingreso: marzo-2002
Mensajes: 85
Antigüedad: 15 años, 8 meses
Puntos: 1
Que tal... para evitar eso... puede ser que lo evites desde el diseño de tu base de datos....

yo lo que hago para evitar eso, es realizar una consulta a la base de datos, verificando que no exista la tupla que se va a insertar.... si existe, es que ya la inserto anteriormente, o que le presiono f5 al explorador, o algo asi.... y le mando un mensaje diciendole que ya existen esos datos...
no se si sea la mejor forma, pero a mi me ha servido bastante bien...
Ojala te sirva
  #3 (permalink)  
Antiguo 27/02/2005, 17:30
 
Fecha de Ingreso: diciembre-2003
Ubicación: Salamanca
Mensajes: 123
Antigüedad: 14 años
Puntos: 2
Mi sistema es más sencillo: una vez enviados los datos abandono el formulario recargando la página, por ejemplo mostrando un mensaje de 'datos guardados, gracias' o algo así.
  #4 (permalink)  
Antiguo 27/02/2005, 20:08
Avatar de mafima  
Fecha de Ingreso: abril-2003
Ubicación: Medellin-Colombia
Mensajes: 1.109
Antigüedad: 14 años, 8 meses
Puntos: 24
respuesta

La primer solucion que me han dado, no es viable por lo siguiente:
POr cuestiones de manejo interno, los datos si se pueden repetir, es decir, que un usuario si puede insertar 1000 veces los mismos datos.

COn respecto al procedimiento que me recomendaste pedroinfante yo te recomiendo que no lo hagas asi, es decir en ves de realizar la consulta, cosa que retarda tu tiempo de carga de la pagina ademas de que envia mas ping de los necesarios a la BD te aconcejos que hagas lo mismo pero con manejo de errores, es decir colocale a esos campos que no quieres que se repitan la caracteristica UNIQUE la que consideres necesaria, luego si intentan insertar un dato ya existente, devolvera un error el cual puedes tratar.

Con respecto a la segunda solución, explicate mas,, pues lo que normalmete uno hace es que procesa la pagina en una parte diferente a donde tiene el formulario, pues mi problema es que el milisegundo que tarda en pasar de la pagina del formulario a la pagina que lo procesa, el user, parece ser que da de nuevo click en el boton haciendo que se guarden dos veces los mismos datos
__________________
SEO en Medellin
  #5 (permalink)  
Antiguo 27/02/2005, 21:03
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Supongo que podrías manejarlo desde JavaScript.
Al presionar sobre el botón "submit", podrías además de enviar el formulario, descativar dicho botón. De esa manera sólo responderá al primer clic y no al resto.
Pregunta en el foro de JavaScript.

Saludos
  #6 (permalink)  
Antiguo 28/02/2005, 02:28
 
Fecha de Ingreso: diciembre-2003
Ubicación: Salamanca
Mensajes: 123
Antigüedad: 14 años
Puntos: 2
Claro, no entendí bien el problema.
Como ha dicho jpinedo la solución sería deactivar el boton mediante javascript. En lugar de un 'submit' colocas un botón que llame a una función para enviarlo y desactive el boton... o a dos funciones, una para cada cosa... el caso es deshabilitar el botón.
Suerte
dobeto
  #7 (permalink)  
Antiguo 04/03/2005, 07:15
Avatar de xyyy7  
Fecha de Ingreso: enero-2004
Ubicación: Maracay.-
Mensajes: 637
Antigüedad: 13 años, 10 meses
Puntos: 5
Cita:
sobre el botón "submit", podrías además de enviar el formulario, descativar dicho botón. De esa manera sólo responderá al primer clic y no al resto.
.... hEY ESTE COMENTARIO ..SOBRE LA UTILIZACION DEL JAVA SCRIPT ES MUY EFICIENTE, TE LO SUGIERO.... TAMABIEN

...ahora bien SERIA MAS PROFECIONAL HACIENDOLO SI SALIR DE PHP : creo que si ponemos en tu escript php una sentencia y condicional sql en donde en el valor de dicho campo el igual al valor de ese mismo campo de tu ultimo registro ... SIMPLENTE DETENGA LA ACCION!!! ..y muestre un mensaje x (echo "ya esta agregado"; por decir algo,

.. LO MALO ES QUE TENGO LA IDEA pero no e como hacer...

haber quien echa una ayudadita!?
__________________
Maracay Edo Aragua - Venezuela :
Mi Favorita :
http://www.MySQL.Com
  #8 (permalink)  
Antiguo 04/03/2005, 11:53
Avatar de mafima  
Fecha de Ingreso: abril-2003
Ubicación: Medellin-Colombia
Mensajes: 1.109
Antigüedad: 14 años, 8 meses
Puntos: 24
lo malo esd que crearia acumulacion

Esto seria beu o pero asis e crearia una acumulacion de procesos, es decir la respuesta no esta muy lejos de no permitir que se agreguen dos registros, se podria hacer quizas con cookies, pero se dejaria por fuera a los usuarios que no las tengan hailitadas....

no se creo que lo de deshabilitar el boton esta mejor... diganme que piensan.
__________________
SEO en Medellin
  #9 (permalink)  
Antiguo 04/03/2005, 12:05
Avatar de xyyy7  
Fecha de Ingreso: enero-2004
Ubicación: Maracay.-
Mensajes: 637
Antigüedad: 13 años, 10 meses
Puntos: 5
Cita:
$sql="SELECT Count(*) As Total FROM tutabla WHERE correo='$correo'";
$res=mysql_query($sql,$ptrdb);
$existe=mysql_result($res,0);

if($existe>0)
//ejecutar funciones AQUI!
else{
// Detener o dar un error AQUI!
}
...este codigo podria ser de utilidad... solo farta que alguno mas experto en la materia...

lo pueda hacer funcional para que solo funcione con el ultimo registro recibido... ..ENTONCES CUANDO UN USUARIO INTENTE DAR MUCHOS CLICK ..PASARIA QUE YA EL PRIMERO ENVIO Y REGISTRO, Y LOS SIGUIENTES CLICK ARROJARIAN EL ERROR YA QUE SE ESTA COLOCANDO UN POST IDENTICO AL ULTIMO ENVIADO POR EL MISMO...



QUIEN ECHA UNA MANITO AQUI!?

INSITO, seria mucho mejor no salir del PHP.- ..Pero bueno el JAVASCRIPT TAMBIEN esta muy bueno... ...PERO EN MI OPINION QUEMARIAS PRIMERAS LAS OPSIONES CON PHP
__________________
Maracay Edo Aragua - Venezuela :
Mi Favorita :
http://www.MySQL.Com
  #10 (permalink)  
Antiguo 07/03/2005, 12:57
Avatar de chechun  
Fecha de Ingreso: diciembre-2001
Ubicación: Córdoba - Capital - Alber
Mensajes: 348
Antigüedad: 16 años
Puntos: 0
El tema es el siguiente... yo ando buscando algo parecido, porque no solamente puede suceder eso, sino que hay veces que una misma persona lo publica a proposito dandole varias veces clicks, lo que quiero es que tenga un time out digamos que quede... desabilitado el boton por varios segundos... tambien pense que se puede hacer a traves del numero de ip, que no pueda escribir ese ip por un dia por ejemplo... o por tanto tiempo... nadie tiene soluci0n..?

Saludos
  #11 (permalink)  
Antiguo 07/03/2005, 13:09
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
mafima... otra cosa que podrías hacer es tener una variable de sesión que capture el time() del último envío y sólo permites un envío cada 10 segundos (o lo que quieras).
Código PHP:
session_start();
if(isset(
$_SESSION['ultimo_envio']) && (time()-$_SESSION['ultimo_envio'])<10 ){
    
// "error!: Deben pasar al menos 10 segundos para poder enviar... etc"
}else{
   
// Realizar la inserción del registro
   //...
   //...
   // y al final:
   
$_SESSION['ultimo_envio'] = time();

Saludos
  #12 (permalink)  
Antiguo 07/03/2005, 13:11
Avatar de chechun  
Fecha de Ingreso: diciembre-2001
Ubicación: Córdoba - Capital - Alber
Mensajes: 348
Antigüedad: 16 años
Puntos: 0
a eso me estaba refieriendo, pero.... para que eso funcione, no hay que estar logueado..? o no influye..?

Y por favor... como hago para insertar ese codigo, donde pongo eso..?

en el comienso de la pagina..?

Última edición por chechun; 07/03/2005 a las 13:14
  #13 (permalink)  
Antiguo 07/03/2005, 13:19
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
No... no tienes que estr logueado...
Ese código sería la estructura del script que inserta el registro en la BD... o sea, el archivo que pones en el atributo "action" del formulario.
Saludos
  #14 (permalink)  
Antiguo 07/03/2005, 13:23
Avatar de chechun  
Fecha de Ingreso: diciembre-2001
Ubicación: Córdoba - Capital - Alber
Mensajes: 348
Antigüedad: 16 años
Puntos: 0
jajaja, ya lo se... me refiero que en que hubicacion dentro de la pagina:
por ejemplo: la variable esa que pones $_SESSION['ultimo_envio' que es lo que lleva... de donde sale..?

la verdad es que no le estoy entendiendo bien al codigo este...
  #15 (permalink)  
Antiguo 07/03/2005, 13:32
 
Fecha de Ingreso: marzo-2005
Mensajes: 12
Antigüedad: 12 años, 9 meses
Puntos: 0
No usar javaScript para validaciones

yo no lo recomiendo por que no es apto ya pueden haber maquinas donde el javacript este desactivado entonces al gran php nadie se la charla.

Yo te recomiendo desplegar tus registros con normalidad pero poniendo a acada uno un imput o lo que quieras donde pongan el numero de veces que quiere ese registro el usuario, si el caso es editar especificas cuales estan en el sistema y con que cantidades para que el usuario pueda modificarlas.

Una vez hecho esto te vas a otra pagina donde insertaras tus registros (no sin antes borrar todos los anteriores para no tener problemas) que ha seleccionado o modificado el usuario con las cantidades especificadas por cada item.

te recomiendo utilizar checkbox he imputs, nombrandolas con un contador

Y VUELVES A INSERTAR DE NUEVO LOS REGISTROS

Ejemplo

<input name="check_<?=$contador?>" type="checkbox" id="check_<?=$contador?>" value="<?=$fila['idItem']?>" >

asi podras saber con la funcion isset($_POST['check_'.$contador]) si existe es que fue checkeado entonces lo insertas el numero de veces que tengas en tu imput de cantidades para los item.

Nota: el imput de cantidades tambien tiene que tener la mismas caracteristicas que el checkbox



Ing. Charles Andia Deromedis
Jefe de Sistemas
Bzdesigners
  #16 (permalink)  
Antiguo 07/03/2005, 13:34
Avatar de chechun  
Fecha de Ingreso: diciembre-2001
Ubicación: Córdoba - Capital - Alber
Mensajes: 348
Antigüedad: 16 años
Puntos: 0
la verdad es que ahora si estoy realmente mariado..! gracias
  #17 (permalink)  
Antiguo 07/03/2005, 15:06
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Yo tampoco le entendí mucho a Deromedis.
Cita:
Iniciado por chechun
jajaja, ya lo se... me refiero que en que hubicacion dentro de la pagina:
por ejemplo: la variable esa que pones $_SESSION['ultimo_envio' que es lo que lleva... de donde sale..?
la verdad es que no le estoy entendiendo bien al codigo este...
Si no conoces las variables de seión, será mejor que leas algo antes. En las FAQ's de este foro puedes ver alguna explicación. Revisa también el manual oficial.

Saludos
  #18 (permalink)  
Antiguo 08/03/2005, 07:49
Avatar de chechun  
Fecha de Ingreso: diciembre-2001
Ubicación: Córdoba - Capital - Alber
Mensajes: 348
Antigüedad: 16 años
Puntos: 0
la verdad es que estoy leyendo las faqs y aun asi no entiendo como se hace..!

Bueno, lo dejare asi nomas..! Espero que alguien no me arte con los mesj guardados..! saludos
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 13:20.