2012-01-22 109 views
1

我希望用戶選擇他們希望看到哪些字段以及他們不想看到的字段。如何在select語句和where子句中包含(用戶選擇 - 動態)列?

表:公司(CID,CNAME,州,project_manager,site_supervisor,elec_engg,mech_engg,液壓,.....)

注:所有的project_manager到最後一列列有值「是/ No'

可以說用戶想要找到在新州有項目經理和電氣工程師的公司。

查詢將是:

Select cid, cname, project_manager, elec_engg 
from companies 
where state='NSW' 
    AND project_manager='Yes' 
    AND elec_engg ='Yes'; 

我不知道我怎樣才能使這個搜索動態。在HTML表單中顯示所有工作職位,並在每個職位旁邊和搜索按鈕旁邊都有複選框。像下面的東西。

查詢:

select cid, cname, (dynamic user input of columns) 
from companies 
where state="NSW" 
    AND Dynamic input column1 ='Yes' 
    and Dynamic input column2 ='Yes' 
    AND Dynamic input column3 ='Yes'..... 
    AND Dynamic input columnn ='Yes'; 
+0

請不要簽收您的帖子。 –

+0

我甚至建議刪除圖像 - 它並沒有真正增加您的問題的細節... –

回答

0

我假設你只是把所有的參數和在一起。如果您可以爲每個HTML設置名稱,則表單中的元素與您期望的列名稱完全一致。當你回到帖子時(假設搜索提交表單作爲帖子),你可以遍歷帖子值。我會創建一個有效列的數組來檢查作爲白名單,以避免有一個破碎的查詢。

下面是一個使用oldschool mysql轉義的例子,或者您可以獲得這個想法,但是我真的會使用PDO和預處理語句來填充查詢的值。關鍵是在動態創建SQL時保護您的where參數和值。拍我的消息,如果你正在使用PDO,並希望看到,但是這會給你一個地方開始:

$sql = 'SELECT cid, cname, project_manager, elec_engg FROM companies '; 
$whereClause = null; 

//whitelist of valid where clause parameters 
$validParams = array('site_supervisor', 'elec_engg', 'mech_engg', 'hydraulics'); 

foreach($_POST as $key=>$value){ 
    if(array_search($key, $validParams)!==false){ //make sure you use !== and not != 
     if(empty($whereClause)){ 
      $whereClause = " WHERE "; 
     }else{ 
      $whereClause .= " AND "; 
     } 

     //IMPORTANT: use whatever you're db needs to escape things or use prepare 
     //statement replacement 
     $whereClause .= "$key='".mysql_escape_string($value)."' "; 
    } 
} 
$sql = $sql.$whereClause; 
echo $sql; 

您還可以添加一個循環檢查的僅僅是「是」的價值觀和排除'不''值...

正如下面的評論mysql_escape_string($ value)是壞的...毫無疑問,要做到這一點正確和安全地與準備好的陳述和pdo你會改變代碼:

$ sql ='選擇cid,cname,project_manager,elec_engg從公司'; $ whereClause = null;

//whitelist of valid where clause parameters 
$validParams = array('site_supervisor', 'elec_engg', 'mech_engg', 'hydraulics'); 

foreach($_POST as $key=>$value){ 
    if(array_search($key, $validParams)!==false){ //make sure you use !== and not != 
     if(empty($whereClause)){ 
      $whereClause = " WHERE "; 
     }else{ 
      $whereClause .= " AND "; 
     } 

     //IMPORTANT: use whatever you're db needs to escape things or use prepare 
     //statement replacement 
     $whereClause .= " $key=:$key "; 
    } 
} 
$sql = $sql.$whereClause; 
$db = new PDO($someDsnString); 
$statement = $db->prepare($sql); 

foreach($_POST as $key=>$value){ 
    if(array_search($key, $validParams)!==false){ //make sure you use !== and not != 
    $statement->bindValue(":$key", $_POST[$key]); 
    } 
}  
$statement->execute(); 
$result = $statement->fetchAll(); 

對參數值的值和白名單上的預處理語句都將使此查詢安全。

+0

-1,使用'mysql_escape_string'特別是考慮到它的缺陷,事實上,這個查詢仍然容易受到SQL注入你甚至使用後。預先準備好的聲明也不能保證這一點。 – jmkeyes

+0

@射線,感謝您的幫助。我擁有與MySQL表中的列匹配的所有HTML字段元素。我喜歡你爲where子句運行循環的方式,我想進一步擴展它。當Where子句中的字段名稱存在yes時,該列應與公司名稱和位置一起顯示。任何想法如何做到這一點。類似於,選擇cid,cname,elec_engg,來自branch ='NSW'和elec_engg ='YES'且hydraulics ='YES'的公司的液壓系統; TIA – user1076517

+0

約書亞有一個問題,雖然他關於準備好的陳述並不保護它的陳述我不同意。我已經使用準備好的語句添加了一個PDO版本。如果任何人都可以通過此代碼顯示SQL漏洞,請正確指出。 – Ray

0

只是把每個字段的結果轉換成字符串,所以像

$builderworks = $POST_['builderworks']; 
$hydrolics = $POST_['hydrolics']; 

然後只需使用的所有字符串值數據庫中選擇,只要確保你首先使用mysql_real_escape_string清理POST數據。

所以像

SELECT jobname FROM jobtable WHERE hydrolics='$hydrolics' AND $builderworks='$builderworks' 

ECT ECT

所以基本上$ builderworks等被任何在這一領域已經發布,它是存儲每次裏面有人提出,如果FO的例子,我去了形式,選擇字段builderworks是,$ builderworks然後會等於是當我點擊提交時,無論存儲在每個字符串中,然後使用數據庫查詢進行比較,那麼如果$ builderworks在其中有yes,選擇所有等於$ builderworks會選擇等於yes的所有字段,如果我在表單中選擇no,則等於no。

+0

-1。這甚至不嘗試阻止SQL注入,它甚至提到'mysql_real_escape_string'。 – jmkeyes

+0

你不能看? '然後只需使用所有字符串值從數據庫中進行選擇,只要確保先使用mysql_real_escape_string清理POST數據。 ,我的代碼只是一個光禿禿的例子在正確的方向指向的人,它不是應該是他們需要做什麼副本,因此爲什麼我說要消毒POST的,讓你不知道,如果你真的準備好了我必須把............. –

0

不這樣做你的數據庫層上。對於安全性,穩定性和可維護性來說,這是一個非常糟糕的主意。分開你的顧慮。您的數據訪問層不應該依賴於您的用戶的權限,並且絕對不應該依賴於您的視圖。

從數據庫中提取數據象通常那樣(成「模型」或一些其它結構),然後選擇性地根據需要(「查看」)在你的渲染層表明結構的數據。

+0

如果你打算投票,至少要有禮貌來陳述原因。 – jmkeyes

相關問題