【问题标题】:PHP/MySQL Navigation MenuPHP/MySQL 导航菜单
【发布时间】:2011-04-11 23:26:26
【问题描述】:

我正在尝试为分层导航菜单栏创建一个功能。

我希望能够拥有这样的东西......

<ul id="navigation">
<li><a href="#">Menu Item 1</a></li>
<li><a href="#">Menu Item 2</a></li>
    <ul>
        <li><a href="#">Sub Menu Item 1</a></li>
        <li><a href="#">Sub Menu Item 1</a></li>
    </ul>
<li><a href="#">Menu Item 3</a></li>
<li><a href="#">Menu Item 4</a></li>
</ul>

我正在使用这个功能,但它并没有像我希望的那样正常工作。它显示主要的父链接,但不显示子链接。

function build_navbar($pid,$sub=0)
{
    global $db;

    $query = $db->simple_select("navbar", "*", "pid='".$pid."'", array("order_by" => "disporder"));
    $menu_build = "<ul id=\"navigation\">\n";
    while($menu = $db->fetch_array($query))
    {   
        if($sub == 1)
        {
           $menu_build .= "<ul>\n";
           $menu_build .= "<li><a href=\"#\">".$menu['title']."</a></li>\n";
           $menu_build .= "</ul>\n";
        }
        else
        {
           $menu_build .= "<li><a href=\"#\">".$menu['title']."</a></li>\n";
        }
        build_navbar($menu['id'],1);
    }
    $menu_build .= "</ul>\n";

    return $menu_build;
}

也许有人可以帮我解决这个问题?谢谢。

--- 新更新 ---

Andy Groff,这是您的代码输出的内容:

<ul id="navigation">
    <li><a href="#">Home</a></li>
    <ul>
        <li><a href="#">Child Link</a></li>
        <li><a href="#">Child 2</a></li>
    </ul>
    <li><a href="#">Parent</a></li>
</ul>

但是,我需要对其进行修改,使其输出如下:

<ul id="navigation">
    <li><a href="#">Home</a>
        <ul>
            <li><a href="#">Child Link</a></li>
            <li><a href="#">Child 2</a></li>
        </ul>
    </li>
    <li><a href="#">Parent</a></li>
</ul>

这是它现在输出的内容,安迪:

<ul id="navigation">
    </li>
    <li><a href="#">Home</a>
    </li>
    <ul>
        <li>
        <a href="#">Child Link</a>
        </li>
        <li><a href="#">Child 2</a>
    </ul>
    </li>
    <li><a href="#">Parent</a>
</ul>

【问题讨论】:

  • 你能告诉我们它输出的是什么吗?
  • 当然。我已经更新了我的问题帖子。
  • 你能给你的数据库架构吗?
  • 好的,我已将数据库架构添加到帖子中。
  • 你应该使用 jQuery UI 和 ajax

标签: php mysql


【解决方案1】:

我认为您的问题可能与您的函数是递归的事实有关,但是您正在构建的字符串每次都会在函数顶部重置,而不是再次传递给函数。此外,我看不到任何地方 sub 将在您的最终迭代中归零。此外,您似乎不需要查询每一行。查询一次并构建整个菜单会更有效。我认为可以放弃递归。另外,我建议在您的数据中存储一个“子”标志,而不是使用一些难以理解的 php 逻辑来判断给定行是否是子菜单。我根据这些概念进行了修改,但不知道它是否有效,因为我没有/不想创建数据来测试它:

function build_navbar()
{
    global $db;
    //first things first, i'd recommend putting a "sub" flag in your database. This example will use it.

    //start off by getting all of the rows. No need for recursion.
    $query = $db->simple_select("navbar", "*", "1", array("order_by" => "disporder"));
    $menu_build = "<ul id=\"navigation\">\n";

    //keep track of what level we're at
    $level = 1;

    while($menu = $db->fetch_array($query))
    {
      //get sub from data
      $sub = $menu['sub']

      //we need to go back to root level
      if($sub == 0 && $level == 2){
        $level--;
        $menu_build .= "</ul></li>\n";
      }
      else $menu_build .= "</li>\n";

      //we need to go up one level
      if($sub == 1 && $level == 1)
      {
        $level++;
        $menu_build .= "<ul><li>\n";
      }
      else $menu_build .= "<li>";
      //always print out a link
      $menu_build .= "<a href=\"#\">".$menu['title']."</a>\n";
    }
    $menu_build .= "</ul>\n";

    return $menu_build;
}

【讨论】:

  • 感谢您的代码!它似乎工作得很好,但是,我需要一个我似乎无法工作的修改。请参阅我的第一篇文章以获取信息。谢谢。
  • 不幸的是,这不起作用。查看我的编辑以了解它输出的内容。
【解决方案2】:

更新:

试试这个:

function build_navbar($pid, $sub=0)
{
    global $db;

    $class = $sub ? "sub" : "navigation";

    $menu_build = "<ul class=\"$class\">\n";

    $query = $db->simple_select("navbar", "*", "pid='".$pid."'");
    while($menu = $db->fetch_array($query))
    {
        $menu_build .= "<li><a href=\"#\">".$menu['title']."</a>\n";

        // build child links
        $menu_build .= build_navbar($menu['id'],1);
    }

    $menu_build .= "</ul>";

    return $menu_build;
}

我们在这里所做的是允许每个函数构建一个&lt;ul&gt;&lt;li&gt; 组,$sub 变量将确定&lt;ul&gt; 的 ID,允许您以不同的方式设置每个 ul 的主题。


编辑:

我找到了!

这一行

build_navbar($menu['id'],1);

需要改成这样:

$menu_build = build_navbar($menu['id'],1);

它看起来应该对我有用。

我要做的是添加一些 echo 语句来显示每次执行的 SQL 查询,然后您可以将其复制到 phpmyadmin(或您使用的任何 db 浏览器)中。看看它是否也返回一个空结果。如果是这样,您的数据也可能有问题。

例如:

echo "SELECT FROM navbar * WHERE pid='$pid' ORDER_BY disporder;<br>";

【讨论】:

  • $sub 是在函数调用时赋值的,不是吗?最初为 0,当它是子菜单时为 1。
  • 哦,很好的调用,我怎么在函数调用中错过了呢?美好时光
  • 如果您在 phpmyadmin 中运行,“子”查询是否会获取行?
  • @ohmusama:谢谢,这确实有效,但是,我还有一个问题需要解决。请在我的帖子上查看我的更新。谢谢!
  • 我有点假设会是这样。尝试添加子数据并使用我的功能。它将为您将来如何组织事物提供更大的灵活性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多