【问题标题】:How can i create dynamic menu with sub-menu with php & mysql?如何使用 php 和 mysql 创建带有子菜单的动态菜单?
【发布时间】:2021-09-13 00:07:40
【问题描述】:

我正在尝试使用 php 从 mysql 表创建一个动态菜单,但我不知道如何创建非类别菜单,这是我目前所拥有的,并且仅使用带有子菜单的类别,但非类别那些没有在 echo 上显示的。

MySQL分类菜单表:

catid        name         group  
1      category name 1      0 -> whithout submenu
2      category name 2      1 -> category
3      category name 3      1 -> category
4      category name 4      0 -> whithout submenu
5      category name 5      0 -> whithout submenu

MySQL子菜单表:

  id      name      parentid -> catid (category menu table)   
    1      name 1     2  
    2      name 2     3
    3      name 3     3
    4      name 4     3
    5      name 5     2

我的 PHP 代码:

 <?php 
           
    function loop($array = array(), $parentID = 0) {
        if (!empty($array[$parentID])) {
            echo '<ul>';
            foreach ($array[$parentID] as $items) {
                echo '<li>';
                echo $items['name'];
                loop($array, $items['catid']);
                echo '</li>';
            }
            echo '</ul>';
        }
    }
    
    function  menu() {  
        $query = $db->query("SELECT m.name, m.parentid, c.group FROM `submenus` m LEFT JOIN( SELECT catid, group, parentid, ico, STATUS , MIN(name) AS category FROM `menu_categories` GROUP BY catid ) c ON m.parentid = c.catid");
        $array = array();
    
        if ($db->numRows($query)) {
            while ($rows = $db->fetch($query)) {
                $array[$rows['parentid']][] = $rows;
            }
            loop($array);
        }
    }
    echo menu();
 ?> 

【问题讨论】:

  • 我用你的代码和我的更改更新了我的答案。你知道什么错误?
  • #1064 - 'FULL JOIN(SELECT 附近的错误
  • 您对类别表的子选择包含 parentid,根据您上面的描述,它位于子菜单表中。也不要在表名或字段名中使用保留字,如“名称”或“组”等。

标签: php mysql arrays nested


【解决方案1】:

不要使用Left Join,它会忽略类别表中未配对的记录,请尝试使用Full Join

<?php 
           
    function loop($array = array(), $parentID = 0) {
        if (!empty($array[$parentID])) {
            echo '<ul>';
            foreach ($array[$parentID] as $items) {
                echo '<li>';
                echo $items['name'];
                loop($array, $items['catid']);
                echo '</li>';
            }
            echo '</ul>';
        }
    }
    
    function  menu() {  
        $query = $db->query("SELECT m.name, m.parentid, c.group FROM `submenus` m FULL JOIN( SELECT catid, group, parentid, ico, STATUS , MIN(name) AS category FROM `menu_categories` GROUP BY catid ) c ON m.parentid = c.catid");
        $array = array();
    
        if ($db->numRows($query)) {
            while ($rows = $db->fetch($query)) {
                $array[$rows['parentid']][] = $rows;
            }
            loop($array);
        }
    }
    echo menu();
 ?>

【讨论】:

  • Ty 回复,我已经替换为完全外连接和错误,你能从我的查询中举个例子吗?
猜你喜欢
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
相关资源
最近更新 更多