PHP Поиск Имя и Фамилия - PullRequest
4 голосов
/ 05 мая 2011

Итак, у меня есть функция поиска на моем сайте, и вот как выглядит код.

$search_people = mysql_query("SELECT * FROM glnce_users 
                 WHERE f_name LIKE '%$search%' OR l_name LIKE '%$search%'");`

Если я наберу в строке поиска Крис, это вызовет все Крис '

Если я напишу в строке поиска Olson, то откроются все Olson's

Однако, если я введу Криса Олсона, это не даст мне результатов для Криса Олсона, хотя есть человек с именем Крис и Фамилия олсон.

Что я делаю не так?

Ответы [ 7 ]

16 голосов
/ 18 мая 2011

Разнесенный массив кажется громоздким и подверженным ошибкам.Я бы рекомендовал объединить столбцы вашей базы данных в запросе.Таким образом, если у кого-то есть имя с пробелом, например «Сара Джейн Альбертсон», он не будет искать имя «Сара» и фамилию «Джейн» и будет полностью игнорировать «Альбертсон».

Это должно сделать то, что вам нужно:

$search_people = mysql_query("SELECT * FROM glnce_users 
    WHERE CONCAT(f_name, ' ', l_name) LIKE '%$search%' OR l_name LIKE '%$search%'");
2 голосов
/ 26 марта 2014

Обычный 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();
2 голосов
/ 05 мая 2011

вы можете использовать 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 поиск тут: YouTube

2 голосов
/ 05 мая 2011
$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 */

Вы можете переключить второе ИЛИ с помощью И, если хотите, чтобы воспитывался только Крис Олсон, в противном случае также будут воспитываться Крис и Олсон.

1 голос
/ 05 мая 2011

Прежде всего используйте explode function, чтобы получить эти два слова (любое количество слов, которые вы искали) из space., А затем просто попытайтесь создать запрос в FOR LOOP ..

Тогда используйте этот запрос. Вы получите абсолютно все, что хотели.

Спасибо.

0 голосов
/ 05 мая 2011

используйте полнотекстовый поиск mysql

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

0 голосов
/ 05 мая 2011

Сначала взорвите свою строку, чтобы получить каждый кусокСплит на пространстве.Затем сравните ВСЕ части в строке как с именем, так и с фамилией.

Или вы можете объединить столбцы с именами и фамилиями в элементе выбора, чтобы он просто запрашивал один раз для комбинированных полей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...