Foros del Web » Programando para Internet » PHP »

Mostrar datos de tablas relacionadas con PHP

Estas en el tema de Mostrar datos de tablas relacionadas con PHP en el foro de PHP en Foros del Web. Buenos días. Seguramente mi consulta es de principiante, aunque no he encontrado ningún post que me pueda ayudar. La duda es bastante sencilla: Tengo varias ...
  #1 (permalink)  
Antiguo 21/05/2014, 06:04
 
Fecha de Ingreso: agosto-2013
Mensajes: 7
Antigüedad: 11 años, 3 meses
Puntos: 0
Mostrar datos de tablas relacionadas con PHP

Buenos días.
Seguramente mi consulta es de principiante, aunque no he encontrado ningún post que me pueda ayudar.
La duda es bastante sencilla: Tengo varias tablas relacionadas entre sí en una base de datos. En un momento dado necesito hacer una consulta compleja sobre varias tablas para mostrar algo similar a esto:
<codigoHTML>
USUARIO#1
<codigoHTML>
Producto#1
<codigoHTML>
Item#1
<codigoHTML>
Item#2
<codigoHTML>
Producto#2
<codigoHTML>
Item#3
<codigoHTML>
USUARIO#2
<codigoHTML>
Producto#3
<codigoHTML>
Item#4
<codigoHTML>
Producto#4
<codigoHTML>

La consulta en cuestión es algo así:
Código:
SELECT Usuarios.usuario, Productos.producto, Items.item
FROM Usuarios INNER JOIN
   Productos ON Usuarios.codUsuario = Productos.codUsuario INNER JOIN
   Items ON Productos.codProducto = Items.codProducto;
Sé que el EJEMPLO no es exactamente así porque no tiene mucho sentido; la cuestión es que si diéramos ese código por válido al recoger los resultados de esa consulta no sabría darle ese formato:
Código:
while ($datos = mysql_fetch_array($resultado)){
//la primera pasada me devolvería un Array('USUARIO#1','Producto#1','Item#1')
//la segunda pasada me devolvería un Array('USUARIO#1','Producto#1','Item#2')
//la tercera pasada Array('USUARIO#1','Producto#2','Item#3')
}
Y el problema es que es demasiado complicado para meter el código HTML entre cada lectura de un registro comparando cada pasada con la anterior para saber si ese nuevo registro se encuentra en el mismo USUARIO o es un USUARIO nuevo, o si se trata del mismo PRODUCTO o es un PRODUCTO nuevo, etc...
Se me ocurre crear un array multidimensional y rellenarlo con TODOS los datos de la BD y después mediante bucles for o foreach ir escribiendo el código HTML (esa es la opción fácil, pero larga).
Pido si hay alguna otra manera en PHP que desconozca y pueda tratar los datos directamente de la base de datos.

GRACIAS!!!!
  #2 (permalink)  
Antiguo 21/05/2014, 06:29
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Mostrar datos de tablas relacionadas con PHP

Te estas enredando..... por que no aprendes un framework ? todos implmentan MVC que resuelve el problema de mezclar HTML con consultas y el resto de la logica, ademas proveen casi todos un ORM para hacer las consultas y relaciones de forma facil e intuitiva :)
__________________
Salu2!
  #3 (permalink)  
Antiguo 21/05/2014, 07:55
 
Fecha de Ingreso: agosto-2013
Mensajes: 7
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Mostrar datos de tablas relacionadas con PHP

Gracias por la respuesta Italico76
No obstante, voy a tardar más en aprender un framework para php que en programar yo mismo la solución, sobre todo una cosilla tan "simple" como las consultas que uso en la web.
Lo preguntaba simplemente por si hubiera alguna forma más "sencilla y limpia" que no pasara por tener que volcar todos los datos a un Array multidimensional para luego trabajar con él.

Un saludo.
  #4 (permalink)  
Antiguo 21/05/2014, 08:03
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Mostrar datos de tablas relacionadas con PHP

Código SQL:
Ver original
  1. SELECT Usuarios.usuario, Productos.producto, Items.item
  2. FROM Usuarios INNER JOIN
  3.    Productos ON Usuarios.codUsuario = Productos.codUsuario INNER JOIN
  4.    Items ON Productos.codProducto = Items.codProducto;

Eso te devuelve un arreglo de "filas" que a su vez pueden ser objetos u otros arrays con los campos (columnas). Eso siempre es asi al menos con la vieja extension 'mysql' hasta para la consulta mas simple.

Con 'MySQLi' tu recibes un objeto resultado al que le puedes solicitar te devuelva objetos registro o bien un arreglo asociativo o no-asociativo con los campos.

Código PHP:
Ver original
  1. <?php
  2. /*
  3.     Ejemplo de uso de mysqli
  4.     100% POO -valido desde php 5.4-
  5.     @author: italico76
  6.  
  7. */
  8. $mysqli = @new mysqli('localhost', 'root', 'tu pass', 'tu db');
  9.  
  10. if ($mysqli->connect_errno)
  11.     die('Connect Error: ' . $mysqli->connect_errno);
  12.  
  13. $query = "SELECT * FROM tu_tabla";
  14.  
  15. if ($result = $mysqli->query($query)) {
  16.  
  17.     var_dump($result); // es un objeto
  18.  
  19.     /* obtener array asociativo */
  20.     while ($row = $result->fetch_assoc()) {
  21.         printf ("%s (%s)\n", $row["nomrbe_campo"], $row["otro_campo"]);
  22.     }
  23.  
  24.     /* liberar el resultset */
  25.     $result->free();
  26. }
  27.  
  28. /* cerrar la conexión */
  29. $mysqli->close();

Puedes obtener objetos-registros como te decia cambiando muy poco, ejemplo:

Código PHP:
Ver original
  1. /* o como... objetos */
  2. while ($row = $result->fetch_object()) {
  3.         printf ("%s (%s)\n", $row->post_title, $row->post_date);
  4. }

O... si quieres no ves un array mas... mira este ejemplo que te hice: :)

Código PHP:
Ver original
  1. <?php
  2. $mysqli = @new mysqli('localhost', 'root', 'xxxxxxxxxx', 'xxxxx');
  3.  
  4. if ($mysqli->connect_errno)
  5.     die('Connect Error: ' . $mysqli->connect_errno);
  6.  
  7. $query = "SELECT * FROM wp_posts";
  8.  
  9. if ($result = $mysqli->query($query)) {
  10.  
  11.     foreach ($result as $row)
  12.     {
  13.         $row = (object) $row;      
  14.         printf ("%s (%s)\n", $row->post_title, $row->post_date);
  15.     }
  16.  
  17.     /* liberar el resultset */
  18.     $result->free();
  19. }
  20.  
  21. /* cerrar la conexión */
  22. $mysqli->close();

Ojo funciona desde php 5.4 el ultimo ejemplo porque es desde cuando se implementa la interfaz Iterator en mysql_result object
__________________
Salu2!

Última edición por Italico76; 21/05/2014 a las 08:40
  #5 (permalink)  
Antiguo 21/05/2014, 13:19
 
Fecha de Ingreso: agosto-2013
Mensajes: 7
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Mostrar datos de tablas relacionadas con PHP

Gracias de nuevo!
No obstante, quizás no lo haya expresado bien.
Todo lo que me has puesto, son diferentes formas de visualizar los datos de una consulta (eso se hace sin complicación), incluso con mysqli_fetch_object también se pueden obtener el resultado en forma de objeto, pero con los array y sobre todo mysql_fetch_assoc me va bien...
Mi problema no es ese, sino imaginad que una base de datos.
Un USUARIO tiene varios pedidos.
Un PEDIDO tiene varios productos.
Un PRODUCTO tiene varias imagenes.

Si quiero saber el árbol de pedidos del usuario "pepe"
SQL:
Código:
select Usuarios.usuario, Pedidos.idPedido, Productos.producto
FROM Usuarios INNER JOIN
Pedidos ON Usuarios.codUsuario = Pedidos.codUsuario LEFT JOIN
//aquí debería haber otra tabla de por medio para una relación varios a varios INNER JOIN
Productos etc...etc...etc...
WHERE Usuarios.nombre = "pepe";
Mi problema es cómo puedo formatear ese resultado para obtener por pantalla el siguiente formato:

PEPE
Pedido 1
Producto 1
Producto 2
Producto 3
Producto 4
Pedido 2
Producto 1
Pedido 3
Producto 1
Producto 2
Producto 3
Producto 4
  #6 (permalink)  
Antiguo 21/05/2014, 13:31
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Mostrar datos de tablas relacionadas con PHP

Si dices que quieres "formatear en pantalla" .... revisa funciones o clases generadoras de tablas
__________________
Salu2!

Última edición por Italico76; 21/05/2014 a las 13:43
  #7 (permalink)  
Antiguo 21/05/2014, 14:20
 
Fecha de Ingreso: agosto-2013
Mensajes: 7
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Mostrar datos de tablas relacionadas con PHP

¿?¿? clases generadoras de tablas?
No necesito crear una tabla, lo que necesito es... (ya no sé cómo explicarme, no creo que sea tan complicado).
después de la consulta sql anterior...
Código:
while ($datos = mysqli_fetch_array($resultado)){
//primera pasada me devuelve Array(0,1,1)
//segunda pasada me devuelve Array(0,1,2)
//tercera pasada me devuelve Array(0,1,3)
//... Array (0,2,1)
//... Array (0,2,2)
}
Ahora con ese código, quiero darle el formato siguiente
Cita:
0
1
1
2
3
2
1
2
  #8 (permalink)  
Antiguo 21/05/2014, 14:33
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Mostrar datos de tablas relacionadas con PHP

Si es cuestion de FORMATO en PANTALLA... deberian mover el hilo a HTML o CSS ... aca te podemos aconsejar que uses algo para generar ese HTML .. revisar lo que tengs hecho... no se que mas quieres ?

Por cierto... tu estas colocando espacios para mostrar justamente eso..y la forma en que se hace es con <TABLE> <TR> <TD>...</TD> </TR> ... etc.. </TABLE>
__________________
Salu2!
  #9 (permalink)  
Antiguo 21/05/2014, 16:06
 
Fecha de Ingreso: agosto-2013
Mensajes: 7
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Mostrar datos de tablas relacionadas con PHP

Lamento que no se entienda entonces lo que quiero hacer. NO es el formato HTML el problema, sino saber, al leer cada registro de la consulta, si tiene que escribir un usuario, un producto o un ítem.
De la consulta sale fila a fila en arrays datos de 1 usuario 1 pedido 1 producto.
Y considero que es demasiado complicado, a la hora de escribir el registro, comprobar si se trata del mismo usuario (para no escribirlo), comprobar si se trata del mismo pedido (para escribirlo o no escribirlo), etc...
  #10 (permalink)  
Antiguo 21/05/2014, 16:18
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Mostrar datos de tablas relacionadas con PHP

Cita:
Iniciado por fonsoesp Ver Mensaje
L
De la consulta sale fila a fila en arrays datos de 1 usuario 1 pedido 1 producto.

Y considero que es demasiado complicado, a la hora de escribir el registro, comprobar si se trata del mismo usuario (para no escribirlo), comprobar si se trata del mismo pedido (para escribirlo o no escribirlo), etc...
Pero Ud no usa ORDER BY Usuarios.codUsuario entonces no puede quedarle ordenadito:

Si lo hiciera..... seria hacer un while() dentro del bucle que lee registros


Código PHP:
Ver original
  1. mientras (hay registros)
  2. {
  3.     $cod_usuario = $reg['cod_usuario'];
  4.    
  5.     mientras ($cod == $cod_usuario)
  6.     {
  7.         // lo que quieras
  8.         $cod_usuario = $reg['cod_usuario'];
  9.     }  
  10. }

Es un clasico con while()

--
Cabria OTRA posibilidad y es ordenar a posteriori con PHP y luego hacer el tema de la anidacion lo cual me parece mala idea por ser ineficiente y porque es complicar las cosas para nada
__________________
Salu2!

Última edición por Italico76; 21/05/2014 a las 16:53

Etiquetas: html, mysql, registro, relacionadas, select, tabla, tablas, usuarios
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:18.