首页 > 解决方案 > 我如何从我的类别 mysql 表中制作下拉菜单仅在 parent_id 不为 0 时显示

问题描述

所以嘿,正如标题所说,我正在寻找用子类别制作我的类别。我一直在stackoverflow中寻找我需要的东西,但没有一个对我有帮助的例子..

这是我的桌子的样子 在此处输入图像描述 所以我知道我想要什么,我需要什么,但我不知道我怎么能做到这一点

  1. 我必须SELECT * FROM categories ORDER by position ASC
  2. 我必须检查是否parent_id大于 0。
  3. 我必须parent_id从我的导航栏中删除 ,并仅在它应该位于的类别名称下显示它们 by dropdown menu

但我不知道我怎么能做到这一切..

这是我只选择我的类别并显示它们的方式

                  $catsq = mysqli_query($con,"SELECT * FROM categories ORDER by position ASC");
                    while($catinfo=mysqli_fetch_assoc($catsq)) {
                      echo '
                         <li class="nav-item'.(isset($_GET["cat"]) && $_GET["cat"]==$catinfo["id"] ? " active" : "").'">
                           <a class="nav-link" href="./index.php?cat='.$catinfo["id"].'">'.$catinfo["name"].'</a>
                         </li>
                      ';
                    }

它看起来像这样

<ul class="nav navbar-nav">
    <li class="nav-item">
    <a class="nav-link" href="cat=1">TestCat</a>
    </li>
    <li class="nav-item">
    <a class="nav-link" href="cat=2">TestCat2</a>
    </li>
    <li class="nav-item">
     <a class="nav-link" href="cat=3">TestSub</a>
    </li>
</ul>

但我希望它看起来像这样

<ul class="nav navbar-nav">
    <li class=""><a href="cat=1">TestCat</a></li>
    <li class="dropdown ">
        //TestCat2 have to doing nothing always.
        <a href="#" class="dropdown-toggle" data-toggle="dropdown">TestCat2</i></a>
        <ul class="dropdown-menu">
            <li><a class="nav-link" href="cat=3">TestSub</a></li>
        </ul>
    </li>
</ul>

parent_id大于 0..

如果有人可以帮助我,那就太好了..

谢谢大家。

标签: phphtmlmysqldropdown

解决方案


您可以采取几种方法:

  1. 构建一个数组
  2. 嵌套查询
  3. 递归

大批

这种方法构建了一个可以在视图中迭代的数据结构。工作示例

<?php
// get db connection...

// create categories array
$stmt = mysqli_query($con, "SELECT * FROM categories ORDER BY position ASC");
while( $row = mysqli_fetch_assoc($stmt)) {
    // $category[ $row['parent_id] ][ $row['id'] ] = $row; // use if you need to access other fields in addition to name
    $category[ $row['parent_id] ][ $row['id'] ] = $row['name'];
}

// other php stuff...

?>
<html>

... snip ...

<ul class="nav navbar-nav">
    <?php foreach($category[0] as $id => $name): ?>
        <?php if( isset( $category[$id]) ): ?>

          <li class="dropdown ">
                <a href="#" class="dropdown-toggle" data-toggle="dropdown"><?= $name ?></a>
                <ul class="dropdown-menu">
                <?php foreach($category[$id] as $sub_id => $sub_name): ?>

                    <li><a class="nav-link" href="?cat=<?= $sub_id ?>" ><?= $sub_name ?></a></li>
                <?php endforeach; ?>
                </ul>
          </li>

        <?php else: ?>  

            <li class="">
                <a href="?cat=<?= $id ?>"><?= $name ?></a>
            </li>

        <?php endif; ?>
    <?php endforeach; ?>

</ul>

嵌套查询

使用在幕后执行所有 sql 内容的虚构类最容易显示此方法。为了论证,我们将假设一个类Category有一个名为的方法,该方法listByParent($parent_id)返回具有指定 parent_id 的行列表。

<?php
$cat = new Category();

$topLevel = $cat->listByParent(0);
?>
<html>

... snip ...

<ul class="nav navbar-nav">
    <?php foreach( $topLevel as $topRow ): ?>

        <!-- note, this method is run on every iteration of top level categories -->
        <?php $subRows = $cat->listByParent($topRow['id']) ?>

        <?php if( count($subRows)): ?>
        <li class="dropdown ">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown"><?= $topRow['name'] ?></a>
                <ul class="dropdown-menu">
                <?php foreach($subRows as $row): ?>

                    <li><a class="nav-link" href="?cat=<?= $row['id'] ?>" ><?= $row['name'] ?></a></li>
                <?php endforeach; ?>

                </ul>
          </li>

        <?php else: ?>  

            <li class="">
                <a href="?cat=<?= $topRow['id'] ?>"><?= $topRow['name'] ?></a>
            </li>
        <?php endif; ?>
    <?php endforeach; ?>

</ul>

递归

使用递归将允许您拥有“无限”级别的子类别。但是,在这种情况下,它的复杂程度似乎没有必要。但是如果你想追求它,请注意,最好的方法是为 html 制作一个可以以编程方式访问的模板,并$cat->findByParent()成为关键参与者......


推荐阅读