gpt4 book ai didi

php - 如何在字符串中的特殊字符之前和之后使用附加字符来扩展字符串

转载 作者:行者123 更新时间:2023-11-29 20:10:52 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

不过,这也存在一些问题。将用户提供的字符串连接到 SQL 语句中是一个注入(inject)漏洞。这还假设所有列都已正确输入,是不带反引号的有效列名称,并且仅使用了有效的数学运算符。

更好的方法是根据有效的数学运算符拆分字符串(使用 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 处理,它不处理括号等。要进一步了解它,您需要研究数学表达式解析器,而且我对任何一个都不够熟悉,无法推荐。

关于php - 如何在字符串中的特殊字符之前和之后使用附加字符来扩展字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40137170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com