Foros del Web » Programando para Internet » PHP »

Consulta 2 tablas

Estas en el tema de Consulta 2 tablas en el foro de PHP en Foros del Web. Buenas foreros , a ver si podeis hecharme una mano , que seguro que es fácil de hacer y así aprendo como se hace, os ...
  #1 (permalink)  
Antiguo 15/08/2014, 20:12
 
Fecha de Ingreso: agosto-2014
Mensajes: 13
Antigüedad: 5 años, 6 meses
Puntos: 0
Consulta 2 tablas

Buenas foreros , a ver si podeis hecharme una mano , que seguro que es fácil de hacer y así aprendo como se hace, os cuento:

Tengo 2 tablas sin relacionar , la primera seria algo asi:


tabla 1 - contactos



Código HTML:
Ver original
  1. +----------+-------------+
  2. | usuario  | contacto    |
  3. +----------+-------------+
  4. | Daniel   | Paco        |
  5. | Daniel   | Maria       |
  6. | Daniel   | Cheks       |
  7. | Paco     | Maria       |
  8. | Paco     | Daniel      |
  9. | Cheks    | Maria       |
  10. | Cheks    | Daniel      |
  11. +----------+-------------+

tabla 2- gente_online

Código HTML:
Ver original
  1. +------------------+------------------------+---------------+
  2. |       date       |           ip           |   nombre      |
  3. +------------------+------------------------+---------------+
  4. | 1408148434       |         xx.xxx.xxx     |    cheks      |
  5. +------------------+------------------------+---------------+
  6. | 1408148534       |       xxx.xxx.x.xx     |     paco      |
  7. +------------------+------------------------+---------------+
Necesito hacer una consulta para mostrar los contactos de un usuario que a la vez estan conectados en la segunda tabla (vease que en una se llama contacto y en la otra nombre , no se si esto será un problema), como veis se bastante poco de mysql :( , podria ser un INNER JOIN o algo asi deduzco ,pero no se como hacerlo
De la primera tabla consigo obtener perfectamente los contactos de un determinado usuario pero a partir de hay no se como mostrar solo los que este online (segunda tabla)

Muchisimas gracias adelantadas amigos

estoy probando algo asi pero me parece que no hay por donde cogerlo xDD, no?

Código MySQL:
Ver original
  1. SELECT gente_online.nombre
  2. FROM gente_online INNER JOIN contactos ON gente_online.nombre = contactos.contacto
  3. WHERE contactos.usuario =%s", GetSQLValueString($colname_amigosonline, "int")

Cita:
Editado: Código de programación no permitido en foros de Bases de Datos.
Leer las normas del foro, por favor.

Última edición por gnzsoloyo; 19/08/2014 a las 12:17
  #2 (permalink)  
Antiguo 19/08/2014, 11:12
 
Fecha de Ingreso: agosto-2014
Mensajes: 10
Antigüedad: 5 años, 6 meses
Puntos: 2
Respuesta: Consulta 2 tablas

¿En qué te basas para saber si los amigos están online?
  #3 (permalink)  
Antiguo 02/09/2014, 04:06
 
Fecha de Ingreso: agosto-2014
Mensajes: 13
Antigüedad: 5 años, 6 meses
Puntos: 0
Respuesta: Consulta 2 tablas

Perdona por la tardanza , he seguido intentandolo pero nada, no lo consigo
Para saber quien esta conectado utilizo esto:

Código PHP:
Ver original
  1. $name="anónimo";
  2.  
  3. //Si ha iniciado sesión , grabamos su nombre de usuario
  4. if (isset($_SESSION['MM_Username1'])) {
  5. $name = $_SESSION['MM_Username1'];
  6.     }
  7.  
  8. // Tiempo máximo de espera
  9. $time = 5 ;
  10.  
  11. // Momento que entra en línea
  12. $date = time() ;
  13.  
  14. // Recuperamos su IP
  15. $ip = $_SERVER['REMOTE_ADDR'];
  16.  
  17. // Tiempo Limite de espera
  18. $limite = $date-$time*60 ;
  19.  
  20. // si se supera el tiempo limite (5 minutos) lo borramos
  21. mysql_query("delete from gente_online where date < $limite") ;
  22.  
  23. // tomamos todos los usuarios en linea
  24. $resp = mysql_query("select * from gente_online where ip='$ip'") ;
  25.  
  26. // Si son los mismo actualizamos la tabla gente_online
  27. if(mysql_num_rows($resp) != 0) {
  28. mysql_query("update gente_online set date='$date' where ip='$ip'") ;
  29. }
  30.  
  31. // de lo contrario insertamos los nuevos
  32. else {
  33. mysql_query("insert into gente_online (date,ip,nombre) values ('$date','$ip','$name')") ;
  34. }
  35.  
  36. // Seleccionamos toda la tabla
  37. $query = "SELECT * FROM gente_online";
  38.  
  39. // Ocultamos algún mensaje de error con @
  40. $resp = @mysql_query($query) or die(mysql_error());
  41.  
  42. // almacenamos la consulta en la variable $usuarios
  43. $usuarios = mysql_num_rows($resp);
  44.  
  45. // Si hay 1 usuarios se muestra en singular; si hay más de uno, en plural
  46. if($usuarios > 1 || $usuarios == 0){echo("Hay ");}else{echo("Hay ");}if($usuarios == 0){echo("no ");}else{echo($usuarios." ");}if($usuarios > 1 || $usuarios == 0){echo("usuarios");}else{echo("usuario");}
  #4 (permalink)  
Antiguo 02/09/2014, 06:23
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.323
Antigüedad: 12 años, 2 meses
Puntos: 2654
Respuesta: Consulta 2 tablas

@jotacheca: Evidentemente no has entendido que en los foros de Bases de DAtos (incluyendo el de MySQL), no se permite postear códigos de programación. Las explicaciones del caso están en el link que te pasé anteriormente.
Basandome en eso y en una de esas normas, procedo a mover tu post al Foro de PHP para evitar tener que borrar nuevamente el código no SQL, y evitar de esa forma que tu planteo pierda sentido (sin el PHP, no se entenderían tus problemas).

Ahora bien, hay al menos un error conceptual referido al uso de SQL embebido en PHP, y otro sobre el uso de ciertas variables de entorno de PHP...

Empecemos por esto:

Código PHP:
Ver original
  1. $limite = $date-$time*60 ;
  2.  
  3. // si se supera el tiempo limite (5 minutos) lo borramos
  4. mysql_query("delete from gente_online where date < $limite") ;
Según esa parte de tu script, tu estás suponiendo que MySQL entiende e interpreta las variables de PHP, y eso NO es así.
Siendo $límite una variable propia de PHP, su tipo de dato Date jamás le llega a MySQL. Lo que le llega es una cadena de texto con el formato que tendría en la conversión de PHP, que no necesariamente respeta el estandar MySQL de "AAAA-MM-DD HH:MM:SS", y que el DBMS espera.
Si yo hago correr esto en PHP 5.5.5, por ejemplo:
Código PHP:
Ver original
  1. // Tiempo máximo de espera
  2. $time = 5 ;
  3.  
  4. // Momento que entra en línea
  5. $date = time() ;
  6.  
  7. // Tiempo Limite de espera
  8. $limite = $date-$time*60 ;
  9.  
  10. echo $limite;
Lo que obtengo como resultado es esto:
Cita:
delete from gente_online where date < 1409656380
Como puedes apreciar, eso NO es una fecha... Pero ES lo que MySQL recibe.

¿Se entiende?

La idea central es que al crear la query debes respetar las reglas de sintaxis de MySQL, así como los formatos de sus datos.
Para resolver eso debes usar la función date() con parametros, y además poner el valor entre apóstrofos:
Código PHP:
Ver original
  1. echo "delete from gente_online where date < '".date("Y-m-d H:i:s",$limite)."'";
Eso devolverá:
Código SQL:
Ver original
  1. DELETE FROM gente_online WHERE DATE < '2014-09-02 04:18:55'
que es sintacticamente correcto.

Conceptualmente, el segundo error es que estás creyendo que $_SERVER['REMOTE_ADDR'] te devuelve la IP propia de un usuario, y eso sólo te devolverá la IP pública desde donde accede, que puede estar compartida por muchísimos usuarios más. En otras palabras, te puede dar resultados erróneos.
la discusión de identificar por IP un usuario es vieja, hay muchos posts en el foro de PHP referidos a eso (consulta con el busador), y luego de tratarlo largamente se puede decir que NO, no es posible usar eso como identificador unívoco absolutamente válido por una serie de limitaciones y restricciones largas de explicar.
Una de las razones del caso es que esa variable podrá contener la IP local de la subred, pero eso sería una dirección privada, que bien podría replicarse en diferentes servidores (ver temas de redes privadas y rango de direcciones en Wikipedia); además, es posible que si la PC está detrás de un proxy, tampoco recibas una dirección correcta.
En algunos foros proponen usar cosas como:
Código PHP:
Ver original
  1. if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARTDED_FOR'] != '') {
  2.     $ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
  3. } else {
  4.     $ip_address = $_SERVER['REMOTE_ADDR'];
  5. }
para resolver la ruta de IPs y determinar mejor las identidades. En ese sentido se entiende que no necesitarás solamente la IP privada, sino además la pública para determinar la identidad del usuario, lo que complica todo.
Siempre seguirá siendo mejor usar la combinación username+password para que se identifique... Y eventualmente el ID de la sesión que genera. Pero esa IP sola no sirve de forma segura.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 02/09/2014 a las 06:35
  #5 (permalink)  
Antiguo 03/09/2014, 15:30
 
Fecha de Ingreso: agosto-2014
Mensajes: 13
Antigüedad: 5 años, 6 meses
Puntos: 0
Respuesta: Consulta 2 tablas

gnzsoloyo gracias por tu interes, me gustaría responderte a unas cuantas cosas:

En primer lugar creo que claramente es una pregunta de Bases de Datos , pues en un principio el planteamiento solo consta de eso , vease mi primer mensaje... si alguien que muy amablemente decide ayudarme me pide cierta parte del código usado en PHP lo posteo y no necesariamente por eso ha cambiado el tema central de mi duda y si por no entender te refieres a no haberme leido todas las normas del foro estoy de acuerdo contigo, pues no veo por ningun lado ese link del que hablas.

Respecto al tema date() / time() le dare una vuelta.

Lo de la ip es algo que ya sabía pero gracias igualmente.

Gracias, pero creo que mi pregunta no esta enfocada con php, al menos directamente.

Última edición por jotacheca; 03/09/2014 a las 15:41
  #6 (permalink)  
Antiguo 03/09/2014, 15:44
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.323
Antigüedad: 12 años, 2 meses
Puntos: 2654
Respuesta: Consulta 2 tablas

Cita:
no veo por ningun lado ese link del que hablas
¿Ves en este otro bloque la parte resltada en naranja?
Cita:
Editado: Código de programación no permitido en foros de Bases de Datos.
Leer las normas del foro, por favor.
Bueno, eso es un link.
haz un click alli y lee lo que dice.

Más allá de eso, el problema de la query sigue siendo la forma de construcción en PHP, ya que el SQL está sintacticamente bien en el resto de la misma. Ergo, es tema de cómo construir el dato en PHP.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: join, mysql, sql, tabla, tablas
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 08:15.