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[[:>:]]` 几个笔记…… >在我的实际代码中,我正在处理多个单词,这只是伪代码. Q1:这是正确的方法吗? 一些额外的信息 关于MySQL REGEXP …… 以下字符由preg_quote()转义
以下是REGEXP中[偶尔]特殊字符的列表
REGEXP中还有其他构造,但它们都被单/双括号包围,因为我知道所有括号都将被preg_quote()转义,我觉得我不应该关注它们. 关于MySQL LIKE …… LIKE中只有2个特殊字符
所以逃避他们似乎足够的解决方法.
从你提到的公寓
mysql_real_escape_string()功能应该做好针对SQL注入的清理.
您只需使用适当的转义函数正确地转义任何用户输入,如果您将其描述为处理此用户输入的链接处理块,您将知道以哪种顺序(从最后到第一)以及要逃避/未转换的内容以及何时,你应该可以保证干净的输入(验证是另一个问题). 而且,正如您已经知道的那样,PDO上的quote()或Mysqli prepare()是更好的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |