2011-07-14 20 views
0

これは正しい方法ですか?私は4つの入力領域を持っています。これらの入力領域はすべて、DB検索のフィルタリングを中心にしており、これを正しく行う方法について少し混乱しています。私が持っているもの:検索文字列のデータベース

$e_s=mysql_real_escape_string($_POST['var_specs']); 
$ven=mysql_real_escape_string($_POST['vender']); 
$xtp=mysql_real_escape_string($_POST['xtype']); 
$sar=mysql_real_escape_string($_POST['sarea']); 
if(strlen($e_s) > 1){ 
    if ($e_s && $Area=="vars"){ 
     $AreaSearch = "db_vars"; 
     $TypeResults = "vars"; 
     $TypeUrl = "vars"; 
     $search = $e_s; 
    } 
    // IF VENDER 
    if($ven=="ALL" || $ven==""){ 
     $vender_search="%"; 
    } 
    else { 
     $vender_search="%".$ven."%"; 
    } 
    // IF TYPE 
    if($xtp=="ALL"){ 
     $xtype_search="%"; 
    } 
    else { 
     $xtype_search="%".$xtp."%"; 
    } 
    // IF AREA 
    if($sar=="ALL"){ 
     $sarea_search="%"; 
    } 
    else { 
     $sarea_search="%".$sar."%"; 
    } 

    // RUN QUERY 
    $result = mysql_query("SELECT * FROM ".$AreaSearch." WHERE name LIKE '%".$search."%' AND vender LIKE ".$vender_search." AND xtype LIKE ".$xtype_search." AND sarea LIKE ".$sarea_search); 
} 

答えて

1

より良い方法はこれです:上記

$parameters = array(); 

if($ven != "ALL" && $ven != "") { 
    $parameters[] = "vender LIKE '%" . mysql_real_escape_string($ven) . "%'"; 
} 
if ($xtp ...) { 
    $parameters[] = ... 
} 
if ($sar ...) { 
etc... 

if (count($parameters > 0) { 
    $where_clause = implode(' AND ', $parameters); 
    $sql = "SELECT * FROM ... WHERE $where_clause"; 
    $result = mysql_query($sql) or die(mysql_error()); 
    ... 
} else { 
    die("NO search parameters entered"); 
} 

注mysql_real_escape_stringの()の呼び出し。これにより、ユーザー提供のテキスト内のSQLメタキャラクタがエスケープされ、SQLインジェクション攻撃が防止されます。たとえあなたがシステムを使用する唯一の人であっても、ユーザーが提供したデータをデータベースクエリに直接挿入することは決してありません。

+0

注:これは非常に簡単なDOS攻撃からあなたを保護するものではありません。最小文字長を確認し、このクエリの結果をキャッシュする必要があります。 –