【问题标题】:PHP with MySQL search engine using LIKE confuses apostrophes in the result [duplicate]使用 LIKE 的 PHP 和 MySQL 搜索引擎混淆了结果中的撇号 [重复]
【发布时间】:2014-02-15 21:23:39
【问题描述】:

我正在使用 PHP 和 MySQL 在我的网站上创建一个基本的搜索引擎来查找人们发布的书籍,但问题是我正在使用例如:

`title` LIKE '%".(string)$searchTerm."%'

注意:变量 $searchTerm 被预先转义。

我知道这被广泛使用并且效果很好,但问题是,例如,如果我有一个书名:

作者参考

结果会显示,如果有人搜索“作家参考”(没有双引号)但是,如果有人只查找“作家参考”,结果将不会显示,这就是为什么我在这里询问解决此问题的好主意。

每次 onkeyup 事件都使用 AJAX 查询?将每个输出收集到一个数组中?但这可能会减慢这一进程。 MySQL中有没有一种过滤和忽略撇号的方法,但同时,如果有人使用撇号,它会起作用吗?正则表达式操作?

谢谢。

编辑:我不是试图阻止 SQL 注入,我正在寻找一种方法,如果有人查找没有撇号的单词,则显示带有撇号的结果,但目前使用 LIKE %%不会出现,因为它直接从数据库中获取单词。因此,如果搜索词没有撇号而结果有撇号,则不会显示。

编辑 2:当我关注 cmets 时,我最近通过 ALTER TABLEdbname.bookADD FULLTEXT (title,description) 更新了数据库中的两列以使用 FULLTEXT

但在此之后,我使用 switch case 来查看用户是否选择在标题或描述中进行搜索,或者两者都有效,因为我使用的是MATCH(title,description) AGAINST('".(string)$sTerm."'),但其他在标题或描述仅不会按计划工作,当然,我有类似:MATCH(title) AGAINST('".(string)$sTerm."') 但除非我做到MATCH(title,title) AGAINST('".(string)$sTerm."')(在 MATCH 中添加另一个标题)

另外,当有人在没有撇号的情况下搜索“Writes Reference”时,由于某种原因它仍然无法正常工作,可能是我的 php 代码?

【问题讨论】:

  • 或者您是说您的数据库中有“作家参考”文本,并且即使有人在搜索“作家参考”,您也希望它匹配?目前还不清楚到底是什么问题。
  • 是的,对此感到抱歉,我匆忙输入了它而没有仔细阅读,我对其进行了编辑并添加了我想要的内容,是的,基本上是在询问是否有办法用撇号显示结果 if有人搜索了没有撇号的标题。
  • Like 会将输入字符串与 col 匹配,就像您提供 LIKE %Writers Reference% 您要求在列中的任何位置查找包含“Writers Reference”的结果一样。所以它不会得到“作家参考”。
  • 我认为您需要查看全文索引。

标签: php mysql search-engine


【解决方案1】:

你可以使用类似的东西:

REPLACE(`title`, '\'', '') LIKE REPLACE('%".(string)$searchTerm."%', '\'', '')

... 缺点是 MySQL 将无法使用在 title 上定义的索引。

【讨论】:

    猜你喜欢
    • 2013-07-12
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多