【问题标题】:Get total number of products by brand with multiple categories with PHP and MySQL使用 PHP 和 MySQL 按品牌获取多个类别的产品总数
【发布时间】:2020-04-04 22:36:31
【问题描述】:

我有一个疑问:SELECT brand FROM products WHERE brand='".$brand."' AND category='".$id."'".$categories_list."

这个想法是通过一个类别 ID 或一个品牌编号的 ID 来计算一个类别内或多个类别中的总产品数。

当前的代码:

foreach ($product_brands as $brand) {
    $products_sql = mysqli_query($mysql_link, "SELECT brand FROM products WHERE brand='".$brand."' AND category='".$id."'".$categories_list."");
    $brand_total = @mysqli_num_rows($products_sql);
    array_push ($product_brands_count, $brand_total);
}

只计算一个类别时它可以正常工作。但是,在尝试计算多个类别时,它会显示错误的计数。

如果显示多个类别,$categories_list 会将OR category='".$categories_data['id']."' 添加到查询中。

我尝试在查询语句中移动brand='".$brand."',但这对我不起作用。

这是我得到的一些计数。

单一类别:--正确

Brand 1 = 3 
Brand 2 = 5

多个类别——不是

Brand 1 = 8
Brand 2 = 11

【问题讨论】:

  • 您需要将所有category 匹配项括在括号中,因为它们包含OR。基本逻辑。一种更有效的方法是将IN 用于类别。
  • 您也对SQL injection 敞开心扉。你应该改用prepared statements

标签: php mysql sql where-clause


【解决方案1】:

您的主要问题是逻辑优先问题。您正在生成一个 where 子句,例如:

WHERE brand = ? AND category = ? OR category = ?

由于AND的出现率高于AND,这实际上意味着:

WHERE (brand = ? AND category = ?) OR category = ?

这接受其类别与第二个类别参数匹配的行,无论其品牌如何。

你需要括号来控制位置:

WHERE brand = ? AND (category = ? OR category = ?)

这可以用IN缩短:

WHERE brand = ? AND category IN (?, ?)

但最重要的是,我看不出在 php 中循环遍历品牌、获取所有行然后对它们进行计数的意义。您的数据库可以通过聚合查询更有效地管理行集。

这样的东西应该接近你所需要的:

select brand, count(*) no_products
from products
group by brand
where category in (?, ?)

请注意,上述所有查询都是参数化的(即,参数未在查询字符串中连接,而是在execute 时间传递给查询)。您确实想使用这种技术来提高代码效率并防止 SQL 注入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2018-02-07
    • 1970-01-01
    • 2017-06-13
    相关资源
    最近更新 更多