我想知道如何正确地检查关键字与SQL“喜欢”;
我有一个剧本,看起来是这样的:
$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,它不起作用
有什么暗示吗?
发布于 2018-09-19 22:04:34
您需要将$search_keywords分割成单独的单词,并搜索其中的每个单词。
若要搜索逗号分隔列表中的项,请使用FIND_IN_SET()而不是LIKE。LIKE '%audi%'也将匹配奥迪-卡特罗.
$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);发布于 2018-09-19 22:03:54
在请求中传递用户数据时使用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]);https://stackoverflow.com/questions/52414673
复制相似问题