Я хочу, чтобы 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
).