2010-01-17 31 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