Как вернуть PHP-код из записи MySQL? - PullRequest
4 голосов
/ 28 июня 2011

Как вернуть php-код из записи «content» строки mysql, где он может содержать простой текст, например:

Hello!

или / и php-подобный:

Lets try some php: <?php echo phpinfo(); ?>

без показателей скорости, когда он содержит только простой текст?


Вот пример, когда возвращается phpпри использовании include (), но в данном случае это не то, что я запрашиваю (я спрашиваю случай, когда весь контент php будет поступать из mysql).

mysql record:

+---------------+
| id |  content |
|---------------|
|  0 | test.php |
+---------------+

test.php content <?php echo phpinfo(); ?>

пытается вернуть php из MySQL через корыто include ():

$result=mysql_query("SELECT content FROM test WHERE id=0");
while($row=@mysql_fetch_array($result,MYSQL_ASSOC)){
    $row[]=array('row'=>array_map('htmlspecialchars',$row));
    $content=$row['content'];
    ob_start();
    include $content;
    $content=ob_get_contents();
    ob_end_clean();
    echo $content;
}
mysql_close($con);

Ответы [ 2 ]

4 голосов
/ 28 июня 2011

Попробуйте оценить содержимое записи: eval($row['content']);

ДОПОЛНИТЕЛЬНО: у вас есть смешанный HTML + PHP-код в вашем случае, и это означает, что вам нужно использовать закрывающий тег PHP, чтобы выйти из режима PHP, так что в вашем конкретном случае это может выглядеть примерно так:

eval( '?>'. $row['content'] .'<?php ' );

Примечание: оставьте дополнительное место после открывающего тега, потому что у него есть некоторые проблемы: http://www.php.net/manual/en/function.eval.php#97063

1 голос
/ 28 июня 2011

PHP-код в БД отстой, но я уже бывал в ситуациях, когда это нужно было делать, потому что мой работодатель не позволял мне переписывать систему таким образом, чтобы этого избежать, поэтому вот общая версия Решение, которое мы использовали:

$string = 'this <?php echo "is not"; ?> cool';

function exec_php($php_string) {
    return preg_replace_callback(
        '/<\?(?:php)?(.*)\?>/m',
        'exec_php_embed',
        $string
    );
}

function exec_php_embed(array $args) {
    if (count($args) != 2) {
        return '';
    }
    list(,$code) = $args;
    ob_start();
    eval($code);
    return ob_get_clean();
}

Примечание: БУДЬТЕ ОЧЕНЬ ОЧЕНЬ ОСТОРОЖНЫ! НЕ НЕ ИСПОЛЬЗУЕМЫЙ ПОЛЬЗОВАТЕЛЬСКИЙ КОНТЕНТ С ЭТИМ! Попробуйте заменить это как можно скорее!

Использование eval() не просто неэффективно, но и опасно, даже если используется ненадлежащим образом. Хотя я очень не рекомендую использовать подобные вещи, я полагаю, что это окажется решением вашей непосредственной проблемы. Я не гарантирую, что это не создаст больше собственных проблем;)

Как говорит GNU:

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
...