Nasıl bir dinamik SQL sorgusu yaratırım?

2 Cevap php

Doğru, bu yüzden sayfamda dropdowns bir dizi var. Bir değer seçili olmasına bağlı olarak, PHP SQL sorgu dizesi eklemek istiyorum. Örnek:

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

'*' Bir şey ifade eder. yani, veriler bu sorgu seçeneği ile filtre olmamalıdır. Şimdi, nasıl hızlı ve basit bunun için sorgu oluşturmak mı? Şu anda, ben böyle bir şey var:

$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 ";
    }
}

Şimdi, belli ki, bu uygulamaya oldukça sinir bozucudur. Daha kolay bir yöntem var mı?

Teşekkürler.

2 Cevap

Herhalde aşağıdaki yöntemleri ile bir sınıf MyQueryBuilder kullanılmış olurdu ..

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)

Bu kod üzerinde daha iyi bir kontrol verebilir ...

Benim Perl CGI betikleri bu bir sürü yapmak, ve bu basitlik / okunabilmesi için biçimlendirmek nasıl:

First, I use a separate variable for the where clause, and always set a condition of 1 = 1 so all subsequent conditions are "and" conditions:

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"; }

Birisi hala URL sonuna "? op1 = (kötülük SQL)" a koyabilirsiniz, ve aracılığıyla almak olabilir - aşağı listeleri damla kullanıyor olsa da, çünkü o zaman, basit bir SQL enjeksiyon saldırılarına karşı korumak için basit bir işlevini kullanın sorgunuz içine formu:

#******************************************************************************
# 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);
   }