表单上的字段包含一个字符串,该字符串是数学函数的公式。使用此字符串,我从数据库中获取数据。
但问题是,如果数据库中的某些字符串为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 :(得分:0)
如果我理解正确,表单中字符串的不同部分(amount_injuries等)是您在查询中的数学表达式中使用的列标识符。
有几种不同的方法可以做到这一点。最简单的方法是对任何有效列标识符使用正则表达式替换。
$coalesce = preg_replace('/(\\w+)/', '(COALESCE(\\1,0))', $string_from_form);
但是这有问题。将用户提供的字符串连接到SQL语句中是一个注入漏洞。这也假定所有列都已正确输入,是没有反引号的有效列名,并且只使用了有效的数学运算符。
更好的方法是将字符串拆分为有效的数学运算符(使用PREG_SPLIT_DELIM_CAPTURE
以便捕获运算符),然后在应用{{{}时验证针对可接受列的列表给出的列。 1}}修改。
COALESCE
这样的方法应该能够处理大多数简单的数学表达式。不过,它仍然非常天真;确定所提供的表达式是否在数学上是有效的,或者它是否可以由MySQL处理,它不处理括号等等,并没有太大作用。为了更进一步,你需要研究数学表达式解析器,并且我对任何人都不太熟悉。