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>

Теперь я попытался использовать функцию eval в php, но я получаю неожиданную ошибку синтаксического анализа '‹'. Я также безуспешно пытался использовать метод выходного буфера (ob_start). Любые идеи относительно того, как я могу получить этот код для оценки, не давая мне ошибки?

примечание: код базы данных хранится в переменной с именем $row['code'].


person phpNutt    schedule 17.01.2010    source источник
comment
Подождите... весь этот фрагмент кода хранится в базе данных? Это пример кода?   -  person meder omuraliev    schedule 17.01.2010
comment
при использовании eval() внутри может быть только код PHP.   -  person mauris    schedule 17.01.2010


Ответы (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%}.

person Karsten    schedule 17.01.2010

Функция eval PHP ожидает, что в качестве параметра будет выполняться код PHP, а не HTML. Попробуйте заключить значения БД в закрывающие и открывающие теги PHP:

eval('?>' . $row['code'] . '<?php');
person nortron    schedule 17.01.2010

Вы не можете использовать 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>";
person Guffa    schedule 17.01.2010
comment
Почему минус? Если вы не объясните, что именно вам не нравится, это довольно бессмысленно. - person Guffa; 17.01.2010