我想知道如何使用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
无效
有任何提示吗?
答案 0 :(得分:1)
您需要将$search_keywords
拆分为单独的单词,然后搜索每个单词。
要搜索用逗号分隔的列表中的项目,请使用FIND_IN_SET()
而不是LIKE
。 LIKE '%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]);