MySQL选择第一个和第二个名称(如x和x)的用户

时间:2012-06-28 20:42:30

标签: php mysql

我无法想出一个标题的方法,对不起,基本上我在我的网站上有搜索功能,它应该从输入查询的数据库中选择用户或者像他们的第一个,第二个,第一个和第二个,或者是他们的第一个和第二个,第一个或第二个名字。 (这让我很难打字输入)

代码:

    $query = mysql_real_escape_string(htmlentities(strip_tags(stripslashes(@$_GET['q']))));
    $searchArray = explode(" ", $query);
    $query = trim($query);

if($query == "" || $searchArray == "") {
                    echo("<div id='result'><p>Please enter a search term</p></div>");
                }
                if (!isset($query) || !isset($searchArray)){
                    echo("<div id='result'><p>Please enter a search term</p></div>");
                }
                if (count($searchArray) > 1) {
                    $sq = mysql_query("
                    SELECT * FROM users WHERE fname LIKE '%{$searchArray[0]}%' 
                    OR fname LIKE '%{$searchArray[1]}%' 
                    OR sname LIKE '%{$searchArray[0]}%' 
                    OR sname LIKE '%{$searchArray[1]}%' 
                    OR fname LIKE '%{$searchArray[0]}%' AND sname LIKE '%{$searchArray[1]}%' 
                    OR fname LIKE '%{$searchArray[1]}%' AND sname LIKE '%{$searchArray[0]}%'
                    OR fname = '%{$searchArray[0]}%' AND sname = '%{$searchArray[1]}%' 
                    OR fname = '%{$searchArray[1]}%' AND sname = '%{$searchArray[0]}%' 
                    ");
                } 

                else{
                    $sql = "SELECT * FROM users WHERE fname AND sname LIKE '%$query%' OR email LIKE '%$query%'";
                }

在我的数据库中,我有以下用户: 德克兰史密斯 约瑟夫布拉伊斯福德 测试用户 测试用户2

如果我搜索电子邮件,我会得到正确的结果。 如果我搜索Dec,Declan或Smith,我会得到正确的结果。 如果我搜索测试,测试用户或用户,我得不到任何结果。 如果我搜索Joseph,Brailsford或Joseph Brailsford,我就没有结果。 如果我搜索Declan Smith,我会得到Joseph Brailsford。

显然,这根本不对,所以有人可以告诉我我做错了什么吗?:/

2 个答案:

答案 0 :(得分:1)

我不完全确定你写的逻辑,但我认为只有这些是必要的:

SELECT * FROM users
  WHERE fname LIKE '%{$searchArray[0]}%' 
     OR fname LIKE '%{$searchArray[1]}%' 
     OR sname LIKE '%{$searchArray[0]}%' 
     OR sname LIKE '%{$searchArray[1]}%' 

该WHERE子句的所有其他部分似乎都是多余的。但如果你真的需要它们,我想你想要括号。否则,“AND”打破了它的工作希望:

SELECT * FROM users 
  WHERE fname LIKE '%{$searchArray[0]}%' 
     OR fname LIKE '%{$searchArray[1]}%' 
     OR sname LIKE '%{$searchArray[0]}%' 
     OR sname LIKE '%{$searchArray[1]}%' 
     OR (fname LIKE '%{$searchArray[0]}%' AND sname LIKE '%{$searchArray[1]}%')
     OR (fname LIKE '%{$searchArray[1]}%' AND sname LIKE '%{$searchArray[0]}%')
     OR (fname = '%{$searchArray[0]}%' AND sname = '%{$searchArray[1]}%')
     OR (fname = '%{$searchArray[1]}%' AND sname = '%{$searchArray[0]}%')

最后两行......为什么%等于测试?当然你不需要那些。

答案 1 :(得分:1)

$sql = "SELECT * FROM users WHERE fname AND sname LIKE '%$query%' OR email LIKE '%$query%'";

应该是

$sql = "SELECT * FROM users
        WHERE 
             fname LIKE '%$query%' OR
             sname LIKE '%$query%' OR 
             email LIKE '%$query%'";

OR

$sql = "SELECT * FROM users WHERE CONCAT(fname, ', ', sname, ', ', email) LIKE '%$query%'";

这样你就不必写那些OR条件了......

您的第一个查询也应该是

SELECT * FROM users
WHERE concat(fname, ', ', sname) LIKE '%{$searchArray[0]}%' 
OR concat(fname, ', ', sname) LIKE '%{$searchArray[1]}%'

另请阅读 Is there a difference between these two queries?