Foros del Web » Programando para Internet » PHP »

Problema while

Estas en el tema de Problema while en el foro de PHP en Foros del Web. Bueno, mi problema aqui es que si me funciona el while, pero solo 1 sola vez. Tengo en mi BD una tabla que se llama ...
  #1 (permalink)  
Antiguo 16/03/2008, 11:49
 
Fecha de Ingreso: enero-2007
Ubicación: Guadalajara, Jalisco.
Mensajes: 37
Antigüedad: 17 años, 2 meses
Puntos: 0
Problema while

Bueno, mi problema aqui es que si me funciona el while, pero solo 1 sola vez.
Tengo en mi BD una tabla que se llama amigos, y tiene 3 espacios:
-id
-id_usuario
-id_amigos

Practicamente la uso para guardar la lista de amigos de cada usuario. Entonces al ejecutar mi while, solo me lo ejecuta una sola vez, me da un solo nombre o 1 sola ID por decirse asi, pero no me devuelve si es que existen 3 o 4 mas guardados.

En la columna de "id_amigos" guardo los datos de la siguiente forma, si tengo 2 amigos y sus ids son 4 y 5, se guarda asi:

"-4-5"

etc...

Ven por ahi algun problema?

Código PHP:
        $usuario = mysql_query("SELECT * FROM usuarios WHERE user='$usuario'");
        $user = mysql_fetch_array($usuario);
        $query=mysql_query("SELECT * FROM amigos WHERE id_usuario='$user[id]'");
        
        if (mysql_num_rows($query) > 0){
            
            $id_array_amigo = 2;
                
                while ($datos=mysql_fetch_array($query)){
                    
                    $busq = explode("-",$datos[id_amigos]);
                    $id_amigo = $busq["$id_array_amigo"];
                    
                    if(isset($id_amigo)){
                        
                        $amigos = mysql_query("SELECT * FROM usuarios WHERE id='$id_amigo'");
                        $amigo = mysql_fetch_array($amigos);
                        echo $amigo['user'];
                        $id_array_amigo = $id_array_amigo+1;
                
                    }
                
                }
        
            if($user['user'] == $_SESSION[usuario]){ ?><br /><a href="editar-amigos.php">Editar lista de Amigos.</a><?PHP }
                
        }else{
                
            echo 
"No tienes amigos";
                
        }
  #2 (permalink)  
Antiguo 16/03/2008, 18:58
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Problema while

El código que pones solo busca los datos de un usuario en base a una búsqueda, si quieres saber cuantos hay puedes hacer simplemente un count($busq) y te devolverá el total de elementos que tienes en la lista.

Saludos.
  #3 (permalink)  
Antiguo 16/03/2008, 19:37
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Re: Problema while

El primer "problema" que se puede ver es de estructura de tu BD.

La relación natural para lo que propones es una llamada "de muchos a muchos". O sea, un usuario puede tener muchos amigos y un usuario puede estar en varias listas de amigos. La manera más limpia de romper una relación de este tipo es mediante una tabla intermedia:

Tabla: Usuario (id_usuario, otro_dato, otro_mas)
Tabla: Amigo (id_usuario, id_amigo)

Ejemplo:
Código:
Tabla USUARIO
id_usu	email		fecha_registro
--------------------------------------
1	[email protected]	2007-11-01
2	[email protected]	2008-01-02
3	[email protected]	2008-01-02
4	[email protected]	2008-01-11

Tabla AMIGOS
id_usu	id_amigo
-------------------
1	2
1	4
2	1
3	1
3	2
3	4
4	1
Es una manera bastante más sencilla de entender y de mantener. Tenla en cuenta.

Ahora, viendo tu código, te digo que lo que está pasando es lo que se espera (aunque no precisamente lo que tú esperas).

Recomendación aparte: Utiliza distintos nombres de variables. $usuario primero es una cadena (nombre de usuario) y luego le asignas un identificador de resultset. Eso puede generar cierta confusión.

¿Es necesaria la primera consulta? Lo único que haces es obtener el id del usuario conociendo su username. ¿El username no es único? Si es así, puedes utilizarlo directamente.

Veamos los errores:
Código PHP:
"SELECT * FROM amigos WHERE id_usuario='$user[id]'" 
Esta consulta te va a devolver un sólo registro (el del usuario con id=$user['id']). Así que hacer un while está de más porque el bucle se va a ejecutar una sola vez.

O sea, debes iterar es en el array que generas con la lista de amigos, no en el resultset.
Código PHP:
// Consultas para obtener el id del usuario $usuario
$consulta_id_usuario mysql_query("SELECT * FROM usuarios WHERE user='$usuario'");
$registro_usuario mysql_fetch_array($consulta_id_usuario);

// Consulta para obtener los datos del usuario
$consulta_usuario mysql_query("SELECT * FROM amigos WHERE id_usuario='$user[id]'");

if (
mysql_num_rows($query) > 0){
    
$datos mysql_fetch_array($query);
    
$array_amigos explode("-"$datos['id_amigos']);

    
// Iteramos en $array_amigos para obtener los datos de cada uno:
    
foreach($array_amigos as $id_amigo){
        
$consulta_amigo mysql_query("SELECT * FROM usuarios WHERE id='$id_amigo'");
        
$registro_amigo mysql_fetch_array($consulta_amigo);
        echo 
$registro_amigo['user'];
    }
       
if(
$registro_usuario['user'] == $_SESSION['usuario']){
    echo 
'<br /><a href="editar-amigos.php">Editar lista de Amigos.</a>';
}
                
}else{
    echo 
"No tienes amigos";

Saludos,
  #4 (permalink)  
Antiguo 16/03/2008, 21:58
 
Fecha de Ingreso: enero-2007
Ubicación: Guadalajara, Jalisco.
Mensajes: 37
Antigüedad: 17 años, 2 meses
Puntos: 0
Re: Problema while

Muchas gracias, al leerlo en teoria si va a funcionar, todabia no lo implemento, y me imagine que mi codigo estaba un mucho raro, por lo mismo que mencionan que hago muchas consultas pudiendo simplificar todo con una sola.
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 16:53.