2016-10-19 2 views
0

내 양식의 필드에는 수학 기능의 공식 인 문자열이 들어 있습니다. 이 문자열을 사용하여 데이터베이스에서 데이터를 가져옵니다.문자열의 특수 문자 전후의 추가 문자로 문자열을 확장하는 방법

하지만 문제는 데이터베이스의 일부 문자열이 NULL이면 내 수식이 작동하지 않는다는 것입니다. 식의

예는이 공식은 MySQL은 PHP 부분은 그녀가 보이는됩니다

amount_injuries+amount_employment+health_insurance 

입니다

SELECT SUM(amount_injuries+amount_employment+health_insurance) FROM ... ! 

나는 내가를 추가 할 수있는 방법

select sum((COALESCE(amount_injuries,0)+(COALESCE(amount_employment,0))+(COALESCE(health_insurance,0)))) from ... 

입니다 원하는 결과와 같은 COALESCE은 PHP의 기존 문자열에 있습니까?

답변

0

올바르게 이해하면 폼의 문자열 (amount_injuries 등)의 다른 부분은 쿼리의 수학 표현식에서 사용중인 열 식별자입니다.

몇 가지 다른 방법이 있습니다. 가장 간단한 방법은 유효한 열 식별자 인 정규식 대체를 사용하는 것입니다.

$coalesce = preg_replace('/(\\w+)/', '(COALESCE(\\1,0))', $string_from_form); 

그래도 문제가 있습니다. 사용자가 입력 한 문자열을 SQL 문에 연결하면 주입 취약점이됩니다. 이것은 또한 모든 열이 올바르게 입력되었고, 역 따옴표가없는 유효한 열 이름이며 유효한 연산 연산자 만 사용되었다고 가정합니다.

올바른 수학 연산자 (연산자를 캡처하기 위해 PREG_SPLIT_DELIM_CAPTURE 사용)에서 문자열을 분할 한 다음 COALESCE 수정 사항을 적용 할 때 허용되는 열 목록에 대해 지정된 열의 유효성을 검사하는 것이 더 좋은 방법입니다.

$columns = preg_split('|([+-/*])|', $string_from_form, null, PREG_SPLIT_DELIM_CAPTURE); 

$accepted_columns = ['amount_injuries', 'amount_employment', 'health_insurance']; 

$columns = array_map(function($x) use ($accepted_columns) { 
    if (in_array($x, ['+', '-', '/', '*'])) { 
     return $x; 
    } else { 
     // validate the column; stop if column is invalid 
     if (in_array($x, $accepted_columns)) { 
      return sprintf('(COALESCE(`%s`,0))', $x); 
     } else { 
      // handle error 
     } 
    } 
}, $columns); 

$columns = implode('', $columns); 

이와 같은 접근 방식은 가장 간단한 수학 표현식을 처리 할 수 ​​있어야합니다. 그것은 여전히 ​​매우 순진합니다. 제공된 표현식이 수학적으로 유효한 지 또는 MySQL이 처리 할 수 ​​있는지, 괄호 등을 처리하지 않는지 여부를 결정하는 데별로 도움이되지 않습니다. 더 멀리 가지려면 수학 표현 파서를 조사해야합니다. 나는 그 중 하나를 권유하기에 익숙하지 않다.

관련 문제