如何在数据库表中存储公式并作为PHP变量执行数学运算
实现方案
你当前的问题是从数据库取出的公式是字符串格式,PHP不会自动解析其中的变量并执行运算,需要额外的逻辑处理来得到计算结果。
方案1:使用eval直接执行表达式(仅适用于公式来源完全可信的场景)
修改代码如下:
<?php include '../../db.php'; $a = 50; $b = 20; $c = 30; $fq = $conn->query("SELECT * FROM `test`"); $fdata = $fq->fetch_array(); $formula = $fdata['formula']; // eval执行表达式,注意拼接语法正确性 eval("\$output = {$formula};"); echo $output; ?>
注意:
eval函数会执行传入的任意PHP代码,如果数据库中的公式可以被不可信用户修改,会出现远程代码执行漏洞,严重威胁服务器安全,仅在完全可控的环境下使用该方案。
方案2:更安全的变量替换+表达式计算
如果需要开放公式修改权限给普通用户,建议不要直接存储PHP变量格式的表达式,改为存储纯数学表达式(例如存储a+b-c而非$a+$b-$c),通过变量映射替换后再计算,大幅降低安全风险:
<?php include '../../db.php'; // 建立变量映射关系 $varMap = [ 'a' => 50, 'b' => 20, 'c' => 30 ]; $fq = $conn->query("SELECT * FROM `test`"); $fdata = $fq->fetch_array(); // 数据库存储的公式为a+b-c $formula = $fdata['formula']; // 替换公式中的变量为实际数值 $calcFormula = str_replace(array_keys($varMap), array_values($varMap), $formula); // 校验公式仅包含数字和合法运算符号后再执行计算 if(preg_match('/^[\d\+\-\*\/\(\)\.]+$/', $calcFormula)) { eval("\$output = {$calcFormula};"); echo $output; } else { echo "公式非法"; } ?>
内容的提问来源于stack exchange,提问作者Vishal Vishwakarma
相关产品推荐
相关产品推荐

