- БЛОГ ПРО WEB
- Рассказываю о web-разработке и помогаю создавать сайты
- PHP Категории (Дерево категорий)
- How to Create Category and Subcategory in PHP
- Dynamic Category and Subcategory in PHP Using MySQL
- 1. Configure Basic Requirement
- 2. Create a category and subcategory Form
- 3. Create Category and Subcategory in PHP
- 4. Display category and subcategory
- My Suggestion
- Related posts:
- Многоуровневое меню на PHP + MySQL
- Далее переходим от слов к практике. Создадим таблицу Categories.
- Алгоритм работы состоит из следующего:
- Создаем соединение с базой данных
- Пишем функцию получения данных из таблицы Categories
- Получаем массив вот такого вида, где ключ массива это ID категории.
- Функция построения дерева из массива от Tommy Lacroix
- Получаем массив в виде дерева
- Скрипт целиком
- Результат работы
- Многоуровневое меню на PHP + MySQL для админки
БЛОГ ПРО WEB
Рассказываю о web-разработке
и помогаю создавать сайты
PHP Категории (Дерево категорий)
Сегодня наша цель, создать иерархическую структуру категорий. Нам важно чтобы было удобно хранить категории и чтобы было легко выводить их там где нам надо.
Иногда простое кажется сложным, именно по этому выложу несколько фрагментов кода, которые я надеюсь вам пригодятся для реализации php категорий в виде дерева.
Итак, структура должна состоять из id категории (id), из названия категории (name) и конечно id родительской категории (parent_id). В MySQL это выглядит так:
CREATE TABLE IF NOT EXISTS `category` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `parent_id` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
Минимальная и понятная структура таблицы для хранения категорий.
Заполняем таблицу нашими категориями
INSERT INTO `category` (`id`, `name`, `parent_id`) VALUES (1, 'Телефоны и планшеты', '0'), (2, 'Автомобили', '0'), (3, 'Samsung', '1'), (4, 'Apple', '1'), (5, 'LG', '1'), (6, 'Ford', '2'), (7, 'Lexus', '2'), (8, 'BMW', '2'), (9, 'Galaxy Tab 4', '3'), (10, 'Galaxy S6', '3');
Там где значение parent_id=0, у данной категории нет родительской категории.
Тут все понятно и просто. Теперь присутпим к выводу списка категорий. Но для правильного вывода списка, нам нужно сначала получить весь список php категорий, а уже потом с помощью рекурсии сформировать наше дерево. Следующая функция предназначена для получения этого списка:
function get_cat() < //запрос к базе данных $sql = "SELECT * FROM category"; $result = mysql_query($sql); if(!$result) < return NULL; >$arr_cat = array(); if(mysql_num_rows($result) != 0) < //В цикле формируем массив for($i = 0; $i < mysql_num_rows($result);$i++) < $row = mysql_fetch_array($result,MYSQL_ASSOC); //Формируем массив, где ключами являются адишники на родительские категории if(empty($arr_cat[$row['parent_id']])) < $arr_cat[$row['parent_id']] = array(); >$arr_cat[$row['parent_id']][] = $row; > //возвращаем массив return $arr_cat; > >
Дальше нам надо запустить эту функция для получения массива
//получаем массив каталога $result = get_cat();
Теперь нужна функция с рекурсией
Теперь осталось только вывести каталог на экран с помощью рекурсивной функции
И в общем то и всё. Таким образом мы можем получить полное дерево категорий с бесконечными подкатегориями.
How to Create Category and Subcategory in PHP
Hello Developers, I have shared the best tutorial to learn about displaying categories and subcategories on web pages. In Most projects, you need to create a Dynamic category and subcategory in PHP using MySQL. But you don’t know the simple way to implement it. So, Don’t worry, you will get the best & simple script to use in your projects.
As you know that a category is created in another category is called nested or child or subcategory. So, you need to care about its relationship. Every subcategory is always created with the id of the parent category. So, I will write the PHP MySQL Scrip with this concept.
Dynamic Category and Subcategory in PHP Using MySQL
You have to go through the following steps to understand and create categories and subcategories in PHP and MySQL. Therefore you must not skip any one of the given points.
1. Configure Basic Requirement
First of all, you should have to create the following folder structure for testing purposes. Otherwise, you can directly use the given script in your project.
myproject/ |__catsubcat-form.php |__catsubcat-script.php |__database.php |__style.css
Create a table with the name of categories in PHPMyAdmin.
CREATE TABLE `categories` ( `id` int(10) UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT, `parent_id` int(10) DEFAULT 0, `category_name` varchar(255) DEFAULT NULL, ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Create another table with the name of subcategories in PHPMyAdmin
Table Name – subcategories
CREATE TABLE `subcategories` ( `id` int(10) UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT, `parent_id` int(10) DEFAULT 0, `subcategory_name` varchar(255) DEFAULT NULL, )
Write the script to connect PHP to MYSQL Database.
2. Create a category and subcategory Form
- Write the HTML code to create the category form.
- Now, Write the HTML code to create a subcategory form.
- You have to write the HTML code to create a category and subcategory list to open those forms.
File Name – catsubcat-form.php
3. Create Category and Subcategory in PHP
To create category and subcategory, you have to use the following functions –
- create_category($conn) can insert category data into the database
- create_subcategory($conn) can insert subcategory data into the database
- fetch_categories($conn) can fetch category data from the database
- fetch_subcategories($conn,$parent_id) can fetch subcategory data from the database
- legal_input($value) can validate category and subcategory data before inserting it into the database
File Name – catsubcat-script.php
if(isset($_POST['addsubcat'])) < $msg=create_subcategory($conn); >function create_category($conn)< $category_name= legal_input($_POST['category_name']); $query=$conn->prepare("INSERT INTO categories (category_name) VALUES (?)"); $query->bind_param('s',$category_name); $exec= $query->execute(); if($exec)< $msg=" Category was created successfully"; return $msg; >else< $msg= "Error: " . $query . "
" . mysqli_error($conn); > > function create_subcategory($conn)< $parent_id= legal_input($_POST['parent_id']); $subcategory_name= legal_input($_POST['subcategory_name']); $query=$conn->prepare("INSERT INTO subcategories (parent_id,subcategory_name) VALUES (. )"); $query->bind_param('is',$parent_id,$subcategory_name); $exec= $query->execute(); if($exec)< $msg="Subcategory was created sucessfully"; return $msg; >else< $msg= "Error: " . $query . "
" . mysqli_error($conn); > > // fetch query $catData=fetch_categories($conn); function fetch_categories($conn)< $parent_id=0; $query = $conn->prepare('SELECT * FROM categories WHERE parent_id=?'); $query->bind_param('i',$parent_id); $query->execute(); $exec=$query->get_result(); $catData=[]; if($exec->num_rows>0)< while($row= $exec->fetch_assoc()) < $catData[]=[ 'id'=>$row['id'], 'parent_id'=>$row['parent_id'], 'category_name'=>$row['category_name'], 'subcategories'=>fetch_subcategories($conn,$row['id']) ]; > return $catData; >else < return $catData=[]; >> // fetch query function fetch_subcategories($conn,$parent_id)< $query = $conn->prepare('SELECT * FROM subcategories WHERE parent_id=?'); $query->bind_param('i',$parent_id); $query->execute(); $exec=$query->get_result(); $subcatData=[]; if($exec->num_rows>0)< while($row= $exec->fetch_assoc()) < $subcatData[]=[ 'id'=>$row['id'], 'parent_id'=>$row['parent_id'], 'subcategory_name'=>$row['subcategory_name'], ]; > return $subcatData; >else < return $subcatData=[]; >> // convert illegal input to legal input function legal_input($value) < $value = trim($value); $value = stripslashes($value); $value = htmlspecialchars($value); return $value; >?>
Don’t forget to include the database connection file database.php in the above file.
This PHP script can work to create any kind of category and subcategory view. You need not change anything into its script. But you can change the table name based on your project.
4. Display category and subcategory
Now, we have to display category and subcategory data in the HTML list. So you will have to follow the below points –
- First of all, include script file category-script.php
- Create an HTML unordered list
- Print category and subcategory by running $catData with a foreach loop
File Name – catsubcat-list.php
My Suggestion
I have shared an example to create a category and subcategory in PHP. Now, you can easily create more than two-level categories with the same concept. If you have any questions, ask me through the below box.
You can learn more PHP Coding in the blog. I will share more web technology coding tutorials in the best and simple way. So, continue to visit my website.
Related posts:
Hey there, Welcome to CodingStatus. My Name is Md Nurullah from Bihar, India. I’m a Software Engineer. I have been working in the Web Technology field for 4 years. Here, I blog about Web Development & Designing. Even I help developers to build the best Web Applications.
Многоуровневое меню на PHP + MySQL
Ни один сайт не обходится без навигации или как еще называют «меню сайта». Так вот меню сайта бывает одноуровневым и многоуровневым в виде дерева. Если с одноуровневым меню особых сложностей в плане реализации не возникает, то при создании многоуровневого меню нужно хорошо подумать.
Самое главное в этой задаче это спроектировать базу данных для нашего многоуровневого меню. Создадим таблицу Categories с тремя полями id , title , parent где:
- ID – идентификатор
- Title – Название меню
- Parent – Родитель категории по умолчанию 0
За ветвление меню отвечает поле Parent если Parent = 0 , то эта категория является родительской. Для того чтобы добавить потомков к родительской категории нужно в поле parent указать ID нужного родителя. Например:
ID | TITLE | PARENT |
---|---|---|
1 | Автомобили | 0 |
2 | Мотоциклы | 0 |
3 | Мазда | 1 |
4 | Хонда | 1 |
5 | Кавасаки | 2 |
6 | Харлей | 2 |
7 | Лодки | 0 |
Как видно из таблицы, у родительской категории Автомобили есть два потомка – это Мазда и Хонда связанных по полю Parent . А у категории Мотоциклы два потомка – это Кавасаки и Харлей . При этом у категории Лодки нет потомков. Надеюсь, что Вы поняли,как связать категории.
Далее переходим от слов к практике. Создадим таблицу Categories.
CREATE TABLE IF NOT EXISTS `categories` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `parent` int(10) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ; -- -- Дамп данных таблицы `categories` -- INSERT INTO `categories` (`id`, `title`, `parent`) VALUES (1, 'Автомобили', 0), (2, 'Мотоциклы', 0), (3, 'Мазда', 1), (4, 'Хонда', 1), (5, 'Кавасаки', 2), (6, 'Харлей', 2), (7, 'Мазда 3', 3), (8, 'Мазда 6', 3), (9, 'Седан', 7), (10, 'Хечбэк', 7), (11, 'Лодки', 0), (12, 'Лифтбэк', 8), (13, 'Кроссовер', 8), (14, 'Белый', 13), (15, 'Красный', 13), (16, 'Черный', 13), (17, 'Зеленый', 13), (18, 'Мазда CX', 3), (19, 'Мазда MX', 3);
Алгоритм работы состоит из следующего:
- Создаем соединение с базой данных
- Получаем все данные из таблицы Categories
- Обрабатываем полученные данные изменив ключ массива на номер ID
- Из обработанного массива строим дерево зависимостей неограниченной вложенности используя метод рекурсии для построения
- Выводим наше многоуровневое меню на экран
Создаем соединение с базой данных
query("SET NAMES 'utf8'"); /* * Это "официальный" объектно-ориентированный способ сделать это * однако $connect_error не работал вплоть до версий PHP 5.2.9 и 5.3.0. */ if ($mysqli->connect_error) < die('Ошибка подключения (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error); > /* * Если нужно быть уверенным в совместимости с версиями до 5.2.9, * лучше использовать такой код */ if (mysqli_connect_error())
Пишем функцию получения данных из таблицы Categories
//Получаем массив нашего меню из БД в виде массива function getCat($mysqli)< $sql = 'SELECT * FROM `categories`'; $res = $mysqli->query($sql); //Создаем масив где ключ массива является ID меню $cat = array(); while($row = $res->fetch_assoc()) < $cat[$row['id']] = $row; >return $cat; >
Получаем массив вот такого вида, где ключ массива это ID категории.
Далее нам нужно из этого массива построить дерево зависимости дочерних элементов от родительских проходя рекурсивно по всему массиву.
Функция построения дерева из массива от Tommy Lacroix
//Функция построения дерева из массива от Tommy Lacroix function getTree($dataset) < $tree = array(); foreach ($dataset as $id =>&$node) < //Если нет вложений if (!$node['parent'])< $tree[$id] = &$node; >else < //Если есть потомки то перебераем массив $dataset[$node['parent']]['childs'][$id] = &$node; >> return $tree; >
Получаем массив в виде дерева
Скрипт целиком
Результат работы
Многоуровневое меню на PHP + MySQL для админки
Если Вы хотите использовать данное меню в админке своего сайта, то нужно переписать пару функций tplMenu() , showCat() .
'.$category['title'].''; >else< $menu = ''; > if(isset($category['childs'])) < $i = 1; for($j = 0; $j < $i; $j++)< $str .= '→'; >$i++; $menu .= showCat($category['childs'], $str); > return $menu; > /** * Рекурсивно считываем наш шаблон **/ function showCat($data, $str) < $string = ''; $str = $str; foreach($data as $item)< $string .= tplMenu($item, $str); >return $string; > //Получаем HTML разметку $cat_menu = showCat($tree, ''); //Выводим на экран echo ''; ?>