2013-07-25 72 views
2

我試圖設置一個HTML頁面來顯示我的數據庫中的'snp'表。 我已經得到了一切,並很好地運行,但我想在功能添加其中,而不是:如何選擇表列LIKE?的所有列,其中用戶選擇值

my $sql = "SELECT * FROM snp WHERE cid LIKE ? ORDER BY pos LIMIT 10"; 

我可以做一些事情,允許用戶鍵入任何關鍵詞,它會拉出來,從適當的桌子。我是這樣想的事:

sub get_snp{ 
    my $sql = "SELECT * FROM snp WHERE ? LIKE ? ORDER BY pos LIMIT 10"; 
    $snp_sth = $dbh->prepare($sql); 
    $snp_sth->execute("$User_Select","%$Search_String%"); 

更清楚,我的代碼工作,只需$ SEARCH_STRING但在$ User_Select後不加時。 這裏是我的參數:

my $Search_String = param("search_for"); 
my $User_Select = param("columns"); 

而且這兩個參數都後來被稱爲在HTML部分如下:

<TR BGCOLOR="#c0c0c0"> 
      <TD><INPUT TYPE="text" NAME="search_for" 
       STYLE="color:#787878;" 
       VALUE="enter keyword | select option" 
      </TD> 
      <SELECT NAME="columns"> 
      <OPTION SELECTED> --select option--</OPTION> 
      <OPTION VALUE ="cid"> cid</OPTION> 
      <OPTION VALUE ="pos"> Position #</OPTION> 
      <OPTION VALUE ="cdspos"> CDS Position</OPTION> 
      <OPTION VALUE ="m82base"> M82 base</OPTION> 
      <OPTION VALUE ="il"> Introgression Line</OPTION> 
      <OPTION VALUE ="ilbase"> IL base</OPTION> 
      <OPTION VALUE ="snptype"> SNP Type</OPTION> 
      <OPTION VALUE ="aachange"> SNP</OPTION> 
      </SELECT> 
      <TD><INPUT TYPE="submit" VALUE="Search"></TD> 
      <TD><INPUT TYPE="reset" VALUE="Reset"></TD> 
     </TR> 

所以上面可以看到我設置了一個droplist用於爲8個不同的選擇8個不同的表格。同樣,如果用戶輸入SL2.40ch12並選擇染色體ID(或cid),那麼我希望顯示該數據,或者如果他們鍵入IL10-1並選擇Introgression Line(或il),那麼應該拉取該數據。

我可能不會以正確的方式解決問題,所以任何建議都會非常有幫助!讓我知道是否需要更多的代碼或一般信息:)

回答

3

綁定參數(? doohikey)只適用於參數值,而不適用於表名稱或列名稱。

如果你想使用一個表或者列名的變量,那麼:

  • 驗證它(確保它是一個有效的表,或有效的列,在你的DB)
  • 使用常規插值插值到您的SQL字符串:

    my $sql = qq[SELECT * FROM snp WHERE $my_col LIKE ? ORDER BY pos LIMIT 10]; 
    
+0

我試圖使$柱=我所有的列南es但警告聲明,「在無效的情況下在./snptable.cgi第18行中無用的常量(column_name)。」並且它什麼也沒做 – byobob

+1

查看DBI方法'quote_identifier'作爲轉義文本以放入SQL字符串的安全方式。這是處理驗證選項的簡單方法;即,您並不需要100%驗證它,但絕對必須100%確定它不是SQL注入攻擊。 –

+0

@StuartWatt - 該驗證僅驗證語法(例如有效字符),而非語義(例如列名稱是DB中的實際有效列)。 – DVK

相關問題