2010-09-29 84 views
1

我做了一个正常的表单,您可以输入用户的全名并选择性别。PHP:在数据库中搜索

现在在PHP中进行数据库搜索。

$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); 
echo $count; 

如果我进入珍妮杰克逊(存在),然后选择“男性”,我仍然在$计数得到1,但珍妮·杰克逊是一个女性,有女性在性别栏..我试图做回应$ sex来查看$ sex的价值,如果它真的是您在表单中选择的,并且是正确的。

+0

*(建议)*考虑使用[改进的MySQL接口](http://de.php.net/manual/en/ book.mysqli.php) – Gordon 2010-09-29 13:55:09

+0

ie * mysqli *。顺便说一句有没有问题,或者你只是想表明你一些PHP的? – 2010-09-29 13:57:55

回答

3

您需要使用括号中的查询为:

WHERE (firstname LIKE '$firstname' OR lastname LIKE '$lastname') AND sex='$sex'"; 

没有括号的查询等效于:

WHERE firstname LIKE '$firstname' OR (lastname LIKE '$lastname' AND sex='$sex')"; 

,自firstname条件匹配,则返回该行。

这是因为AND是有precedenceOR

+0

名字工作正常,但是当我只搜索姓氏。例如“杰克逊”,那么它返回0.所以OR不工作正确? – Johnson 2010-09-29 14:09:26

+0

添加圆括号表示性别必须匹配,并且名字或姓氏应该匹配。 – codaddict 2010-09-29 14:13:28

+0

使用没有'''''''''LIKE'或者'_'没有用处?它还有什么其他目的? – Shikiryu 2010-09-29 14:43:04

0

使数据库知道哪个优先(AND或OR),您需要在您的WHERE条款括号:

WHERE (firstname LIKE '$firstname' OR lastname LIKE '$lastname') AND sex = '$sex' 
0

你结合和和OR条件相同WHERE子句

您的意思是

(firstname LIKE '$firstname' OR lastname LIKE '$lastname') AND sex = '$sex' 

firstname LIKE '$firstname' OR (lastname LIKE '$lastname' AND sex = '$sex') 
+1

他意味着第一个,否则他不会问这个问题;-) – Mischa 2010-09-29 13:59:53

+0

如果我不得不问这是哪种可能性,那么SQL解析器也必须猜测(SQL除外有一个优先规则,使它的猜测)...我休息我的情况 – 2010-09-29 14:06:39

+0

我只是想*开玩笑*指出你*不必问*因为a)SQL有优先规则和b)TS是没有得到他预期的结果...我休息我的情况 – Mischa 2010-09-29 14:12:00

1

尝试加入一些括号

$query = " 
    SELECT 
     firstname, 
     lastname, 
     id, 
     user_name, 
     sex, 
     last_access, 
     bostadsort 
    FROM users 
    WHERE 
     (
     firstname LIKE '$firstname' 
     OR lastname LIKE '$lastname' 
     ) 
     AND sex = '$sex'";