2011-02-23 85 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;