sql >> データベース >  >> RDS >> Mysql

動的メニューphpブートストラップmysql

    コードは2つのレベルのメニューしか生成しません。必要なレベルを通過する必要がある場合は、再帰を使用する必要があると思います。

    これは、データベース構造とサンプルに基づく例です。この例では、さまざまなレベルでメニューを生成します。メニュー項目の名前には英語のラベルが使用されています。

    <?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) {...}ごとにループします 。
    • ループには2つのケースがあります:

      1. アイテムはリーフです。つまり、他のアイテムの親ではありません。または、ツリーの最終レベルに到達します。このケースはベースケースと呼ばれます 、再帰が停止し、値echo "<li>" . $menu_row['label'] . "</li>";

      2. アイテムは親です。この場合、drawMenuと呼びます。 アイテムID$menu_row[0]で再び機能します 親として、$level - 1 レベルの終わりに達したときに必ず停止するようにします。

    コードをテストし、ニーズに合わせて変更します。




    1. SQL:フルネームフィールドから名、ミドルネーム、ラストネームを解析します

    2. すべてのテーブル、ストアドプロシージャ、トリガー、制約、およびすべての依存関係を1つのSQLステートメントにドロップします

    3. 列数が行1の値数と一致しません

    4. PHPエラー->警告:mysqli_stmt ::execute():mysqli_stmtをフェッチできませんでした|警告:mysqli_stmt ::close()