2011-10-29 120 views
0

我正在做一个网站,用户可以选择一个出租物业,有两个领域,他们可以选择,家具和宠物。在两个选择框中的选项是是和否。我的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> 

我正在编写基于用户在这些字段中选择的SQL语句。

$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"'; 
} 

如果用户是选择有家具,我希望它显示配(是),或者是部分家具(部分)的所有属性。如果用户选择否,我希望它显示所有未提供的属性(否)或具有特殊描述(描述)的属性。

如果用户为宠物选择是,我希望它显示允许所有宠物(是)或只允许猫(猫)或只允许狗(狗)的所有属性。如果用户选择否,我希望它显示所有不允许宠物的属性(否)或具有特殊描述(描述)的属性。

作为一个例子,这是输出的SQL语句,如果用户选择上提供的是的是的宠物:

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" 

的问题是,它现在将返回满足装饰或宠物的任何结果在where条款中的要求,而我需要它返回符合where条款中的家具和宠物要求的结果。

所以它现在会返回一个结果,说有Furnished设置为yes,宠物设置为no。 我怎样才能返回所有结果与家具设置为是和宠物设置为是?

我的SQL语句有什么问题?

+0

你不会像你应该逃避输入变量。看看[mysql_real_escape_string()](http://php.net/manual/en/function.mysql-real-escape-string.php)或[PDO :: quote()](http:// php。 net/manual/en/pdo.quote.php)或数据库库中使用的转义/引用方法... – rodneyrehm

回答

4

AND来运算符优先级OR之前,让您的查询读起来就像

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" 

这是不太你所期望的。尝试

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") 

甚至更​​好

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

你不应该做SELECT *尝试命名您需要的列!

+0

非常感谢您的帮助!为什么它很重要我不做SELECT *?我需要为每个属性返回许多列,所以我没有看到将它们全部写出来的要点。 – zeckdude

+0

除非你真的需要你所有的列,*会导致PHP和MySQL之间不必要的通信开销(内存和CPU无用)。 (其中包括其他原因......) – rodneyrehm

+0

好的,这很有道理。谢谢澄清! – zeckdude

3

把parens放在各种各样的OR的东西。

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

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

等等。