如何在字符串中的特殊字符前后使用附加字符扩展字符串

时间:2016-10-19 16:42:49

标签: php mysql

表单上的字段包含一个字符串,该字符串是数学函数的公式。使用此字符串,我从数据库中获取数据。

但问题是,如果数据库中的某些字符串为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中的现有字符串?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,表单中字符串的不同部分(amount_injuries等)是您在查询中的数学表达式中使用的列标识符。

有几种不同的方法可以做到这一点。最简单的方法是对任何有效列标识符使用正则表达式替换。

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

但是这有问题。将用户提供的字符串连接到SQL语句中是一个注入漏洞。这也假定所有列都已正确输入,是没有反引号的有效列名,并且只使用了有效的数学运算符。

更好的方法是将字符串拆分为有效的数学运算符(使用PREG_SPLIT_DELIM_CAPTURE以便捕获运算符),然后在应用{{{}时验证针对可接受列的列表给出的列。 1}}修改。

COALESCE

这样的方法应该能够处理大多数简单的数学表达式。不过,它仍然非常天真;确定所提供的表达式是否在数学上是有效的,或者它是否可以由MySQL处理,它不处理括号等等,并没有太大作用。为了更进一步,你需要研究数学表达式解析器,并且我对任何人都不太熟悉。