php - 如何使我的类别 mysql 表中的下拉菜单仅在parent_id 不为 0 时显示

标签 php html mysql dropdown

所以嘿,正如标题所说,我正在寻找方法来创建带有子类别的类别。我一直在 stackoverflow 中寻找我需要的东西,但没有一个对我有帮助的例子..

这是我的 table 的样子 enter image description here 所以我知道我想要什么和需要什么,但我不知道如何才能做到这一点

  1. 我必须从类别中选择 * 按位置 ASC 排序
  2. 我必须检查 parent_id 是否大于 0。
  3. 我必须从导航栏中删除 parent_id,并仅在类别名称下通过下拉菜单显示它们。

但我不知道如何才能做到这一切..

以下是我如何仅选择我的类别并显示它们

                  $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时..

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

谢谢大家。

最佳答案

您可以采取多种方法:

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

数组

此方法构建了一个可以在 View 中迭代的数据结构。 Working example

<?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() 是关键角色...

关于php - 如何使我的类别 mysql 表中的下拉菜单仅在parent_id 不为 0 时显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59827043/

相关文章:

mysql - django 连接两个唯一的外键

MySQL:INSERT INTO SELECT FROM 具有一些唯一值

php - 使用 php 代码调用 MYSQL CREATE VIEW?

html - 用css控制滚动条高度

php - site_url() 和 base_url() 有什么区别?

javascript - 存储一个数组以在不同页面上访问

html - HTML 字段集的交替行颜色

python - 数据库异常后 SQLAlchemy 回滚中的错误?

调用其他需要模拟的类方法的phpunit测试方法

php - 在 php 中放置一些条件后,某些项目不会回显