Categoría y subcategoría en PHP y MySQL
Categoría y subcategoría en PHP y MySQL. En todo sistema es primordial el uso de categorías y subcategorías y si observamos el mundo de los CMS también veremos que se basan en usar una sola tabla: Prestashop, por ejemplo.
En este tutorial aprenderás cómo crear una estructura bien definida de categorías con PHP y MySQL. Sin embargo, una vez definida puede usarlo en cuadro desplegable (Etiqueta Select) o una lista (UL LI).
A continuación, como resultado final vamos a obtener todas las categorías y subcategorías de manera dinámica.
¿Cómo funciona el script Categoría y subcategoría en PHP?
El funcionamiento es muy simple, usaremos PHP como lenguaje de programación y MySQL como gestor de base de datos.
Además, para poder desplegar las categorías y subcategorías usaremos funciones con consultas SQL.
Categoría y subcategoría en PHP y MySQL: Estructura
Trabajar con categorías en un blog o sistema web es bastante solicitado por las empresas. Sin embargo, la necesidad de usar subcategorías también es primordial.
En este tutorial explicaré cómo diseñar un esquema de base de datos para administrar categorías y subcategorías en una sola tabla. Veamos la estructura:
myproject/ |__index.php |__funciones.php |__config.php |__categoria_db.sql
Para almacenar categorías y subcategorías en una sola tabla, necesitamos una manera de determinar qué categorías son las subcategorías. Por lo tanto, esto se puede lograr mediante la columna «parent_id«, todas las categorías raíz tendrán una parent_id de «0«.
Las subcategorías tendrán un «parent_id» que coincida con el identificador de la categoría primaria.
A) Base de datos del script
Trabajaremos con una base de datos llamado «categoria_db» y una tabla con nombre «categorias«.
Vamos a agregar algunos datos para que esto sea más claro.
CREATE TABLE `categorias` ( `idcat` int(11) NOT NULL, `categoria_nombre` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL, `parent_id` int(11) NOT NULL, `fecha_creacion` timestamp NOT NULL DEFAULT current_timestamp() ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT INTO `categorias` (`idcat`, `categoria_nombre`, `parent_id`, `fecha_creacion`) VALUES (1, 'Carreras Tecnicas', 0, '2020-10-04 14:55:02'), (2, 'Cursos', 1, '2020-10-06 03:06:44'), (3, 'Cursos libres', 1, '2020-10-06 03:06:44'), (4, 'Diplomados', 0, '2020-10-06 03:07:23'), (5, 'Contabilidad Empresarial', 4, '2020-10-07 11:40:34'), (6, 'Administracion Gerencial', 4, '2020-10-07 11:40:37'), (7, 'Gestion Ambiental', 4, '2020-10-07 11:40:40'), (8, 'PHP Basico', 2, '2020-10-07 14:47:33'), (9, 'PHP Avanzado', 2, '2020-10-07 14:47:33'), (10, 'PHP PDO', 2, '2020-10-07 14:47:33'), (11, 'Cpanel de Control', 3, '2020-10-07 14:48:22'), (12, 'Wordpress Avanzado', 3, '2020-10-07 14:48:22'); ALTER TABLE `categorias` ADD PRIMARY KEY (`idcat`); ALTER TABLE `categorias` MODIFY `idcat` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=13;
B) Archivo index.php
Al momento de cargar el script, lo primero que cargará será el fichero index.php que contiene e incluye el fichero «config.php
» y fichero «funciones.php
«. Además, cargara los resultados extraídos de la base de datos.
<!doctype html> <html> <head> <meta charset="utf-8"> <title>Categoria Subcategoria PHp & MySQL</title> </head> <body> <?php include_once("config.php"); include_once("funciones.php"); $categories = categories(); ?> <?php foreach($categories as $category){ ?> <ul class="category"> <li><?php echo $category['categoria_nombre'] ?></li> <?php if( ! empty($category['subcategory'])){ echo viewsubcat($category['subcategory']); } ?> </ul> <?php } ?> </body> </html>
C) Fichero config.php
Tendrá un rol fundamental de realizar la conexión con MySQL, contendrá las credenciales del usuario MySQL, contraseña y nombre de base de datos.
<?php function dbconnect(){ $host = "localhost"; $dbuser = "root"; $dbpass = ""; $dbname = "categoria_db"; $conn = new mysqli($host, $dbuser, $dbpass, $dbname); if($conn->connect_error){ die("La conexion ha fallado: ".$conn->connect_error); } return $conn; } ?>
D) Archivo funciones.php
Sera el motor del script, porque a través de las funciones se realizarán consultas a la base de datos para extraer la información precisa y ordenadas por categorías y subcategorías.
<?php function categories() { $conn = dbconnect(); $sql = "SELECT * FROM categorias WHERE parent_id=0"; $result = $conn->query($sql); $categories = array(); while($row = $result->fetch_assoc()) { $categories[] = array( 'idcat' => $row['idcat'], 'parent_id' => $row['parent_id'], 'categoria_nombre' => $row['categoria_nombre'], 'subcategory' => sub_categories($row['idcat']), ); } return $categories; } function sub_categories($idcat) { $conn = dbconnect(); $sql = "SELECT * FROM categorias WHERE parent_id=$idcat"; $result = $conn->query($sql); $categories = array(); while($row = $result->fetch_assoc()) { $categories[] = array( 'idcat' => $row['idcat'], 'parent_id' => $row['parent_id'], 'categoria_nombre' => $row['categoria_nombre'], 'subcategory' => sub_categories($row['idcat']), ); } return $categories; } function viewsubcat($categories) { $html = '<ul class="sub-category">'; foreach($categories as $category){ $html .= '<li>'.$category['categoria_nombre'].'</li>'; if( ! empty($category['subcategory'])){ $html .= viewsubcat($category['subcategory']); } } $html .= '</ul>'; return $html; } ?>
Categoría y subcategoría en PHP y MySQL: Conclusión
Hay varias formas de estructurar el ejemplo mostrado, pero en esta ocasión hemos usado funciones y una sola tabla para mostrar las categorías y subcategorías existentes en la base de datos.
Si observan, la implementación es muy sencilla y la curva de aprendizaje es muy baja.
Espero que la presente explicación les ayude en sus proyectos en desarrollo.