2015-05-12 46 views
1

我想通過選擇複選框來搜索不同的製造商,我該怎麼做?用於搜索的SQL設置

如果他們選擇了7搜索如何將我得到它與SQL字符串的工作,現在我必須手動輸入這樣LIKE '%BMW'但我想它來自於循環:

if(!empty($_POST['check_list'])) { 
    // Loop to store and display values of individual checked checkbox. 
    foreach($_POST['check_list'] as $selected) { 
     echo $selected."</br>"; 
    } 
} 

$sql = "SELECT * FROM `Cars` WHERE `manufacturer` LIKE '%BMW' OR 
     `manufacturer` LIKE '%Audi' ORDER BY `tier` ASC"; 
+0

動態構建你的sql。並考慮使用更好的表結構,這樣您就不會陷入使用無索引/不可優化的子字符串匹配。 –

回答

2

通常,當您使用複選框縮小範圍時(例如在Amazon中),它們不會使用通配符。在這種情況下,對於製造商列表,您可能會更好地執行WHERE IN

SELECT * FROM `Cars` 
WHERE `manufacturer` IN ('BMW', 'Audi', 'Mercedes', 'Lexus', 'Cadillac', 'Huffy Bikes'); 

在這種情況下,要在PDO準備語句中使用,您不需要循環。只需要array_fill和implode()來生成佔位符,然後在execute()中綁定數組。

$placeholders = array_fill(0, count($_POST['check_list']), '?'); 
$pdo->prepare('SELECT * FROM `Cars` WHERE `manufacturer` IN ('.implode(',' $placeholders).')'); 
$stmt->execute($_POST['check_list']); 

如果你有奧迪BMW$_POST['check_list'],則implode(',', $placeholders)將輸出?,?PDO ::執行()將每一個佔位符(?)與相應的值綁定。

0

比方說,我們有$ _POST ['check_list']數組中的製造商名稱。

您可以簡單地將該名稱連接成一個變量並用它來構建查詢。要構建查詢,最簡單的方法是使用IN運算符,而不是類似的運算符。 的代碼應該是:

$query = "SELECT * FROM `Cars` WHERE `manufacturer` IN (".implode(",",$_POST['check_list']).")"; 

這應該工作,但創造一個安全問題(SQL注入)。 做的事情以正確的方式,你應該使用數組,與廠家名稱和每個一個ID,如:

$manufacturers = array(1 => "BMW", 3 => "Renault", 4 => "Ferrari"); 

而且你可以從這個數組dinamically創建複選框:

foreach($manufacturers as $id => $name) { 
    echo '<label><input type="checkbox" name="check_list[]" value="'.$id.'>'.$name.'</label>'; 
} 

而在查詢部分,您必須循環到$ _POST ['check_list'](現在包含數字ID)並分配給臨時數組,您需要插入查詢的製造商名稱

$manif_to_select = array(); 
foreach($_POST['check_list'] as $manif_id) { 
    if(!isset($manufacturers[$manif_id])) 
     continue; 

    $manif_to_select[] = $manufacturers[$manif_id]; 
} 
$query = "SELECT * FROM `Cars` WHERE `manufacturer` IN (".implode(",",$manif_to_select).")"; 
+0

您需要使用輸入'name =「check_list []」',但我不確定爲什麼不使用預準備語句來防止SQL注入。 – Devon

+0

編輯(thx爲修復...當你寫速度時,這附加) 是的,我可以使用準備的語句,以防止SQL注入...但用戶仍然可以嘗試發送不在數據庫中的值(即是不是一個安全問題,但可以創建其他問題...) 這樣你也可以使用非Unicode名稱等... –

+0

爲什麼我不能使用兩個$ sql =「SELECT * FROM'Cars' WHERE manufacturer IN('。。implode(「','」,$ checklist)。「)AND tier IN(」。implode(「','」,$ tier)。「')」; – youngkid7