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

Bucle de consultas SQL

Estas en el tema de Bucle de consultas SQL en el foro de Mysql en Foros del Web. Bueno, soy Brudor, soy desarrollador en JavaME y web. Estoy desarrollando una aplicacion para BlackBerry de posicionamiento GPS, la cual va enviando las coordenadas a ...
  #1 (permalink)  
Antiguo 03/11/2009, 04:56
 
Fecha de Ingreso: noviembre-2009
Mensajes: 3
Antigüedad: 14 años, 5 meses
Puntos: 0
Bucle de consultas SQL

Bueno, soy Brudor, soy desarrollador en JavaME y web. Estoy desarrollando una aplicacion para BlackBerry de posicionamiento GPS, la cual va enviando las coordenadas a un servidor propio, que las almacena en una BD.

Hasta ahí todo bien.

En el servidor tengo una página web donde, a través de una cuenta personal, cada usuario puede visualizar los datos enviados por su/sus dispositivo/s en un mapa de Google.

Bueno, la cuestion es que una de las funciones consiste en mostrar la última localización de cada uno de los dispositivos asociados a tu cuenta, por lo que en primer lugar consultamos cuales son los dispositivos con :

Código PHP:
$consulta="SELECT * FROM ft_devices WHERE id_user = '$id_user'";
$devices exe_select($consulta,$conexion);
show_table($devices); 
donde $id_user viene de $_SESSION, exe_select es una función propia para hacer la consulta y devolverla al resource $devices y la funcion show_table($resultado) es una funcion propia que imprime una tabla y la cantidad de registros que hay en ella., de modo que el resultado sería:

ID KEY DEVICE_NAME ID_USER
1 1234 Dispositivo 1 1
2 abcd Dispositivo 2 1

Esto significa que el usuario con ID=1 tiene contratados dos dispositivos.

Ahora bien, como todos los datos de coordenadas, fecha y hora de todos los dispositivos están en la misma tabla, necesito hacer una consulta por cada uno de ellos para sacar la última posicion, con:

Código PHP:
while ($fila mysql_fetch_array($devices)){

echo 
$fila[2];
$query 'SELECT MAX(id),id_phone,lat,lon,date,time FROM ft_routes WHERE id_phone='.$fila[1];
$resultado=exe_select($query$conexion);
show_table($resultado);
    

donde $fila[1] corresponde a la KEY, el identificador del aparato en la tabla ft_routes.



Aquí es donde tengo el problema. Quiero ejecutar tantas consultas del tipo anterior como dispositivos haya, pero solo funciona la primera consulta del bucle. He probado haciendo un array de conexiones, pero no es posible. He probado haciendo un array de consultas y un array de resultados, pero siempre ocurre esto:

Código HTML:
Dispositivo 1
MAX(ID)	ID_PHONE	LAT	LON	DATE	TIME
107	1234	37.3583	-6.02793	2009-10-13	14:17:03

1 resultado.

Dispositivo 2

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\wamp\www\AI_ajax\funciones.php on line 78

Warning: mysql_num_fields() expects parameter 1 to be resource, boolean given in C:\wamp\www\AI_ajax\funciones.php on line 80

Warning: mysql_num_fields() expects parameter 1 to be resource, boolean given in C:\wamp\www\AI_ajax\funciones.php on line 103

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\wamp\www\AI_ajax\funciones.php on line 111

No hay resultados

¿Alguna idea?
  #2 (permalink)  
Antiguo 03/11/2009, 05:18
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, 4 meses
Puntos: 2658
Respuesta: Bucle de consultas SQL

Cita:
¿Alguna idea?
Si: Por un lado, el mensaje de error es de PHP y no de MySQL. Habitualmente es un problema del script PHP, lo que se escapa al alcance del Foro, ya que por reglas del mismo aquí no se pone código de programación, sea PHP o cualquier otro, s´lo SQL.

Pero cuando se analiza el mensaje parece estar diciendo que esperaba un parámetro tabla o respuesta de consulta, para ser un recurso de consulta, y está recibiendo un parámetro booleano. Eso implica que algo no está bien en la consulta, porque está saliendo como error no administrado.

Si observamos al segunda consulta, vemos que su sintaxis es:

Código sql:
Ver original
  1. SELECT
  2.    MAX(id),
  3.    id_phone,
  4.    lat,
  5.    lon,
  6.    DATE,
  7.    TIME
  8. FROM ft_routes
  9. WHERE id_phone='valorDeUnTelefono';
Este código tiene tres errores, dos de sintaxis y dos de uno de nombres:
Por un lado, cuando usas una función agrupada (MAX, MIN, AVG, COUNT, o la que sea), junto con otros valores que no lleven una, forzosamente debe ir una cláusula GROUP BY en base a uno o más campos.
En segundo lugar, estás usando DATE y TIME como nombres de campos, y esas son palabras reservadas, es decir, son denominaciones de funciones y tipos de dato, y pueden generar errores de ejecución en la consulta. O les pones otros nombres o los encierras entre acentos agudos (`) para que MySQL sepa que estás invocando nombres de campos.
__________________
¿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 03/11/2009, 05:27
 
Fecha de Ingreso: noviembre-2009
Mensajes: 3
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Bucle de consultas SQL

Muchas gracias gnzsoloyo por tu pronta respuesta.

REPLICO:

La primera consulta, pese a todos los errores de sintaxis que comentas, la hace correctamente, por lo que no creo que esté ahí el error.

Mi problema es que he de confeccionar un bucle de consulta/resultado sin machacar el resultado obtenido en la consulta anterior, pero ni con un array de resources consigo esto.

EDIT:

gnzsoloyo TE AMO MUCHO jejeje... cambié mi método: en vez de hacer una consulta para cada dispositivo, usé una consulta para todos a la vez:

Código PHP:
'SELECT MAX(id),id_phone,lat,lon,date,time FROM ft_routes GROUP BY id_phone' 

Última edición por Brudor; 03/11/2009 a las 05:31 Razón: Revisión del codigo
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 17:55.