@Hasiev1

Как реализовать вывод категорий и подкатегорий на одной странице в PHP/SQL?

Есть две таблицы:
1. Категории
sql создания таблицы Категории

CREATE TABLE `categories` (
	`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
	`title` VARCHAR(100) NOT NULL DEFAULT 'unnamed',
	`icon` VARCHAR(100) NOT NULL DEFAULT 'icon',
	PRIMARY KEY (`id`),
	UNIQUE INDEX `Индекс 2` (`title`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=3
;


2. Подкатегории (имеют внешний ключ на категории)
sql создания таблицы Подкатегории

CREATE TABLE `subcategories` (
	`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
	`title` VARCHAR(100) NOT NULL DEFAULT 'unnamed',
	`category_id` INT(11) UNSIGNED NOT NULL,
	PRIMARY KEY (`id`),
	INDEX `id` (`category_id`),
	CONSTRAINT `id` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;



PHP код который есть сейчас (Работает, выводит только категории):
index.php

<?php
require_once 'init.php';

if (!$link) {
    $error = mysqli_connect_error();
    $content = include_template('error.php', ['error' => $error]);
}
else {
    $sql = 'SELECT * FROM categories';
    $result = mysqli_query($link, $sql);

    if ($result) {
        $categories = mysqli_fetch_all($result, MYSQLI_ASSOC);
        $content = include_template('main.php', ['categories' => $categories]);
    }
    else {
        $error = mysqli_error($link);
        $content = include_template('error.php', ['error' => $error]);
    }
}

print(include_template('layout.php', ['content' => $content]));


Как, и в каком месте кода будет правильней реализовать вывод категорий, и её подкатегорий (при условии что они могут отсутствовать)?
  • Вопрос задан
  • 509 просмотров
Решения вопроса 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
1) по уму нужно просто nested sets
2) В вашей (не очень удачной) структуре нужно сджоинить таблицы по id - category_id.
3) Такая структура норм только для 2 уровней вложенности, что не есть хорошо.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы