我想要做的是从数据库中提取html和PHP代码,然后执行它。例如,我可能有:
<?php
$test = <<<END
<p> <?php
echo time();
?> </p>
END;
echo $test;
?>
我想要的是获得$ test打印
<p> 12:00PM </p> //right
而不是打印:
<p> <?php echo time(); ?> </p> //wrong
当我使用echo函数时发生。
请不要告诉我如何使用JavaScript或其他解决方法做同样的事情。而是坚持这个问题并记住这个例子只是一个展示我问题的例子。实际的代码要复杂得多。
我看过Javascript string variable that contains PHP code,但没有一个答案有效。
谢谢,
布雷特
答案 0 :(得分:6)
我强烈建议不要做你要做的事情。这有很多很好的理由。
正如其他人所说,问题的答案是使用eval()
。但是,eval()
有几个主要问题。
首先,要对问题的评论进行跟进,运行它的代码执行速度明显慢于常规PHP代码。尽管PHP是一种脚本语言,但它确实具有优化以使运行更快。这些优化都不适用于eval块,因为脚本引擎在实际运行代码之前无法知道代码的样子。
不仅如此,从数据库加载代码也比使用常规include()
语句从文件加载代码慢。
其次,eval()
是您可能遇到的最大安全问题之一。 eval()
语句将运行任何 PHP代码,这意味着攻击者可以操作代码,可以在服务器上执行任何。简而言之,代码中的单个eval()
语句可能会将一个小错误变成灾难性的错误。
一种不涉及过多改变概念的替代解决方案是将PHP代码保存到文件而不是DB。这将允许您在适当的时间简单include()
它,并将消除上面讨论的速度问题。如果您愿意,您仍然可以使用数据库存储它,并使用cron作业或类似工具将其导出到缓存文件,或者您可以直接将其保存到文件中。
但是,此解决方案不一定会消除安全风险。你仍然可以有效地运行任意代码,这仍然意味着黑客可以通过相对简单的黑客攻击造成大量破坏。
因此,我建议您重新考虑为什么需要允许将用户输入的PHP代码输入到您的软件中。
答案 1 :(得分:4)
您可以将eval()用于此
$test = <<<END
<p> <?php
echo time();
?> </p>
END;
ob_start();
eval("?>$test");
$result = ob_get_clean();
答案 2 :(得分:1)
这样的事可能有用......
<?php echo writedata($code_to_parse); ?>
<?php
function writedata($data){
if(substr($data,0,2)=="?>"){
eval($data);
// eval will run & echo the code immediately, so return an empty $code
$code="";
}else{
$code="$data";
}
return $code;
}
?>
现在你可以处理普通的html&amp;混合php / html与一个函数调用。
示例数据:
?>Bonjour. The time now is <?php echo $timenow; ?> in Paris.
<div class="bluebox">Perfect day for swimming</div>
使用eval()会产生一些副作用,请记住它会在调用后立即执行,因此有时会产生意外结果。