通配符搜索MySQL

时间:2011-11-26 06:54:55

标签: mysql search wildcard

我的情况是我的通配符搜索没有真正起作用我想到它应该... 这是我正在运行的MySQL查询,它只返回整个单词......

例如。如果我输入“phone”作为搜索词,它将返回所有带有“phone”的行,但不会返回带有“phone”的行(注意添加的's')

mysql_query(" SELECT * FROM posts WHERE permalink = '$permalink' AND LOWER(raw_text) LIKE '%$str%' " );

如何让它返回搜索字的所有变体?显然我知道这可能会遇到问题,因为如果用户输入一个共同的字母,它可以返回各种匹配,我想我可以把它作为高级搜索选项的一部分。

ADENDUM 我已经把它缩小到了通配符的问题,但是我正在使用返回的数据...我正在我的正则表达式中我正在抛出数据。

$pattern= "/(?:[\w\"',.-]+\s*){0,5}[\"',.-]?\S*".$str."(\s|[,.!?])(\s*[A-Za-z0-9.,-]+){0,5}/";

preg_match_all($pattern, $row["raw_text"], $matches);

正则表达式找不到我返回的原始数据中的字符串,所以它给我一个空值。一个新的问题,我对正则表达式并不熟悉,所以我也很想把这个问题弄出来......也许我很快就会提出一个新的问题!

谢谢, 中号

2 个答案:

答案 0 :(得分:1)

我认为还有其他事情正在发生。查询的%部分似乎是正确的。这似乎是确认:

select 'phones' LIKE '%phone%';
+-------------------------+
| 'phones' LIKE '%phone%' |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.00 sec)

顺便说一下,我真的希望你在$str上做一个严格的卫生设施(如果它是来自用户输入,那么$permalink也是如此)。您应该只允许使用字母数字和少量其他安全字符(可能是空格),并且在mysql_real_escape_string()中使用它之前应该通过mysql_query()运行它。更好的是,请查看PDO

无论如何,回到故障排除:尝试一件事可能是让程序记录您发送到mysql_query()的字符串。基本上,将对mysql_query()的调用更改为对error_log()echo()或类似的调用。然后将生成的查询复制并粘贴到MySQL命令行工具或PHPmyAdmin等等。当该查询不能按照您期望的方式工作时,至少您可以查看它并进行调整以找出问题。谁知道,一旦你看到查询拼写出来,也许它会非常明显。

答案 1 :(得分:0)

我怀疑您的$str变量中有一个尾随空格,可以解释您所看到的内容:您的LIKE条件为'%phone %',与"... phone ..."匹配,但不是"... phones ..."

首先尝试修剪你的价值。