我希望能够将PHP放入数据库并运行它。我必须这样做,因为我将页面布局存储在数据库中,并且每个页面布局都彼此不同,但在某些情况下我想为某些页面使用动态内容。
假设$query_from_db
是从数据库返回的字符串。 PHP应该只在<?php
和?>
$query_from_db = '<div> <?php //php to run function dosomething() { //bleh } ?> </div> '; php echo eval($query_from_db);
我该怎么做?我知道不推荐这样做。
答案 0 :(得分:3)
我不是在争论这种方法的含义或无意义。在某种程度上,这是一个有效的问题。
参见文档:
要混合HTML输出和PHP代码,您可以使用结束PHP标记离开PHP模式。
所以你必须这样做:
eval('?> ' . $query_from_db . ' <?php ');
另请注意,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
)。