2011-10-29 2 views
0

Je fais un site où l'utilisateur peut sélectionner une propriété de location qui a deux champs qu'ils peuvent choisir, meublés et animaux domestiques. Les options dans les deux boîtes de sélection est Oui et NonQuel est le problème avec ma déclaration SQL?

<select name="furnished"> 
    <option value=""> 
    <option value="yes">Yes</option> 
    <option value="no">No</option> 
</select> 

<select name="pets"> 
    <option value=""> 
    <option value="yes">Yes</option> 
    <option value="no">No</option> 
</select> 

Je vous écris une instruction SQL basé sur ce que les choix de l'utilisateur dans ces domaines.

$sql = 'SELECT * 
     FROM properties 
     WHERE num_bedrooms >= ' . $_GET['num_bedrooms'] . 
     ' AND num_bathrooms >= ' . $_GET['num_bathrooms']; 

if($_GET['furnished'] == 'yes') { //if the furnished is set to yes 
    $sql .= ' AND furnished = "yes" OR furnished = "partially"'; 
} else if($_GET['furnished'] == 'no') { //if the furnished is set to no 
    $sql .= ' AND furnished = "no" OR furnished = "description"'; 
} 

if($_GET['pets'] == 'yes') { //if the pets is set to yes 
    $sql .= ' AND pets = "yes" OR pets = "cats" OR pets = "dogs"'; 
} else if($_GET['pets'] == 'no') { //if the pets is set to no 
    $sql .= ' AND pets = "no" OR pets = "description"'; 
} 

Si l'utilisateur choisit oui pour meublé, je le veux pour afficher toutes les propriétés qui sont fournis (oui) ou qui sont partiellement meublé (partiellement). Si l'utilisateur choisit Non, je veux qu'il affiche toutes les propriétés qui ne sont pas fournies (non) OU qui ont une description spéciale (description).

Si l'utilisateur choisit oui pour les animaux de compagnie, je veux qu'il affiche toutes les propriétés qui permettent tous les animaux domestiques (oui) OU qui permettent uniquement les chats (chats) OU qui permettent uniquement les chiens (chiens). Si l'utilisateur choisit Non, je veux qu'il affiche toutes les propriétés qui n'autorisent pas les animaux domestiques (non) OU qui ont une description spéciale (description).

À titre d'exemple, voici l'instruction SQL émise si l'utilisateur choisit sur Oui Meublé et sur Oui Animaux:

SELECT * FROM properties 
WHERE num_bedrooms >= 1 
AND num_bathrooms >= 1 
AND furnished = "yes" OR furnished = "partially" 
AND pets = "yes" OR pets = "cats" OR pets = "dogs" 

Le problème est qu'il retourne en résultats, conformes aux normes du meublé ou animaux exigences dans la clause where, alors que j'en ai besoin pour renvoyer des résultats qui répondent aux deux exigences fournies et pets dans la clause where.

Par conséquent, il retournera un résultat indiquant que le paramètre Furnished est défini sur yes et que les paramètres animaux sont définis sur no. Comment puis-je l'obtenir retourner tous les résultats avec meublé réglé sur oui ET les animaux de compagnie mis à oui?

Quel est le problème avec mon instruction SQL?

+0

Vous n'échappez PAS aux variables d'entrée comme vous le devriez. Jetez un oeil à [mysql_real_escape_string()] (http://php.net/manual/en/function.mysql-real-escape-string.php) ou [PDO :: quote()] (http: // php. net/manual/en/pdo.quote.php) ou la méthode d'échappement/quotation utilisée dans votre base de données librariy ... – rodneyrehm

Répondre

4

AND vient avant OR en priorité des opérateurs, de sorte que votre requête se lit comme

SELECT * FROM properties 
WHERE 
(num_bedrooms >= 1 AND num_bathrooms >= 1 AND furnished = "yes") 
OR (furnished = "partially" AND pets = "yes") 
OR pets = "cats" 
OR pets = "dogs" 

qui est pas tout à fait ce que vous attendiez. Essayez

SELECT * FROM properties 
WHERE num_bedrooms >= 1 
AND num_bathrooms >= 1 
AND (furnished = "yes" OR furnished = "partially") 
AND (pets = "yes" OR pets = "cats" OR pets = "dogs") 

ou mieux encore

SELECT * FROM properties 
WHERE num_bedrooms >= 1 
AND num_bathrooms >= 1 
AND furnished IN ("yes", "partially") 
AND pets IN ("yes", "cats", "dogs") 

Vous ne devriez pas faire SELECT * essayer de nommer les colonnes dont vous avez besoin!

+0

Merci beaucoup pour votre aide! Pourquoi est-ce important de ne pas faire SELECT *? J'ai beaucoup de colonnes que j'ai besoin de retourner pour chaque propriété, donc je ne vois pas l'intérêt de les écrire tous. – zeckdude

+0

sauf si vous avez vraiment besoin de toutes vos colonnes, * conduirait à une surcharge de communication inutile entre PHP et mysql (mémoire et cpu gaspillés pour rien). (entre autres raisons ...) – rodneyrehm

+0

Ok, ça a du bon sens. Merci de clarifier! – zeckdude

3

Mettez parens autour des diverses choses OR 'd.

$sql .= ' AND (furnished = "yes" OR furnished = "partially")'; 

$sql .= ' AND (pets = "yes" OR pets = "cats" OR pets = "dogs")'; 

et cetera.

Questions connexes