2010-09-29 140 views
1

我現在有這個權利:PHP:搜索正確

if(isset($_POST["search"]) && !empty($_POST["search"])) { 
    $full_name = mysql_real_escape_string($_POST["search"]); 
    $sex = mysql_real_escape_string($_POST["sex"]); 
    list($firstname, $lastname) = array_map('ucfirst', explode(' ', $full_name)); 
    $query = "SELECT firstname, lastname, id, user_name, sex, last_access, bostadsort FROM users WHERE (firstname LIKE '$firstname' OR lastname LIKE '$lastname') AND sex = '$sex'"; 
    $result1 = mysql_query($query) or die(mysql_error()); 
    $count = mysql_num_rows($result1); 
    while($get = mysql_fetch_array ($result1)){ 
     echo $get["firstname"] . " " .$get["lastname"]."<br>"; 
    } 
} 

這是我的搜索查詢。現在該表格被稱爲「搜索全名」。你輸入,然後分成$ firstname,$ lastname。

工程很好,沒問題。

雖然如果你只輸入一個用戶的LASTNAME,因爲也許你不記得用戶的名字,那麼這段代碼會把它當作firstname,因爲所有在空格之前都是firstname(list()行)它以$ firstname命名並且不會導致任何結果,因爲這個姓氏沒有名字。

我該如何解決這個問題?如果你通過名字搜索,它也可以正常工作,也可以使用全名,但不只是姓氏。任何智能解決方案

+0

個人而言,我會重構整個事物並使用兩個輸入字段,每個字段對應一個名稱。如果一個人輸入三個單詞,則不知道中間單詞是名字,姓氏還是中間名的一部分。在當前實現中,您可能需要考慮添加限制= 2,修剪空白並檢查多個連續空格。 – Matthew 2010-09-29 17:13:16

+0

我應該在哪裏修剪白色空間。我從你的答案中增加了限制。我知道這與輸入三個字,但我的網站是沒有中間名,只有第一個姓氏 – Johnson 2010-09-29 18:43:02

回答

2

如果我理解正確的話,這是最簡單的解決方案:

list($firstname, $lastname) = array_map('ucfirst', explode(' ', $full_name, 2)); 
if (!$lastname) $lastname = $firstname; 

編輯:增加了一個限制的爆炸線。

+1

嗨。我不明白,如果姓氏是空的,然後填寫名字? – Johnson 2010-09-29 17:02:19

+0

+1我認爲這是我會做的。 (值在WHERE子句中是OR) – MrWhite 2010-09-29 17:06:28

+0

你不瞭解什麼?如果一個人只輸入一個單一的值,它可能是一個名字或一個姓氏。因此,您需要在兩個字段中搜索相同的值。 – Matthew 2010-09-29 17:08:16

1

搜索這兩個(或多個)列表項,因爲名稱可能包含空格並查找唯一結果。

$arr_name= explode(' ', $full_name); 

foreach($arr_name as $name){ 
$query = "SELECT firstname, lastname, id, user_name, sex, last_access, bostadsort FROM users WHERE (firstname LIKE '$name' OR lastname LIKE '$name') AND sex = '$sex'"; 
$result1 = mysql_query($query) or die(mysql_error()); 
... 
} 
2

可以構建一系列的條件:

  1. 分割空間
  2. 輸入對於所得到的陣列中的每個項目,追加或姓名=「值」 OR姓氏=「值」

所以史密斯就變成了:

SELECT * FROM table WHERE (firstname='smith' OR lastname='smith') .... 

和約翰·史密斯就變成了:

SELECT * FROM table WHERE (firstname='john' OR lastname='john' OR firstname='smith' OR lastname='smith') .... 

如果不是根據自己的喜好,那麼你可以打出來的搜索詞,以便您可以分別輸入名字和姓氏。

1
if (!empty($_POST["search"])) { 
    $name = mysql_real_escape_string($_POST["search"]); 
    $sex = mysql_real_escape_string($_POST["sex"]); 
    $query = "SELECT firstname, lastname, id, user_name, sex, last_access, bostadsort 
       FROM users 
       WHERE (firstname = '$name' 
        OR lastname = '$name' 
        OR CONCAT(firstname, lastname) = '$name' 
        OR CONCAT(lastname, firstname) = '$name') 
        AND sex = '$sex'"; 
    $result1 = mysql_query($query) or die(mysql_error()); 
    $count = mysql_num_rows($result1); 
    while ($get = mysql_fetch_array($result1)){ 
     echo $get["firstname"] . " " . $get["lastname"] . "<br>"; 
    } 
} 

我只是檢查它的搜索輸入是名字,姓氏,名字和姓氏,或者是姓氏和名字。

PS:這個版本的一個好的副作用是它也會找到像Milhouse van Houten這樣的名字。您的原始版本(以及這裏提出的許多版本)無法處理這種情況。他們會尋找Milhousevan

PPS:您可能爲數據庫選擇了*_ci排序規則。因此字符串比較將不區分大小寫:您不需要ucfirst