2011-09-08 66 views
2

我正在開發一個使用PHP和Codeigniter構建的API,我使用MySQL作爲數據庫。用全名搜索而不是名字或姓氏

我有一個用戶表稱爲用戶,包含以下幾列:

- ID 
- Firstname 
- Lastname 
- Email 

如何使用全名的用戶搜索這個表?例如,它可以很好地搜索Martin或Smith,但不是Martin Smith。

這是我現在使用的查詢:

$this->db->select('*'); 
$this->db->from('users'); 
$this->db->like('firstname', $args['query']); 
$this->db->or_like('lastname', $args['query']); 

更新

如果我使用此查詢的建議下面我無法找到任何東西。不包含全名,名字或姓氏。然後,名字和姓氏必須是相同的單詞。

$this->db->select('*'); 
$this->db->from('users'); 
$this->db->like('firstname', $args['query']); 
$this->db->like('lastname', $args['query']); 
+1

爲什麼犯規工作?你期望什麼,取而代之的是什麼。 – TJHeuvel

回答

1

直出我的頭,但對於

$input = 'Martin Smith'; 

$names = explode($input); 

$this->db->select('*'); 
$this->db->from('users'); 
$this->db->where_in('firstname', $names); 
$this->db->or_where_in('lastname', $names); 

應輸出類似:

SELECT * FROM users 
WHERE firstname IN ('Martin', 'Smith') 
OR lastname IN ('Martin', 'Smith') 
+0

好主意,但我不會像亞伯拉罕範海辛或喬納森·帕克·鮑爾斯名工作。 –

+0

+1以供參考。也許不是最靈活的解決方案,但:'SELECT * FROM用戶WHERE CONCAT_WS(」」,名字,姓氏)= 「$ input_firstname $ input_lastname」;' – danneth

1

嘗試:

$this->db->select('*'); 
$this->db->from('users'); 
$this->db->like('firstname', $args['first_name']); 
$this->db->like('lastname', $args['last_name']); 

這導致:

Select * from users 
WHERE firstname LIKE '%first_name%' 
AND lastname LIKE '%last_name% 
+0

那麼,如果我這樣做,搜索不起作用。請參閱更新。 –

+0

我希望現在更清楚 –

+0

問題是,如果我搜索「martin smith」,它不會找到任何東西,不會與martin一起找到任何東西,因爲它正在尋找一個名字爲martin和姓氏martin的用戶。 –

0

變化:$this->db->or_like('lastname', $args['query']);

要:$this->db->like('lastname', $args['query']);

+0

那麼,如果我這樣做,搜索不起作用。請參閱更新。 –

+0

小姐,你應該使用「QUERY1」和「QUERY2」或類似的東西......否則將使用相同的參數來搜索這兩個領域.. –

0

您需要CH安格那或爲AND:

SELECT * FROM users WHERE Firstname = '$firstname' AND Lastname = '$lastname' 
+0

好吧,如果我這樣做了搜索無法正常工作。請參閱更新。 –

+1

好吧,我編輯它。 注:MySQL是大小寫敏感的,你說你的列被命名爲名字,姓氏,電子郵件,但在查詢中使用的是他們像名字和姓氏 –

0

我這樣做和工作的罰款me:

$terms = explode(' ', $searchtxtusername); 
if(count($terms)>1){ 
    $this->db->like('u.first_name', $this->db->escape_like_str($terms[0])); 
    $this->db->like('u.last_name', $this->db->escape_like_str($terms[1])); 
}else{ 
    $this->db->like('u.first_name', $this->db->escape_like_str($terms[0])); 
    $this->db->or_like('u.last_name', $this->db->escape_like_str($terms[0])); 
} 

這裏,$ s earchtxtusername是包含名字和姓氏(空格分隔)的搜索術語。如果只有一個術語,那麼它會檢查名字和姓氏的相同術語。

例如:如果我搜索了鮑勃,然後搜索條件是這樣的:

first_name LIKE '%Bob%' 
AND last_name LIKE '%Bob%' 

,如果我搜索鮑勃Beggins,然後搜索條件爲:

first_name LIKE '%Bob%' 
AND last_name LIKE '%Beggins%'