Mysql
 sql >> база данни >  >> RDS >> Mysql

Динамично меню php bootstrap mysql

Вашият код ще генерира само меню на две нива, ако трябва да преминете през всяко ниво, което искате, мисля, че трябва да използвате рекурсия.

Ето пример, базиран на вашата структура на базата данни и проби. В примера ще генерираме меню на различни нива, английските етикети се използват за имена на елементи от менюто.

<?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>

За да нарисувате всички нива:

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

drawMenu функцията работи както следва:

  • Първо предаваме $db обект за извършване на заявки за база данни, $parent с което дървото ще започне и $level за нивото на дървото.
  • Функцията ще стартира, като изберете дъщерното на дадения $parent и преминете в цикъл за всеки един foreach ($m->fetchAll() as $menu_row) {...} .
  • В цикъла имаме два случая:

    1. Елементът е лист, т.е. не е родител за други елементи, или стигаме до последното ниво на дървото. Този случай се нарича Основен случай , в който рекурсията ще спре и ще върне стойност echo "<li>" . $menu_row['label'] . "</li>";

    2. Елементът е родител, в този случай ние наричаме drawMenu функция отново с идентификатор на елемент $menu_row[0] като родител и $level - 1 за да сте сигурни, че сте спрели, когато достигнете края на нивата.

Тествайте кода и го променете, за да отговаря на вашите нужди.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Копиране на ред, но с нов идентификатор

  2. Разберете къде е инсталиран MySQL на Mac OS X

  3. Mysql Load Inline - Специфични колони

  4. Възможно ли е да се предаде променлива към извикване на съхранена процедура в mysql?

  5. Как да проверя дали два периода от време се припокриват в mysql?