动态菜单树使用递归并从其他四个mysql表获取信息

时间:2019-07-17 22:38:40

标签: php mysql recursion menu

我正在尝试制作一个菜单,该菜单将从四个表格中获取信息,例如pagescategoriessub-categoriesarticles

例如,我想制作一个菜单,看起来像这样:

Home
Category 1
   Subcategory 1.2
   Subcategory 1.3
   Subcategory 1.1
Category 2
   Subcategory 2.3
   Subcategory 2.2
   Subcategory 2.1
Subcategory 4.1
   Article 4.1.2
   Article 4.1.3
   Article 4.1.1
Page 2 (Services)
   Page 3 (Service 1)
   Page 4 (Service 2)
   Page 4 (Service 3)
Page 1 (About us)

数据库表菜单:

+----+---------+---------------------+-----------+-------+--------+
| id | id_menu | type                | parent_id | order | active |
+----+---------+---------------------+-----------+-------+--------+
|  1 |       1 | pages               |         0 |     1 |      1 |
|  2 |       1 | sub_categories      |         0 |     2 |      1 |
|  3 |       2 | sub_categories      |         0 |     4 |      1 |
|  4 |       2 | categories          |         0 |     3 |      1 |
|  5 |       3 | sub_categories      |         4 |     1 |      1 |
|  6 |       2 | sub_categories      |         2 |     1 |      1 |
+----+---------+---------------------+-----------+-------+--------+

(id_menu代表类型的ID)| (parent_id == 0代表菜单的根目录)

输入数据库中的菜单应如下所示:

Page 1
Sub Category 1
   Sub Category 2
Category 2
   Sub Category 3
Sub Category 2

我选择使用type作为表名。 基本上,如果我想将category 1 (id == 1)用作第二个菜单项,则将执行以下操作:

INSERT INTO `menu` (`id_menu`, `type`, `parent_id`, `order`, `active`) VALUES (`1`, `categories`, `0`, `2`, `1`);

我在php中尝试了很多选项来实现它,但是我得到了一个无限循环或一些疯狂的菜单...

我该怎么做?因为我尝试了各种方法,但没有找到相关的解决方案。

我尝试过类似的操作,以使菜单只是一个子菜单。但是然后我得到一个无限循环。

function GetMenuTree($ParentId){
    global $conn;
    $menu = "";
    $MenuData = $conn->prepare("SELECT * FROM menu where parent_id = ?");
    $MenuData->execute([ $ParentId ]);
    while ($row = $MenuData->fetch()) {
        $SQL = "SELECT * FROM " . $row[ 'type' ] . " WHERE id = " . $row[ 'id_menu' ];
        $DataForMenu = $conn->prepare($SQL);
        $DataForMenu->execute();
        foreach ($DataForMenu as $value) {
            $menu .= "\n<li><a href='" . $value[ 'title' ] . "'>" . $value[ 'title' ] . "</a>\n";

            $menu .= "\n<ul>" . GetMenuTree($row[ 'id_menu' ]) . "</ul>\n";

            $menu .= "\n</li>\n";
        }
    }
    return $menu;
}

0 个答案:

没有答案