是的,所以我的页面上有一组下拉菜单。根据是否选择了值,我想将其添加到PHP中的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 :(得分: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)
它可以更好地控制代码......
答案 1 :(得分: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注入攻击,因为即使您使用下拉列表 - 有人仍然可以在您的URL末尾添加“?op1 =(evil sql)”,它可能会通过您的表单进入您的查询:
#******************************************************************************
# 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);
}