存储值来自php变量中的函数eval

时间:2017-02-09 10:06:21

标签: php

eval("echo {$row11['incentive']};"); 

在名为incentive的表列中,我将值存储为字符串,例如。 '($workshop_sales*0.005)'存储多种公式以计算激励。

我在php中使用上面的代码生成了结果,但是当我要将其值存储在任何变量中时,它都没有被存储。

如何存储结果?是否有可能?

3 个答案:

答案 0 :(得分:0)

假设:

$workshop_sales = 15;
$row11['incentive'] = '($workshop_sales*0.005)';
  • 变体1 直接保存结果(不安全):

    $foo = eval("return {$row11['incentive']};");
    echo $foo; //Outputs 0.075
    
  • 变体2 之前替换变量(应为pretty secure

    function do_maths($expression) {
        eval('$o = ' . preg_replace('/[^0-9\+\-\*\/\(\)\.]/', '', $expression) . ';');
        return $o;
    }
    
    //Replace Variable with value before
    $pure = str_replace("\$workshop_sales", $workshop_sales, $row11['incentive']);
    //$pure is now (15*0.005)
    
    //Interpret $pure
    $foo = do_maths($pure);
    echo $foo; // Outputs 0.075
    

但请注意eval()邪恶

有关When is eval evil in php?

的更多信息
  

eval()的主要问题是:

     

潜在的不安全输入。传递不受信任的参数是一种失败的方法。确保参数(或其中的一部分)完全受信任通常不是一项微不足道的任务。

     

<强> Trickiness 即可。使用eval()可以使代码更聪明,因此更难以遵循。引用Brian Kernighan“调试的速度是编写代码的两倍。因此,如果您尽可能巧妙地编写代码,那么根据定义,您可能不够聪明,无法对其进行调试”

答案 1 :(得分:0)

代替回显 eval-ed 代码,返回值:

<?php
$workshop_sales = rand(1000, 9999);

$row11['incentive'] = '($workshop_sales*0.005)';

$result = eval("return {$row11['incentive']};");

var_dump($result);

来自docs

  

eval()返回NULL,除非在计算代码中调用return,...

明显的 eval是危险的 - 陈述(也来自文档):

  

警告 eval()语言结构非常危险,因为它   允许执行任意PHP代码。因此不鼓励使用它。   如果您已经仔细确认除了以外没有其他选择   使用此构造,请特别注意不要传递任何用户   提供数据而未事先正确验证。

答案 2 :(得分:0)

只需将变量分配给eval函数

中的新值即可

稍后使用您的变量

例如:

eval('$result = "2";');

echo $result;

这将打印出$result变量

的值

PS, 你必须看看@yoshi提到的使用eval的危险性