1

我有一个存储在 cookie 中的“标签”数组。它们被格式化为一系列由,'s 分隔的单词。我试图返回一个表中的所有行,其中该数组的每个“标签”都在“search_tags”列中找到。

我目前有:

$stmt = $conn->prepare("SELECT * FROM users WHERE MATCH search_tags AGAINST('". $_COOKIE['tags'] ."' IN BOOLEAN MODE);");

这几乎可以工作,但会返回任何标签匹配的所有行。而不是要求所有的$_COOKIE['tags']匹配“search_tags”列。

另一种解决方案可能是将其保留为 OR 查询,而是按匹配数或相关性对结果进行排序。

4

1 回答 1

1

您可以在布尔模式下+使用运算符来断言必须存在一个单词,因此,如果您将标签从逗号分隔列表转换为分隔列表,应该会给您想要的结果:+

$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.

于 2020-03-07T07:39:01.097 回答