PHP eval()代码介于<! - ?php? - >之间,来自数据库

时间:2011-02-21 23:23:02

标签: php mysql eval

我希望能够将PHP放入数据库并运行它。我必须这样做,因为我将页面布局存储在数据库中,并且每个页面布局都彼此不同,但在某些情况下我想为某些页面使用动态内容。

假设$query_from_db是从数据库返回的字符串。 PHP应该只在<?php?>

之间eval()代码
$query_from_db  = '<div>
<?php

//php to run
function dosomething() {
     //bleh
}

?>
</div>
';


php echo eval($query_from_db);

我该怎么做?我知道不推荐这样做。

3 个答案:

答案 0 :(得分:3)

我不是在争论这种方法的含义或无意义。在某种程度上,这是一个有效的问题。

参见文档:

  

要混合HTML输出和PHP代码,您可以使用结束PHP标记离开PHP模式。

所以你必须这样做:

eval('?> ' .  $query_from_db . ' <?php ');

DEMO

另请注意,eval正在直接输出到浏览器。它不返回值。看看Output Control Functions是否有缓冲。

答案 1 :(得分:0)

您知道不建议这样做,我强烈建议大家审核这个问题的评论。

但要提供答案:

<?php

$string = 'hello <?php echo "world"; ?>';

eval('?>'.$string.'<?'); // will output "hello world";

请注意,这不起作用:

<?php

$string = 'hello <?php echo "world"; ?>';

eval('?>'.$string.'<?php'); // error will be thown

这再次起作用:

<?php

$string = 'hello <?php echo "world"; ?>';

eval('?> '.$string.' <?php '); // will output "hello world";

我不确定为什么。

跟进您的评论以获取您可以执行的输出:

<?php

$string = 'hello <?php echo "world"; ?>';

ob_start();
eval('?> '.$string.' <?php '); // will output "hello world";
$output = ob_get_clean(); // $output will now contain "hello world". No text will have ben printed.

答案 2 :(得分:0)

如果你想避免eval耻辱,你可以选择使用:

include("data:,$query_from_db");

这只是eval的另一个名字,不会让人感到不安。这取决于php.ini设置allow_url_include

您正在做的事情在功能上等同于include("$template/$by_name.php");,并且不同之处在于您之前没有将数据库内容放入文件中。 (但这是另一种解决方法:file_put_contents && include)。