2010-09-29 10 views
1

J'ai fait une forme normale que vous pouvez entrer le nom complet d'un utilisateur et choisir le sexe.PHP: Recherche dans la base de données

Maintenant, au PHP pour la recherche dans la base de données.

$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; 

Si j'entre Jenni Jackson (qui existe) et choisissez « mâle », je reçois encore 1 $ count, mais Jenni Jackson est une femme, et a femme dans la colonne sexe .. J'ai essayé do echo $ sex pour voir la valeur de $ sex si c'est vraiment ce que vous avez choisi dans le formulaire, et c'est correct.

+0

* (suggestion) * Vous pouvez utiliser les [Interface améliorée MySQL] (http://de.php.net/manual/en/ book.mysqli.php) – Gordon

+0

ie * mysqli *. BTW est là une question ou vous juste wnat pour montrer que vous quelques morceaux de php? –

Répondre

3

Vous devez utiliser des parenthèses dans votre requête comme:

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

sans la parenthèse votre requête est équivalente à:

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

et depuis firstname matches de l'état, la ligne est renvoyée.

Cela se produit parce que AND est d'avoir precedence sur OR

+0

Le prénom fonctionne bien, mais quand je recherche seulement par le nom de famille .. par exemple "Jackson" alors il renvoie 0. donc l'OR ne fonctionne pas bien? – Johnson

+0

L'ajout d'une parenthèse indique que le sexe doit correspondre et que le prénom ou le nom de famille doit correspondre. – codaddict

+0

N'est-il pas inutile d'utiliser 'LIKE' sans'% 'ou' _'? Quel autre but peut-il avoir? – Shikiryu

0

Vous avez besoin entre parenthèses dans votre clause WHERE afin que la base de données sait qui a la priorité (AND ou OR):

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

Vous combinez ET et OU conditions dans la même clause WHERE

Voulez-vous dire

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

ou

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

Il veut dire le premier ou sinon il ne poserait pas cette question ;-) – Mischa

+0

Si je dois demander laquelle des possibilités est prévue, alors l'analyseur SQL va devoir aussi deviner (sauf SQL a une règle de précédence pour faire deviner avec) ... Je reste mon cas –

+0

Je voulais juste * en plaisantant * souligner que vous * n'avez pas à demander * parce que a) SQL a une règle de priorité et b) TS est Je n'ai pas obtenu le résultat escompté ... Je repose mon cas – Mischa

1

Essayez d'ajouter des supports

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