如何在每个类别下显示多个类别和产品?

时间:2010-05-16 20:28:06

标签: php mysql

通常会有一个类别菜单,每个菜单都链接到一个类别页面,其中显示该类别下的所有项目。

现在,我需要在同一页面中显示PHP / MySQL下面的所有类别和项目。

所以它会是这样的。

Category 1
description of category 1
item 1 (some details, such as name, thumbnail etc for each item)
item 2
..

Category 2
description of category 2
item 5
item 6
..

Category 3
description of category 3
item 8
item 9
...

...

我的数据库中有类别和产品表。

似乎我必须循环浏览类别,并且在每个类别下我都会遍历以获取所有项目。

但我不知道该怎么办。

CREATE TABLE IF NOT EXISTS `omc_product` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `shortdesc` varchar(255) NOT NULL,
  `longdesc` text NOT NULL,
  `thumbnail` varchar(255) NOT NULL,
  `image` varchar(255) NOT NULL,
  `product_order` int(11) DEFAULT NULL,
  `class` varchar(255) DEFAULT NULL,
  `grouping` varchar(16) DEFAULT NULL,
  `status` enum('active','inactive') NOT NULL,
  `category_id` int(11) NOT NULL,
  `featured` enum('none','front','webshop') NOT NULL,
  `other_feature` enum('none','most sold','new product') NOT NULL,
  `price` float(7,2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;



CREATE TABLE IF NOT EXISTS `omc_category` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `shortdesc` varchar(255) NOT NULL,
  `longdesc` text NOT NULL,
  `status` enum('active','inactive') NOT NULL,
  `parentid` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

3 个答案:

答案 0 :(得分:1)

简单方法:执行一个查询以获取类别,然后单独查询以获取每个产品列表。类似的东西:

<?php
    // Shortcuts to essential string-escaping functions
    //
    function h($s) {
        echo htmlspecialchars($s, ENT_QUOTES);
    }
    function u($s) {
        echo urlencode($s);
    }
    function m($s) {
        return "'".mysql_real_escape_string($s)."'";
    }

    // Get all categories
    //
    $q= mysql_query('SELECT id, name, shortdesc FROM omc_category WHERE status='active' ORDER BY id');
    $categories= array();
    while ($categories[]= mysql_fetch_assoc($q)) {}
?>

<?php foreach ($categories as $category) { ?>
    <h2><?php h($category['name']); ?></h2>
    <p><?php h($category['shortdesc']); ?></p>
    <?php
        // Get all products for a category
        //
        $q= mysql_query('SELECT id, name FROM omc_product WHERE status='active' AND category_id='.m($category['id']));
    ?>
    <ul>
        <?php while ($product= mysql_fetch_assoc($q)) { ?>
            <li>
                <a href="/product.php?id=<?php u($product['id']); ?>">
                    <?php h($product['name']); ?>
                </a>
            </li>
        <?php } ?>
    </ul>
<?php } ?>

(注意:这里的m()调用并不是绝对必要的,因为整数可以安全地插入到SQL查询中而不需要转义。但是进入这种习惯并不是一个好主意,就像你用字符串做的那样你有一个SQL注入安全漏洞。我在这里使用mysql_界面手动转义;如果可用的话,使用mysqli_或PDO的参数化查询通常要好得多。防止你担心SQL转义。u()的URL编码也是如此:整数不是必需的,但通常值得养成使用习惯。)

对于一个简单的网站,这没关系。对于包含多个类别的较大网站,您可能希望将所有产品放在一个查询中,您可以这样做:

SELECT omc_product.id, omc_product.name, omc_product.category_id
FROM omc_product
JOIN omc_category ON omc_category.id=omc_product.category_id
WHERE omc_product.status='active' AND omc_category.status='active'
ORDER BY category_id, id

然后在你返回的每一行上,检查category_id自上一行以来是否发生了变化。如果有,则输出上一个查询中相应name对象的shortdesccategory。 (或者您也可以在上面的查询中选择omc_category.nameshortdesc来同时获取它们,但如果描述可能很长,您可能不想这样做。)

另外,请考虑使用InnoDB表,在表之间使用适当的FOREIGN KEY引用。今天使用MyISAM没有什么好理由(除了FULLTEXT)。

`parentid` int(11) NOT NULL,

哦,我希望这并不意味着你有等级类别!这会使一切变得更加复杂。另请参见:嵌套集。

答案 1 :(得分:0)

  

好像我必须循环   类别和每个类别下我   得到所有的循环   项目

  1. 您查询以获取所有类别
  2. 循环您的类别•显示类别常规标题•您查询以获取该类别的所有项目
  3. 循环浏览项目并显示它们

答案 2 :(得分:0)

SELECT A.`id` AS catid, A.`name` AS catname, ..., B.`id` AS prodid, ...
FROM `omc_category` A LEFT JOIN `omc_product` B ON (B.`category_id` = A.`id`)
ORDER BY A.`id`

您甚至不需要按类别排序,但它使处理结果更容易。

注意:如果结果集非常大,我会赞成Lo'oris的方法。