用于执行PHP代码的字符串变量

时间:2012-05-14 04:21:40

标签: php string echo

我想要做的是从数据库中提取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,但没有一个答案有效。

谢谢,

布雷特

3 个答案:

答案 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()会产生一些副作用,请记住它会在调用后立即执行,因此有时会产生意外结果。