使用数据库值嵌套在php while循环中

时间:2017-12-01 20:03:41

标签: php mysql

我在数据库(phpmyadmin)中有一个菜单,我用一个while循环将其输入到我的标题中。但其中一个菜单项有一个下拉列表。如何更改下面的while循环以便它集成子菜单?换句话说,Home, How It Works, Blog, About and Contact仍然是链接,而Services仍然是一个下拉列表,显示一个单独的while循环,页面为Service1, Service2, Service3...Service nth

这是我到目前为止所做的工作

我的联系顶部

<?php
require_once('db/db_database.php');

// These are menu items Home(id=1), Services(id=2), How It Works(id=3), Blog(id=4), About(id=5), & Contact(id=6)
$sql = " SELECT * FROM menu WHERE id IN (1, 2, 3, 4, 5, 6) ";
$result = $conn->query($sql);


// These are submenu items Svs1(id=10), Svs2(id=20), Svs3(id=30)
$sql2 = " SELECT * FROM menu WHERE id IN (10, 20, 30) ";
$result2 = $conn->query($sql2);
?>

我的主菜单循环没有子菜单正常工作

<?php
    if ($result->num_rows > 0) {
        // output data of each row
        while($row = $result->fetch_assoc()) {
            echo '<li class="nav-item dropdown active">';
            echo '<a href="' . $row["link"] . '" class="nav-link dropdown-toggle animated fadeIn animation-delay-7">' . $row["pagename"] . '</a>';
            echo '</li>';
        }
    } else {
        echo "0 results";
    }
?>

和我希望嵌套在上面循环中的子菜单结构

<li class="nav-item dropdown">
    <a href="#" class="nav-link dropdown-toggle animated fadeIn animation-delay-7" data-toggle="dropdown" data-hover="dropdown" role="button" aria-haspopup="true" aria-expanded="false" data-name="services">
        Services
        <i class="zmdi zmdi-chevron-down"></i>
    </a>
    <ul class="dropdown-menu">
        <li>
            <a class="dropdown-item" href="">
                Service 1
            </a>
        </li>
        <li>
            <a class="dropdown-item" href="">
                Service 2
            </a>
        </li>
        <li>
            <a class="dropdown-item" href="">
                Service 3
            </a>
        </li>                                   
    </ul>
</li>

**请注意li中的整个班组与常规链接不同,因此为什么我更难过。此外,“服务”下拉列表按其显示的顺序排在第二位。所以我不能单独添加它,为什么我假设它应该嵌套来打破循环并在其后的菜单项之后重新启动循环。

P.S。我可以运行3个查询(仅1个用于主页链接,另一个用于服务下拉列表,第三个用于其他菜单项)但我知道必须有更好的方法。

以下是想要的外观

enter image description here

先谢谢你们! 并不是因为你需要一个连接它会有所帮助,但如果你想玩这个菜单,这里有一个带有我的代码的codepen

CODEPEN

修改

为了使它更容易在这里,我现在的工作正常,但太臃肿。 (3个查询)

<?php
    if ($resulthome->num_rows > 0) {
        // output data of each row
        while($row = $resulthome->fetch_assoc()) {
            echo '<li class="nav-item dropdown active">';
            echo '<a href="' . $row["link"] . '" class="nav-link dropdown-toggle animated fadeIn animation-delay-7">' . $row["pagename"] . '</a>';
            echo '</li>';
        }
    } else {
        echo "0 results";
    }
?>
<li class="nav-item dropdown active">
    <a href="#" class="nav-link dropdown-toggle animated fadeIn animation-delay-7" data-toggle="dropdown" data-hover="dropdown" role="button" aria-haspopup="true" aria-expanded="false" data-name="services">
        Services
        <i class="zmdi zmdi-chevron-down"></i>
    </a>
    <ul class="dropdown-menu">
        <?php
            if ($result2->num_rows > 0) {
                // output data of each row
                while($row = $result2->fetch_assoc()) {
                    echo '<li>';
                    echo '<a href="' . $row["link"] . '" class="dropdown-item">' .  $row["pagename"] . '</a>';
                    echo '</li>';
                }
            } else {
                echo "0 results";
            }
        ?>
    </ul>
</li>
<?php
    if ($result1->num_rows > 0) {
        // output data of each row
        while($row = $result1->fetch_assoc()) {
            echo '<li class="nav-item dropdown active">';
            echo '<a href="' . $row["link"] . '" class="nav-link dropdown-toggle animated fadeIn animation-delay-7">' . $row["pagename"] . '</a>';
            echo '</li>';
        }
    } else {
        echo "0 results";
    }
?>

2 个答案:

答案 0 :(得分:1)

您可以在主菜单循环中使用带有条件的子菜单循环。

 if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        if($row['id'] == 2){ // applies only for services
            echo '<li class="nav-item dropdown active">';
            echo '<a href="#" class="nav-link dropdown-toggle animated fadeIn animation-delay-7" data-toggle="dropdown" data-hover="dropdown" role="button" aria-haspopup="true" aria-expanded="false" data-name="services">';
           echo $row["pagename"];
           echo '<i class="zmdi zmdi-chevron-down"></i>';
           echo '</a>';
           // create a new list
            echo '<ul class="dropdown-menu">';
             // loop second/submenu query results
             while($sub_row = $result2->fetch_assoc()) { 
                echo '<li>';
                echo '<a href="' . $sub_row["link"] . '" class="dropdown-item">' . $sub_row["pagename"] . '</a>';

                echo '</li>';  
             }
             echo "</ul>";
             echo '</li>';   
        }else{ // for all other menu links
            echo '<li class="nav-item dropdown active">';
            echo '<a href="' . $row["link"] . '" class="nav-link dropdown-toggle animated fadeIn animation-delay-7">' . $row["pagename"] . '</a>';
            echo '</li>';
        }

    }
} else {
    echo "0 results";
}

答案 1 :(得分:0)

如果要减少数据库查询,可以使用UNION将它们连接在一起,然后添加一个虚拟列,以便识别哪些行属于哪个查询。

这样的事情:

SELECT *, 'first' AS query FROM menu WHERE id IN (1, 2, 3, 4, 5, 6) 
UNION
SELECT *, 'second' AS query FROM menu WHERE id IN (10, 20, 30)

这将在一个查询中返回所有结果,其中包含一个名为query的额外列,然后您可以在foreach逻辑中使用该列。

我可能会先命令查询返回子菜单结果,而不是使用嵌套的foreach循环。将HTML构造成一个变量,然后构造主菜单HTML,然后放入子菜单的变量来代替当前的嵌套循环。