gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:40:22 25 4
gpt4 key购买 nike

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

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

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

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

['code2']
$num4 = $num3;        //4
$num5 = 5;
$num6 = $num4+$num5; //9

['code3']
$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');

上面从 db 调用的三个片段应该回显“13”,但它没有。还有我的问题:

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

最佳答案

您没有从数据库中获取结果。 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?



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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com