2010-09-29 109 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'";