如何使用MySQL PHP正确地执行多级菜单?
我试图使一个菜单,这是一个主菜单,去2级深(子菜单和子菜单) 我以前在CONCAT小组做过,但那只是1级的深度。事实上,这是两个层次的深真的让我为最佳实践的循环如何使用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
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.' <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.' <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.' <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.' <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;
}
}
}
?>