我无法想出一个标题的方法,对不起,基本上我在我的网站上有搜索功能,它应该从输入查询的数据库中选择用户或者像他们的第一个,第二个,第一个和第二个,或者是他们的第一个和第二个,第一个或第二个名字。 (这让我很难打字输入)
代码:
$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。
显然,这根本不对,所以有人可以告诉我我做错了什么吗?:/
答案 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]}%'