0

我有 3 个表,top_category、bottom_category、products,目前我已经列出了 top_category,我对如何列出第二个类别感到困惑,但是它列出了它,所以它也知道它属于什么 top_category,这就是为什么我有外键父级,所以如果 top_category 例如是:

prod1 
prod2
prod3
etc

现在我想将我的底部类别加载到这些 top_categories 中,如下所示:

prod1
 -subprod1
 -subprod2
 -subprod3
prod2
 -subprod4
 -subprod5
prod3
 -subprod6
etc

这是我的数据库:

CREATE TABLE top_category (
  id INT PRIMARY KEY,
  NAME VARCHAR(100) 
);

CREATE TABLE bottom_category (
  id INT PRIMARY KEY,
  NAME VARCHAR(100) ,
  top_category_id INT REFERENCES top_category
);

create table product (
  id int primary key,
  name varchar(100) ,
  bottom_category_id int references bottom_category
);

这是我的 php & html 代码:

<?php
include('dbconnect.php'); 

try
    { 
        $result = $pdo->query(" SELECT * FROM top_category ORDER BY top_name ASC; ");
    } // end try
    catch (PDOException $e) 
    { 
        echo 'There was a error fetching the products.' . $e->getMessage();
        exit(); 
    } // end catch

$products = array();

foreach ($result as $row)
{
    $products[] = array('id' => $row['id'],    
                        'top_name' => $row['top_name']);
}

?>

<div class="sidebar">
    <h4 class="sidebar-header">Select Products</h4>
    <form class="nav-search-form">
        <input type="search" name="search" placeholder="Search products">
    </form>
    <nav class="sidebar-links"> 
        <ul>
            <li><a id="red" href="index.php">New Products</a></li>
            <?php foreach ($products as $product): ?>
            <li><a href="#"><?php echo htmlspecialchars($product['top_name']);?></a>

            <?php endforeach; ?>    
                <ul>
                    <li><a href="#"></a></li>
                </ul>
            </li>   
        </ul>
    </nav>
</div><!-- sidebar -->
<div class="main-content">
4

1 回答 1

0

您应该将您的top_categorybottom_category表合并到一个表中,也许category. 真的没有理由将这些分开。它看起来像这样:

CREATE TABLE category (
  id INT PRIMARY KEY,
  parent_id INT,
  NAME VARCHAR(100) 
);

对于所有“顶级”类别,parent_id将是 0。对于任何“底部”类别,parent_id将是它id所属的“顶级”类别。除了稍微清理数据库之外,如果您愿意,它还允许将来扩展到不止两层。

然后,您将创建一个递归函数(一个调用自身的函数)来循环并显示菜单结构,如下所示:

function menus( $parent_id, $pdo ) {
    $menu_query = "SELECT * FROM category WHERE parent_id = :parent_id";
    $menu_result = $pdo->prepare( $menu_query );
    $menu_result->execute( array( ":parent_id" => $parent_id ));

    $menu = "";
    if( $menu_result->rowCount() ) {
        $menu .= "<ul>\n";

        while( $menu_row = $menu_result->fetch( PDO::FETCH_ASSOC )) {
            $menu .= "<li>{$menu_row['NAME']}\n";
            $menu .= menus( $menu_row['id'], $pdo );
            $menu .= "</li>\n";
        }

        $menu .= "</ul>\n";
    }

    return $menu;
}

然后要显示您的菜单,您只需打印函数的结果:

print menus( 0, $pdo );

它将返回一个基本上如下所示的结构:

<ul>
  <li>prod1
    <ul>
      <li>subprod1</li>
      <li>subprod2</li>
      <li>subprod3</li>
    </ul>
  </li>
  <li>prod2
    <ul>
      <li>subprod4</li>
      <li>subprod5</li>
    </ul>
  </li>
  <li>prod3
    <ul>
      <li>subprod6</li>
    </ul>
  </li>
</ul>

(为了可读性添加了缩进,上面的代码没有添加缩进,但这是结构)。

这基本上就是这样做的。该函数提取所有顶级条目,然后在遍历每个条目时,它调用自身,但使用当前选定条目的 ID,然后拉出所有子条目,并执行相同的操作。每次它完成一个层(即为给定级别的所有条目创建结构)时,它会将其返回给父函数并连接数据。

我没有测试过这个特定的代码,所以它可能在这里或那里包含一个小问题,但这个概念是可靠的(我自己已经实现了很多次)。

更新(样式)

如果您想将样式应用于此菜单,其中每个图层都有一组不同的样式,有两种方法可以做到这一点。第一个是函数的 $level 变量,因此它的定义如下:

function menus( $parent_id, $pdo, $level )

首先调用它0作为关卡,然后在函数中调用它$level + 1。这样,将使用正确的值调用每个连续级别。您可以基于此创建类,例如level-1,然后将元素定义为 have class="level-{$level}"

第二种是将整个事物包装在 a<div>中,然后使用直接子选择器来引用特定级别。 div>ul>li将是 的第一级<li>div>ul>li>ul>li将是 的第二级<li>,依此类推。

于 2013-08-10T03:57:05.867 回答