Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
 Аватар для Ferrym
0 / 0 / 4
Регистрация: 18.01.2012
Сообщений: 49

Вывод выпадающего меню из MySQL

08.03.2022, 14:09. Показов 822. Ответов 4

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Пытаюсь вытащить из БД меню, хотелось бы получить такое:
Название: 1.jpg
Просмотров: 78

Размер: 7.8 Кб
Имеется структура БД:
SQL
1
2
3
4
5
6
7
8
CREATE TABLE IF NOT EXISTS `menu` (
  `id` INT(10) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) NOT NULL,
  `href` VARCHAR(255) NOT NULL,
  `position` INT(10) NOT NULL,
  `podmenu` INT(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=5 ;
В index.php подключаю шаблоны:
PHP
1
2
3
include("moduls/menu.php");
$menu = menu();
include("templates/index.html");
menu.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?
function menu()
{
$result_index = mysql_query("SELECT * FROM menu ORDER BY position");//Выводим из базы данных все пункты меню
$myrow_index = mysql_fetch_array($result_index);
if($myrow_index != "")//Проверяем есть ли в базе данных записи
{//Если есть...
$sm_read = file("templates/menu.html");//...подключаем шаблон
$sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его
preg_match("/\[_divmenu\](.*?)\[_divmenu\]/s",$sm_read,$div_menu);//Вырезаем из шаблона ту 
//часть, которая будет повторяться
$i=0;//переменная позволяющая создать многомерный массив
do//Цикл do while
{
    $commMASS[$i] = array($myrow_index[id],//0 - ID пункта
                $myrow_index[name],//1 - Имя пункта
                $myrow_index[href],//2 - Ссылка (# - нет ссылки; Пустота - Категория; "http://site.ru/page2.html" - Прямая ссылка)
                $myrow_index[podmenu]);//3 - ID родительного пункта
    $i++;//при каждом цикле меняем элемент многомерного массива на единицу
}
while($myrow_index = mysql_fetch_array($result_index));
 
$menu = station(0,$commMASS,$div_menu[1],0);//функция генерации пунктов стартовые параметры:
//0 - Вывод главных пунктов,
//$commMASS - Многомерный массив со всеми пунктами,
//$div_menu[1] - часть шаблона,
//0 - вложенность - стартовая вложенность нулевая
 
$menu = preg_replace("/\[_divmenu\].*?\[_divmenu\]/s",$menu,$sm_read);//Вместо [_divmenu]...[_divmenu]
//вклеиваем наш с генерированный код из $menu
}
else $menu = "";//Если записей нет, то вывести это сообщение
return $menu;//Выводим с генерированный html код
}
//-------------------------------------------------------------------
function station($stat,$commMASS,$temp,$BC)
{
for($i=0;isset($commMASS[$i]);$i++)//глобальный цикл for
{
    if($commMASS[$i][3] == $stat)//если podmenu пункта равно переменной stat
    {
        $edd_tamp = $temp;//Так как на придется править шаблон,
        //то лучше его сохранить в отдельную переменную, иначе нам придется 
        //пользоваться функцией file() чаще чем 1 раз, а это нагрузка на сервер
 
        //Замены идентификаторов на переменные из базы данных
        if($commMASS[$i][2] == "")$href = "<a href=\"index.php?cat=".$commMASS[$i][0]."\">".$commMASS[$i][1]."</a>";//если нет ссылки то генерируем категорию
        else//если поле href не пусто
        {
            if($commMASS[$i][2] != "#")$href = '<a href="'.$commMASS[$i][2].'" class="nav-link"><i class="nav-icon fas fa-th"></i><p>'.$commMASS[$i][1].'</p></a>';//если поле href не содержит значок "#" значит генерируем прямую ссылку
            else $href = $commMASS[$i][1];//если содержит значок "#" значит пункт является не ссылкой, поэтому выводим только имя
        }
    $style = $BC * 10;//рассчитываем отступ от края в пикселях
    $newBC = $BC + 1;//прибавляем к вложенности единицу
    $podmenu = station($commMASS[$i][0],$commMASS,$temp,$newBC);//перезапускаем функцию с новыми параметрами:
    //$commMASS[$i][0] - id обрабатываемого пункта
    //$commMASS - массив со всеми пунктами
    //$temp - шаблон
    //$newBC - новый уровень вложенности
 
    $edd_tamp = str_replace("[_podmenu]",$podmenu,$edd_tamp);//код-слово заместо которого вставляется пункты которые являются подпунктами
    $edd_tamp = str_replace("[_style]",$style,$edd_tamp);//отступ от левого края в пикселях
    $edd_tamp = str_replace("[_station]",$href,$edd_tamp);//Ссылка
    $menu .= $edd_tamp;// Склеиваем весь с генерированный код в одну переменную
    }
}
if(!isset($menu))return "";//если переменная menu не была создана то результатом будет пустота
else return $menu;//если создана переменная menu то выводим ее
}
?>
Menu.html
HTML5
1
2
3
4
5
6
7
8
9
10
 <nav class="mt-2">
        <ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false">  
[_divmenu]
          <li class="nav-item" style="margin-left:[_style]px;">
                [_station]    
          </li>
          [_podmenu]
[_divmenu]         
        </ul>
</nav>
Как должен выглядеть html меню на странице пользователя:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<li class="nav-item menu-is-opening menu-open">
            <a href="#" class="nav-link">
              <i class="nav-icon fas fa-circle"></i>
              <p>
                Level 1
                <i class="right fas fa-angle-left"></i>
              </p>
            </a>
            <ul class="nav nav-treeview" style="display: block;">
              <li class="nav-item">
                <a href="#" class="nav-link">
                  <i class="far fa-circle nav-icon"></i>
                  <p>Level 2</p>
                </a>
              </li>
              <li class="nav-item">
                <a href="#" class="nav-link">
                  <i class="far fa-circle nav-icon"></i>
                  <p>
                    Level 2
                    <i class="right fas fa-angle-left"></i>
                  </p>
                </a>
                <ul class="nav nav-treeview">
                  <li class="nav-item">
                    <a href="#" class="nav-link">
                      <i class="far fa-dot-circle nav-icon"></i>
                      <p>Level 3</p>
                    </a>
                  </li>
                  <li class="nav-item">
                    <a href="#" class="nav-link">
                      <i class="far fa-dot-circle nav-icon"></i>
                      <p>Level 3</p>
                    </a>
                  </li>
                  <li class="nav-item">
                    <a href="#" class="nav-link">
                      <i class="far fa-dot-circle nav-icon"></i>
                      <p>Level 3</p>
                    </a>
                  </li>
                </ul>
              </li>
              <li class="nav-item">
                <a href="#" class="nav-link">
                  <i class="far fa-circle nav-icon"></i>
                  <p>Level 2</p>
                </a>
              </li>
            </ul>
          </li>

Не могу допереть, как заставить php вставить в нужно место: <ul class="nav nav-treeview" style="display: block;">
Помогите, наведите на мысль?) Буду признателен. Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.03.2022, 14:09
Ответы с готовыми решениями:

Вывод выпадающего меню, данные из базы
Добрый день! Есть таблица в которой хранится меню id автоинкемент, идентификатор пункта меню num номер того меню где должно быть...

Вывод из массива в строку выпадающего меню
Вот из этого массива $arr = array(Москва в пределах МКАД, Москва за МКАД, Другой город); сюда ...

Вывод многоуровнего меню php+mySQL
Доброго времени суток , задумал меню вот как тут БЭМ . Обычно многоуровневое меню вывожу через рекурсию //Ниже выборка из...

4
 Аватар для HotReboot
326 / 227 / 92
Регистрация: 22.04.2017
Сообщений: 1,136
09.03.2022, 07:03
Ferrym, Для начала у вас должны быть не htmlрасширение, а php и там уже вставляете код

PHP
1
2
3
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false">  
<?php //Здесь код на php ?>
<li class="nav-item" style="margin-left:[_style]px;">
0
 Аватар для Ferrym
0 / 0 / 4
Регистрация: 18.01.2012
Сообщений: 49
12.03.2022, 20:26  [ТС]
Просто вывод у меня уже реализован, и не хотелось бы html нагружать php- кодом...
PHP
1
 $edd_tamp = str_replace("[_podmenu]",$podmenu,$edd_tamp);
Хотелось бы понять, как это все обернуть в:
HTML5
1
2
3
<ul class="nav nav-treeview" style="display: block;">
[_podmenu]
</ul>
0
Надуваю лягушек
Эксперт PHP
 Аватар для Царь Бабай
289 / 219 / 93
Регистрация: 01.05.2014
Сообщений: 742
12.03.2022, 21:32
Такое может... или не допонял))))

PHP
1
 $edd_tamp = str_replace('[_podmenu]','<ul class="nav nav-treeview" style="display: block;">'.$podmenu.'</ul>',$edd_tamp);
0
 Аватар для HotReboot
326 / 227 / 92
Регистрация: 22.04.2017
Сообщений: 1,136
13.03.2022, 20:05
Ferrym, Вы никак не нагружаете html php кодом, так как php код обрабатывается сервером и клиенту уже отдаёт только html.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.03.2022, 20:05
Помогаю со студенческими работами здесь

Выпадающее меню не пропадает при переходе на другой заголовок выпадающего меню.
есть 2 выподающих Выпадающий и Выпадающий2 если переходить именно по ним между ними то их выпадающие списки не пропадут. Понятно что...

выпадающее меню внутри выпадающего меню выпало без наведения на кнопку
не могу сделать чтобы при наведении на кнопку страны она находится на 1этапе выпадающего меню выпадало меню где кнопка города на...

Изменить горизонтальное меню - сделать автозакрытие выпадающего меню после отвода курсора
Вообщем что имеем: http://test.aowserv.ru имеется горизонтальное меню, при наведении на кнопку Пример появляется выпадающее меню. вообщем...

Заполнение и вывод дроп-меню <select> средствами php и mysql
Здравствуйте! Такой вопрос: есть меню &lt;select&gt; &lt;option&gt;&lt;/option&gt; ..... &lt;option&gt;&lt;/option&gt; &lt;/select&gt; Есть база mysql, в...

Оптмизация выпадающего меню
я создал выпадающее меню в одной таблице, при наведении выпадает всё что нужно, но если этот список попадает на другую таблицу на странице...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru