2015-08-28 27 views
-4

我已經實現了一個搜索欄到一個會去數據庫並從中獲取結果的網站,但現在我想爲該搜索添加一個過濾器,以便您可以過濾由一組類別(也在這個數據庫中定義)。 如何獲取Filter Dropdown中的參數並將它們傳遞給PHP搜索?在我的搜索中包含一個過濾器,PHP

到目前爲止,我的HTML看起來像這樣:

<div class="form-group"> 
    <div class="input-group-btn search-panel"> 
     <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> 
     <span id="search_concept">Filtrar</span> <span class="caret"></span> 
     </button> 
     <ul class="dropdown-menu" role="menu"> 
      <?php print("$salida");?> 
      <li><a href="#" data-value="action">Todo</a></li> 
     </ul> 
     <input type="hidden" name="search_param" value="all" id="search_param">   
     <input type="text" class="form-control" name="searchinv" placeholder="Buscar" onkeydown="searchq();"> 
    </div> 
    </div> 

的JavaScript是:

$(document).ready(function(e){ 
    $('.search-panel .dropdown-menu').find('a').click(function(e) { 
    e.preventDefault(); 
    var param = $(this).attr("href").replace("#",""); 
    var concept = $(this).text(); 
    $('.search-panel span#search_concept').text(concept); 
    $('.input-group #search_param').val(param); 
    }); 
    }); 
function searchq(){ 
    var searchTxt = $("input[name='searchinv']").val(); 
    $.post("search.php",{searchVal: searchTxt}, function(output){ 
    $("#output").html(output); 
    }); 
} 

而且PHP:

if(isset($_POST['searchVal'])){ 
$searchq = $_POST['searchVal']; 
$query = $mysqli->query("SELECT * FROM product WHERE name_product LIKE '%".$searchq."%'"); 

if($query->num_rows){ 
    $rows = $query->fetch_all(MYSQLI_ASSOC); 
    forEach($rows as $row){ 
    $nprod = $row['name_product']; 
    $id = $row['id_product']; 
    $output .= '<div> '.$nprod.' '.$id.'</div>'; 
    } 
}  
+0

標記爲要求教程。除了「我不做X,但我想開始做X」之外,您不會出現問題。當您提供代碼時,沒有錯誤消息可以確定您是否真正測試了您的理論。 – onebree

回答

1

選擇所有從數據庫中的類別和然後在視圖中循環選擇它們作爲選項。像這樣:

<select id='search-filter' name='filter'> 
<!--$categories is an array containing all your available filters--> 
<?php foreach($categories as $category):?> 
    <option value='<?php echo $category;?>'><?php echo $category;?></option> 
<?php endforeach;?> 
</select> 

這將創建一個帶有過濾器作爲選項的下拉菜單。

然後,在JavaScript編輯searchq()功能,使其在選擇外地員額值過:

function searchq(){ 
    var searchTxt = $("input[name='searchinv']").val(); 
    var filter = $('search-filter').val(); 
    $.post("search.php",{searchVal: searchTxt,filter:filter}, function(output){ 
    $("#output").html(output); 
    }); 
} 

在你的PHP的過濾器添加到您的查詢。如果所有的過濾器值適用於同一列,這是很容易:

if(isset($_POST['searchVal'])){ 
    $searchq = $_POST['searchVal']; 
    if(isset($_POST['filter'])) { 
    $filter = $_POST['filter']; 
    $query = $mysqli->query("SELECT * FROM product WHERE name_product LIKE '%{$searchq}%' AND filter_col = '{$filter}'"); 
    } else { 
    $query = $mysqli->query("SELECT * FROM product WHERE name_product LIKE '%{$searchq}%'"); 
    } 
} 
... 

如果每個過濾器適用於不同的列,那麼我會在送他們的鍵值對的數組。通過該數組循環追加查詢附加的where子句。事情是這樣的:

$filters = json_decode($_POST['filters']);//send the variable as a json encoded array 
$sql_query = "SELECT * FROM product WHERE name_product LIKE '%{$searchq}%' "; 
foreach($filters as $col=>$val) { 
    $sql_query .= " AND {$col} = {$val} "; 
} 
$query = $mysqli->query($sql_query); 
... 

當然,如果這是你需要保存每個過濾器適用於數據庫中的哪些列,然後打印爲每個選擇選項的數據屬性,進行多次選擇可用的情況下在您的選擇輸入中,並在JavaScript構建和json編碼選項發佈到後端。

在旁註 - 不要忘記逃跑的後臺數據,以防止SQL注入:https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

希望有所幫助,祝你好運!