【问题标题】:PHP SQL Search query matchingPHP SQL 搜索查询匹配
【发布时间】:2017-08-21 09:55:32
【问题描述】:

我在 PHP 中有一个搜索页面,它使用以下查询从数据库中获取内容。

SELECT * FROM linkBase WHERE (`title` LIKE '%".$s."%') OR (`descr` LIKE '%".$s."%')

这是我的数据库的样子:

id  |title         |descr
-----------------------------------------
1   |Hello World   |This is a hello world description
2   |PiedPiper     |The silicon valley company PiedPiper
3   |StackOverflow |Ask questions on programming

现在,例如,如果我使用 $s = "silicon valley" 的值运行此查询,那么它会获取 row 2。这可以。但是如果用户输入搜索词为silicon PiedPiper 会怎样。上面的 SQL 查询不返回任何结果。如何修改查询,使其也将返回 row 2 和第二个搜索词。

问题总结: 我如何使用 PHP 和 SQL 进行搜索查询,即使用户输入两个在数据库中没有相互关联的单词也会返回结果

【问题讨论】:

  • MySQLSQL Server是不同公司生产的不同软件包。即使两者都实现了 SQL,它们也以不同的方式扩展它,有时它们使用不同的语法约定,从而使查询在它们之间不兼容。请仅使用与您正在使用的软件匹配的标签。
  • %替换空格登录$s...
  • 注意这段代码的sql注入。尝试改用参数化查询。

标签: php sql mysqli


【解决方案1】:

如果您需要在搜索中支持任意顺序的单词,我建议使用带有简单“或”正则表达式的REGEXP MySQL 函数

SELECT * FROM linkBase WHERE (`title` REGEXP 'silicon|PiedPiper') OR (`descr` REGEXP 'silicon|PiedPiper')

所以你可以用 PHP 替换空格并用管道符号 (|) 替换它们,单词的顺序不再重要了。

这将选择至少包含一个单词的所有行,如果您需要匹配列表中的所有单词,则可能需要另一个正则表达式。

【讨论】:

    【解决方案2】:

    LIKE '%{".$s."}%' 或成为老派 INSTR(title, '{'.$s.'}') > 0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 2020-11-09
      • 2017-10-30
      • 1970-01-01
      相关资源
      最近更新 更多