Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Problema con consultas

Estas en el tema de Problema con consultas en el foro de Mysql en Foros del Web. Hola ando teniendo algunos problemas con consultas corridas desde un script en php. 1° PRIMER Y SEGUNDO PROBLEMA El primer problema que ocurrio fue porque ...
  #1 (permalink)  
Antiguo 17/11/2011, 08:56
 
Fecha de Ingreso: junio-2008
Mensajes: 26
Antigüedad: 15 años, 10 meses
Puntos: 0
Problema con consultas

Hola ando teniendo algunos problemas con consultas corridas desde un script en php.

1° PRIMER Y SEGUNDO PROBLEMA
El primer problema que ocurrio fue porque una consulta se corrio de alguna forma 2 veces y realiza una resta.

UPDATE clientes SET monto = monto - 2000 WHERE cliente_id = 1

El cliente contaba con 2000 de monto pero por algun motivo la consulta se corrio 2veces seguidas entonces desconto 4000 enviando el monto del cliente a 61555.

La tabla esta seteada para que sea unsigned. No entiendo porque en vez de dejar el valor en 0 se esta llendo a 61555.

2° SEGUNDO PROBLEMA
Ese es uno, despues como es posible que cuando alguien envia un form la consulta corra 2 veces? Y en tal caso como puedo evitarlo?

3° TERCER PROBLEMA
Estoy seguro que este problema se relaciona con los anteriores. Pero de todas formas les explico.

Tengo una consulta que corre siempre que encuentra un tiempo <= time() osea una fecha vieja, y entonces actualiza el valor en la cuenta del usuario y despues borra el registro.

Por ejemplo si tiene que guardar 2500, guarda eso y guarda por ejemplo 1500 extra también.

La consulta que actualiza seria algo asi.

SELECT monto FROM temp WHERE cliente_id = 1

(aca se procesa ese monto y se hacen calculos en PHP)

UPDATE clientes SET monto = monto + 2500 WHERE cliente_id = 1

DELETE FROM temp WHERE cliente_id = 1

Obviamente revise que el valor sea el correcto, pero algunas veces aleatoriamente guarda cualquier cosa. En vez de 2500 guarda 4000 por ejemplo, lo cual es rarisimo porque tal valor no existe.

Bueno por ahora eso.

Aclaro que uso como motor InnoDB. No se si servirá. Espero que alguien pueda ayudarme porque la verdad no se que hacer para solucionar esto.

Muchas gracias.
  #2 (permalink)  
Antiguo 17/11/2011, 09:37
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con consultas

Problema 1: Eso se denomina desborde. Es producto de que el almacenamiento de numeros no se hace como cifras,sino como números binarios. Al desbordar el binario se produce ese tipo de efectos.
Lo que está mal es definir una columna que va a contener valores monetarios como UNSIGNED. Eso no se debe hacer, proque un valor monetario puede volverse negativo, mientras que la cantidad de un stock o un ID, no.

Problema 2: Eso es un defecto de programación. Consulta en el foro de tu lenguaje.

Problema 3: La base de datos no comete "errores" de ese tipo. Si se está produciendo una inserción errónea es un problema de procesos, no de SQL. MySQL sólo insert alo que recibe, por lo que la pregunta es por qué está recibiendo eso en ese momento.
Habría que verificar con cuidado en qué circunstancias y con qué procesos programados en PHP se están dando, pero en el 99,99% de las veces, son bugs de programación. Deberías hacer un plan de pruebas para verificar paso a paso cómo van variando los valores de cada cosa, y que estos generen un log que puedas analizar.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 17/11/2011, 09:53
 
Fecha de Ingreso: junio-2008
Mensajes: 26
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Problema con consultas

Como evito el desbordamiento desde la base de datos? En caso de que entre un valor erróneo.
  #4 (permalink)  
Antiguo 17/11/2011, 10:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con consultas

Cita:
Iniciado por lucky8919 Ver Mensaje
Como evito el desbordamiento desde la base de datos? En caso de que entre un valor erróneo.
Eso no lo tienes que resolver en la base de datos. Lo que tienes que hacer (lo que hacemos todos los que programamos aplicaciones) es validar los datos antes de enviarlos a la base.
El tema es así: Antes de enviar un insert tienes que consultar a la base lo que hay y verificar que la inserción se pueda hacer. ¿Qué sentido tiene enviar algo que no cumple con lo que requiere el sistema?

Ten paciencia, tómate el tiempo necesario, y programa en tu aplicación las validaciones que correspondan. Ganaras en eficiencia en todos los sentidos.
Sé que es una tarea hartante. Pero todos las hacemos porque llegado el momento, nos ahorran enormes dolores de cabeza.

Nunca te olvides que siempre existe la posibilidad de que el usuario ponga tonterías. ¿Para qué vas a enviarlas a la base?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 17/11/2011, 10:47
 
Fecha de Ingreso: junio-2008
Mensajes: 26
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Problema con consultas

Te entiendo el problema es que los datos son internos. Es decir, una vez que se insertan ya esta (yo siempre verifico los datos insertados y están bien).

El usuario no mete mas mano. Después a partir de los datos insertados se corren varias consultas que procesan los datos cuando se dan ciertos eventos. Por ejemplo una fecha de vencimiento. Y es ahí cuando obtengo cosas raras. Muevo un valor de una tabla a otra y ponele que el valor que paso es 20 y termino teniendo 33 lo cual no tiene sentido, porque en el medio no hay suma de valores ni nada que procese el valor, es simplemente el paso de un valor de una tabla a otra.

Simplemente tomo el valor de la consulta y lo paso para actualizarlo en otra fila.

Y ahí comienzo a tener valores duplicados y cosas así.

No se si sera porque hay 2 usuarios que hacen una petición de la pagina al mismo tiempo. Yo creo que con InnoDB esas cosas no pasan no?
  #6 (permalink)  
Antiguo 17/11/2011, 10:52
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con consultas

Cita:
No se si sera porque hay 2 usuarios que hacen una petición de la pagina al mismo tiempo. Yo creo que con InnoDB esas cosas no pasan no?
Depende... ¿Estás declarando las transactions?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 17/11/2011, 10:56
 
Fecha de Ingreso: junio-2008
Mensajes: 26
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Problema con consultas

No simplemente puse el motor en innodb...

El script que debe recorrer es largo... entre la consulta de selección y la de actualización... quizás esta repitiendolo.
  #8 (permalink)  
Antiguo 17/11/2011, 11:10
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con consultas

Puede ser, pero ten en cuenta que las transacciones no operan si no las declaras. si tienes usuarios concurrentes puede estar pasando cualquier cosa.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 17/11/2011, 11:35
 
Fecha de Ingreso: junio-2008
Mensajes: 26
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Problema con consultas

Donde debería dar comienzo a la transacción y donde terminarla?

Te pregunto porque nunca use...

Etiquetas: php, select, tabla
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 01:50.