针对mySQL查询副作用问题的PHP动态筛选器


PHP Dynamic Filter for mySQL Query Side effect issue

我创建了一个函数,其中添加到查询中以选择对应的项目:

// BUILD FILTER
    $filter = '';
    $dups = array();
    if ($filters) {
        foreach ($filters as $t => $v) {
            $key = substr_replace($t, '', 0, strpos($t, '|') + 1);
            if (!in_array($key, $dups)) {
                $dups[] = $key;
                $filter .= "AND {$key}  = '{$v}' ";
            } else {
                $filter .= "OR {$key}  = '{$v}' ";
            }
        }
    }

因此,让我们假设这个例子的过滤器是彩色的。每个$key会说COLOUR,每个$v会是它的值,蓝色和另一个粉红色。

然后将过滤器添加到现有查询中:

$sql = "SELECT * FROM product_filter f 
   LEFT JOIN product_allow a ON (a.prod_sku = f.prod_sku) 
   INNER JOIN product_image i ON (i.prod_sku = f.prod_sku) 
   INNER JOIN dh_product_basic b ON (b.prod_sku = f.prod_sku) 
   WHERE a.prod_status = 1 
    AND f.CATEGORY = '{$cate}' 
    AND i.prod_isMain = 1 {$filter} 
   GROUP BY b.prod_sku, b.prod_category 
   ORDER BY b.prod_price DESC";

工作正常,除了两个$key相同,因此使用OR操作数时,它需要用括号括住(f.GRADE = 'B' OR f.GRADE = 'A')

这种类型的过滤对我来说有点陌生,所以我不确定如何更改顶部代码,以便在需要括号的情况下将其添加到正确的位置。

关于如何改进这个功能,有什么想法吗?

感谢

我不确定这是否是最好的方法,但我已经设法做到了:

 // BUILD FILTER
    $filter = '';
    $dups = array();
    if ($filters) {
        foreach ($filters as $t => $v) {
            $key = substr_replace($t, '', 0, strpos($t, '|') + 1);
           if (!in_array($key, $dups)) {
                $dups[] = $key;
                $filter .= "AND {$key}  = '{$v}' "; // AND
            } else {
               $i = strripos($filter, "AND");
               $filter = substr_replace($filter, " (", $i+3, 0);
                $filter .= "OR {$key}  = '{$v}') ";  // OR
            }
        }
    }

因此,当它看到它将添加一个OR时,它会搜索最后一个AND,然后添加一个括号。似乎有效,但任何更好的建议都非常受欢迎。

感谢