Двухуровневое меню на PHP и MySQL

Всем привет. Последнее время люди спрашивают, как создать двухуровневое меню на PHP, поэтому решил записать видео-урок, в котором я покажу Вам как создавать двухуровневое меню на PHP и MySQL.

Выставляйте хорошее качество (720p)

Для работы нам понадобятся 2 файла, index.php и fns.php

Файл index.php

<body>
<?
include('fns.php');
$menu = get_menu();?>
<ul><?foreach($menu as $item):
$submenu = get_submenu($item['title_url']);
?>
	<li><a href="index.php?view=<?=$item['title_url'];?>"><?=$item['title'];?></a></li>
	<?if(!empty($submenu))
    {
        echo "<ul>";
        foreach($submenu as $item2):?>
	<li><a href="index.php?view=<?=$item['title_url'];?>&amp;t=<?=$item2['title_url'];?>"><?=$item2['title'];?></a></li>
	<?endforeach;
        echo "</ul>";
    }?><?endforeach;?></ul>
</body>

Файл fns.php

<?

    //Функция подключения к базе данных
    function db_connect()
    {
        $host = 'localhost';
        $user = 'test';
        $pswd = 'admin123';
        $db = 'lesson';

        $connection = mysql_connect($host, $user, $pswd);

        mysql_query("SET NAMES utf8");

        mysql_select_db($db, $connection);

        return $connection;
    }

    //Функция выборки основного меню
    function get_menu()
    {
        db_connect();

        $result = mysql_query("SELECT * FROM menu WHERE menu.parent='none' ORDER BY menu.id");

        while($row = mysql_fetch_array($result))
        {
            $res_array[$count] = $row;
            $count++;
        }

        return $res_array;
    }

    //Функция выборки подменю
    function get_submenu($parent)
    {
        db_connect();

        $result = mysql_query("SELECT * FROM menu WHERE menu.parent='$parent' ORDER BY menu.id");

        while($row = mysql_fetch_array($result))
        {
            $res_array[$count] = $row;
            $count++;
        }

        return $res_array;
    }

?>

Если урок Вам был полезен, нажмите на любую кнопку ниже— буду благодарен :) Всем удачи и следите за ходом событий 😉

Комменты

  • Здраствуйте код отказываеться работать выдает ошибку Warning: Invalid argument supplied for foreach() in E:\OpenServer\domains\MusicClub.com\index.php on line 5

  • Добрый вечер! А вы не могли бы подсказать что бы это подменю открывалось при клике а не показывалось сразу и еще если бы вы выпустили урок где объясняете как сделать такое меню + ЧПУ цены бы вам не было заранее благодарю!

  • И не кажется ли вам что два запроса к Бд это через чур ? для такого скрипта ?

  • А что делать если я хочу не ограниченное вложение директорий и под-директорий ?

  • Как-то коряво отображается (((

  • Друг я сам сделал, спасибо

  • Димон спасибо тебе за уроки!

  • А лучше сделайте урок для 2-х уровневого горизонтального меню) буду благодарен)
    Или пришлите на мой ящик если у вас что то похожее уже сделано. Я буду очень признателен.

    • Дмитрий Валак: 08-04-2014 в 18:36

      Тут показана логика построения такого меню, а горизонтальное оно или вертикальное — дело верстки.

  • а почему двух разъезжается в IE горизонтальное двухуровневое меню в php. А в HTML все норм?

  • Не подскажите, а как сделать так, что бы не показывались сразу все подменю. Я например нажал на фото, а у меня показало подменю только к этой вкладке, а остальные не показывало.

  • Есть сервер на Линуксе и на Винде.
    На виндовом вообще ничего не отображает (не ошибка, а просто — неотображение)
    На линуксовом вывело только значки списка (колличество верное), но нет текста… как-то не пойму.

  • А у меня почему-то ничего не отображает. Код выглядит так

    index.php

    <a href="index.php?view=»>

    fns.php

    саму страницу отображает, а менюшку не выводит. Тамблица, бд, логин и пароль верны.
    Может Вы увидите.

    Спасибо за урок.

  • автор, как то же самое проделать используя MVC? К примеру на Codeigniter

  • Здравствуйте
    Написал меню все прекрасно работает большое спасибо.
    Один вопрос как написатьусловие чтобы к «Главной» применялся один стиль а к меню где есть подменю другой.

    • Дмитрий Валак: 22-11-2013 в 21:35

      Здравствуйте, Вадим.
      Используйте условие if.

      if($item['title_url'] == 'home') 
      {
         echo 'class="home"';
      }
      else
      {
          echo 'class="other"';
      }
      

      Что-то вроде этого.

  • По твоему уроку сделал двухуровневое меню из двух таблиц. Все ссылки из этих двух таблиц вывелись но проблема в том что когда кликаешь на родителя все правильно открывается, а когда кликаешь на дочерние открывается все равно родитель!!Подскажи пожалуйста как решить эту проблему???

  • Спасибо!
    Очень понятно и главное понятен сам принцип работы.
    Дмитрий, не могли бы вы записать урок на тему как сделать сайт мультиязычным.
    Не просто вывод текста на нескольких языках, а как сделать, если сайт достаточно большой, использует базу данных, много таблиц с разной информацией.
    Мне кажется это очень актуально, учитывая что ваш сайт посещают и из-за рубежа.
    В рунете я инфы на эту тему не нашла.

  • 30-10-2012 | modin73
    Ну а как сделать примерно такое меню (http://php5lab.com/scripts/demo/60/) с выводом из двух таблиц

    Повторюсь как сделать вывод из двух таблиц и как связать их
    http://modin73.ru

  • Я смотрю твои видео уроки, так держать но можешь выпустить урок посвященный непосредственно работе с методами GET и POST и как их использовать в cms… буду очень благодарен!

  • у меня ошибка:

    Invalid argument supplied for foreach()

  • не могли бы вы сделать такой же урок только для codeigniter, спасибо за ваш труд.

  • А можно обойтись без массивов, сделав тоже самое напрямую из базы циклами?

  • Здравствуйте. Я прошел первый курс по ПХП (теорию) и начал второй (про магазин), но там застрял на выводе из БД товаров с помощью цикла foreach. Я этот курс отложил и начал курс «Экстремальное программирование» и на 6 уроке остановился так как меню не хочет появляться из БД. Опять та же проблема. Подскажите, что делать?

    • Забыл написать, что использую WAMPSERVER.

    • Дмитрий Валак: 21-03-2013 в 18:37

      Здравствуйте. Покажите код использования цикла.

      • Я вам отправил отзыв на счет «Экстремального курса» со скринами кодов цикла, функций индексного файла. Если вам неудобно его там посмотреть, то можно с вами как-то через почту связаться?

        • Дмитрий Валак: 22-03-2013 в 7:41

          Ответил. Отзыв на то и отзыв, этот раздел не для вопросов. Вопросы можно задавать тут support.2develop.ru

  • Дмитрий, прошу прощения за своё мнение, но опять никакой грамотной структуры в базе не наблюдаю. Как мне кажется тут намного уместнее использовать связи между таблицами (один ко многим). Суррогатные ключи тоже не катят в данном случае. Ключём тут может быть title. Впоследствии это избавит от дублирования названий меню на уровне структуры базы. Плюс к этому первичный ключ автоматически индексируется (то есть выборка по ключу). Минус одна (абсолютно левая никому не нужная) колонка которая совсем там не нужна. и т. д.
    Если Вы заинтересуетесь, то я могу вам предоставить правильный курс по MySql
    Уверяю Вас не пожалеете потраченного времени и найдёте много полезного

    • Дмитрий Валак: 08-03-2013 в 8:33

      Здравствуйте.

      С удовольствием посмотрю, скидывайте вот сюда: support.2develop.ru

  • Все разобрался спасибо было два лишних  теги li

  • Дима привет твой урок мне помог но есть небольшая загвоздка, я сделал трех уровневое меню по твоей схеме все без css выводится но если прикручиваю данную схему к css для меню (меню было просто написано в html) выводится только основные пункты меню   выпадающие не работают).

  • Дмитрий! Отрываю Ваш сайт и между, Выставляйте хорошее качество (720p) и 
    Для работы нам понадобятся 2 файла, index.php и fns.php Пустая белая, без   что либо, что у Вас там. 
     
     

  •  
    Здравствуете уважаемый Дмитрий Валак, у меня такая проблема
    У меня ест база с данными я когда обновляю браузер с F5 клавишам у меня данные дублируется.  Никак не получается устранить этого проблему.
    Спасибо за  помощь с Узбекистана

    • Дмитрий Валак: 31-10-2012 в 14:53

      Здравствуйте. К сожалению, я не сталкивался с таким, так что не знаю в чем тут дело.

  • Очень хороший урок, по выводу меню из бд

  • Привет, Дмитрий! Спасибо тебе за твой труд! Только ты забыл закрыть соединение с базой, это очень важно для безопастности. Ну и новичкам необходимо сразу привыкать всё делать правильно. А так всё OK. Удачи!!!

  • Я бы еще обратил внимание на то, чтоб поменьше использовать функции.
    Функции ведь это что? Это то, что облегчает работу, писать кода меньше. А вы туда все что только можно…
    Например, зачем делать вывод через функции, когда формирование меню происходит один раз. и т.д.

    • Дмитрий Валак: 30-10-2012 в 13:04

      Вы предлагаете писать запросы в перемешку с хтмл? По мне так это глупо. Лучше написать функцию, которая находится на своем месте, со всеми остальными. Это в этом уроке получилась функция выборки только меню, а так ее можно сделать уникальной, отправляя параметром название таблицы.

  • Ну а как сделать примерно такое меню (http://php5lab.com/scripts/demo/60/) с выводом из двух таблиц

    • Дмитрий Валак: 30-10-2012 в 12:14

      Точно так же. Только во втором цикле выводите подменю(или что-то другое) из другой таблицы.

  • Обычно делаются поля parentid, где не varchar, а integer. Если есть родитель, то указывается id категории, если нет, то просто 0.

  • Дмитрий, урок хороший-мне был полезен, но быстро очень объясняешь!:) Говори чуть чуть медленней — это как пожелание:)
     

  • Классный урок. Спасибо автору так держать.