【问题标题】:PHP Search First Name and Last NamePHP 搜索名字和姓氏
【发布时间】:2011-08-19 02:34:48
【问题描述】:

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

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

我做错了什么?

【问题讨论】:

  • 您有两个选择: 1) 使用两个搜索栏,名字和姓氏,并将这两个变量传递给您当前的查询字符串。 2)使用一个搜索栏并假设一个空格将第一个与姓氏分开并拆分。作为奖励选项,您可以更改查询以组合名字和姓氏,并仅使用您的单个变量名称。

标签: php sql search


【解决方案1】:

爆炸的数组看起来很庞大且容易出错。我建议在查询中连接您的数据库列。这样,如果某人的名字中带有空格,例如“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%'");

【讨论】:

  • 如果列包含空值,请使用COALESCE
【解决方案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();

【讨论】:

    【解决方案3】:

    您可以使用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

    【讨论】:

    • 没有必要放那种类型的查询老兄..只需使用explode功能并得到你想要的..Thx.
    • 抱歉,这是一个糟糕的解决方案。请简单地做:WHERE CONCAT(f_name, ' ', l_name) LIKE '%$search%'
    【解决方案4】:
    $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's。

    【讨论】:

      【解决方案5】:

      首先使用explode functionspace 中获取这两个单词(您搜索的任意数量的单词)。然后尝试在FOR LOOP 中创建查询。..

      然后使用该查询。你绝对会得到你想要的。

      谢谢。

      【讨论】:

        【解决方案6】:

        【讨论】:

          【解决方案7】:

          我已经使用过它并且它工作正常

                             $q->where('first_name', 'like', "%$name%")
                             ->orWhereRaw("concat(first_name, ' ', last_name) like '%$name%' ")
                            ->orWhere('last_name', 'like', "$name");
          

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-19
              • 1970-01-01
              • 2023-03-19
              • 2021-07-14
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多