PHP - 来自数据库的评估代码

标签 php function eval

关于 PHP eval() 的使用,已有数百甚至数千篇帖子;从数据库运行代码。通过我的所有搜索,我没有找到我的问题的答案(简短解释)。

首先,我将向您介绍我的应用程序。

我在数据库中存储了三条有效代码记录:
例如:
['代码1']

$num1 = 1;
$num2 = 3;
$num3 = $num1+$num2;  //4

['代码2']

$num4 = $num3;        //4
$num5 = 5;
$num6 = $num4+$num5;  //9

['代码3']

$num7 = $num4;        //4
$num8 = $num6;        //9
$num9 = $num7+$num8;  //13
echo $num9;           //13

接下来我有一个调用和运行记录的函数:
例如:

function runCode($codeName) {
    // assume db connection is established
    $result = mysql_query("SELECT `code` FROM CodeStore WHERE `name` = '".$codeName."'");
    if ($result) {
        // Fetch one row
        $row = mysql_fetch_assoc($result);
        if (!$row) {
            die('No rows returned.');
        } else {
            return eval($row['code']);
        }
    } else {
        die('Invalid query: '.mysql_error());
    }
}

现在,需要做的是依次调用上述三个片段,并使 ($numX) 内的变量可供彼此使用。
例如:

runCode('code1');
runCode('code2');
runCode('code3');

上面对数据库中三个片段的调用应该回显“13”,但事实并非如此。我的问题是:

如何使这些变量在评估代码之外可用?

最佳答案

您没有从数据库中获取结果。 mysql_query() 确实返回所有选定的行。

function runCode($codeName) {
    // assume db connection is established
    $result = mysql_query("SELECT `code` FROM CodeStore WHERE `name` = '".$codeName."'");
    if ($result) {
        // Fetch one row
        $row = mysql_fetch_assoc($result);
        if (!$row)
            die('No rows returned.');
        $valid = eval($row['code']);
        if($valid) {
            return $valid;
        } else {
            die('Error executing: '.$codeName);
        }
    } else {
        die('Invalid query: '.mysql_error());
    }
}

请参阅 mysql_fetch_assoc 的手册.

How can I make these variables available outside the eval'd code?

这有点困难,没有简单的方法可以做到这一点。
评估的代码段不在同一范围内运行,因此您必须以某种方式保存当前符号表并在之后恢复它。

如果保留变量对您来说就足够了,您可以尝试 get_defined_vars (可能是 compactextract 的组合,或者是您自己的这些函数的替代品)。但是,此函数返回所有已定义变量的名称(包括像 $_GET 等超全局变量)。
如果您构建一个聪明的 diff 算法,您可能可以比较评估代码之前和之后定义的变量,并找出哪些变量是新的。祝你好运:)。

关于PHP - 来自数据库的评估代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4330262/

相关文章:

javascript - 将 Typescript 中的函数传递给另一个函数时,如何设置该函数的类型?

php - 当调用 javascript 函数时将 javascript 变量值传递给 php 文件

对象克隆和 eval() 的 JavaScript 问题

lisp - 编程语言用来评估 AST 的算法是什么?

java - XML-RPC PHP Java

php - 俄罗斯方 block

php - ubuntu 包管理器无法识别 php5

php - 如何在codeigniter中将form标签转换为form_open

C++ 函数打印数组

c++ - 使用 Flex 和 Bison 在脚本引擎中实现 eval 和 load 函数