1

我想不出一个办法来表达标题,很抱歉,基本上我的网站上有一个搜索功能,它应该从数据库中选择用户,其中输入的查询就像他们的第一个,第二个,第一个和第二个,或者是他们的名字和第二个、名字或第二个名字。(这让我很困惑打字)

编码:

    $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%'";
                }

在我的数据库中,我有以下用户: Declan Smith Joseph Brailsford 测试用户 测试用户 2

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

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

4

2 回答 2

2
$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%'";

或者

$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]}%'

另请阅读这两个查询之间有区别吗?

于 2012-06-28T20:53:19.167 回答
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]}%')

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

于 2012-06-28T20:52:59.423 回答