2015-01-13 27 views
1

我已經能夠使用選擇框構建一個mySQL查詢。像ajax一樣從PHP開始。從動態選擇框構造mySQL查詢

HTML/JS(相關部分)

var call = true; 
    switch(parseInt($(this).val())) { 
    case 1: 
    cat_code ="ager"; 
     sortv = "database_percent"; 
     sorto = "asc"; 
    break; 
    case 2: 
    cat_code ="ager"; 
     sortv = "database_percent"; 
     sorto = "desc"; 
    break; 
    default: 
    cat_code ="ager"; 
     sortv = "value"; 
     sorto = "asc"; 

    break; 
} 
if(call) { 
$.ajax({ 
     url: 'all_get_2.php', 
     type: 'GET', 
     dataType: 'JSON', 
     data: {cat_code: cat_code, sortvalue: sortv ,sortorder:sorto}, 
     success: function(data) { 
//stuff 
} 
}) 

PHP(相關部分...只是一個例子)

$whereCategory = isset($_GET['cat_code'])? "{$_GET['cat_code']}" : ''; 
$sortvalue = isset($_GET['sortvalue'])? "{$_GET['sortvalue']}" : ''; 
$sortorder = isset($_GET['sortorder'])? "{$_GET['sortorder']}" : ''; 
$sql = "select count(guid) from full_db2 where '{$whereCategory}' = '{$sortvalue}'' and example = '{$sortorder};"; 

$result = $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC); 
header('Content-type: application/json'); 
echo json_encode($result); 

一切正常。我在這個插圖中混合了一些變量,但這不是問題。這將返回用戶從選擇中選擇的屬性的計數。這些選擇是根據用戶在上一次選擇中選擇的內容動態生成的。

如果我希望用戶能夠選擇更多屬性以添加到查詢中,該怎麼辦?因此,例如,與年齡超過40歲的數據庫(用戶)中的條目數量相比,他們可以像年齡超過40歲且結婚生子的用戶那樣增加更多內容。

我基本上考慮添加一個選項來添加另一組選擇框(例如,單擊一個「+」和出現的新集),但我很快意識到我無法弄清楚有多少選擇出來那裏和創建查詢的邏輯方法。

什麼是最好的方式允許用戶選擇(理論上)無限數量的屬性來構建一個單一的mySQL查詢?

+0

旁註。你有沒有聽說過['SQL Injenction'](http://php.net/manual/en/security.database.sql-injection.php)? –

+0

@ PM77-1不幸的是,當時正在閱讀它們。我對PHP是全新的,所以我還沒有弄清楚如何更新(例如)上面的代碼來防止這種情況。任何建議,將不勝感激。 – jonmrich

+2

你不知道有多少元素......首先想到的是'array'。您可以使用'name =「複選框[]」'爲每個複選框指定相同的名稱。這樣你發送一個包含值的列表到服務器,然後使用PHP獲取所需的值。在PHP中,你可以使用'$ data = $ _GET ['field_name'];'獲得一個包含這些值的數組。 –

回答

0

我會使用HTML <select> & <option>標籤來呈現各種SQL條件運算符(AND, OR, >, <, =, !=)以及字段/表名,然後將它們連接在一起以構建查詢。

正如評論中提到的那樣,您可以利用像name="checkbox[]"這樣的陣列功能並將其作爲HTML表單(POST或GET)提交以簡化拼接。

爲了避免SQL注入,您將希望轉義和消毒所有發送到數據庫的內容,因爲HTML頁面可以在客戶端進行編輯。如果沒有清理,您的整個數據庫將被精明的用戶訪問。這可以像驗證數組內容匹配實際表名或其中一個條件運算符一樣簡單,然後丟棄它是否不匹配。使用mysqli::escape_stringhttp://php.net/manual/en/mysqli.real-escape-string.php)轉義也是一個好主意。