PHP按类别过滤搜索结果并计数

Posted

技术标签:

【中文标题】PHP按类别过滤搜索结果并计数【英文标题】:PHP Filtering search results by category with count 【发布时间】:2012-08-10 22:59:14 【问题描述】:

我正在尝试使用高级边栏来在有人使用搜索栏时过滤结果。我有常规搜索工作,还让它在另一个侧边栏(即价格范围、品牌、条件)上显示一个类别中的项目数,但现在我希望用户单击一个类别并缩小结果,就像你看到的那样新蛋网。

这是我的搜索查询:

 function build_query($product_search) 
$search_query = "SELECT * FROM tbl_product p INNER JOIN tbl_brand b ON p.br_id = b.br_id";
$clean_search = str_replace(',', ' ', $product_search);
$search_word = explode(' ', $clean_search);
$final_search_words = array();
if (count($search_word) > 0) 
    foreach ($search_word as $word) 
        if (!empty($word)) 
            $final_search_words[] = $word;
        
    

$where_list = array();
if (count($final_search_words) > 0) 
    foreach($final_search_words as $word) 
        $where_list[] = "p.pd_name LIKE '%$word%'";
    

$where_clause = implode(' OR ', $where_list);
if(!empty($where_clause)) 
    $search_query .= " WHERE $where_clause";

计算类别的侧边栏也是如此:

function narrow_query($product_search) 
$search_query = "SELECT p.pd_name, p.pd_con, b.br_name AS name, c.cat_name AS cat,
    COUNT(p.pd_con) AS con, COUNT(b.br_name) AS brand, COUNT(c.cat_name) AS cat_c,
    COUNT(CASE WHEN p.pd_price >= '00.01' AND p.pd_price <= '99.99' THEN 1 END) AS cnt1,
    COUNT(CASE WHEN p.pd_price >= '100.00' AND p.pd_price <= '199.99' THEN 1 END) AS cnt2,
    COUNT(CASE WHEN p.pd_price >= '200.00' AND p.pd_price <= '299.99' THEN 1 END) AS cnt3,
    And so on and so on...
                FROM tbl_product p JOIN tbl_brand b ON b.br_id = p.br_id
                JOIN tbl_category c ON c.cat_id = p.cat_id";
$clean_search = str_repl...
    (Same word filter code as above)

现在我通过抓住 $_GET 来完成一些工作:

"<a href=\"" . $_SERVER['php_SELF'] . "?productsearch=" . $product_search . "&narrow=" . $row['cat'] . "$link=1\">"

在我的函数中使用案例:

function any_query($product_search, $link, $narrow) 
previous info from above...
  if(!empty($link)) 
    switch($link)
    case 1:
      $search_query .= " AND b.br_name = '$narrow'";
      break;
    default:
    
    

但它没有做这项工作,我只是在这一点上迷路了。

有没有更好的方法或不同的方法来实现这一点?它不必使用 case 或 $_GET。 感谢您的宝贵时间。

【问题讨论】:

【参考方案1】:

问题是您需要在 OR 语句周围添加括号。我会这样做:

$search_query .= ' WHERE 1';

if (!empty($where_clause)) 
    $search_query .= " AND ($where_clause)";


if (!empty($narrow)) 
    $search_query .= " AND $narrow";

【讨论】:

以上是关于PHP按类别过滤搜索结果并计数的主要内容,如果未能解决你的问题,请参考以下文章

WooCommerce 产品类别计数

Ember 2,仅在一个计算属性中处理两个或多个属性。如何按搜索文本和类别进行过滤

显示显示结果的计数

php 按帖子类型和类别搜索

php 按类别搜索

php 按类别筛选搜索 - woocommerce产品