올바르게 이해하면 폼의 문자열 (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이 처리 할 수 있는지, 괄호 등을 처리하지 않는지 여부를 결정하는 데별로 도움이되지 않습니다. 더 멀리 가지려면 수학 표현 파서를 조사해야합니다. 나는 그 중 하나를 권유하기에 익숙하지 않다.