2011-07-05 47 views
0

好ob_start問題,我不能來這個ob_start和ob_end_clean代碼交手...與PHP代碼

基本上,我想在頁面部分中輸出的PHP代碼。

這裏是我的源代碼:

$content = trim(html_entity_decode($context['page_data']['body'], ENT_QUOTES, $context['character_set'])); 
$content = trim($content, '<?php'); 
$content = trim($content, '?>'); 

function dream_error_handler($output) 
{ 
    $error = error_get_last(); 
    $output = ""; 
    if (!empty($error)) 
     foreach ($error as $info => $string) 
      if ($info == 'message') 
       $output .= $string; 

    return $output; 
} 

ob_start('dream_error_handler'); 
eval($content); 
$code = ob_get_contents(); 
ob_end_clean(); 

$context['page_data']['body'] = $code; 

現在,在模板功能,我使用這樣的:

global $context; 

echo ' 
       <div class="cat_bar"> 
        <h3 class="catbg"> 
         ', $context['page_data']['title'], ' 
        </h3> 
       </div> 
       <span class="upperframe"><span></span></span> 
        <div class="roundframe"> 
         ', $context['page_data']['body'], ' 
        </div> 
       <span class="lowerframe"><span><!-- // --></span></span> 
      '; 

那麼,爲什麼我收到此錯誤消息?

HTTP錯誤500(內部服務器錯誤 ):意外的情況是遇到 而服務器是 試圖完成請求。

我在這做錯了什麼? $ context ['page_data'] ['body']具有有效的PHP代碼,簡單的echo 'Hello World';,但它給我這500內部服務器錯誤。爲什麼?

+0

您應該在模板中使用'.'而不是'''連接字符串。也看看Apache的錯誤日誌。 – Boldewyn

+0

@Boldewyn ['echo()'](http://php.net/manual/en/function.echo.php)構造接受多個參數,儘管文檔聲明在這種情況下應該使用括號。 – jensgram

回答

0

不應該爲包含<?php ?>的字符串調用PHP的eval(),因爲它假定字符串本身的內容是純PHP代碼。因此,除了使用@ Boldewyn的建議之外,您應該能夠移除您正在進行的兩個trim()電話。

+0

好於我應該用什麼來代替'eval()'來輸出PHP? 'echo $ content;'不好。 – SoLoGHoST

+1

我在說,你仍然可以使用'eval()',只是不要將'<?php'和'?>'添加到'$ content'變量中,因爲函數假設你傳遞給它的所有東西都已經PHP代碼。 – jerluc

+0

好吧,刪除它,我現在跟着你。找出問題所在,沒有在任何地方定義'error_get_last()'函數。 – SoLoGHoST