2011-02-23 88 views
2

你将如何做一个mysql查询,用户可以从多个选项中进行选择。 Fox示例我有一个用户可以用来搜索房屋的表单。现在我有一个选择框,您可以在这里选择是否需要房屋,公寓或其他任何东西。然后我有第二个箱子,你可以选择你想要的房子或公寓的城市。也许另一个价格最高的房子。如何用多个WHERE子句执行MySQL查询?

现在你将如何做MySQL查询?我的问题是,我会这样做: if($ _ POST [“house_type”]!= 0)$ select = mysql_query(“SELECT * FROM WHERE type ='”。$ _ POST [“house_type”] 。 “'”); } 但现在我只有这样的情况,有人选择了房屋类型,但没有任何其他选项。那么,我必须为所选元素的每种可能组合做一个“if”吗?

为了强调我的问题:

if(!isset($_POST["house_type"])) { 

      if($_POST["something"] == 0) { 
     $search_select = @mysql_query("SELECT * FROM housedata WHERE something = $_POST["whatever"]); 

      } 
      elseif($_POST["something"] != 0) { 
     $search_select = @mysql_query("SELECT * FROM housedata something = $_POST["whatever"] AND somethingelse = 'whatever'); 
      } 
     } 



elseif(!isset($_POST["house_type"])) { 


     if($_POST["something"] == 0) { 
     $search_select = @mysql_query("SELECT * FROM housedata WHERE something = $_POST["whatever"]); 

      } 
      elseif($_POST["something"] != 0) { 
     $search_select = @mysql_query("SELECT * FROM housedata something = $_POST["whatever"] AND somethingelse = 'whatever'); 
      } 
     } 

现在想象一下,我有一个像10个或20个不同的选择框,输入域和复选框,我会根据什么这些盒子和fiels和做一个MySQL查询复选框已填充。这将是一个非常复杂,缓慢和可怕的代码。那么是否有可能做出如下的mysql查询:

SELECT * FROM whatever WHERE house_data = '".$whatever."' AND (if(isset($_POST["something"])) { whatever = '".$whatever2."' } AND ...; 

你明白我的意思了吗?它的解释有点复杂,但实际上它是一个非常重要的问题,可能很容易回答。

谢谢你的帮助! phpheini

+0

Loop through and concat输入所有选项? – 2011-02-23 15:42:35

回答

4

生成WHERE子句在运行SQL之前。

一个简单的例子:

$whereClause = ""; 

if ($_POST['opt1']) { 
    $opt1 = mysql_real_escape_string($_POST['opt1']); 
    $whereClause .= "AND opt1='$opt1'"; 
} 

if ($_POST['opt2']) { 
    $opt2 = mysql_real_escape_string($_POST['opt2']); 
    $whereClause .= "AND opt2='$opt2'"; 
} 

mysql_query("SELECT * FROM table WHERE 1 ".$whereClause); 
+0

谢谢!非常好,简单! – phpheini 2011-02-23 15:56:17

+0

只记得逃避所有通过$ _POST来防止SQL注入:) – lethalMango 2011-02-23 15:59:13

+0

@lethalMango - $ 10雄鹿说他没有;) – Jakub 2011-02-23 16:07:18

1

要指出你一点点到正确的方向,尝试这样的事情:

if(isset($_POST["something"])) 
{ 
    $where = " AND whatever = '".$whatever2."'"; 
} 
else $where = ''; 

mysql_query("SELECT * FROM whatever WHERE house_data = '".$whatever."'".$where);
+0

在这种情况下可能要使用append'$ where。=“AND whatever = ....' – Jakub 2011-02-23 15:46:39

+0

谢谢!我早就想到了这一点,但我认为这里有一个mysql函数或什么。 – phpheini 2011-02-23 15:57:42

0

写一些简单的查询生成器

$where = array(); 
if($_POST["something"]) { 


$where[] = sprintf(" something='%s'",$_POST["something"]); 

// sprintf的 - 防止SQL注入 }

if($_POST["something2"]) { 


$where[] = sprintf(" something2='%s'",$_POST["something2"]); 
} 
//build where string 
$where_str = " WHERE ".implode(" AND ",$where); 
//build sql 
$sql = "SELECT * ... $where_str"; 
+0

谢谢,但是什么是sprintf在这种情况下做? – phpheini 2011-02-23 15:55:35

+0

它将$ _POST变量转换为字符串并转义特殊字符以防止SQL注入请参见图片http://imgs.xkcd.com/comics/exploits_of_a_mom.png – Michal 2011-02-23 16:22:41

0

您需要单独建立自己的搜索字符串,但格式很简单

SELECT * FROM your_table WHERE number = {$number} AND sentence = '{$sentence}'; 

既然你是基于PHP逻辑做到这一点创建搜索词:

$search = "SELECT * FROM your_table WHERE "; 
if(isset($whatever)) $search .= "something = '{$whatever}'"; 
if(isset($whateverelse)) $search .= " AND somethingelse = '{$whateverelse}'"; 
$search_select = mysql_query($search); 
+0

非常感谢!为什么你把变量放在括号({和})中?是否比使用''。$ number''更好?''? – phpheini 2011-02-23 15:57:17

+0

如果'$ whatever'没有设置,而是'$ whateverelse',你最终会选择''SELECT * FROM your_table WHERE和somethingelse ='{$ whatevellse}'“; – lethalMango 2011-02-23 16:10:48

+0

是否对我的问题有答案? – phpheini 2011-02-23 16:21:07

1
$where = array(); 
if($_POST["something"]) { 
    $where[] = " something =".$_POST["something"]; 
} 
if($_POST["something2"]) { 
    $where[] = " something2=".$_POST["something2"]; 
} 
. 
. 
. 
//build where string 
$where_ = !(empty($where) ? " WHERE ".implode(" AND ",$where) : ""; 
//build sql 
$sql = "SELECT * ... ".$where;