2012-04-14 133 views
2

我需要一個PHP腳本,將使用窗體的複選框的值作爲MySQL查詢檢索數據。我想我需要在查詢中使用WHERE和OR運算符。檢索數據與表格使用WHERE多個複選框

我的PHP和MySql級別是初學者。

<form id="form1" name="form1" method="post" action=""> 

    <p> 
     <h3>story</h3> 
     <label><input type="checkbox" name="story" value="1" id="story_1" />one story</label> 
     <label><input type="checkbox" name="story" value="2" id="story_2" />two story</label> 
    </p> 

    <p> 
     <h3>bedrooms</h3> 
     <label><input type="checkbox" name="bedroom" value="2" id="bed_2" />two beds</label> 
     <label><input type="checkbox" name="bedroom" value="3" id="bed_3" />three beds</label> 
     <label><input type="checkbox" name="bedroom" value="4" id="bed_4" />four beds</label> 
    </p> 

    <p> 
     <h3>baths</h3> 
     <label><input type="checkbox" name="bath" value="1" id="bath_1" />one bath</label> 
     <label><input type="checkbox" name="bath" value="2" id="bath_2" />two baths</label> 
     <label><input type="checkbox" name="bath" value="3" id="bath_3" />three baths</label> 
    </p> 

    <input type="submit" name="search" value="search" /> 

</form> 

我的查詢到目前爲止

SELECT * FROM homes WHERE story='1' OR story='2' OR bed='3' OR baths='3' 

所以,如果沒有複選框被選中沒有WHERE子句將在所有被添加,它會默認爲檢索的所有記錄。

+2

使用單選按鈕。不是複選框。 – 2012-04-14 15:04:24

+0

@Truth也許多選都是有效的。 – 2012-04-14 15:04:48

+0

@joeframbach:是的,我想要一個1層和2層的房子,有兩個和三個浴室。 – 2012-04-14 15:05:56

回答

1

我爲避免注入攻擊增加了一些附加功能。

$query = 'SELECT * FROM homes WHERE 1'; 

// Protect against injection attacks 
$valid_responses = array(
    'story' => array(
     '1','2'), 
    'bedroom' => array(
     '2','3','4'), 
    'bath_1' => array(
     '1','2','3'), 
); 
foreach ($valid_responses as $field=>$values) { 
    $selection = array_intersect($_POST[$field],$values); 
    if (!empty($selection)) { 
     $query .= ' AND ' . $field . ' IN (' . implode(',',$selection) . ')'; 
    } 
} 
+0

看起來就是我所需要的。今天我沒有時間測試,但我相信你比我更好,並且是正確的。謝謝。 – 2012-04-15 00:28:17

+0

這已經有一段時間了,但是請您告訴我如何避免在您提供的代碼中使用該錯誤時出現此錯誤?警告:array_intersect():參數#1不是數組 – 2013-04-26 10:05:27

+0

任何進一步的幫助將不勝感激 – 2013-04-26 10:15:54

2

使用select語句,因爲你擁有它或許會導致問題。

SELECT * FROM homes WHERE story='1' OR story='2' OR bed='3' OR baths='3' 

這將產生所有的家庭 其中的故事= 1與任意數量的浴室或臥室。 其中故事= 2與任何數量的浴室或臥室。 其中牀= 3與任何數量的故事或浴缸 其中浴場與任意數量的牀或浴缸

= 3所以你可能最終得到的結果與所有家庭的

你應該做的是獨立的與parens不同的類型,並在它們之間使用AND。

SELECT * FROM homes WHERE (story='1' OR story='2') and (bed='3') and (baths='3') 

或更復雜的查詢,這樣的事情。

SELECT * FROM homes WHERE (story='1' OR story='2') 
         and (bed='3' OR bed = '4') 
         and (baths='3' OR baths='4') 

這將產生有3個1個或2,臥室或4和3或4浴場的故事,你不會得到任何3間的房子,結果,你不會得到任何2臥室的房子,你不會得到2間浴室的房子。

我認爲這樣做。

+1

也可以使用IN,如'WHERE(故事IN(1,2))和(bed IN(3,4))''。 – 2012-04-14 15:16:42

1

您需要在HTML中的每個輸入上具有唯一的「名稱」屬性。當表單發佈後,它將被髮送到「action」屬性的URL地址。你有空白,所以你可能想發送它到「something.php」,並在服務器上有一個相同名稱的PHP文件。

如果空($ _ POST)返回True,您將知道表單是否已發佈到PHP文件。該變量保存表單中的發佈數據。

每個輸入標籤的name屬性將在$ _POST全局變量中創建一個數組條目。所以如果啓用複選框,$ _POST [「bath_1」]將爲1。

有許多不同的方法可以將$ _POST數據轉換爲SQL語句以獲取所需內容。我建議你先處理髮布的數據,然後返回一個更具體的與處理數組和生成SQL語句相關的問題。

2

您可以通過使用同樣的事情命名的投入獲得陣列中的全部選定的值,其次是方括號:

HTML:
<輸入類型=「複選框」 NAME =」牀[]」值= 「1」/ >一臥室
< INPUT TYPE = 「複選框」 名稱= 「牀[]」 的值= 「2」/ >雙臥室

然後可以在使用mysql IN() function你的WHERE cla使用。 PHP:

$aBeds = $_POST['bed']; // array (1,2) if both are checked 
$aBeds = array_map ('intval', $aBeds); // filter with intval for sql injection 
$sBeds = implode (',', $aBeds); // "1,2" if both are checked 
$query = "SELECT * FROM homes WHERE bed IN($sBeds) and ..."; 

注:我做了一些快速和骯髒的輸入濾波有,但要注意,這可能不是以避免SQL注入的最佳方式。最好使用數據訪問層,準備好的語句或其他通用方案,其中每個查詢都不需要自己的過濾代碼。