我有一个存储在cookie中的"标签"数组。它们被格式化为由,
的s分隔的一系列单词。我试图返回表中的所有行,其中该数组的每个"标记"都位于"search_tags"列中。
我目前有:
$stmt = $conn->prepare("SELECT * FROM users WHERE MATCH search_tags AGAINST('". $_COOKIE['tags'] ."' IN BOOLEAN MODE);");
这几乎可以工作,但会返回ANY标记匹配的所有行。而不是要求所有$_COOKIE['tags']
与"search_tags"列匹配。
另一种解决方案可以是,它作为OR查询,而是根据匹配数或相关性对结果进行排序。
您可以在布尔模式中使用+
运算符来断言单词必须存在,因此,如果您将标记从逗号分隔的列表转换为+
分隔的列表,则会得到您想要的结果:
$tags = '+' . implode(' +', explode(',', $_COOKIE['tags']));
$stmt = $conn->prepare("SELECT * FROM users WHERE MATCH search_tags AGAINST('$tags' IN BOOLEAN MODE);");
请注意,如果逗号后面可能有空格,则应使用preg_split('/,s*/', $_COOKIE['tags'])
而不是explode
。