sql >> Databasteknik >  >> RDS >> Mysql

Dynamisk meny php bootstrap mysql

Din kod kommer bara att generera två nivåer meny, om du behöver gå igenom någon nivå du vill, jag tror att du måste använda rekursion.

Här är ett exempel baserat på din databasstruktur och exempel. I exemplet kommer vi att generera en meny på olika nivåer, de engelska beteckningarna används för menyobjekts namn.

<?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å här ritar du alla nivåer:

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

drawMenu funktionen fungerar enligt följande:

  • Först skickar vi en $db objekt för att göra databasfrågor, $parent att trädet börjar med och $level för nivån på trädet.
  • Funktionen börjar med att välja barnet till den givna $parent och gå i loop för var och en foreach ($m->fetchAll() as $menu_row) {...} .
  • I slingan har vi två fall:

    1. Föremålet är ett löv, det vill säga inte en förälder för andra föremål, eller så når vi den slutliga nivån av träd. Detta fall kallas Base case , där rekursionen kommer att stoppa och returnera ett värde echo "<li>" . $menu_row['label'] . "</li>";

    2. Objektet är en förälder, i det här fallet kallar vi drawMenu fungerar igen med objekt-id:t $menu_row[0] som förälder och $level - 1 för att se till att stoppa när du når slutet av nivåerna.

Testa koden och ändra den så att den passar dina behov.




  1. Fixa "INSERT har fler uttryck än målkolumner" i PostgreSQL

  2. behöver hjälp med att optimera wordpress meta_query

  3. Uppdatera mysql-tabellen med vald fråga från en annan databas

  4. Hur ansluter man node.js till mysql- och wamp/xampp-servern?