2012-04-08 3 views
1

$ _POST 값에서 MySql 쿼리를 만들려고하는데 문제가 있습니다. 일부는 다른 것들에 사용되므로 일부는 $ _POST 값을 사용하지 않으려 고합니다. 그들이 값 이름에서 쿼리 문자열을 만들 경우 그들은 다음 DB에 제출 한 실제 경우 배열에 대한 값 이름은

이 지금

$i = 1; 
$b = 1; 

$cnt = count($_POST); 

foreach ($_POST as $key => $entry) 
{ 

$array = array('Country', 'County', 'Age', 'ect', 'ect'); 

foreach ($array as $arrayValue) { 
    if ($arrayValue == $key) { 
$b++; 
     if($i == 1) {$query[] = "$key='$entry'";} 
     elseif($cnt == $b) {$query[] = "$key='$entry'";} 
      else {$query[] = "$key='$entry' AND ";} 
$i++; 
    } 
} 

} 

내가 가지고까지 내가 무엇을 가지고 볼 수 이제 $ QUERY 배열의 모든 값을 단일 문자열 (예 : $search = "country='United Kingdom' AND county ='example'"

)로 변환하는 방법을 모르겠다.

도움이 될 것입니다.

+1

이렇게하지 마십시오. [prepared statements] (http://php.net/manual/en/pdo.prepared-statements.php)를 사용하십시오. –

답변

1
$query = array(); 
$vars = array('Country', 'County', 'Age', 'etc1', 'etc2'); 
foreach ($vars as $v) 
{ 
    if (isset($_POST[$v])) 
    { 
     $query[] = $v.' = "'.addslashes($_POST[$v]).'"'; 
    } 
} 
$query = implode(' AND ', $query); 
+1

'addslashes'는 MySQL 데이터를 이스케이프하는 적절한 방법이 아닙니다. mysql_real_escape_string을 사용하십시오. 또한 MySQL의 적절한 구분 기호는 작은 따옴표입니다. – Ryan

1

너 자신을 복잡하게 만든다. 당신은 당신이 사용하고 싶은 변수를 알고 있다면, 단순히으로 확인하고 쿼리를 작성 : 또한 등 MySQL의 공격을 확인해야합니다 것

$sql = "SELECT * FROM mytable WHERE "; 

$sql_array = array(); 

if(isset($_POST['A'])) { $sql_array[] = 'some_col_a = '.$_POST['A']; } 
if(isset($_POST['B'])) { $sql_array[] = 'some_col_b = '.$_POST['B']; } 
if(isset($_POST['C'])) { $sql_array[] = 'some_col_c = '.$_POST['C']; } 

$sql .= implode(' AND ', $sql_array); 

, 그러나 이것은 순수한 기본이다. 나는 무엇

1

제안은 사용하는 것입니다 :

A. 대소 문자를 구분하여 strtolower

모든 것을 함께 가져 D. implode

검증

에 대한 in_array를 사용 mysql_real_escape_string

C를 사용하여

B. 위생

$_POST['Country'] = "United Kingdom" ; 
$_POST['County'] = "example" ; 
$array = array('Country', 'County', 'Age', 'ect', 'ect'); 
$query = array(); 

foreach ($_POST as $key => $entry) 
{ 
    if(in_array(strtolower($key), $array) || in_array($key, $array)) 
    { 
     $query[] = $key . " = '" . mysql_real_escape_string($_POST[$key]) . "'"; 

    } 
} 

$search = implode(" AND ", $query); 
var_dump($search); 

출력

string 'Country= 'United Kingdom' AND County= 'example'' (length=47) 

옵션

// Optional 
// You array is inconsistent and contains case sensitive values .. use can use this to convert them to small letters 
array_walk($array, "toLower"); 
function toLower(&$item, $key) 
{ 
    $item = strtolower($item); 
} 
+0

대소 문자를 구분하지 않으려면 어떻게해야합니까? 그것 없이는 그렇게 복잡하지 않을 수 있습니다. – Ryan

+0

그의 배열을 보아라. 그것은'Country'와'ect'를 모두 포함하고있다. 나는 일관성이없고 그것 때문에 그에게 문제가 될 수도있다. – Baba

+0

'$ array [ 'A']'vs'$ array [ ' ']'? PHP는 대소 문자를 구별합니다. 잊지 마세요! – Botanick

0

PDO는 당신에게 여러 가지 이점을 제공 할 것입니다; 매개 변수화 된 쿼리는 말할 것도 없습니다. 나는 created a gist을 사용하여 원하는 매개 변수 만 화이트 리스팅하고, SQL 쿼리를 작성하고, 매개 변수화 된 PDO 쿼리를 실행하는 방법을 제공합니다.

  1. 라인 08 - 18은 이것을 테스트 할 스크래치 데이터베이스/테이블을 작성하기위한 SQL을 제공합니다.
  2. 줄 23-27은 화이트리스트와 WHERE 절을 처리합니다 ("ALL"대신 "ANY"유형 필터를 작성하려면 'AND'대신 'AND'로 바꾸십시오)
  3. 41 행은 전체 SQL 쿼리를 작성합니다
  4. 50 행은 매개 변수가있는 쿼리를 실행합니다.

    array(3) { 
        'Country' => string(3) "USA" 
        'County' => string(6) "Nassau" 
        'Age'  => string(2) "21" 
    } 
    

    $whereClause :

    string(38) "Country = ? AND County = ? AND Age = ?" 
    

    $sql :

    string(72) "SELECT * FROM pdo_whitelist WHERE Country = ? AND County = ? AND Age = ?" 
    

    허용 목록 부 여기

$parameters 배열이이 예에 기초하여 포함 할 무엇 소스의 (전체 소스는 https://gist.github.com/2340119에있다) :

<?php 

// whitelist parameters 
$post_input = ['Country' => 'USA', 'County' => 'Nassau', 'Age' => 21, 'EscalatePriviledge' => true, 'MakeMeSuperUser' => 1]; 
$whitelist = ['Country', 'County', 'Age']; 
$parameters = array_map('trim', array_intersect_key($post_input, array_flip($whitelist))); 
$wheres  = array_map(function($fieldName){ return "${fieldName} = ?"; }, array_keys($parameters)); 
$whereClause= join(' AND ', $wheres); 
// you should validate and normalize here as well (see: php.net/filter_var) 

쿼리 매개 변수화 처리하는 PDO 코드 :