2011-11-26 224 views
0

我有一种情况,我的通配符搜索是不是真的如何我认为它应该... 这是我正在运行的MySQL查询,它将只返回整个单词...通配符搜索w/MySQL

例如。如果我输入“手机”作为搜索词将返回在它与“手机”中的所有行,但不排,“手机”(注意加“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); 

该正则表达式在原始数据中找不到字符串,因此我正在返回空值。一个新问题,我并不熟悉正则表达式,所以我将尽可能地将这个问题解决出来......也许我会很快抛出一个新问题!

感谢, 中号

+0

这并不直接回答你的问题,但它可能解释你会看到它的一些奇怪的行为。 [使用mysqli_prepare()]准备的查询(http://php.net/manual/en/mysqli.prepare.php)。这个代码就像它一样,写有“SQL注入漏洞”。 –

回答

1

我想别的东西是怎么回事。查询的%部分似乎是正确的。而这似乎是确认:

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

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

无论如何,回到故障排除这一点:有一件事要尝试可能是让程序记录发送到mysql_query()的字符串。基本上,将调用mysql_query()改为致电error_log()echo()或类似的东西。然后将结果查询复制并粘贴到MySQL命令行工具或PHPmyAdmin中或其他任何地方。当这个查询不能按照你期望的方式工作时,至少你可以查看它并调整它来找出结果。谁知道呢,也许一旦你看到查询拼写出来,它就会非常明显。

+0

我同意......虽然......我似乎无法将我的头包裹起来......但我知道,在我的测试数据中,我有包含“枪”和“枪”等单词和变体的记录。但是,当我搜索“枪”时,它只会返回包含“枪”的记录,而不是“枪”的记录......嗯...... 就卫生而言,永久链接是由我创建的功能生成的,它去除了所有不友好的字符并创建友好的永久链接。至于搜索,到目前为止,它只是采取原始输入,但我最终将清理搜索字符串,只允许某些字符。 –

+0

有一件事要尝试可能是让程序记录发送给'mysql_query()'的字符串。基本上,将调用改为'mysql_query()'调用'error_log()'或'echo()'或类似的东西。然后将结果查询复制并粘贴到MySQL命令行工具或PHPmyAdmin中或其他任何地方。当这个查询不能按照你期望的方式工作时,至少你可以查看它并调整它来找出结果。谁知道呢,也许一旦你看到查询拼写出来,它就会非常明显。 – Trott

+0

这正是我在附录中思考的问题...查询正确地返回了数据,这是我用我的正则表达式处理数据后的字...我现在用一个正确的正则表达式修复它,现在它工作得很漂亮!虽然感谢您的答案! –

0

我怀疑你有你的$str变量尾随的空间,这可以解释你所看到的:你LIKE标准将'%phone %',它匹配"... phone ...",但不"... phones ..."

先试着调整你的值。

+0

这正是我的附录中的想法...查询正确地返回数据,这是我用我的正则表达式处理数据后的字...我现在用一个正确的正则表达式修复它,现在它工作得很漂亮!虽然感谢您的答案! –