【问题标题】:Matching multiple words in mysql query using "LIKE"使用“LIKE”匹配mysql查询中的多个单词
【发布时间】:2013-09-29 06:39:31
【问题描述】:

我的应用程序允许搜索文章。因此,当用户输入字符串“articlex”时,会显示查询和结果,但是当输入多个单词“articlex articley”时,查询不会显示任何结果。

目前我正在使用此查询

$querySub = 'SELECT * FROM table WHERE (col1 LIKE "%'.$search_string.'%") OR (col2 LIKE "%'.$search_string.'%") OR (col3 LIKE "%'.$search_string.'%")';

其中$search_string 仅包含用户输入

如何使查询也适用于多个单词?

【问题讨论】:

  • 你最好在PDO上使用prepared statement。您当前的代码允许 SQL 注入 攻击。
  • 如果我使用 mysql_real_esacep_string(),它会安全吗?
  • 是的,但mysql_** 函数已弃用。看这里php.net/manual/en/function.mysql-real-escape-string.php你可以选择MysqliPDO。我推荐你PDO

标签: php mysql search full-text-search


【解决方案1】:

PDO 的示例

/* Assume $pdo is already prepared as PDO instance. */

// search query split by spaces
$user_input = 'foo bar baz';

// create string for PDO::prepare()
$sql = 'SELECT * FROM testTable WHERE ';
$wheres = $values = array();
foreach (array_filter(explode(' ', $user_input), 'strlen') as $keyword) {
    $wheres[] = 'col1 LIKE ?';
    $values[] = '%' . addcslashes($keyword, '%_\\') . '%'; // this is escape for LIKE search
}
$sql .= $wheres ? implode(' OR ', $wheres) : '1';

// bind values and execute
$stmt = $pdo->prepare($sql);
$stmt->execute($values);

mysql_** 函数示例(已弃用)

/* Assume $link is already prepared as MySQL resource. */

// search query split by spaces
$user_input = 'foo bar baz';

// create string for mysql_auery()
$sql = 'SELECT * FROM testTable WHERE ';
foreach (array_filter(explode(' ', $user_input), 'strlen') as $keyword) {
    $wheres[] = 'col1 LIKE ' . mysql_real_escape_string(
        '%' . addcslashes($keyword, '%_\\') . '%',
        $link
    );
}
$sql .= !empty($wheres) ? implode(' OR ', $wheres) : '1';

// execute
$result = mysql_query($sql, $link);

【讨论】:

    【解决方案2】:

    在使用变量进行类似查询时,您可以使用

    Select * from table where keyword LIKE '%{$to_be_searched}%'

    【讨论】:

      【解决方案3】:

      您可以为此目的使用 REGEXP .....或者,如果您想要多个单词搜索,那么您需要按空格展开搜索字符串,然后使用 LIKE 从表中搜索此字符串

             if you search "articlex articley" then it will search whole word in LIKE operator
      

      【讨论】:

        【解决方案4】:

        最后只使用一个“%”。喜欢

        $querySub = SELECT * FROM table WHERE (col1 LIKE '$search_string%'");
        

        这将搜索“articlex”和“articley”

        【讨论】:

          【解决方案5】:

          1:这将是返回应该记录

          select * from products where title like "%word1%" or 标题 LIKE "word2";

          注意:如果你有这么多的词,然后使用动态查询生成器生成标题如“%word3%”或标题如“%word4%”或........

          2:这将是返回必须记录

          select * from products where title like "%word1%word2%word3%";

          【讨论】:

            猜你喜欢
            • 2013-12-07
            • 2016-10-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-10
            • 2011-12-21
            相关资源
            最近更新 更多