Foros del Web » Programando para Internet » PHP »

Php, MySQL: querys y bucles

Estas en el tema de Php, MySQL: querys y bucles en el foro de PHP en Foros del Web. Hola a tod@s: Hace poco que estoy con php y mysql y me estoy volviendo loca intentando solucionar un problema. A ver si podéis ayudarme. ...
  #1 (permalink)  
Antiguo 04/06/2006, 04:09
Avatar de Anastasiaphp  
Fecha de Ingreso: junio-2006
Ubicación: El patio de mi casa
Mensajes: 196
Antigüedad: 18 años, 5 meses
Puntos: 3
Php, MySQL: querys y bucles

Hola a tod@s:
Hace poco que estoy con php y mysql y me estoy volviendo loca intentando solucionar un problema. A ver si podéis ayudarme.

El resultado que pretendo es este:

MARCA 1
Familia 1
- Serie a de la familia 1
- Serie b de la familia 1
- Serie d de la familia 1

Familia 2
- Serie c de la familia 2

(...)

Lo que he conseguido es esto:
MARCA 1
Familia 1
- Serie a de la familia 1
- Serie b de la familia 1
- Serie c de la familia 2

Familia 2
- Serie d de la familia 1

(...)



El código:


Código PHP:
<?php 
include ('incs_db/db_connect.php'); 
$conn db_connect(); 

$query 

SELECT * 
FROM marcas_familias 
WHERE id_marca = $id 
"


$query_s 

SELECT * 
FROM marcas_familias, marcas_series 
WHERE id_marca = $id 
AND marcas_familias.id_familia = marcas_series.id_familia 
"



$result = @$conn->query($query); 
$num_result $result->num_rows

$result_s = @$conn->query($query_s); 
$num_result_s $result_s->num_rows


for (
$i=0$i<$num_result$i++) 

$row $result->fetch_assoc(); 
echo 
$row['familia']; 
echo 
"<br />"

    for (
$j=$row['id_familia']; $j<$num_result_s$j++) 
    { 
    
$row_s $result_s->fetch_assoc(); 
    echo 
$row_s['serie']; 
    echo 
"<br />"
 
    } 
    echo 
"<br />"


$result->free
$conn->close(); 
?>
Pienso que el problema está en la condición del segundo for, pero por más vueltas y pruebas que he hecho, no he conseguido hayar la solución.

Gracias a todos.

Última edición por Anastasiaphp; 04/06/2006 a las 06:54
  #2 (permalink)  
Antiguo 04/06/2006, 12:11
 
Fecha de Ingreso: abril-2006
Mensajes: 62
Antigüedad: 18 años, 7 meses
Puntos: 0
Sonrisa

Efectivamente creo que el error está en el segundo bucle:
Código PHP:
    for ($j=$row['id_familia']; $j<$num_result_s$j++) 
    { 
    
$row_s $result_s->fetch_assoc(); 
    echo 
$row_s['serie']; 
    echo 
"<br />"
 
    } 
Específicamente me parece que es $j=$row['id_familia'] lo que está fuera de lugar.

Para mostrar todas las series correspondientes a una familia tenes algunas opciones: una es hacer
Código PHP:
for ($j=1;$j<$num_result_s;$j++) {...} 
y dentro de ese bucle agregar un condicional
Código PHP:
if ($row_s['id_familia']=...) {echo... 
O hacer una consulta para cada familia.

Yo optaría por la primera, aunque debe haber soluciones mucho mejores, eso te lo dejo a vos.
__________________
Guish
  #3 (permalink)  
Antiguo 04/06/2006, 14:40
Avatar de Anastasiaphp  
Fecha de Ingreso: junio-2006
Ubicación: El patio de mi casa
Mensajes: 196
Antigüedad: 18 años, 5 meses
Puntos: 3
Gracias Guish, pero no ha funcionado.

El caso es que cada familia tiene un id_familia que es lo que la relaciona con la tabla de marcas_series. De tal forma que las series tienen un id_familia y, de alguna manera, tendría que poder decirle que me saque todas las series que tienen el id_familia=1 debajo de la familia 1; y las que tienen el id_familia=2, debajo de la familia 2; y así sucesivamente.
  #4 (permalink)  
Antiguo 04/06/2006, 14:44
 
Fecha de Ingreso: abril-2006
Mensajes: 62
Antigüedad: 18 años, 7 meses
Puntos: 0
Sí, eso es lo que entendí.

Deberías postear el código que reescribiste y exactamente el error o problema por el cual no ha funcionado.

De esa forma es más fácil ayudarte.
__________________
Guish
  #5 (permalink)  
Antiguo 04/06/2006, 14:58
Avatar de Anastasiaphp  
Fecha de Ingreso: junio-2006
Ubicación: El patio de mi casa
Mensajes: 196
Antigüedad: 18 años, 5 meses
Puntos: 3
He hecho varias pruebas, la que más se acerca es:

Código PHP:
for ($i=0$i<$num_result$i++)
{
$row $result->fetch_assoc();
echo 
$row['familia'];
echo 
"<br />";

    for (
$j=0$j<$num_result_s$j++)
    {
    
$row_s $result_s->fetch_assoc();
        if (
$row_s['id_familia']=1)
        {
        echo 
$row_s['serie'];
        echo 
"<br />";
        }
    }
    echo 
"<br />";

De momento le he dado el valor de 1 al id_familia para probar a ver si me sacaba debajo las series de la familia 1, pero nada.

Esto me da como resultado:
MARCA 1
Familia 1
- Serie a de la familia 1
- Serie b de la familia 1
- Serie c de la familia 2
- Serie d de la familia 1

Familia 2

Es decir, que me saca todas las series debajo de la primera familia y sigue con el bucle para sacar el resto de familias.


Si aumento el valor de $j=1, como $num_result_s vale 4, pues saca las tres primeras series en la primera familia y la cuarta en la segunda familia (es el resultado del primer mensaje).

Un dato curioso: si cambio el valor de
if ($row_s['id_familia']=1) por, por ejemplo:
if ($row_s['id_familia']=35), le da igual y saca el mismo resultado, pero si lo cambio a cero no me saca ninguna serie.
  #6 (permalink)  
Antiguo 04/06/2006, 16:09
 
Fecha de Ingreso: abril-2006
Mensajes: 62
Antigüedad: 18 años, 7 meses
Puntos: 0
El condicional debe ser;
Código PHP:
if ($row_s['id_familia']==1
El código que posteaste usa "=", mientras que debe ser "==".

El primero es un operador de asignación y el segundo es del de comparación.-

Tal como está escrita, esa condición dará siempre verdadero.

Yo también me equivoqué en el mismo punto.
__________________
Guish
  #7 (permalink)  
Antiguo 05/06/2006, 00:41
Avatar de Anastasiaphp  
Fecha de Ingreso: junio-2006
Ubicación: El patio de mi casa
Mensajes: 196
Antigüedad: 18 años, 5 meses
Puntos: 3
Demasiado bonito para que funcionara...

He puesto el código tal como muestras, utilizando el operador de comparación == y si le doy el valor 1 ¡magia! parece que funciona, me coloca todas las series de la familia 1 debajo de esta; pero si le doy el valor 2, me coloca todas las series de la familia 2 debajo de la familia 1
  #8 (permalink)  
Antiguo 05/06/2006, 08:24
Avatar de Anastasiaphp  
Fecha de Ingreso: junio-2006
Ubicación: El patio de mi casa
Mensajes: 196
Antigüedad: 18 años, 5 meses
Puntos: 3
Pregunta ¿Alguien tiene alguna idea de por qué no funciona?

Sigo intentando sacar el tema. Lo último conseguido es meter el if que comentaba Guish, pero ocurre que no relaciona la familia con las series. Solo saca las series que le dices debajo de la familia 1.
  #9 (permalink)  
Antiguo 05/06/2006, 08:41
 
Fecha de Ingreso: enero-2005
Ubicación: Barcelona
Mensajes: 1.473
Antigüedad: 19 años, 10 meses
Puntos: 10
Hola! q tal? no ser si te entendi bien, pero kieres mostrar las series q pertenecen a una familia verdad?
supongo q tu estructura de tablas seria algo semejante a esto:
--------------
Marca
id_marca
nombre_marca
--------------
familia
id_familia
nombre_familia
id_marca
--------------
serie
id_serie
nombre_serie
id_familia
-------------

aqui te posteo el codigo q uso yo para hacer una cosa semejante.
Código PHP:
<?php 
include ('incs_db/db_connect.php'); 
$conn db_connect(); 
//Hacemos la primera consulta
$result mysql_query(" SELECT * FROM marcas_familias WHERE id_marca = $id"); 
//Mostramos los resultados
while ($row=mysql_fetch_array($result))
{
    
//Mostramos la familia
    
echo $row["familia"];
    echo 
"<br>";
    
//Hacemos segunda consulta para saber q series hay dentro de la familia
    
$result_s mysql_query(" SELECT * FROM marcas_series WHERE id_familia=".$row[id_familia]); 
    while (
$row_s=mysql_fetch_array($result_s))
    {
    
//Mostramos la serie q pertenece a la familia
    
echo $row_s["serie"];
    echo 
"<br>";    
    }
}
?>
espero q te sirva,

saludos
__________________
"Cada hombre es el hijo de su propio trabajo"
Miguel de Cervantes Saavedra
"La experiencia es algo que no consigues hasta justo depués de necesitarla"
Laurence Olivier
  #10 (permalink)  
Antiguo 05/06/2006, 09:23
Avatar de Anastasiaphp  
Fecha de Ingreso: junio-2006
Ubicación: El patio de mi casa
Mensajes: 196
Antigüedad: 18 años, 5 meses
Puntos: 3
Graciaaaaaas!!!!

Ha funcionado!!!
Por lo que he visto el tema está en hacer la segunda query dentro del bucle

Gracias Sergi_Climent. Y a ti Guish, por el esfuerzo.

Saludos,
  #11 (permalink)  
Antiguo 05/06/2006, 09:40
 
Fecha de Ingreso: abril-2006
Mensajes: 62
Antigüedad: 18 años, 7 meses
Puntos: 0
usar ==1 o ==2 está bien para testear el código. Se supone que para volverlo operativo debés de hacer referencia a la variable que almacena el número de familia es decir usar:
Código PHP:
if ($row_s['id_familia']==$row['id_familia']) 
Como ya te comenté existen dos opciones visibles una es usar un condicional o hacer una consulta para cada famila, es decir colocar la segunda consulta dentro del bucle.

En ese mismo post aclaré que prefería la primera, y eso es por cuestiones de performance. Debes tratar de hacer un uso inteligente de las consultas a la base de datos porque al multiplicarse la cantidad de llamadas es muy costoso en términos de rendimiento.

Por supuesto que eso depende la frecuencia con que sea procesado ese código.
__________________
Guish
  #12 (permalink)  
Antiguo 05/06/2006, 09:52
Avatar de Anastasiaphp  
Fecha de Ingreso: junio-2006
Ubicación: El patio de mi casa
Mensajes: 196
Antigüedad: 18 años, 5 meses
Puntos: 3
Hola Guish, sí, lo probé también tal como dices, pero no funcionó (solo me cogía las series de la primera familia).

Se me pasó el texto "hacer una consulta para cada familia", supongo que de tanto darle vueltas ya no veía lo que leía; y ahí tenías tú también la respuesta. Bueno, al final está, que es lo que importa.

Tendré en cuenta lo que me comentas del rendimiento.

Gracias por todo.
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 13:06.