【问题标题】:Recursive menu with php and MySQLi带有 php 和 MySQLi 的递归菜单
【发布时间】:2012-09-14 21:29:03
【问题描述】:

我有以下代码:

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>

我想让基本菜单工作,然后处理链接的排序顺序。如果有人可以提供帮助,将不胜感激。

【问题讨论】:

  • MySQL 不支持递归函数,因此不太适合这种存储分层数据的邻接表模型。您应该考虑重组数据以使用嵌套集或传递闭包表。请参阅this answer 了解更多信息。
  • 以我的知识水平来看,这让我正在做的事情几乎不可能。
  • @eggyal 我认为支持递归函数/过程
  • @Petah:递归过程达到固定的最大深度(默认为零),是的。但是功能,没有。并且真的想在这里使用一个功能,例如WHERE is_descendent(node.id, 123).
  • 嘿,如果您也可以进行排序,请分享您的代码吗?谢谢!

标签: php mysql mysqli


【解决方案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>';
      }

}

【讨论】:

    猜你喜欢
    • 2014-02-22
    • 2020-06-11
    • 1970-01-01
    • 2013-11-05
    • 2013-06-13
    • 2014-09-22
    • 2010-10-24
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多