我使用PHP和MySQL在我的网站上创建一个基本的搜索引擎来查找人们发布的书籍,但问题是我使用了一些东西,例如:
`title` LIKE '%".(string)$searchTerm."%'
注意:变量$searchTerm正在被提前转义。
我知道这被广泛使用,效果也很好,但问题是,如果我有一个书名,例如:
作者参考
如果有人搜索"作家参考资料"(没有双引号),结果会显示。但是,如果有人只查找"作家参考",结果不会显示,这就是为什么我在这里问解决这个问题的好主意。
使用AJAX在每次onkeyup事件上查询?将每个输出收集到一个数组中?但这可能会减缓进程。MySQL中有没有一种方法可以过滤和忽略撇号,但同时,如果有人使用撇号,它会起作用?正则表达式操作?
谢谢。
编辑:我并没有试图阻止SQL注入,我正在寻找一种方法,如果有人查找一个没有撇号的单词,则会显示带撇号的结果,但目前不会显示LIKE%%,因为它从数据库中直接获取单词。因此,如果搜索词没有撇号,而结果有撇号,它就不会出现。
编辑2:当我关注评论时,我最近通过ALTER TABLE
数据库名称.
图书ADD FULLTEXT (title,description)
更新了数据库中的两列,使其使用FULLTEXT
但在那之后,我使用一个切换案例来查看用户是否选择在标题或描述中搜索,或者两者都有效,就像我使用MATCH(title,description) AGAINST('".(string)$sTerm."')
一样,但其他搜索标题或描述的人不会按计划工作,当然,我有类似的东西:MATCH(title) AGAINST('".(string)$sTerm."')
,但除非我将其设为MATCH(title,title) AGAINST('".(string)$sTerm."')
(在MATCH中添加另一个标题),否则不会工作
此外,当有人搜索没有撇号的"Writes Reference"时,由于某种原因,它仍然不起作用,可能是我的php代码吗?
您可以使用以下内容
REPLACE(`title`, ''', '') LIKE REPLACE('%".(string)$searchTerm."%', ''', '')
缺点是MySQL将不能使用在CCD_ 7上定义的索引。