2010-09-29 88 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