包含变量的PHP字符串变量不计算

包含变量的PHP字符串变量不计算,php,string,variables,eval,Php,String,Variables,Eval,我被PHP的一些东西卡住了 $l = $par['Length']; $w = $par['Width']; $d = $par['Depth']; $length = $par['Expr_1']; $width = $par['Expr_2']; $par是从数据库读取的数组。 长度、宽度和深度都是数字 Expr_1和Expr_2是存储为字符串的公式 例如: ($l + .0625) * ($w + .125) * ($l + .125) * ($w

我被PHP的一些东西卡住了

    $l = $par['Length'];
    $w = $par['Width'];
    $d = $par['Depth'];
    $length = $par['Expr_1'];
    $width = $par['Expr_2'];
$par
是从数据库读取的数组。 长度、宽度和深度都是数字 Expr_1和Expr_2是存储为字符串的公式 例如:

($l + .0625) * ($w + .125) * ($l + .125) * ($w + .0625) + 1.625
L,0.5;W,0.2;D,0.3:4.7
应该发生的是,
$l
$w
应替换为值。如果I
echo$l、$w、$d独立,则它们具有正确的值。如果I
echo$length或$width
则显示公式


甚至当我尝试
eval($width={$par['Expr_2']};”)时它不强制它计算,而只是读取公式。我知道这个公式是正确的,因为如果我手动将它粘贴到
$length
$width
中,它工作得很好。

只有在源代码对这些字符串求值时,才会将变量插入字符串。当它们只是存储在变量中的值时,赋值不会进行插值


最好是存储一个简单的可解析格式,不需要完整的
eval()
。下面是一些可以存储如下格式的代码:

($l + .0625) * ($w + .125) * ($l + .125) * ($w + .0625) + 1.625
L,0.5;W,0.2;D,0.3:4.7
这相当于
(L+0.5)*(W+0.2)*(D+0.3)+4.7

$eqn_parts = explode(':', $input);
$add_part = $eqn_parts[1];
$mult_parts = explode(';', $eqn_parts[0]);

$accum = 1;
foreach($mult_parts as $part) {
    $bits = explode(',', $part);
    switch($bits[0]) {
        case "L":
            $accum *= ($length + (int)$bits[1]); break;
        case "W":
            $accum *= ($width + (int)$bits[1]); break;
        case "D":
            $accum *= ($depth + (int)$bits[1]); break;
    }
}
$accum += (int)$add_part;

而不是对公式使用
eval
。。。有一种可能的选择是使用类似于
preg\u replace()
的东西来代替。。。要仅替换来自数据库的公式变量。。。然后将替换的结果转换/类型转换为
(int)
或任何您需要的数据类型。然后从那里计算公式。虽然。。。它可能不如
eval
可靠


尽管amber的解决方案会起作用,但我想保持它的简单性,并使我所做的所有将公式输入数据库的工作都不会成为浪费。我只是在字符串的开头加上$length/$width,在末尾加上:,然后对其求值

谢谢大家

编辑以添加我使用的代码:

 $l = $par['Length'];
    $w = $par['Width'];
    $d = $par['Depth'];
    $par['Expr_1'] = '$length='.$par['Expr_1'].';';
    eval($par['Expr_1']);
    $par['Expr_2'] = '$width='.$par['Expr_2'].';';
    eval($par['Expr_2']);

假设您不会“在未事先正确验证的情况下将任何用户提供的数据传递给它”

下面的方法似乎很有效

$width = $par['Expr_2'];
eval('$width = '.$width .';');

1.使用
eval
是不好的。2.如果您仍然想使用它,请确保它是从php.ini.1启用的。不必在意,因为数据库中提供公式的部分将是只读的,所以在我检查插补变量时,不要担心危险代码。2.我只是浏览了完整的php.ini,没有看到任何关于启用或禁用eval的内容。请指定我应该查看的位置以及如何修复?我需要存储50+个公式,用户需要输入lxwxd以转换为lxwConsider,以您可以解析和计算的方式存储方程式-例如,将
(L+0.5)*(W+0.25)+0.3
存储为
L,0.5;W、 0.25:0.3
(这将被解释为“在
上拆分:
,将冒号之前的所有内容拆分为
s,这些项目中的每一项都是一对逗号分隔的输入类型和一个添加的常量。将它们相乘,然后在冒号之后添加常量。)因此,没有办法强制php将其作为源代码进行求值?我的eval命令是否有误?我感到困惑,因为如果您执行$a=5;$b=6;$c=$a+$b;$c将求值为11。在声明$a和$b的值之前,$c不是字符串。很抱歉,必须编辑b/c,现在是凌晨2点,我很困惑,我会不会遇到同样的问题?php会吗在那一点上评估它?我认为@Amber在数据库中存储公式的方法会更好。这只是另一种看待问题的方法…编辑你的问题而不是发布答案。