Foros del Web » Programando para Internet » PHP »

Mal funcionamiento de While's anidados

Estas en el tema de Mal funcionamiento de While's anidados en el foro de PHP en Foros del Web. Bueno, os cuento, estoy haciendo una web en PHP + MySQL, y algun lenguaje mas, para el proyecto de final del ciclo formativo. La pagina ...
  #1 (permalink)  
Antiguo 04/06/2010, 10:33
Avatar de Lobito14  
Fecha de Ingreso: abril-2010
Mensajes: 222
Antigüedad: 14 años
Puntos: 17
Mal funcionamiento de While's anidados

Bueno, os cuento, estoy haciendo una web en PHP + MySQL, y algun lenguaje mas, para el proyecto de final del ciclo formativo.

La pagina seria algo asi como una especie de portal donde el usuario se registra, y una vez registrado, puede introducir informacion sobre autores de discos, nombres de discos, y canciones referentes a esos discos en si... para al final crear una gran base de datos con toda la informacion posible sobre Autores (cantantes) con sus discos y canciones dentro de cada disco... espero que se entienda mas o menos de que va la web.

Bien, una vez puestos en antecedentes, tengo un problema al mostrar los registros de la base de datos, por lo siguiente: yo muestro un autor, dentro de ese autor, se muestra el disco o DISCOS que tiene, y dentro de cada disco, las canciones relacionadas con ese disco. Pongo discos en mayuscula, porque ahi esta el problema. Cuando un autor posee mas de un disco, las canciones referentes no se muestran bien.

Podeis ver lo que digo en la web, que la tengo subida, la direccion seria: [URL="http://proyectointegrad.webcindario.com"]Esta[/URL], para no registraros, podeis entrar con user: lobo y pass: lobo, y en la pestañita de "Mostrar Datos", primero muestro todos los autores de la base de datos, despues los discos y despues las canciones (esto es como prueba para ver lo que hay dentro, terminare quitandolo) y despues abajo muestro lo que seria las relaciones, y ahi podeis ver, como el autor "Prueba Prueba" tiene dos discos, "Disco de prueba" y "Disco de prueba 2", pero como podeis ver, primero le asocia a los dos discos las canciones de uno, y despues los muestra otra vez, asociandole de nuevo a los dos discos las canciones del otro...

Ya no se donde puede estar el fallo, si en las consultas, en que no utilizo bien los while's uno dentro del otro o que...

Aqui les pongo el codigo de esa parte de la web, solo desde "Relaciones" hacia abajo, que es lo que interesa:

Código PHP:
Ver original
  1. $Consulta4= conexion("SELECT DISTINCT autores.id_autor, adc.id_disco, autores.nombre_autor, autores.apellidos_autor FROM autores INNER JOIN adc ON autores.id_autor = adc.id_autor");
  2.    
  3.     print("Relaciones");
  4.     echo "<br/>";
  5.     echo "<table width='auto' cellspacing='1' cellpadding='3' border='0'> ";
  6.  
  7. while($Fila4 = mysql_fetch_array($Consulta4)) { //Ciclo Repetitivo mientras no sea fin de Archivo
  8.  
  9.     echo "<tr>";
  10.     echo "<td align='left' font-weight: bold; bgcolor='#000000' colspan='3'><font color='#FFFFFF' face='arial, verdana, helvetica'> <u>Autor</u> </font></td>";
  11.     echo "</tr>";
  12.          
  13.     echo "<tr>";
  14.     echo "<td align='left' font-weight: bold; bgcolor='#D8D8D8'><font face='arial, verdana, helvetica'>  ".$Fila4["nombre_autor"]." " .$Fila4["apellidos_autor"]. "</font></td>";
  15.     echo "</tr>";
  16.    
  17.     echo "<tr>";
  18.     echo "<td>&nbsp;</td>";
  19.     echo "<td>&nbsp;</td>";
  20.     echo "<td>&nbsp;</td>";
  21.     echo "</tr>";  
  22.    
  23.    
  24.     $idAutor = $Fila4["id_autor"];
  25.    
  26.     $Consulta6 = conexion("SELECT DISTINCT nombre_disco FROM discos INNER JOIN adc ON discos.id_disco = adc.id_disco INNER JOIN autores ON autores.id_autor = adc.id_autor WHERE autores.id_autor = '$idAutor'");
  27.    
  28.     while($Fila6 = mysql_fetch_array($Consulta6)) {
  29.        
  30.         echo "<tr>";
  31.         echo "<td>&nbsp;</td>";
  32.         echo "<td align='left' font-weight: bold; bgcolor='#000000' colspan='2'><font color='#FFFFFF' face='arial, verdana, helvetica'> <u>Disco</u> </font></td>";
  33.         echo "</tr>";
  34.    
  35.         echo "<tr>";
  36.         echo "<td>&nbsp;</td>";  
  37.         echo "<td align='left' font-weight: bold; bgcolor='#D8D8D8'>".$Fila6["nombre_disco"]."</td>";
  38.         echo "<td>&nbsp;</td>";
  39.         echo "</tr>";
  40.    
  41.         echo "<tr>";
  42.         echo "<td>&nbsp;</td>";
  43.         echo "<td>&nbsp;</td>";
  44.         echo "<td>&nbsp;</td>";
  45.         echo "</tr>";
  46.  
  47.         echo "<tr>";
  48.         echo "<td>&nbsp;</td>";
  49.         echo "<td>&nbsp;</td>";
  50.         echo "<td align='left' font-weight: bold; bgcolor='#000000'><font color='#FFFFFF' face='arial, verdana, helvetica'> <u>Canciones</u> </font></td>";
  51.         echo "</tr>";
  52.    
  53.         $idDisco = $Fila4["id_disco"];
  54.         //print("<br>" .$idDisco. "<br>");
  55.         $Consulta5 = conexion("SELECT DISTINCT titulo_cancion, duracion FROM canciones INNER JOIN adc ON canciones.id_cancion = adc.id_cancion INNER JOIN discos ON discos.id_disco = adc.id_disco WHERE discos.id_disco = '$idDisco'");
  56.  
  57.         while($Fila5 = mysql_fetch_array($Consulta5)) {
  58.    
  59.             echo "<tr>";
  60.             echo "<td>&nbsp;</td>";  
  61.             echo "<td>&nbsp;</td>";
  62.             echo "<td align='left' font-weight: bold; bgcolor='#D8D8D8'>".$Fila5["titulo_cancion"]." - " .$Fila5["duracion"]. "</td>";
  63.             echo "</tr>";
  64.            
  65.    
  66.             $Contador5++;
  67.  
  68.         }
  69.        
  70.         $Contador6++;
  71.     }      
  72.    
  73.     $Contador4++;
  74. }  
  75.     echo "</table>";

Espero haberme explicado bien, y que alguien pueda intentar ayudarme, un saludo y gracias de antemano!! ;)

Última edición por Lobito14; 04/06/2010 a las 12:12
  #2 (permalink)  
Antiguo 04/06/2010, 10:37
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: Mal funcionamiento de While's aninados

como consejo.. intenta resumir tus problemas.. al igual que tu codigo..
no todos los que responden dudas tienen el tiempo para leer todo eso, y por lo tanto solo omiten tu pregunta

saludos!..
__________________
More about me...
~ @rhyudek1
~ Github
  #3 (permalink)  
Antiguo 04/06/2010, 10:42
Avatar de Lobito14  
Fecha de Ingreso: abril-2010
Mensajes: 222
Antigüedad: 14 años
Puntos: 17
Respuesta: Mal funcionamiento de While's aninados

Ok... es que creo que no se puede resumir mucho, o yo no se hacerlo, para ver como solucionarlo creo que hay que entender el sistema que tengo, aun asi.

RESUMEN: Tengo varios while's unos dentro de otros y no muestran bien los registros de la base de datos relacionados...

El codigo no puedo resumirlo, porque es el cacho de codigo en el cual puede estar el fallo, si quito codigo, puede que omita donde esta el fallo...

Gracias por tu ayuda.
  #4 (permalink)  
Antiguo 04/06/2010, 16:25
Avatar de _Ju
_Ju
 
Fecha de Ingreso: noviembre-2008
Ubicación: Colima, MX
Mensajes: 192
Antigüedad: 15 años, 5 meses
Puntos: 6
Respuesta: Mal funcionamiento de While's anidados

El problema esta aquí:

while($Fila4 = mysql_fetch_array($Consulta4))

Para acceder a los valores de esta forma es por medio del indice; osea;
$valor= $Fila4[0];
$valor= $Fila4[1];
etc..

Y tu lo haces por medio del nombre del campo. Si lo deseas así; intenta cambiarlo por esto:

while($Fila4 = mysql_fetch_assoc($Consulta4))

Saludos
__________________
www.grupogalco.net

Twitter: @jugalvez
  #5 (permalink)  
Antiguo 04/06/2010, 16:33
Avatar de Lobito14  
Fecha de Ingreso: abril-2010
Mensajes: 222
Antigüedad: 14 años
Puntos: 17
Respuesta: Mal funcionamiento de While's anidados

Cita:
Iniciado por _Ju Ver Mensaje
El problema esta aquí:

while($Fila4 = mysql_fetch_array($Consulta4))

Para acceder a los valores de esta forma es por medio del indice; osea;
$valor= $Fila4[0];
$valor= $Fila4[1];
etc..

Y tu lo haces por medio del nombre del campo. Si lo deseas así; intenta cambiarlo por esto:

while($Fila4 = mysql_fetch_assoc($Consulta4))

Saludos
Gracias por tu respuesta _Ju, eso deberia de cambiarlo en todos los while's?? o solo en el de $Fila4 - $Consulta4 ???

Thank!
  #6 (permalink)  
Antiguo 04/06/2010, 16:41
Avatar de Lobito14  
Fecha de Ingreso: abril-2010
Mensajes: 222
Antigüedad: 14 años
Puntos: 17
Respuesta: Mal funcionamiento de While's anidados

He cambiado eso que me comentas... pero la cosa sigue igual.

Para mi que no es un problema de mostrar los datos de la base de datos, porque mostrarlos, los muestra, lo que pasa que no lo hace como yo quiero.

Quizás esta mal la consulta...o algo en los while, es que no se por donde puede estar el fallo, ese es el problema.

Agradeceria un poco de luz en el asunto :(

Gracias :)
  #7 (permalink)  
Antiguo 05/06/2010, 13:51
Avatar de _Ju
_Ju
 
Fecha de Ingreso: noviembre-2008
Ubicación: Colima, MX
Mensajes: 192
Antigüedad: 15 años, 5 meses
Puntos: 6
Respuesta: Mal funcionamiento de While's anidados

Debes de cambiarlo en todos los While.

Usa el mysql_fetch_assoc para todo.

Saludos
__________________
www.grupogalco.net

Twitter: @jugalvez
  #8 (permalink)  
Antiguo 05/06/2010, 15:53
Avatar de Lobito14  
Fecha de Ingreso: abril-2010
Mensajes: 222
Antigüedad: 14 años
Puntos: 17
Respuesta: Mal funcionamiento de While's anidados

Gracias por tu respuesta tio, pero lo usé en todos, y nada, sigue sin salirme bien.

Como te dije, no creo que el problema sea ese, porque como puede verse en mi web, los datos, lo que es mostrarlos, los muestra, pero no de la forma que yo quiero...

A ver si alguien sabe como puedo hacerlo.

Gracias!
  #9 (permalink)  
Antiguo 05/06/2010, 16:32
Avatar de wiwi74  
Fecha de Ingreso: marzo-2008
Mensajes: 515
Antigüedad: 16 años, 1 mes
Puntos: 10
Respuesta: Mal funcionamiento de While's anidados

Revisa los inner join, estan bien?
Seria:
tabla INNER JOIN tabla

Y por ahi tienes:

....
discos.id_disco=adc.id_disco
INNER JOIN
autores
....

Aqui por ejemplo en ningun momento hace nada de eso:
(entre "empleado" y "departamanto"):
http://es.wikipedia.org/wiki/Join

...La verda que son un poquito complejas esas consultas, quiza alli este el problema.
  #10 (permalink)  
Antiguo 05/06/2010, 16:37
Avatar de Lobito14  
Fecha de Ingreso: abril-2010
Mensajes: 222
Antigüedad: 14 años
Puntos: 17
Respuesta: Mal funcionamiento de While's anidados

Claro, porque en ese ejemplo solo esta haciendo relacion entre dos tablas, en mis consultas tengo que relacionar mas de dos tablas.

Quizás el fallo este en alguna de esas consultas, pero como dices, son un poco complejas, y quizás tienen algun fallo que no me muestra las consultas bien... :(

Gracias por tu respuesta ;)
  #11 (permalink)  
Antiguo 05/06/2010, 17:03
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Mal funcionamiento de While's anidados

Hola
Y que ocurre si en la última consulta
agregas el id del autor?

probaste antes los querys directamente en la bd?
nos comentas
saludos
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #12 (permalink)  
Antiguo 05/06/2010, 17:08
Avatar de Lobito14  
Fecha de Ingreso: abril-2010
Mensajes: 222
Antigüedad: 14 años
Puntos: 17
Respuesta: Mal funcionamiento de While's anidados

Buenas mortiprogramador, gracias por tu respuestas.

Le he agregado la relacion con id_autor, en la ultima consulta, pero no cambia nada, sigue igual.

Voy a probar las consultas directamente en la base de datos y ya os cuento, thank ;)
  #13 (permalink)  
Antiguo 06/06/2010, 05:22
Avatar de Lobito14  
Fecha de Ingreso: abril-2010
Mensajes: 222
Antigüedad: 14 años
Puntos: 17
Respuesta: Mal funcionamiento de While's anidados

Puf, por fin!! Ya me sale bien!!

Estuve probando las consultas directamente en la base de datos, y me di cuenta que con la consulta para sacar los autores, como sacaba tambien los id de autor y de disco, pues se repetia una vez (por haber dos discos).

Entonces dividí esa consulta en tres, una para los nombres de autor, y las otras para las id´s, y ya me sale bien.

Gracias por la ayuda. ;)
  #14 (permalink)  
Antiguo 06/06/2010, 09:54
Avatar de wiwi74  
Fecha de Ingreso: marzo-2008
Mensajes: 515
Antigüedad: 16 años, 1 mes
Puntos: 10
Respuesta: Mal funcionamiento de While's anidados

Podrias armarte un catalogo asi:
te creas una db de prueba


Código PHP:


mysql_connect
("db","usr","pass");
$link=mysql_query("use DB;");


echo 
"<pre>";

//autores: id_autor,nombre_autor,apellidos_autor

mysql_query("DROP TABLE IF EXISTS autores;");

mysql_query("CREATE TABLE autores(
id_autor varchar(21) NOT NULL, 
nombre_autor varchar(21) NOT NULL,
apellidos_autor varchar(21) NOT NULL                    
);"
);



$r1=mysql_query("insert into autores(id_autor,nombre_autor,apellidos_autor) values
('1','Autor1','apellidoAutor1'),
('2','Autor2','apellidoAutor2'),
('3','Autor3','apellidoAutor3'),
('4','Autor4','apellidoAutor4');"
);

var_dump($r1);

//discos:     id_autor,id_disco_cancion,nombre_disco

mysql_query("DROP TABLE IF EXISTS discos;");
mysql_query("CREATE TABLE discos(
id_autor varchar(21) NOT NULL,
id_disco_cancion varchar(21) NOT NULL, 
nombre_disco varchar(21) NOT NULL
);"
);
//un mismo autor tiene varios discos
$r2=mysql_query("insert into discos (id_autor,id_disco_cancion,nombre_disco) values
('1','1','disco1'),
('1','2','disco2'),
('1','3','disco3'),
('2','4','disco1'),
('2','5','disco2'),
('2','6','disco3')                                                        
;"
);


var_dump($r2);                    


//////

//canciones:  id_disco_cancion,titulo_cancion,duracion

mysql_query("DROP TABLE IF EXISTS canciones;");
mysql_query("CREATE TABLE canciones(
id_disco_cancion varchar(21) NOT NULL, 
titulo_cancion varchar(21) NOT NULL,
duracion varchar(21) NOT NULL                    
);"
);

$r3=mysql_query("insert into canciones (id_disco_cancion,titulo_cancion,duracion) values
('1','tituloCancion1-1','duracion1-1'),
('1','tituloCancion1-2','duracion1-3'),
('1','tituloCancion1-3','duracion1-4'),

('2','tituloCancion2-1','duracion2-1'),
('2','tituloCancion2-2','duracion2-2'),

('3','tituloCancion3-1','duracion3-1'),
('3','tituloCancion3-2','duracion3-2'),
('3','tituloCancion3-3','duracion3-3'),

('4','tituloCancion4-1','duracion4-1'),
('4','tituloCancion4-2','duracion4-2')
;"
);

var_dump($r3);


echo 
"</pre>"
  #15 (permalink)  
Antiguo 06/06/2010, 09:56
Avatar de wiwi74  
Fecha de Ingreso: marzo-2008
Mensajes: 515
Antigüedad: 16 años, 1 mes
Puntos: 10
Respuesta: Mal funcionamiento de While's anidados

Luego la recorres con esto:


Código PHP:

mysql_connect
("db","user","pass");
mysql_query("use DB");

echo 
"<pre><table border='1' cellpadding='5'>";

$query_autores=mysql_query("select * from autores;");
//id_autor,nombre_autor,apellidos_autor
//echo "<tr bgcolor='#ff4444'><td>id_autor</td><td>nombre_autor</td><td>apellidos_autor</td></tr>";
echo "<tr bgcolor='#ff4444'><td>nombre_autor</td><td>apellidos_autor</td></tr>";

while(
$row_autores=mysql_fetch_array($query_autores)){
echo 
"<tr bgcolor='#DDEEFF'>";
//echo "<td>".$row_autores['id_autor']."</td>";
echo "<td>".$row_autores['nombre_autor']."</td>";
echo 
"<td>".$row_autores['apellidos_autor']."</td>";
echo 
"</tr>";



//mediante la id del autor ($row_autores['id_autor']) buscamos los discos
//discos:     id_autor,id_disco_cancion,nombre_disco
$query_discos=mysql_query("select * from discos where id_autor='".$row_autores['id_autor']."'");

while(
$row_discos=mysql_fetch_array($query_discos)){

echo 
"<tr bgcolor='#eeeeee'>";
//echo "<td>".$row_discos['id_autor']."</td>";
//echo "<td>".$row_discos['id_disco_cancion']."</td>";
echo "<td colspan='2' align='center'>".$row_discos['nombre_disco']."</td>";
echo 
"</tr>";

//tenemos id_disco_cancion ($row_discos['id_disco_cancion']) para recuperar las canciones del autor
//canciones:  id_disco_cancion,titulo_cancion,duracion
$query_canciones=mysql_query("select * from canciones where id_disco_cancion='".$row_discos['id_disco_cancion']."'");

while(
$row_canciones=mysql_fetch_array($query_canciones)){

echo 
"<tr>";
//echo "<td>".$row_canciones['id_disco_cancion']."</td>";
echo "<td>".$row_canciones['titulo_cancion']."</td>";
echo 
"<td>".$row_canciones['duracion']."</td>";
echo 
"</tr>";


//tercer while
//segundo while
//primer while

echo "</table></pre>";
?> 

Etiquetas: anidados, funcionamiento, mal
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 12:35.