【问题标题】:MYSQL/PHP: Select part of word OR exact matchMYSQL/PHP:选择单词的一部分或完全匹配
【发布时间】:2017-02-28 09:52:33
【问题描述】:

尝试为我的问题寻找答案。如果有人问过类似的问题,请指向该页面。

我有一个表单,用户在一个或多个文本字段中输入搜索词。

然后传递给SQL语句:

WHERE st.Description LIKE '%$Description%'
AND st.Number LIKE '%$Number%'
AND st.Color LIKE '%$Color%'

这将返回单词包含用户输入的任何匹配项。

如果用户使用引号(如“搜索词”),有什么方法会搜索完全匹配?

最佳做法是什么?

【问题讨论】:

  • 您可以在查询本身中处理此逻辑,或者最好在 PHP 代码中处理它。如果搜索字符串包含引号,则使用不带通配符 % 的不同 LIKE 表达式。
  • 你的意思是遍历输入文件并使用 if 语句,如果它包含引号?如果是这样,将表达式放入 php 变量中?
  • 我的意思是检查你的 PHP 代码中的输入,并适当地处理引号。基本上,如果 LIKE 'search string' 有引号,你想要 LIKE '%search string%' 如果它没有引号。
  • 是的,PHP 如何检测单词/单词是否被引号包围?编辑:找到 preg_match('/^(["\']).*\1$/m', $string);
  • 使用'%".$Description."%'

标签: mysql sql select


【解决方案1】:

您可以在执行查询之前从 php 代码中执行此操作

假设搜索词在一个名为$keyword的变量中

<?php 
if(substr($keyword, 0, 1) == '"' && substr($keyword, -1, 1) ==='"'){
    $search = ' = ' . substr($keyword, 1, -1);
}else{
    $search = ' LIKE ' . '%' . $keyword . '%';
}

然后在查询中使用$search 变量

<?php
  $sql = ... WHERE st.Description $search and  st.Number $search and  st.Color $search

不要忘记使用准备好的语句来防止SQL injections

对于性能问题,如果您正在寻找一个确切的词,请不要使用 LIKE 关键字,使用 = 比较符号

【讨论】:

  • 我尝试使用它,但也将 'LIKE' 表达式包含为 $search= 'LIKE %' 。 $searchOpts['描述'] 。 '%';但它不会工作。
  • 我将此添加到$search 变量中
  • 另外,你真的必须在你的sql查询中使用AND,我猜你的意思是OR
【解决方案2】:

有没有什么办法,如果用户使用引号(如“搜索词”),它将搜索完全匹配?

如果您删除它所搜索的引号:WHERE st.Description LIKE '%search word%'。这意味着当提供多个单词作为搜索词时,您认为您当前正在搜索是否存在乱序的单词。不是这种情况。假设给定一个包含多个单词的短语,您要搜索所有单词:

WHERE st.Description LIKE '%search%'
AND st.Description LIKE '%word%'

最佳做法是什么?

与您当前所做的工作相差非常:使用全文索引或构建您自己的关键字搜索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多