2011-07-05 2 views
0

Ok, je ne peux pas venir à bout de ce ob_start et le code ob_end_clean ...problème ob_start avec le code PHP

Fondamentalement, je suis en train de sortie du code PHP dans une section de page.

Voici mon code source:

$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; 

Maintenant, dans la fonction de modèle, j'utilise ceci:

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> 
      '; 

Alors, pourquoi suis-je reçois ce message d'erreur?

Erreur HTTP 500 (serveur interne d'erreur): Une situation inattendue se tandis que le serveur était essayant de répondre à la demande.

Qu'est-ce que je fais mal ici? Le $ context ['page_data'] ['body'] a un code PHP valide, un simple echo 'Hello World'; mais il me donne cette 500 erreur interne du serveur. Pourquoi?

+0

Vous devez utiliser '.' au lieu de', 'dans le modèle pour concaténer les chaînes. Jetez aussi un coup d'œil au journal des erreurs d'Apache. – Boldewyn

+0

@Boldewyn la construction ['echo()'] (http://php.net/manual/fr/function.echo.php) accepte plusieurs paramètres, bien que les docs indiquent que les parenthèses doivent être utilisées dans ce cas. – jensgram

Répondre

0

Le code eval() de PHP ne doit pas être appelé pour une chaîne contenant <?php ?> car il est supposé que le contenu de la chaîne elle-même est du code PHP pur. Vous devriez donc pouvoir supprimer les deux appels trim() que vous faites en plus d'utiliser la suggestion de @ Boldewyn.

+0

Bien que devrais-je utiliser au lieu de 'eval()' pour sortir le PHP? 'echo $ content;' n'est pas bon. – SoLoGHoST

+1

Je dis que vous pouvez toujours utiliser 'eval()', mais n'ajoutez pas le ' À la variable '$ content' car la fonction suppose que tout ce que vous lui passez est déjà Code PHP. – jerluc

+0

Ok, enlevé, je vous suis maintenant. Compris le problème, n'a pas la fonction 'error_get_last()' définie nulle part. – SoLoGHoST