通常会有一个类别菜单,每个菜单都链接到一个类别页面,其中显示该类别下的所有项目。
现在,我需要在同一页面中显示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 ;
答案 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
对象的shortdesc
和category
。 (或者您也可以在上面的查询中选择omc_category.name
和shortdesc
来同时获取它们,但如果描述可能很长,您可能不想这样做。)
另外,请考虑使用InnoDB表,在表之间使用适当的FOREIGN KEY
引用。今天使用MyISAM没有什么好理由(除了FULLTEXT)。
`parentid` int(11) NOT NULL,
哦,我希望这并不意味着你有等级类别!这会使一切变得更加复杂。另请参见:嵌套集。
答案 1 :(得分:0)
好像我必须循环 类别和每个类别下我 得到所有的循环 项目
答案 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的方法。