PHP:正确搜索

时间:2010-09-29 16:56:01

标签: 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,因为也许你不记得用户的名字,那么这段代码会将它作为名字,因为所有的空格都是名字(list()行),然后把它放进去在$ firstname中没有任何结果,因为没有姓氏的名字。

我该如何解决这个问题?如果你按名字搜索它也可以正常使用全名,但不仅仅是姓氏。任何智能解决方案?

4 个答案:

答案 0 :(得分:2)

如果我理解正确,这是最简单的解决方案:

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

编辑:为爆炸线添加了限制。

答案 1 :(得分:2)

您可以构建一系列条件:

  1. 拆分空间输入
  2. 对于结果数组中的每个项目,追加OR firstname ='value'或lastname ='value'
  3. 史密斯变成了:

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

    约翰史密斯成了:

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

    如果这不符合您的喜好,那么您可以分解搜索字词,这样您就可以单独输入名字和姓氏。

答案 2 :(得分: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());
...
}

答案 3 :(得分: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