我使用mysqli
LIKE查询在我的项目上创建了一个搜索功能。
我的最后一个障碍是它输出的ORDER
。
当前情景:
if(isset($_GET['userInput']))
{
$search = $_GET['userInput'];
$search = explode(" ", $search);
if($search[0] != ''){
$firstterm = $search[0];
}else{
$firstterm = '@@@';
}
if($search[1] != ''){
$secondterm = $search[1];
}else{
$secondterm = '@@@';
}}
$contact = $mysqli->query("
SELECT * FROM contact WHERE
f_name LIKE '%$firstterm%'
OR l_name LIKE '%$firstterm%'
OR f_name LIKE '%$secondterm%'
OR l_name LIKE '%$secondterm%'
order by id LIMIT 5");
我的问题是,ORDER
是否可以通过与id
相匹配的大量匹配字符来jQuery
。原因是如果我输入“C博客”#39;正在寻找克雷格博客' ' C'会因为电子邮件地址而对我的所有联系人进行注册。[c] om'。
因此,如果我可以通过大多数匹配字符(两次爆炸中增加的数量超过1)将其输入ORDER,那么理论上最重要的结果应该是“Craig Blogs'。
答案 0 :(得分:1)
您可以使用+
计算匹配数。在MySQL中,布尔表达式被视为一个数字,其中1为真,0为1:
ORDER BY ((f_name LIKE '%$firstterm%') +
(l_name LIKE '%$firstterm%') +
(f_name LIKE '%$secondterm%') +
(l_name LIKE '%$secondterm%')
) desc
编辑:
如果您想要匹配的字符数,可以从搜索字词的长度开始。但是,条款可能不止一次出现。所以:
ORDER BY ((length(replace(f_name, 'firstterm', concat('firstterm', 'x'))) - length(f_name)) +
(length(replace(l_name, 'firstterm', concat('firstterm', 'x'))) - length(l_name)) +
(length(replace(f_name, 'secondterm', concat('secondterm', 'x'))) - length(f_name)) +
(length(replace(l_name, 'secondterm', concat('secondterm', 'x'))) - length(l_name))
) desc