Lista y sublista en PHP

Tengo una pequeña web de programas en mente, cada programa tiene una categoría principal y luego una subcategoría. Mi idea es la de hacer un listado de categoría principal, y bajo esta, las subcategorías exitentes que tengan como categoría principal la que se ha escrito ya en pantalla.
Intenté hacerlo con dos bucles anidados do... While, pero no sale. ¿Me puedes echar una mano?
He declarado dos juegos de registros así:
mysql_select_db($database_trucalia, $trucalia);
$query_rsListProgXcat = "SELECT DISTINCT categoria1 FROM programas ORDER BY categoria1 ASC";
$rsListProgXcat = mysql_query($query_rsListProgXcat, $trucalia) or die(mysql_error());
$row_rsListProgXcat = mysql_fetch_assoc($rsListProgXcat);
$totalRows_rsListProgXcat = mysql_num_rows($rsListProgXcat);
Este era el de la primera categoría, ahora el de la subcategoría.
$cat1 = $row_rsListProgXcat['categoria1'];
mysql_select_db($database_trucalia, $trucalia);
$query_rsCategoria2 = "SELECT DISTINCT categoria2 FROM programas WHERE categoria1 LIKE '%$cat1%' ORDER BY categoria2 ASC";
$rsCategoria2 = mysql_query($query_rsCategoria2, $trucalia) or die(mysql_error());
$row_rsCategoria2 = mysql_fetch_assoc($rsCategoria2);
$totalRows_rsCategoria2 = mysql_num_rows($rsCategoria2);
Y este el código que te dije que tengo, pero que no funciona como deseo.
</table>
<hr align="left" width="452">
<table width="452" border="0" cellspacing="1">
<?php do { ?>
<tr>
<td class="texto1"><a href="programas.php?categoria=<?php echo $row_rsListProgXcat['categoria1']; ?>"><?php echo $row_rsListProgXcat['categoria1']; ?></a> </td>
</tr>
<?php do { ?>
<tr>
<td class="textoNormal">>><?php echo $row_rsCategoria2['categoria2']; ?><br> </td>
</tr>
<?php } while ($row_rsCategoria2 = mysql_fetch_assoc($rsCategoria2)); ?><br>
<?php } while ($row_rsListProgXcat = mysql_fetch_assoc($rsListProgXcat)); ?>
</table>
**********************
¿Cómo puedo hacer que funcione?
Un ejemplo más para aclararlo mejor. Tengo como categorías principales Audio y Seguridad. Como subcategorías de Audio: Editores y Códecs. Y de Seguridad, Antivirus y vigilancia.
Yo quiero que aparezca esto por pantalla:
Audio
·Editores
·Códecs
Seguridad
·Antivirus
·Vigilancia

2 Respuestas

Respuesta
1
He tesdo mirando el código que adjuntabas y creo que se donde puede estar el fallo, prueba a poner las consultas a la base de datos dentro de los do-while, es decir después del primer do-while pon la consulta para categoria1 y después haces el echo de categoria1 y lo mismo con categoria2.
Haciendo un copy-paste de tu código un poco a lo besia me refiero a esto:
</table>
<hr align="left" width="452">
<table width="452" border="0" cellspacing="1">
<?php do {
mysql_select_db($database_trucalia, $trucalia);
$query_rsListProgXcat = "SELECT DISTINCT categoria1 FROM programas ORDER BY categoria1 ASC";
$rsListProgXcat = mysql_query($query_rsListProgXcat, $trucalia) or die(mysql_error());
$row_rsListProgXcat = mysql_fetch_assoc($rsListProgXcat);
$totalRows_rsListProgXcat = mysql_num_rows($rsListProgXcat);
?>
<tr>
<td class="texto1"><a href="programas.php?categoria=<?php echo $row_rsListProgXcat['categoria1']; ?>"><?php echo $row_rsListProgXcat['categoria1']; ?></a> </td>
</tr>
<?php do {
$cat1 = $row_rsListProgXcat['categoria1'];
mysql_select_db($database_trucalia, $trucalia);
$query_rsCategoria2 = "SELECT DISTINCT categoria2 FROM programas WHERE categoria1 LIKE '%$cat1%' ORDER BY categoria2 ASC";
$rsCategoria2 = mysql_query($query_rsCategoria2, $trucalia) or die(mysql_error());
$row_rsCategoria2 = mysql_fetch_assoc($rsCategoria2);
$totalRows_rsCategoria2 = mysql_num_rows($rsCategoria2);
?>
<tr>
<td class="textoNormal">>><?php echo $row_rsCategoria2['categoria2']; ?><br> </td>
</tr>
<?php } while ($row_rsCategoria2 = mysql_fetch_assoc($rsCategoria2)); ?><br>
<?php } while ($row_rsListProgXcat = mysql_fetch_assoc($rsListProgXcat)); ?>
</table>
Si así sigue sin funcionarte, por favor dime que es lo que te muestra en los dos casos: como lo hacías tu y como te he dicho yo y intentare solucionarlo.
Espero haberte sido de ayuda, si tienes más dudas o para cualquier otra cosa puedes comunicármela por aquí o postearla en los foros de Lumanet.net (http://www.lumanet.net) y estaré encantado en atenderte.
Respuesta
1
Si, eso se puede hacer sin problemas, lo que si antes de comentarte la solución me gustaría darte un consejo: cambia de nombre las variables! Uno de los secretos para una buena programación es que el código sea legible y lo más entendible posible, y esto se logra de dos maneras:
1) Identando correctamente.
2) Poniendo nombres de variables significativas pero sencillas.
Bueno, a continuación te doy un ejemplo de como lo haría yo:
//con esto obtiene la lista de programas
mysql_select_db($database_trucalia, $trucalia);
$sql = "SELECT DISTINCT categoria1 FROM programas ORDER BY categoria1 ASC";
$result = mysql_query($sql, $trucalia) or die(mysql_error());
//a partir de acá comienza a imprimir en pantalla
while ($programas = mysql_fetch_array($result)) {
$cat1=$programas['categoria1']
//imprime el nombre de la categoria
echo $cat1;
//obtiene los nombres de las subcategorias pertenecientes a esa categoria
$sql = "SELECT DISTINCT categoria2 FROM programas WHERE categoria1 LIKE '%$cat1%' ORDER BY categoria2 ASC";
$result = mysql_query($sql, $trucalia) or die(mysql_error());
//mientras haya registros los imprime
while ($subcat = mysql_fetch_array($result)) {
echo "- ".$subcat['categoria2'];
}
}
Creo que no me olvidé ningún punto y coma ni nada ;). Suerte!
Lukas

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas