Hola a todos, esta es la primera vez que posteo, les cuento que soy nuevo en php y mysql y me encuentro muy entretenido aprendiendo todos los dias algo nuevo, pero el tema en cuestion es que tengo un problema que no me ha dejado avanzar.
He tratado de desarrollar un sistema de categorias y subcategorias usando tablas relacionadas pero no lo he logrado, mi idea por el momento es generar un menu como este:
Categoria 1
SubCategoria1
SubCategoria2
SubCategoria3
Categoria 2
SubCategoria1
SubCategoria2
SubCategoria3
Categoria 3
SubCategoria1
SubCategoria2
SubCategoria3
La estructura de las tablas que estoy usando es la siguiente:
Estructura de tabla para la tabla `categorias`
CREATE TABLE `categorias` (
`categoria_id` int(10) NOT NULL auto_increment,
`categoria_nombre` varchar(150) NOT NULL,
PRIMARY KEY (`categoria_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
Estructura de tabla para la tabla `subcategorias`
CREATE TABLE `subcategorias` (
`subcategoria_id` int(10) NOT NULL auto_increment,
`categoria_id` int(10) NOT NULL,
`subcategoria_nombre` varchar(150) NOT NULL,
PRIMARY KEY (`subcategoria_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;
Hasta el momento lo mejor que he logrado es generando la consulta de este modo, pero el resultado que me muestra no es el que yo quiero.
Categoria 1
Categoria 2
Categoria 5
Categoria 4
1
SubCategoria1
SubCategoria2
SubCategoria3
2
SubCategoria1
SubCategoria2
SubCategoria3
3
SubCategoria1
SubCategoria2
SubCategoria3
<?php
// Ejemplo de Conexion a base de datos
$servidor ='localhost';
$basedatos ='tutorial';
$usuario_basedatos ='tutorial';
$clave_basedatos ='XXXX';
//Conectamos con el servidor
$db=@mysql_connect($servidor,$usuario_basedatos,$clave_basedatos);
mysql_select_db($basedatos);
$sqlQuery = mysql_query("SELECT categorias.*, subcategorias.* FROM categorias, subcategorias
WHERE categorias.categoria_id = subcategorias.categoria_id
ORDER BY subcategorias.subcategoria_id ASC", $db) or die(mysql_error());
$categoria = "";
$categorias = array();
$pos = 0;
while ($row = mysql_fetch_object($sqlQuery)){
if($categoria != $row -> categoria_id){
echo "<h3>".$row -> categoria_nombre."...</h3>";
$categoria = $row -> categoria_id;
$pos = array_push( $categorias, array( $categoria, array() ) );
}
$categorias[$pos][1][] = array($row->subcategoria_id, $row -> subcategoria_nombre);
}
foreach ($categorias as $categoria)
{
if( !empty( $categoria[0] ) ) {
echo "<h1>" . $categoria[0] . "</h1>";
}
if (count($categoria[1]) > 0)
{
echo "<ul>";
foreach ($categoria[1] as $subCat)
{
echo "<li><a href='index.php?mod=categorias&categoria_id=" . $subCat[0] . "'>" .
$subCat[1] . "</a></li>";
}
echo "</ul>";
}
}
?>
Pero no logro sacar como lo quiero, espero que me podáis ayudar.
Un saludo y gracias de nuevo
Yo utilizaria una sola tabla:
create table MENUS(
ID VARCHAR(10) UNIQUE not NULL PRIMARY KEY,
NOMBRE VARCHAR(50) not NULL,
TIPO VARCHAR(1) not NULL,
MENU VARCHAR(10) not NULL );
La cosa es muy simple.... Cuando creas un menu, los datos se insertan asi:
# esto es un menu
ID = abcde123
NOMBRE = Inicio
TIPO = post|hoja|script|galeria
MENU = 0
# esto es un sub-menu de un menu principal
ID= otrocodigo
NOMBRE = Blog
TIPO = post|hoja|script|galeria
MENU = abcde123
Cuando existe un valor en la entrada MENU, quiere decir que es una sub-categoria o sub-menu, de lo contrario es solo un menu principal.
Saludos !
Interesante no lo había visto de esa forma, la cosa es que si quisiera hacerlo con un 3º nivel?
como seria? (inicialmente era de 3 niveles pero me resultaba y lo deje en 2
Un saludo y gracias ;)
Pues lo ideal es que hagas 2 querys, uno para obtener todos los items de menú de primer nivel y otro query para obtener los de segundo nivel. Los resultados los almacenas en 1 array y recorres todo con un for tipo:
<?php
$items_1_nivel = array(
0 => array(
'id' => 1,
'name' => 'Item1'
),
1 => array(
'id' => 2,
'name' => 'Item2'
)
);
$items_2_nivel = array(
0 => array(
'id' => 1,
'name' => 'SubItem1',
'parent' => '1'
),
1 => array(
'id' => 2,
'name' => 'SubItem2',
'parent' => '1'
),
2 => array(
'id' => 3,
'name' => 'SubItem3',
'parent' => '2'
),
3 => array(
'id' => 4,
'name' => 'SubItem4',
'parent' => '2'
)
);
foreach( $items_1_nivel as $item1 ) {
$hijos = NULL;
$list .= "<li>" . $item1['name'];
foreach( $items_2_nivel as $item2 ) {
if ( $item2['parent'] == $item1['id'] ) {
$hijos .= "<li>".$item2['name']."</li>";
}
}
if ( isset( $hijos ) && $hijos != NULL ) {
$list .= "<ul>".$hijos."</ul>";
}
$list .= "</li>";
}
echo "<ul>".$list."</ul>";
?>
Para hacerlo con 3 niveles o los niveles que te hagan falta es igual que para hacerlo con 2 en el ejemplo que te puso Diabliyo.
ID = Nivel_1
NOMBRE = Inicio
TIPO = post|hoja|script|galeria
MENU = 0
ID = Nivel_2
NOMBRE = Otro nombre
TIPO = post|hoja|script|galeria
MENU = Nivel_1
ID = Nivel_3
NOMBRE = Otro nombre mas
TIPO = post|hoja|script|galeria
MENU = Nivel_2
Y asi sucesivamente, solo tienes que referenciar de que menú cuelga el siguiente elemento y ya está.
Un saludo