2010-02-13 132 views
3

對,所以我在我的頁面上有一組下拉菜單。取決於是否選擇了一個值,我想將它添加到PHP中的SQL查詢字符串中。例如:如何構建動態SQL查詢?

select1: options("*" "op1", "op2) 
select2: options("*" "op1", "op2) 
select3: options("*" "op1", "op2) 

'*'表示任何事情。即數據不應該被該查詢選項過濾。現在,我該如何快速而簡單地構建查詢?目前,我有這樣的事情:

$query=''; 
$found=0; 
$op1=$_POST['select1']; 
$op2=$_POST['select2']; 
$op3=$_POST['select3']; 

if($op1!='*') 
{ 
$found=1; 
$op1="'".$op1."'"; 
$query="WHERE op1=$op1 "; 

} 

if($op2!='*') 
{$op2="'".$op2."'"; 
if($found==1) 
    { 
    $query=$query. "AND op2=$op2 "; 
    } 
else{ 
    $found=1; 
    $query="WHERE op2=$op2 "; 
    } 
} 

if($op3!='*') 
{$op3="'".$op3."'"; 
if($found==1) 
    { 
    $query=$query. "AND op3=$op3 "; 
    } 
else{ 
    $found=1; 
    $query="WHERE op3=$op3 "; 
    } 
} 

現在,很明顯,這是很煩人的實現。有沒有更簡單的方法?

謝謝。

+0

被警告說,目前的代碼使你接觸SQL注入攻擊.. http://en.wikipedia.org/wiki/SQL_injection – 2010-02-13 17:56:06

+0

加比 - 我我很清楚。這只是一個例子。 – Rohan 2010-02-17 11:10:58

回答

2

我會用一個類MyQueryBuilder有可能下面的方法..

AddSelectionColumn(String ColumnName, string Alias) 
AddTableSource(String TableName, String Alias) 
AddTableJoin(String Table1, String Alias1, String Table2, String Alias2, String Col1, String Col2, JoinType Join) 
AddFilterCondition(String ColumnName, String Alias, String Condition) 

它可能給的代碼更好的控制...

0

我做了很多這在我的Perl CGI腳本,這是我怎樣格式化爲簡單起見/可讀性:

首先,我使用一個單獨的可變的where子句,並且總是被設置的 1 = 1個因此,所有隨後的條件的條件是「和」條件:

my $whereClause  =<<ENDWHERESQL; 
where 
    1 = 1 
ENDWHERESQL 

if ($op1 ne "*") { $whereClause .= "  and op1 = '".safeSQL($op1)."'\n"; } 
if ($op2 ne "*") { $whereClause .= "  and op2 = '".safeSQL($op2)."'\n"; } 
if ($op3 ne "*") { $whereClause .= "  and op3 = '".safeSQL($op3)."'\n"; } 

然後我用一個簡單的功能,以防止簡單的SQL注入攻擊,因爲即使你使用的下拉列表 - 有人仍然可以把一個「?OP1 =(邪惡SQL)」上月底您URL,它可能通過你的形式進入查詢:

#****************************************************************************** 
# Function: safeSQL() 
# Author: Ron Savage 
#  Date: 04/22/2009 
# 
# Description: 
# This removes update,create,drop,deletes from SQL. 
#****************************************************************************** 
sub safeSQL 
    { 
    my $cmd; 
    my ($inText,$commandList) = @_; 

    if (!defined($commandList)) { $commandList = "create,delete,select,update,dele,drop,exec,insert"; } 

    foreach $cmd (split(/\,/,$commandList)) 
     { 
     $inText =~ s/ $cmd |^$cmd /** no_${cmd}_allowed! **/gi; 
     } 

    return($inText); 
    }