关于 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
(可能是 compact
和 extract
的组合,或者是您自己的这些函数的替代品)。但是,此函数返回所有已定义变量的名称(包括像 $_GET
等超全局变量)。
如果您构建一个聪明的 diff 算法,您可能可以比较评估代码之前和之后定义的变量,并找出哪些变量是新的。祝你好运:)。
关于PHP - 来自数据库的评估代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4330262/