用于mySQL查询的PHP动态过滤器副作用问题

时间:2016-05-16 13:13:37

标签: php mysqli filter

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

// 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')

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

有关如何改进此功能的任何想法?

谢谢

1 个答案:

答案 0 :(得分:0)

我不确定这是否是最好的apporach,但我设法这样做:

 // 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,然后添加一个括号。似乎工作,但任何更好的建议是非常受欢迎的。

由于