如果我理解正確,表單中的字符串的不同部分(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處理,它不處理括號等。爲了更進一步,您需要查看數學表達式解析器,我對任何推薦的都不熟悉。