
问题是这样的,在做一个网站筛选的时候,客户的筛选项中是包括:床,床头柜

由于筛选是模糊匹配的,所以在选择床之后,产品床头柜的产品也会被筛选出来。
通过查询代码发现,在:ParserController.php中的筛选代码中,parserSelectSonRowsLabel的函数方法是:
$where1[] = $filter[0] . " like '%" . escape_string($value) . "%'";
$where2[] = "FIND_IN_SET('" . escape_string($value) . "', a.tags)";以及
// 扩展字段数据筛选
foreach ($_GET as $key => $value) {
if (preg_match('/^ext_[\w\-]+$/', $key)) { // 其他字段不加入
$isselect = true;
if (strpos(get($key, 'vars'), ',') !== false) {
$selects = explode(',', get($key, 'vars'));
$selects_where = [];
foreach ($selects as $key2 => $value2) {
$selects_where[] = FIND_IN_SET_AUTO($value2, "e.".$key);
}
$where3[] = "(" . implode(' OR ' , $selects_where) . ")";
} else {
$where3[$key] = get($key, 'vars');
}
}
}所以我们需要将其修改成精确匹配:
$where1[] = "FIND_IN_SET('" . escape_string($value) . "', " . $filter[0] . ")"; $where2[] = "FIND_IN_SET('" . escape_string($value) . "', a.tags)";以及:
foreach ($_GET as $key => $value) {
if (preg_match('/^ext_[\w\-]+$/', $key)) {
$isselect = true;
$vars = get($key, 'vars');
if (strpos($vars, ',') !== false) {
$selects = explode(',', $vars);
$selects_where = [];
foreach ($selects as $value2) {
$selects_where[] = "FIND_IN_SET('" . escape_string($value2) . "', e.".$key.")";
}
$where3[] = "(" . implode(' OR ', $selects_where) . ")";
} else {
$where3[] = "FIND_IN_SET('" . escape_string($vars) . "', e.".$key.")";
}
}
}修改之后就可以了。
下一篇:没有了!