如何在字符串变量中执行 PHP 代码


How to execute PHP code in a string variable

我想做的是从数据库中提取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

就像我使用回显功能时发生的那样。

请不要告诉我如何使用JavaScript或其他解决方法做同样的事情。相反,坚持问题并记住示例只是演示我的问题的示例。实际代码要复杂得多。

我看过包含PHP代码的Javascript字符串变量,但没有一个答案有效。

我强烈建议不要做你要求做的事情。这有很多很好的理由。

正如其他人所说,这个问题的答案是使用 eval() .但是,eval()有几个主要问题。

首先,为了跟进对问题的评论,通过它运行的代码执行速度明显慢于常规PHP代码。虽然PHP是一种脚本语言,但它确实进行了优化,使运行速度更快。这些优化都不适用于评估块,因为脚本引擎在实际运行代码之前无法知道代码的外观。

不仅如此,从数据库加载代码也比使用常规include()语句从文件加载代码慢。

其次,eval()是您可能遇到的最大安全难题之一。eval()语句将运行它给出的任何PHP代码,这意味着攻击者可以操纵代码将能够在您的服务器上执行任何操作。简而言之,代码中的单个eval()语句可以将一个小的黑客变成灾难性的黑客。

一种不涉及过多更改概念的替代解决方案是将PHP代码保存到文件而不是数据库中。这将允许您在适当的时间简单地include()它,并消除上面讨论的速度问题。如果您愿意,您仍然可以使用数据库来存储它,并使用 cron 作业或类似工具将其导出到缓存文件,或者您可以将其直接保存到文件中。

但是,此解决方案不一定能消除安全风险。您仍然会运行有效的任意代码,这仍然意味着黑客可以通过相对简单的黑客造成很大的损害。

因此,我建议重新考虑为什么需要允许用户输入的PHP代码输入到软件中。

你可以使用 eval((

$test = <<<END
<p> <?php 
echo time(); 
?> </p>
END;

ob_start();
eval("?>$test");
$result = ob_get_clean();

这样的东西可能会有用...

<?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和混合php/html。

示例数据:

?>Bonjour. The time now is <?php echo $timenow; ?> in Paris.
<div class="bluebox">Perfect day for swimming</div>

使用 eval(( 有一些副作用,请记住它会在调用它时立即执行,因此有时会产生意想不到的结果。