2012-09-14 53 views
1

递归菜单我有以下代码:使用PHP和库MySQLi

function menu($parent, $level){ 
global $dbc; 

$result = $dbc->prepare('SELECT linktext, visible, sort FROM content WHERE parent =? ORDER BY sort'); 
$result->bind_param('s', $parent); 
$result->execute(); 
$result->bind_result($menu_linktext, $menu_visible, $menu_sort); 
$total_records = $result->num_rows; 

if($level > 0 && $total_records > 0){ 
echo '<ul>'; 
} 
while($row = $result->fetch()){ 
echo "<li>"; 
echo '<a href="?page=' . $menu_linktext . '">' . $menu_linktext . '</a>'.$id; 
//display this level's children 
menu($id, $level+1); 
echo "</li>\n"; 
} 
if($level > 0 && $total_records > 0){ 
echo '</ul>'; 
} 
} 
echo '<ul>' . menu(0,0) . '</ul>' 

它为一个链接(首页),然后抛出一个调用一个成员函数bind_param()在非对象错误。

表的基础是:

page | linktext | visable | parent | sort 
    1  Home  1   0  1 
    2  Gallery  1   0  3 
    3  About Us  1   0  2 
    4 Contact Us 1   0  5 
    5  Services  1   0  4 
    6  Diving  0   5  1 
    7  Angling  0   5  2 
    8  Charters  0   5  3 

下面是HTML结构:

<ul class="sf-menu" id="nav"> 
      <li><a href="index.html">Home</a></li> 
      <li><a href="about.html">Examples</a></li> 
      <li><a href="gallery.html">A Page</a></li> 
      <li><a href="#">Services</a> 
      <ul> 
       <li><a href="#">Diving</a></li> 
       <li><a href="#">Angling</a> 
       <li><a href="#">Charter</a></li> 
      </ul> 
      </li> 
      <li><a href="contact.html">Contact Us</a></li> 
     </ul> 

我想要得到的基本菜单,然后工作links.If的排序顺序上工作任何人都可以帮助它将非常感激。

+1

MySQL不支持递归函数,所以它不适合存储分层数据的这种邻接表模型。您应该考虑重构您的数据以使用嵌套集合或传递闭包表。请参阅[本答案](http://stackoverflow.com/a/192462/623041)了解更多信息。 – eggyal

+0

阅读,只是让我看着做我的知识水平几乎不可能。 – Jiggles

+0

@eggyal我认为支持递归函数/程序 – Petah

回答

1

问题解决了!我会发布它是如何完成的,有人可能会使用它。

function menu() 
    { 
    global $dbc; 

    $result = $dbc->prepare('SELECT page, linktext, visable, parent FROM content WHERE visable > 0 ORDER BY parent,sort ASC'); 
    $result->execute(); 
    $result->bind_result($menu_page, $menu_linktext, $menu_visible, $menu_parent); 

    while($result->fetch()) 
    { 
     if($menu_parent == 0) $menu[$menu_page]=$menu_linktext; 
     elseif(!empty($menu[$menu_parent])) $sub[$menu_parent][]=$menu_linktext; 
    } 

    $result->close(); 

    if(!empty($menu)) 
    { 
     echo '<ul class="sf-menu" id="nav">'; 
     foreach($menu as $page=>$link) 
      { 
       echo "<li><a href='$link'>$link</a>"; 
       if(!empty($sub[$page])) 
       { 
        echo '<ul>'; 
        foreach($sub[$page] as $lnk) echo "<li><a href='$lnk'>$lnk</a></li>"; 
        echo '</ul>'; 
       } 
       echo '</li>'; 
      } 
     echo '</ul>'; 
     } 

}