2010-02-13 6 views
3

À droite, donc j'ai un ensemble de listes déroulantes sur ma page. Selon si une valeur est sélectionnée, je veux l'ajouter à une chaîne de requête SQL en PHP. Exemple:Comment créer une requête SQL dynamique?

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

'*' fait référence à n'importe quoi. Par exemple, les données ne doivent pas être filtrées par cette option de requête. Maintenant, comment puis-je créer la requête pour cela rapidement et simplement? Actuellement, j'ai quelque chose comme ceci:

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

Maintenant, évidemment, c'est assez ennuyeux à implémenter. Y a-t-il une méthode plus facile?

Merci.

+0

averti que le code actuel vous expose à des attaques par injection SQL .. http://en.wikipedia.org/wiki/SQL_injection –

+0

Gaby - I suis tout à fait conscient. C'est juste un exemple. – Rohan

Répondre

2

Je l'ai utilisé une MyQueryBuilder de classe avec des méthodes suivantes probablement ..

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) 

Il pourrait donner un meilleur contrôle sur le code ...

0

Je fais beaucoup de cela dans mon perl CGI Tout d'abord, j'utilise une variable distincte pour la clause where, et définissez toujours une condition de 1 = 1 pour que toutes les conditions suivantes soient des conditions "et":

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

puis-je utiliser une fonction simple pour protéger contre les simples attaques par injection SQL, parce que même si vous utilisez les listes déroulantes - quelqu'un pourrait encore mettre un « ? OP1 = (mal sql) » à la fin de votre URL, et il pourrait passer à travers votre formulaire dans votre requête:

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