2010-11-05 38 views
0

我正在爲我的用戶製作一個PM系統。顯示兩個以上的名稱和空間問題

在收件人字段中輸入完整名稱。當你提交我想確保它是他發送給他的正確用戶。

因此,如果他鍵入「梅根福克斯」,這是一個用戶的完整匹配。但如果他鍵入梅格F或梅根,福克斯將返回「你是指梅根福克斯?」

所以......

現在我已經想過,如果有就是不止一個名爲「梅根」還是姓「狐狸」。我爲此做了一段時間,如果超過1,它會回來,「你是誰的意思:馬特福克斯,梅根福克斯?」

現在我發現它出錯的地方,我得到了3行與姓氏「福克斯」,它只顯示其中兩個在「誰是你的意思?

我該如何解決這個問題?

如果我只在收件人字段中輸入空格,它將返回表中的所有用戶。我怎樣才能防止這個?

這裏是我的代碼如下所示:

$mot = mysql_real_escape_string($_POST['mottagare']); 
list($firstname, $lastname) = array_map('ucfirst', explode(' ', $mot, 2)); 
$qur = mysql_query(" 
SELECT id, firstname, lastname, 
(firstname = '$firstname' AND lastname = '$lastname') AS full FROM users 
WHERE (firstname = '$firstname' AND lastname='$lastname') 
OR (firstname LIKE '$firstname%' AND lastname LIKE '$lastname%') 
OR firstname LIKE '$firstname%' OR lastname LIKE '$firstname%' 
ORDER BY (firstname = '$firstname' AND lastname='$lastname') DESC"); 

$get = mysql_fetch_array($qur); 

if(mysql_num_rows($qur) == 1){ 
    if($get["full"] == 1){ 
    echo $get["id"]; 
    }else{ 
    echo "Did you mean ".$get["firstname"]." ".$get["lastname"]." ?"; 
    } 
}elseif(mysql_num_rows($qur) > 1){ 
    while($get = mysql_fetch_array($qur)) { 
     $name[] = $get["firstname"]." ".$get["lastname"]; 
    } 

    if(count($name) > 1) { 
     echo 'Who did you mean?<br>'; 
    } else { 
     echo 'Did you mean: '; 
    } 
    echo implode('<br>', $name); 

} 

回答

2

在這一行:

$get = mysql_fetch_array($qur); 

你已經獲取你的第一個名字,而不將其追加到$ name數組,所以在這條線:

while($get = mysql_fetch_array($qur)) { 

第一個將無法從DB再次獲取。

+0

但是..線條在不同的if's ..雖然工作,這不是問題 – Johnson 2010-11-05 20:10:28

+0

不,第一個是根本沒有「如果」,它總是執行。 – AndreKR 2010-11-05 20:12:01

+0

@約翰遜:如果這段時間工作,你不會在這裏問我們爲什麼不這樣做。你的第一個mysql_fetch_array總是被執行,並從結果集中移除第一個元素,這就是爲什麼它甚至不會到達這個時間。 – 2010-11-05 20:13:26

0

對於您的空間問題,您可以要求在建議結果之前必須輸入一定數量的非空格字符。

如果只有少數用戶,您還可以嘗試根據Levenshtein distance提出建議來糾正拼寫錯誤。

+0

哦,是的,我忽略了空間問題。維克托是正確的,只是不執行整個事情如果修剪($ _ POST ['mottagare'])==「」。 – AndreKR 2010-11-05 20:16:38

相關問題