2016-10-19 78 views
0

表單中的字段包含一個字符串,它是數學函數的公式。用這個字符串我從數據庫中獲取數據。如何在字符串中的特殊字符之前和之後擴展字符串

但問題是,如果數據庫中的某些字符串是NULL,那麼我的公式不起作用。公式

例子是

amount_injuries+amount_employment+health_insurance 

這個公式是在MySQL的PHP​​的一部分,她看起來像

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處理,它不處理括號等。爲了更進一步,您需要查看數學表達式解析器,我對任何推薦的都不熟悉。

相關問題