Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:在mysql中搜索字符串中的单词?_Php_Mysql - Fatal编程技术网

PHP:在mysql中搜索字符串中的单词?

PHP:在mysql中搜索字符串中的单词?,php,mysql,Php,Mysql,我正在尝试使用PHP在mysql数据库中搜索字符串中的单词 我遇到的问题是,它在我的PHP页面上搜索并吐出结果,但是任何接近搜索词的词也会在我的页面上得到结果 为了更好地解释这一点,假设我有一个字符串,如下所示: women's clothing 现在,如果我搜索的单词是women,结果将正确显示在我的页面上,但是如果我搜索的单词是men,同样的结果将显示在我的页面上,因为单词women包含单词men 这是我当前的sql查询: SELECT id, category_name, image_u

我正在尝试使用PHP在mysql数据库中搜索字符串中的单词

我遇到的问题是,它在我的PHP页面上搜索并吐出结果,但是任何接近搜索词的词也会在我的页面上得到结果

为了更好地解释这一点,假设我有一个字符串,如下所示:

women's clothing
现在,如果我搜索的单词是
women
,结果将正确显示在我的页面上,但是如果我搜索的单词是
men
,同样的结果将显示在我的页面上,因为单词women包含单词men

这是我当前的sql查询:

SELECT id, category_name, image_url FROM data WHERE `category_name` LIKE '%$sub%' GROUP BY category_name
我试图将
“%$sub%”
更改为
“%$sub”
,但根本没有返回任何结果

有人能就此提出建议吗

编辑:

category_name列中的字符串各不相同,无法更改,因为它们来自外部API

这些字符串可能会有所不同。所以一个可能看起来像女人的裙子和裙子,另一个可能看起来像女人的鞋子,另一个可能看起来像女人的包,另一个可能看起来像男人的鞋子等等

所以我需要做的是显示关键字women的所有结果,并显示所有男子的结果。我希望这是有道理的


但目前,男性和女性的结果同时显示,因为正如我前面解释的,单词women包含单词men。

您可以使用MySQL的
REGEXP
操作符,使用单词匹配来实现这一点

SELECT ... WHERE column REGEXP '[[:<:]]$sub[[:>:]]' ...
选择。。。其中列REGEXP'[[::]]'。。。

你想要的是,你想要的是男人的衣服,但是没有一件衣服像女人一样。这两个结果之间的唯一区别是,女性的衣服前面有人物,而男性的衣服后面有人物

Mrun他的想法是,如果你想搜索一个精确的单词,后面什么都不跟。因此,当您使用:
比如“%$sub%”
时,只会出现以下结果:单词MEN后面跟nothing,单词MEN前面直接跟nothing。中间必须有一个空间

现在,为了让结果生效,您可以使用:
比如$sub%
(末尾没有空格),但是这确实意味着单词MEN后面可以跟anthing。例如,“威胁”这个词就会出现。如果希望只允许使用@mrun建议的特定字符,可以添加
$sub
%
符号之间的任何内容不过你必须逃避它

编辑:


现在我想起来了,你可能也希望允许使用MENS,但这意味着你必须选择自己的条件,因为MYSQL无法自动检测到单词的复数形式也被允许,等等。

有几种选择。以下是其中之一:

SELECT id, category_name, image_url FROM data WHERE `category_name` LIKE '% $sub %' OR `category_name` LIKE '% $sub' OR `category_name` LIKE '$sub' OR `category_name` LIKE '$sub %' OR `category_name` LIKE '% $sub\' %' OR `category_name` LIKE '% $sub' OR `category_name` LIKE '$sub\'' OR `category_name` LIKE '$sub\' %' GROUP BY category_name
另一种方法是使用匹配,但需要使用全文索引,如下所示:

SELECT id, category_name, image_url FROM data WHERE MATCH (`category_name`) AGAINST ('+$sub' IN BOOLEAN MODE) GROUP BY category_name

好的,伙计们,谢谢你们的投入。这就是我如何做到的及其现在的工作:

SELECT id, category_name, aw_image_url FROM data WHERE category_name RLIKE '[[:<:]]".$sub."[[:>:]]' GROUP BY category_name
从数据中选择id、category\u name、aw\u image\u url,其中category\u name类似于“[[::]”按category\u name分组

那么像“%$sub%”这样使用
怎么样?这不符合
男士的
,但我希望你能得到idea@mrun,你的意思是在$sub?@H前后加空格?基本上是的,但你必须计算出这样的情况,例如
男人
,然后是
,等等@swidmann我也很困惑。我想我们需要对OP的情况有更多的了解,因为我感觉他这样做是错误的。@swidmann,好的,谢谢。FWIW,我认为这比我的建议更糟糕,因为(正如你所承认的)这匹配任何以搜索词开头的内容。我认为男/女案例只是一个简单的例子,匹配不应该局限于单词开头,而是整个单词。@Antti29你知道这部分不是我的明确答案,对吗?像%$sub%
这样的
不是我的明确答案,而是一种解释。这之后的一切都是我的完整答案。我确实如此。我担心
LIKE%$sub%
不会删除它,因为它与
men's whatnot
等类别名称不匹配。当搜索
men
@Antti29时,仅仅为了记录,
LIKE%$sub%
会返回任何以男性开头的内容,之后的内容都不重要。OP的条件太多了,我想实际上不能使用类似于1的语句。我只是向他解释如何使用
%%
,当你想做这样的事情时,你需要在LIKE语句中使用它。你可能想再试一次<代码>如“%men%”
将返回列中包含子字符串
“men”
(即单个空格后的“men”)的行。但是,我不会返回以
“men”
开头的列。我尝试了你的第一个建议,但没有从mysql返回任何内容,第二个建议是毫无疑问的,而且我不能使用FULTEXT索引,因为我的服务器不允许。你能用你的内容样本更新你的答案吗?