sql >> Database teknologi >  >> RDS >> Mysql

Dynamisk menu php bootstrap mysql

Din kode vil kun generere en menu på to niveauer, hvis du har brug for at gennemgå et hvilket som helst niveau, du ønsker, tror jeg, at du skal bruge rekursion.

Her er et eksempel baseret på din databasestruktur og eksempler. I eksemplet vil vi generere en menu på forskellige niveauer, de engelske etiketter bruges til menupunkters navne.

<?php
$db = new PDO('mysql:host=localhost;dbname=testdb', 'root', '');



function drawMenu($db, $parent, $level = null){
    $m = $db->prepare(" SELECT * FROM 
                        administrator_menu, administrator_menu_description
                        where administrator_menu.id = administrator_menu_description.id
                        and language_id = 2
                        and parent_id = $parent");
    $m->execute();


    foreach ($m->fetchAll() as $menu_row) {
        $m = $db->prepare("SELECT count(*) FROM administrator_menu where parent_id = $menu_row[id]");
        $m->execute();
        // The item is parent, so do recursion again
        if($m->fetchAll()[0][0] !== '0' && $level !== 0){ 
            echo "<li>" . $menu_row['label']."<ul>";
            drawMenu($db, $menu_row[0], $level - 1);
            echo "</ul></li>";
        }else{ // The item is a leaf or we reach the end level, i.e. base case, so do print the item label 
            echo "<li>" . $menu_row['label'] . "</li>";
        }

    }

}
?>
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<?php
echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";
echo "--------------------------------------------------------";
echo "<div> <ul>";
drawMenu($db, 0, 0); // level 0
echo "</ul></div>";
echo "--------------------------------------------------------";
echo "<div> <ul>";
drawMenu($db, 0, 1); // level 1
echo "</ul></div>";
echo "--------------------------------------------------------";
echo "<div> <ul>";
drawMenu($db, 0, 2); // level 2
echo "</ul></div>";
?>
</body>
</html>

Sådan tegner du alle niveauer:

echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";

drawMenu funktion fungerer som følgende:

  • Først sender vi en $db objekt for at lave databaseforespørgsler, $parent at træet starter med og $level for træets niveau.
  • Funktionen starter med at vælge barnet til den givne $parent og gå i loop for hver foreach ($m->fetchAll() as $menu_row) {...} .
  • I løkken har vi to tilfælde:

    1. Genstanden er et blad, dvs. ikke en forælder til andre varer, eller vi når det endelige niveau af træ. Denne sag kaldes Basissagen , hvor rekursionen stopper og returnerer en værdi echo "<li>" . $menu_row['label'] . "</li>";

    2. Elementet er en forælder, i dette tilfælde kalder vi drawMenu funktion igen med element-id'et $menu_row[0] som forælder og $level - 1 for at sørge for at stoppe, når du når slutningen af ​​niveauerne.

Test koden, og skift den, så den passer til dine behov.




  1. Fejl 1215:Kan ikke tilføje fremmednøglebegrænsning

  2. Hvad er den bedste måde at indsætte flere rækker i en mysql-database ved hjælp af php?

  3. MySQL - CONCAT - Er der nogen måde at sammensætte en streng og bruge den som en variabel?

  4. mysqli indsæt - men kun hvis det ikke er en dublet