PHP搜索名字和姓氏

时间:2011-05-05 06:27:58

标签: php sql search

所以我的网站上有一个搜索功能,这就是代码的样子。

$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的结果。

我做错了什么?

8 个答案:

答案 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 functionspace获取这两个单词(您搜索的任意数量的单词)。然后尝试在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)

首先爆炸你的字符串以获得每一件。在空间上分开。然后将字符串中的所有部分与名字和姓氏进行比较。

或者,您可以在选择中组合名字和姓氏列,以便只对组合字段进行一次查询。