gpt4 book ai didi

php - 如何展示多个分类以及每个分类下的产品?

转载 作者:行者123 更新时间:2023-11-29 15:02:20 27 4
gpt4 key购买 nike

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

现在我需要在同一页面中使用 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 ;

最佳答案

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

<?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 查询中而无需转义。但是养成这种习惯并不是一个好主意,就像您使用字符串那样d 有一个 SQL 注入(inject)安全漏洞。我在这里使用 mysql_ 接口(interface)并手动转义;使用 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自上一行以来已更改。如果有,则输出nameshortdesc相应的category来自上一个查询的对象。 (或者您也可以在上面的查询中选择 omc_category.nameshortdesc 以同时获取它们,但如果描述可能很长,您可能不想这样做。)

另外,考虑使用具有适当 FOREIGN KEY 的 InnoDB 表表之间的引用。如今,没有什么充分理由使用 MyISAM(FULLTEXT 除外)。

`parentid` int(11) NOT NULL,

哦,我希望这并不意味着您有分层类别!那会让一切变得更加复杂。另请参阅:嵌套集。

关于php - 如何展示多个分类以及每个分类下的产品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2845347/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com