Merhaba,

Gönderdiğin Tablo yapısı ve kod yapısına uyarak düzenlemeler yaptım, string değerini nereye gönderdiğini kullanmadığını fark etmiş olsam da, başka şekilde değerlendireceğini düşündüm için o bölüme pek dokunmadım. Umarım çalışır, test etme şansım olmadı. İyi çalışmalar.


   function menuler($id = 0, $string = 0) 
    { 
        global $db; 
        $menuIcerik    = $db->prepare("SELECT * FROM panel_menu_menuler WHERE ust_menu_id = ? ORDER BY link_sira ASC"); 
        $menuIcerik->bind_param("s",$id);
        $menuIcerik->execute(); 
        $menuIcerikSonuc = $menuIcerik->get_result(); 

        $returnItem = false;
        /*
         returnItem degeri ön tanımlı olarak false veriliyor, eğer if sorgusu içerisine girmez ise, otomatik olarak false dönecektir, eğer girer ise doğal olarak html değerini dönecektir. 
        */
        if($menuIcerikSonuc->num_rows > 0){
            while($menu = $menuIcerikSonuc->fetch_assoc()){
                $returnItem .= '<li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">'.$menu->link_adi.'<span class="caret"></span></a>'; 
                /*
                    Ana kategori olmasına göre, sub içeriği veriyor bu durumu kendine göre database üzerinden yada kod yordamıyla ayarlayabilirsin. Gönderdiğin ekran görüntüsünü baz olarak bu şekilde düzenledim.
                */
                if($menu["ust_menu_id"] === 0){
                    $getSubs = menuler($menu->id, $string + 2);
                    if($getSubs !== false){
                        $returnItem .= '<ul class="dropdown-menu">'; 
                        $returnItem .= $getSubs; 
                        $returnItem .= '</ul>'; 
                    }
                }
                $returnItem .= '</li>';
            }
        }
        return $returnItem;
    }