PHP eval () код между <? Php?> Из базы данных

Я хочу, чтобы PHP мог поместить PHP в базу данных и запустить ее. Я должен сделать это, потому что я храню макеты страниц в базе данных и каждый из наших друг для друга, однако в некоторых случаях я хочу использовать динамический контент для некоторых страниц.

Предположим, что $query_from_db – это строка, возвращаемая из базы данных. PHP должен только eval () код между <?php и ?>

 $ query_from_db = '<div>
 <? PHP

 // php для запуска
 функция dosomething () {
      // BLEH
 }

 ?>
 </ DIV>
 «;


 php echo eval ($ query_from_db);

Как я могу это сделать? Я знаю, что это не рекомендуется.

Я не спорю о смысле или глупости этого подхода. В некоторой степени это правильный вопрос.

См. Документацию:

Чтобы смешать вывод HTML и PHP-код, вы можете использовать закрывающий тег PHP для выхода из режима PHP.

Так что вам нужно сделать:

 eval('?> ' . $query_from_db . ' <?php '); 

DEMO

Также обратите внимание, что eval выводит непосредственно в браузер. Он не возвращает значение. Посмотрите на функции управления выходом для буферизации.

Вы знаете, что это не рекомендуется, и я настоятельно призываю всех рассмотреть комментарии к этому вопросу.

Но чтобы дать ответ:

 <?php $string = 'hello <?php echo "world"; ?>'; eval('?>'.$string.'<?'); // will output "hello world"; 

имейте в виду, что это, однако, не сработает:

 <?php $string = 'hello <?php echo "world"; ?>'; eval('?>'.$string.'<?php'); // error will be thown 

Это снова работает:

 <?php $string = 'hello <?php echo "world"; ?>'; eval('?> '.$string.' <?php '); // will output "hello world"; 

я не совсем уверен, почему.

следуя за вашим комментарием, чтобы захватить вывод, который вы можете сделать:

 <?php $string = 'hello <?php echo "world"; ?>'; ob_start(); eval('?> '.$string.' <?php '); // will output "hello world"; $output = ob_get_clean(); // $output will now contain "hello world". No text will have ben printed. 

Если вы хотите избежать стигмы eval, вы также можете использовать:

 include("data:,$query_from_db"); 

Это просто другое имя для eval, которое не расстраивает людей. Однако это зависит от настройки php.ini allow_url_include .

То, что вы делаете, функционально эквивалентно include("$template/$by_name.php"); и просто отличается тем, что вы ранее не добавляли содержимое базы данных в файл. (Но это другое обходное решение: file_put_contents && include ).