php – 为查询准备用户定义的搜索词

前端之家收集整理的这篇文章主要介绍了php – 为查询准备用户定义的搜索词前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
对于搜索功能,我编写了一个由 PHP脚本执行的MySQL查询.我没有进行全文搜索.相反,我正在使用以下方法进行搜索

… WHERE字段LIKE’%etc%’和字段REGEXP'[[:<:]]等[[:>:]]’

现在,我的想法是在PHP中准备这些动态值,例如:

$word = '2*3%5_1^0'; // just an example

$wordLike = strtr($word,array('\\'=>'\\\\','%'=>'\\%','_'=>'\\_'));
// instead of my old solution:
// $wordLike = preg_replace('~([%_])~','\\\\$1',$word);
$wordLike = $db_con->escape('%' . $wordLike . '%');

$spaces = '[[:blank:]]|[[:punct:]]|[[:space:]]';
// I'm not sure about the difference between blank & space,though

$wordRX = preg_quote($word);
$wordRX = $db_con->escape('(^|'.$spaces.')'.$wordRX.'($|'.$spaces.')');
// instead of my old solution:
// $wordRX = $db_con->escape('[[:<:]]' . $wordRX . '[[:>:]]');

然后使用这些值,如…

… WHERE字段LIKE’$wordLike’和字段REGEXP’$wordRX’

通过此示例输入,结果

...
WHERE field LIKE '%2*3\\%5\\_1^0%' AND
field REGEXP '[[:<:]]2\\*3%5_1\\^0[[:>:]]`

几个笔记……

>在我的实际代码中,我正在处理多个单词,这只是伪代码.
>我用来搜索单词的方法 – 用LIKE& REGEXP在我尝试的方法中是最快的.
>我知道我应该使用PDO,除非与我的问题相关,否则请不要输入任何内容

Q1:这是正确的方法吗?
Q2:这对sql注入是否足够安全?

一些额外的信息

关于MysqL REGEXP ……

以下字符由preg_quote()转义

. \ + * ? [ ^ ] $( ) { } = ! < > | : –

以下是REGEXP中[偶尔]特殊字符的列表

. \ + * ? [ ^ ] $( ) { } | –

REGEXP中还有其他构造,但它们都被单/双括号包围,因为我知道所有括号都将被preg_quote()转义,我觉得我不应该关注它们.

关于MysqL LIKE ……

LIKE中只有2个特殊字符

_ %

所以逃避他们似乎足够的解决方法.
如果我遗漏任何东西,请纠正我.

从你提到的公寓 mysql_real_escape_string()功能应该做好针对sql注入的清理.

您只需使用适当的转义函数正确地转义任何用户输入,如果您将其描述为处理此用户输入的链接处理块,您将知道以哪种顺序(从最后到第一)以及要逃避/未转换的内容以及何时,你应该可以保证干净的输入(验证是另一个问题).

而且,正如您已经知道的那样,PDO上的quote()Mysqli prepare()是更好的方法.

原文链接:https://www.f2er.com/php/134052.html

猜你在找的PHP相关文章