如何使用MYSQL“ LIKE”正确检查关键字

时间:2018-09-19 21:52:25

标签: php mysql

我想知道如何使用SQL“ LIKE”正确检查关键字;

我有一个看起来像这样的脚本:

$search_keywords = $_POST['search-keywords'];
$search_keywords = str_replace(" ","%", $search_keywords);
$search_keywords = '%' . $search_keywords . '%';
$search = $odb -> query("SELECT * FROM `cars` WHERE `keywords` LIKE '".$search_keywords."' ORDER BY `id` ASC");
$rows = $search->rowCount();
if ($rows > 0) {//Loop}

实际上,它是有效的,但是仅当数据库中的关键字如下所示时:

audi, a3, silver,然后搜索audi a3

如果我要这样搜索:a3 audi无效

有任何提示吗?

2 个答案:

答案 0 :(得分:1)

您需要将$search_keywords拆分为单独的单词,然后搜索每个单词。

要搜索用逗号分隔的列表中的项目,请使用FIND_IN_SET()而不是LIKELIKE '%audi%'也将与audi-quatro匹配。

$keyword_array = explode(" ", $_POST['search_keywords']);
foreach ($keyword_array as &$keyword) {
    $keyword = "FIND_IN_SET('$keyword', keywords)";
}
$tests = implode(' AND ', $keyword_array);
// $tests contains something like: FIND_IN_SET('a3', keywords) AND FIND_IN_SET('audi', keywords)
$sql = "SELECT * FROM `cars` WHERE $tests ORDER BY `id` ASC";
$search = $odb->query($sql);

答案 1 :(得分:0)

最佳做法是在请求中传递用户数据时使用PDO::prepare,以避免SQL Injection

$search = $odb->prepare("SELECT * FROM cars WHERE keywords 
    LIKE CONCAT('%',:keyword,'%') 
    ORDER BY id ASC");
$results = $search->execute([":keywork" => $search_keywords]);