如何构建动态SQL查询?

时间:2010-02-13 17:38:18

标签: php sql mysql

是的,所以我的页面上有一组下拉菜单。根据是否选择了值,我想将其添加到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 ";
    }
}

现在,显然,实施起来非常烦人。有没有更简单的方法?

感谢。

2 个答案:

答案 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);
   }