所以我的网站上有一个搜索功能,这就是代码的样子。
$search_people = mysql_query("SELECT * FROM glnce_users
WHERE f_name LIKE '%$search%' OR l_name LIKE '%$search%'");`
如果我在我的搜索栏中输入Chris,它将显示所有Chris'
如果我输入我的搜索栏Olson,它会显示所有Olson的
然而,如果我输入Chris Olson,即使有一个名字叫Chris的人和olson的姓氏,它也不能为我提供Chris Olson的结果。
我做错了什么?
答案 0 :(得分:16)
爆炸阵列看起来很笨重且容易出错。我建议在查询中连接数据库列。这样,如果有人的名字中有一个空格,比如“Sarah Jane Albertson”,它就不会寻找名字“Sarah”和姓氏“Jane”而完全忽略“Albertson”。
这应该做你需要的:
$search_people = mysql_query("SELECT * FROM glnce_users
WHERE CONCAT(f_name, ' ', l_name) LIKE '%$search%' OR l_name LIKE '%$search%'");
答案 1 :(得分:2)
$searchArray = explode(" ", $search);
if (count($searchArray) > 1) {
$search_people = mysql_query("SELECT * FROM glnce_users WHERE f_name
LIKE '%{$searchArray[0]}%' OR f_name LIKE '%{$searchArray[1]}%'
OR l_name LIKE '%{$searchArray[0]}%' OR l_name LIKE '%{$searchArray[1]}%'");
} /* else do the original query */
如果你只想让Chris Olson长大,你可以用AND切换第二个OR,否则Chris'和Olson也会被提起。
答案 2 :(得分:2)
您可以使用explode()
。以下是您可以使用的一些代码:
<?php
$fullName = "Chris Olson";
$names_exploded = explode(" ", $fullName); // will split " " (a space!)
counter_words = 0;
foreach($names_exploded as $each_name){
$counter_words++;
/* check the word count */
if($counter_words == 1){
$qPart .= " `f_name` LIKE '%$each_name%' OR `l_name` LIKE '%$each_name%'";
}else{
$qPart .= " OR `f_name` LIKE '%$each_name%' OR `l_name` LIKE '%$each_name%'";
}
}
$q = mysql_query("ELECT * FROM `glnce_users` WHERE $qPart");
while($r = mysql_fetch_assoc($q)){
// get your data here!
}
?>
希望这会有所帮助。看看这个php搜索tut:YouTube
答案 3 :(得分:2)
普通SQL,
$sql = "SELECT `id`, `first_name`, `last_name`, `mobile`, CONCAT(`first_name`, ' ',`last_name`) AS `full_name` FROM `users`
WHERE `first_name` LIKE '%".$word."%'
OR `last_name` LIKE '%".$word."%'
OR CONCAT(`first_name`, ' ',`last_name`) LIKE '%".$word."%'
OR `mobile` LIKE '%".$word."%';";
在Laravel,
$result = User::select('id', 'first_name', 'last_name', 'mobile', DB::raw('CONCAT(first_Name, " ", last_Name) AS name'))
->where('first_name', 'LIKE', '%'.$word.'%')
->orWhere('last_name', 'LIKE', '%'.$word.'%')
->orWhere(CONCAT(first_Name, " ", last_Name), 'LIKE', '%'.$word.'%')
->get();
答案 4 :(得分:1)
首先使用explode function
从space
获取这两个单词(您搜索的任意数量的单词)。然后尝试在FOR LOOP
中创建查询..
然后使用该查询。你绝对会得到你想要的任何东西。
感谢。
答案 5 :(得分:0)
答案 6 :(得分:0)
我已经使用了它,并且工作正常
$q->where('first_name', 'like', "%$name%")
->orWhereRaw("concat(first_name, ' ', last_name) like '%$name%' ")
->orWhere('last_name', 'like', "$name");
答案 7 :(得分:-1)
首先爆炸你的字符串以获得每一件。在空间上分开。然后将字符串中的所有部分与名字和姓氏进行比较。
或者,您可以在选择中组合名字和姓氏列,以便只对组合字段进行一次查询。