Foros del Web » Programando para Internet » PHP »

Error de logica? Listar cd con canciones

Estas en el tema de Error de logica? Listar cd con canciones en el foro de PHP en Foros del Web. Hola como están ? Bueno , espero que puedan ayudar a este humilde joven jaja . Estoy creando un listado de CD y dentro de ...
  #1 (permalink)  
Antiguo 17/11/2011, 09:53
 
Fecha de Ingreso: agosto-2011
Mensajes: 161
Antigüedad: 12 años, 8 meses
Puntos: 7
Error de logica? Listar cd con canciones

Hola como están ?
Bueno , espero que puedan ayudar a este humilde joven jaja .
Estoy creando un listado de CD y dentro de cada CD sus respectivas canciones.
Un ciclo FOR para listar los CD y dentro de cada CD UN CICLO CON SUS CANCIONES.

Deberia quedar asi :

CD1
cancion 1 del cd1
cancion 2 del cd1
cancion 3 del cd1

CD2
cancion 1 del cs2
cancion 2 del cs2
cancion 3 del cs2 ... sucesivamente.

Eh aqui el error y me lanza esto :

CD1
cancion 1 del cd1
cancion 2 del cd1
cancion 3 del cd1

CD2
cancion 1 del cd1
cancion 2 del cd1
cancion 3 del cd1
cancion 1 del cs2
cancion 2 del cs2
cancion 3 del cs2 ... y asi pasa con el CD3 Y sucesivos.. donde en el 3 me pone las canciones del c1 cd2 y cd3.


Imagen del script.
http://www.subirimagenes.com/otros-listadocanciones-7146395.html

PD:
Los script de las request a mysql están en otro archivo en sus clases, .. estoy seguro de que lo que falla es un detalle del ciclo.
Muchas gracias.
  #2 (permalink)  
Antiguo 17/11/2011, 10:05
Avatar de linuxzero  
Fecha de Ingreso: noviembre-2011
Ubicación: Argentina
Mensajes: 778
Antigüedad: 12 años, 5 meses
Puntos: 160
Respuesta: Error de logica? Listar cd con canciones

Anda depurando el código, fijate de hacer esto para ver los datos de los discos que trae:
Código PHP:
Ver original
  1. print_r($discos);

Asi nos aseguramos que no este trayendo duplicados en los discos.

Porque en sí el código de la página no esta mal, me huele que el problema esta en
Código PHP:
Ver original
  1. $discografia->getDiscos();

o en:

Código PHP:
Ver original
  1. $discografia->getCanciones();

fijate si podes postear en código de estos 2 métodos.

Saludos!
__________________
Si todo fuera tan sencillo como un symfony cc la vida seria más fácil.
http://phpnico.wordpress.com
  #3 (permalink)  
Antiguo 17/11/2011, 20:09
 
Fecha de Ingreso: agosto-2011
Mensajes: 161
Antigüedad: 12 años, 8 meses
Puntos: 7
Respuesta: Error de logica? Listar cd con canciones

Gracias por la ayuda campeon,
eh aqui el script de obtener los discos:
http://www.subirimagenes.com/otros-discos-7149005.html

y aqui de obtener las canciones:
http://www.subirimagenes.com/otros-canciones-7149013.html
  #4 (permalink)  
Antiguo 18/11/2011, 04:47
Avatar de linuxzero  
Fecha de Ingreso: noviembre-2011
Ubicación: Argentina
Mensajes: 778
Antigüedad: 12 años, 5 meses
Puntos: 160
Respuesta: Error de logica? Listar cd con canciones

El código no parece tener nada malo, empeza depurando el codigo haciendo print_r() de los vectores a ver que te esta trayendo, haciendo eso vas a encontrar la solución facilmente.

Probalo y contame ;)
__________________
Si todo fuera tan sencillo como un symfony cc la vida seria más fácil.
http://phpnico.wordpress.com
  #5 (permalink)  
Antiguo 18/11/2011, 10:05
 
Fecha de Ingreso: agosto-2011
Mensajes: 161
Antigüedad: 12 años, 8 meses
Puntos: 7
Respuesta: Error de logica? Listar cd con canciones

lo probare :) gracias.
  #6 (permalink)  
Antiguo 18/11/2011, 10:07
Avatar de linuxzero  
Fecha de Ingreso: noviembre-2011
Ubicación: Argentina
Mensajes: 778
Antigüedad: 12 años, 5 meses
Puntos: 160
Respuesta: Error de logica? Listar cd con canciones

Cualquier cosa avisame ;)
__________________
Si todo fuera tan sencillo como un symfony cc la vida seria más fácil.
http://phpnico.wordpress.com
  #7 (permalink)  
Antiguo 18/11/2011, 18:44
 
Fecha de Ingreso: julio-2011
Mensajes: 220
Antigüedad: 12 años, 8 meses
Puntos: 72
Respuesta: Error de logica? Listar cd con canciones

Me parece que el problema es que el método get_canciones($id_disco) guarda el resultado de la consulta SQL en el array $canciones pero sin borrar los datos guardados en la consulta anterior. Esto es, en el bucle for se llama al método get_canciones() del objeto $discografia la primera vez este método guarda los nombres de las canciones del primer disco en $canciones y luego retorna su valor, en el segundo llamado guarda los nombres de las canciones del segundo disco pero sin eliminar los primeros guardados con lo que al retornar $canciones este array ahora contiene las canciones de los dos discos y en el tercer llamado contendra las canciones de los tres discos y asi sucesivamente.
Una forma de solución es poner $this->canciones= false; al principio del método get_canciones() asi siempre se eliminaria el contenido anterior de $canciones y se retornaria solo las canciones del disco actual.
Un saludo.
  #8 (permalink)  
Antiguo 19/11/2011, 07:45
 
Fecha de Ingreso: agosto-2011
Mensajes: 161
Antigüedad: 12 años, 8 meses
Puntos: 7
Respuesta: Error de logica? Listar cd con canciones

Gracias. problema resuelto.
era lo que me indicaste .. deje al principio del metodo, this->canciones=false;
ahora tengo la siguiente pregunta... por que pasa eso ?.
osea básicamente el metodo de canciones con los discos son los mismos.
...
por que en el de los discos no me guarda los registros anteriores, y en el de las caniones si ?

Te pasaste, muchas gracias.
  #9 (permalink)  
Antiguo 19/11/2011, 09:38
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: Error de logica? Listar cd con canciones

es muy sencillo, checando tu código estas guardando todas las canciones de todas las peticiones en una variable array, por lo tanto cada vez que haces una nueva petición se agregan las canciones a las peticiones anteriores

Código PHP:
Ver original
  1. class miclase {
  2.      private $canciones = array();
  3.  
  4.      public function getCanciones() {
  5.           //código SQL, etc...
  6.  
  7.           //lo que haces aquí es agregar un nuevo item al array
  8.           $this->canciones[] = $cancion;
  9.           //Por lo tanto si ya tienes por ejemplo 10 canciones cuando vuelvas a
  10.           //hacer otra petición la siguiente canción será el item 11 y así sucesivamente
  11.  
  12.           //En estos casos es mejor una variable local
  13.           //Así no importa las peticiones, siempre estará vacía la variable canciones
  14.           $canciones = array();
  15.           while($cancion = mysql_fetch_assoc($sq)) {
  16.                     $canciones[] = $cancion;
  17.           }
  18.  
  19.           return $canciones;
  20.      }
  21. }

ahora, no se porque "$this->canciones" la tienes como variable global (dentro de la clase), a menos que la uses en otro método no le veo sentido, en todo caso la variable debería ser local para no tener estos problemas

Cita:
por que en el de los discos no me guarda los registros anteriores, y en el de las caniones si ?
Muy sencillo, porque solo haces una petición de los discos disponibles en cambio, las canciones haces una petición por cada disco, si haces mas de 1 petición a los discos, tendrás el mismo problema...
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #10 (permalink)  
Antiguo 19/11/2011, 09:47
 
Fecha de Ingreso: agosto-2011
Mensajes: 161
Antigüedad: 12 años, 8 meses
Puntos: 7
Respuesta: Error de logica? Listar cd con canciones

extramadamente agradecido, comprendi mi gran error.
algo nuevo que aprendi haha.. entonces.. si la variable solo se usa en un metodo, no tengo para que tenerla global. ya que no se ustilizara en otros metodos.

entonces, el metodo construct esta demas y el array global tambien.
Mil gracias campeones !

Etiquetas: canciones, html, logica, mysql
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 23:55.