Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用MySQL PHP正确地执行多级菜单?_Php_Mysql - Fatal编程技术网

如何使用MySQL PHP正确地执行多级菜单?

如何使用MySQL PHP正确地执行多级菜单?,php,mysql,Php,Mysql,我试图使一个菜单,这是一个主菜单,去2级深(子菜单和子菜单) 我以前在CONCAT小组做过,但那只是1级的深度。事实上,这是两个层次的深真的让我为最佳实践的循环 CREATE TABLE `database`.`main_menu` ( `main_menu_id` INT(11) NOT NULL AUTO_INCREMENT , `main_menu_name` VARCHAR(255) NOT NULL , PRIMARY KEY (`main_menu_id`)) ENGINE = In

我试图使一个菜单,这是一个主菜单,去2级深(子菜单和子菜单)

我以前在CONCAT小组做过,但那只是1级的深度。事实上,这是两个层次的深真的让我为最佳实践的循环

CREATE TABLE `database`.`main_menu` ( `main_menu_id` INT(11) NOT NULL AUTO_INCREMENT , `main_menu_name` VARCHAR(255) NOT NULL , PRIMARY KEY (`main_menu_id`)) ENGINE = InnoDB;

CREATE TABLE `database`.`sub_menu` ( `main_menu_id` INT(11) NOT NULL , `sub_menu_id` INT(11) NOT NULL AUTO_INCREMENT , `sub_menu_name` VARCHAR(255) NOT NULL , PRIMARY KEY (`sub_menu_id`)) ENGINE = InnoDB;

CREATE TABLE `database`.`sub_sub_menu` ( `main_menu_id` INT(11) NOT NULL , `sub_menu_id` INT(11) NOT NULL , `sub_sub_menu_id` INT(11) NOT NULL AUTO_INCREMENT , `sub_sub_menu_name` VARCHAR(255) NOT NULL , PRIMARY KEY (`sub_sub_menu_id`)) ENGINE = InnoDB;


INSERT INTO `main_menu` (`main_menu_id`, `main_menu_name`) VALUES (NULL, 'Food'), (NULL, 'Treats')

INSERT INTO `sub_menu` (`main_menu_id`, `sub_menu_id`, `sub_menu_name`) VALUES ('1', NULL, 'Duck'), ('1', NULL, 'Chicken')
INSERT INTO `sub_menu` (`main_menu_id`, `sub_menu_id`, `sub_menu_name`) VALUES ('2', NULL, 'Bacon Bits'), ('2', NULL, 'Dental')

INSERT INTO `sub_sub_menu` (`main_menu_id`, `sub_menu_id`, `sub_sub_menu_id`, `sub_sub_menu_name`) VALUES ('1', '1', NULL, 'In Gravy'), ('1', '2', NULL, 'in Soup')

INSERT INTO `sub_sub_menu` (`main_menu_id`, `sub_menu_id`, `sub_sub_menu_id`, `sub_sub_menu_name`) VALUES ('2', '3', NULL, 'Sticks'), ('2', '4', NULL, 'Chunks')
MySQL查询:

SELECT ssm.sub_sub_menu_name  as    sub_sub_menu_name ,
sm.sub_menu_name  as    sub_menu_name ,
mm.main_menu_name  as   main_menu_name ,

ssm.sub_sub_menu_id  as     sub_sub_menu_id ,
sm.sub_menu_id  as      sub_menu_id ,
mm.main_menu_id  as     main_menu_id 

FROM        main_sub_sub_menu  as ssm
LEFT JOIN main_menu as mm
    ON mm.main_menu_id  = ssm.main_menu_id 
LEFT JOIN sub_menu as sm
    ON sm.sub_menu_id   = ssm.sub_menu_id  

ORDER BY ssm.sub_sub_menu_id, sm.sub_menu_id, ssm.main_menu_id
PHP在此介绍如何将信息划分为类别:

<?php $cat = $getData->get_menu_categories(); //SQL Query above with PDO
$i = 1;
$j = 1;
for($a=0; $a<= count($cat); $a++){
        if($i == $cat[$a]['main_menu_id']){
            for($j=1; $j < count($cat[$a]['sub_menu_id']); $j++){ // Was getting stuck here because I can't count it unless it is an array
                 //Would show each submenu name, then I would make another for loop for the sub sub menu 
            }
        }else{
            $i++;
        }

您需要循环查询结果并打印如下内容。我使用了破折号来缩进,但您可以使用html来更清晰地进行缩进。我为任何想帮忙的人做了一把db小提琴


|---------------------|------------------|------------------|
|id |菜单|名称|父项| id|
|---------------------|------------------|------------------|
|1 |主菜单|空|
|---------------------|------------------|------------------|
|2 |子菜单| 1|
|---------------------|------------------|------------------|
|3 |子菜单| 2|
|---------------------|------------------|------------------|
像这样设计你的表格,这样你就不必为每一个子元素制作表格,而且你可以在里面达到任何级别。

    <ul>
        <li>
            <ul class="nav__list">
    
    <?php
    // $cat = $getData->get_menu_categories(); // put your SQL request to the database here
    $lastmain = '';
    $lastsub = '';
    $lastsubsub = '';
    $mainx=1;
    $mainy=0;
    $subx=0;
    $suby=0;
    $subsubx=0;
    $subsuby=0;
    $startmainx = 0;
    ?>
    <nav class="nav" role="navigation">
      <ul class="nav__list">
    <?php
    foreach ($cat as $line) {
       $main = $line['main_menu_name'];
       $sub = $line['sub_menu_name'];
       $subsub = $line['sub_sub_menu_name'];
    
       $mainid = $line['main_menu_id'];
       $subid = $line['sub_menu_id'];
       $subsubid = $line['sub_sub_menu_id'];
    
       if ($lastmain <> $main) {
            if($mainx <> $mainy){
                if($startmainx == 0){
                    $mainx = $mainy;
                    $startmainx =1;
                }else{
                    print '</ul></li></ul></li>';//beginning
                    $mainx = $mainy;
                }
            }
           echo '<li>
           <input id="group-'.$subid.'" type="checkbox" hidden />
           <label for="group-'.$subid.'">'.$main.'&nbsp; <span class="fa fa-angle-right"></span></label>';
            if(($mainx == $mainy) && ($lastmain == '')){
                echo '<ul class="group-list">';
                $mainx++;
            }
           $lastmain = $main;
            if(($mainx == $mainy) && ($lastmain == $main)){
                echo '<ul class="group-list"><li>'; //end
                $lastsub = '';
                $mainx++;
            }
       }//end 1st menu 
       if ($lastsub <> $sub) {
        if(($subx <> $suby) && ($lastsub == '')){
            $suby++;
        }
        if($subx <> $suby){
            print "</ul>";
            $suby++;
        }
           echo '<input id="sub-group-'.$subsubid.'" type="checkbox" hidden />
           <label for="sub-group-'.$subsubid.'">'.$sub.'&nbsp; <span class="fa fa-angle-right"></span></label>';
            $lastsub = $sub;
            if($subx == $suby){
                    echo '<ul class="sub-group-list">';
                $subx++;
            }
       }//End 2nd menu
       if ($lastsubsub <> $subsub) {
            if($subsubx <> $subsuby){
                $subsubx =$subsuby;
            }
           echo '<li><a href="'.$subsubid.'">'.$subsub.'</a></li>';
            $lastsubsub = $subsub;
            if($subsubx == $subsuby){
               $subsubx = $subsuby;
            }
       }
    }
    ?>
    

我想向大家展示我是如何根据mankowitz的回答向其中添加html的。

我不太清楚你的问题。您可以通过显示示例表数据和预期输出来重新表述它吗?希望这会有所帮助。只是一个带有父项、子项和子项的
  • 样式列表,menuI想知道我的MySQL查询逻辑在我尝试执行PHP之前获取数据的方式是否有误?我看不出你在尝试做什么,所以我无法真正进行评论。希望这有助于解释我想做的事情,这是最简单、最直接、效果最好的代码。我花了几天时间想弄明白这一点现在,我只需要添加ids,它还帮助我通过ssm.main\u menu\u id ASC、msm.sub\u menu\u id ASC、ssm.main\u sub\u menu\u id ASC更改SQL顺序,因此它不必位于单独的表中。很高兴知道。:)对于大多数用例,这是一种更好的表示层次数据的方法,因为您可以拥有infinte级别的菜单。然而,菜单的广度和深度往往有限,而且您拥有的数据结构已经足够了。另一个选项是以XML或JSON的形式存储菜单。 |---------------------|------------------|------------------| | id | menu_name | parent_id | |---------------------|------------------|------------------| | 1 |Main Menu | null | |---------------------|------------------|------------------| | 2 |sub Menu | 1 | |---------------------|------------------|------------------| | 3 |sub sub Menu | 2 | |---------------------|------------------|------------------|
    <ul>
        <li>
            <ul class="nav__list">
    
    <?php
    // $cat = $getData->get_menu_categories(); // put your SQL request to the database here
    $lastmain = '';
    $lastsub = '';
    $lastsubsub = '';
    $mainx=1;
    $mainy=0;
    $subx=0;
    $suby=0;
    $subsubx=0;
    $subsuby=0;
    $startmainx = 0;
    ?>
    <nav class="nav" role="navigation">
      <ul class="nav__list">
    <?php
    foreach ($cat as $line) {
       $main = $line['main_menu_name'];
       $sub = $line['sub_menu_name'];
       $subsub = $line['sub_sub_menu_name'];
    
       $mainid = $line['main_menu_id'];
       $subid = $line['sub_menu_id'];
       $subsubid = $line['sub_sub_menu_id'];
    
       if ($lastmain <> $main) {
            if($mainx <> $mainy){
                if($startmainx == 0){
                    $mainx = $mainy;
                    $startmainx =1;
                }else{
                    print '</ul></li></ul></li>';//beginning
                    $mainx = $mainy;
                }
            }
           echo '<li>
           <input id="group-'.$subid.'" type="checkbox" hidden />
           <label for="group-'.$subid.'">'.$main.'&nbsp; <span class="fa fa-angle-right"></span></label>';
            if(($mainx == $mainy) && ($lastmain == '')){
                echo '<ul class="group-list">';
                $mainx++;
            }
           $lastmain = $main;
            if(($mainx == $mainy) && ($lastmain == $main)){
                echo '<ul class="group-list"><li>'; //end
                $lastsub = '';
                $mainx++;
            }
       }//end 1st menu 
       if ($lastsub <> $sub) {
        if(($subx <> $suby) && ($lastsub == '')){
            $suby++;
        }
        if($subx <> $suby){
            print "</ul>";
            $suby++;
        }
           echo '<input id="sub-group-'.$subsubid.'" type="checkbox" hidden />
           <label for="sub-group-'.$subsubid.'">'.$sub.'&nbsp; <span class="fa fa-angle-right"></span></label>';
            $lastsub = $sub;
            if($subx == $suby){
                    echo '<ul class="sub-group-list">';
                $subx++;
            }
       }//End 2nd menu
       if ($lastsubsub <> $subsub) {
            if($subsubx <> $subsuby){
                $subsubx =$subsuby;
            }
           echo '<li><a href="'.$subsubid.'">'.$subsub.'</a></li>';
            $lastsubsub = $subsub;
            if($subsubx == $subsuby){
               $subsubx = $subsuby;
            }
       }
    }
    ?>