2010-01-17 112 views
0

目前,我有下面的代码从数据库表来:PHP:使用eval函数与HTML和PHP代码

<h1 class="widgetHeader">My Friends</h1> 
<div class="widgetRepeater">    
    <p class="widgetHeader">Random Selection</p> 
<?php 
    $friends = $user->getFriends(); 
?> 
    <p class="widgetContent"> 
<?php 
     for ($i=0; $i<count($friends);$i++) { 
      $friend = $friends[$i]; 
?> 
       <span class="friendImage" style="text-align:center;"> 
        <?php print $friend->username; ?> 
       </span> 
<?php 
     } 
?>  
    </p> 

</div> 

现在,使用PHP eval函数香港专业教育学院尝试,但我得到一个解析错误意外'<'。我也尝试过使用输出缓冲区方法(ob_start),但没有成功。任何想法如何我可以得到这个代码来评估而不给我一个错误?

注意:数据库代码存储在名为$row['code']的变量中。

+0

等等..整个代码片段存储在数据库中?它是示例代码吗? – 2010-01-17 11:46:28

+1

使用eval()时,只能在PHP代码里面。 – mauris 2010-01-17 11:51:10

回答

3

EVAL =邪恶!

尤其是如果eval'd代码来自一个数据库...一个mysql注入=完整的php执行=完全控制。

而是使用一些占位符并替换它们(就像任何其他良好的模板系统一样)。

你可以存储在这个数据库:

<h1 class="widgetHeader">My Friends</h1> 
<div class="widgetRepeater">    
    <p class="widgetHeader">Random Selection</p> 
    {%friendstemplate%} 
</div> 

然后他们应该有内容的str_replace函数的占位符。在您的例子,我也将每朋友添加一个子模板是这样的:

<span class="friendImage" style="text-align:center;"> 
    {%username%} 
</span> 

...你能循环,并插入{%friendstemplate%}。

4

PHP的eval函数期望PHP代码执行,因为它的参数,而不是HTML。尝试用PHP关闭和打开的标签包围的DB值:

eval('?>' . $row['code'] . '<?php'); 
0

你不能上的标记代码使用eval。无论是代码保存到临时文件,这样就可以包含它,或者重写代码,以便它不标记,像这样:

print "<h1 class=\"widgetHeader\">My Friends</h1>"; 
print "<div class=\"widgetRepeater\">"; 
print "<p class=\"widgetHeader\">Random Selection</p>"; 
$friends = $user->getFriends(); 
print "<p class=\"widgetContent\">"; 
for ($i=0; $i<count($friends);$i++) { 
    $friend = $friends[$i]; 
    print "<span class=\"friendImage\" style=\"text-align:center;\">"; 
    print $friend->username; 
    print "</span>"; 
} 
print "</p>"; 
print "</div>"; 
+0

为什么downvote?如果你不解释你不喜欢的是什么,那是毫无意义的。 – Guffa 2010-01-17 12:03:52