PHP: использование функции eval с кодом HTML и PHP - PullRequest
0 голосов
/ 17 января 2010

В настоящее время у меня есть следующий код из таблицы базы данных:

<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), но безуспешно. Любые идеи относительно того, как я могу получить этот код для оценки, не давая мне ошибку? </p>

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

Ответы [ 3 ]

4 голосов
/ 17 января 2010

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

eval('?>' . $row['code'] . '<?php');
3 голосов
/ 17 января 2010

eval = зло!

Особенно, если eval'd-код приходит из db ... одной инъекции 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%}.

0 голосов
/ 17 января 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>";
...