То, что я хочу сделать, это вывести html и PHP-код из базы данных, а затем выполнить его. Так, например, я могу:
<?php $test = <<<END <p> <?php echo time(); ?> </p> END; echo $test; ?>
Я хочу получить $ test для печати
<p> 12:00PM </p> //right
вместо печати:
<p> <?php echo time(); ?> </p> //wrong
как это происходит, когда я использую функцию эха.
Пожалуйста, не говорите мне, как делать то же самое с JavaScript или другой работой. Вместо этого придерживайтесь вопроса и помните, что пример – это просто пример, чтобы продемонстрировать мою проблему. Фактический код намного сложнее.
Я просмотрел строчную переменную Javascript, содержащую PHP-код, но ни один из ответов не работает.
Благодаря,
Brett
Вы можете использовать eval () для этого
$test = <<<END <p> <?php echo time(); ?> </p> END; ob_start(); eval("?>$test"); $result = ob_get_clean();
Я бы настоятельно рекомендовал не делать то, что вы просите. Для этого есть несколько веских причин.
Ответ на вопрос, как говорили другие, заключается в использовании eval()
. Однако у eval()
есть несколько серьезных проблем.
Во-первых, чтобы следить за комментариями по этому вопросу, код, выполняемый через него, выполняется значительно медленнее обычного PHP-кода. Хотя PHP – это скриптовый язык, у него есть оптимизация для ускорения работы. Ни одна из этих оптимизаций не работает для блока eval, потому что механизм сценариев не может знать, как будет выглядеть код до тех пор, пока он его не запустит.
Не только это, но и загрузка кода из базы данных также будет медленнее, чем загрузка его из файла с помощью регулярного оператора include()
.
Во-вторых, eval()
– одна из самых больших головных болей в вашей безопасности. Оператор eval()
запускает любой PHP-код, который ему задан, что означает, что злоумышленник может манипулировать кодом, сможет что- либо сделать на вашем сервере. Короче говоря, один оператор eval()
в вашем коде может превратить незначительный взлом в катастрофический.
Одно из альтернативных решений, которые не связаны с изменением вашей концепции, – это сохранить PHP-код в файле, а не в БД. Это позволит вам просто include()
в соответствующее время и устранить проблемы скорости, описанные выше. Вы все равно можете использовать БД, чтобы сохранить его, если хотите, и экспортировать его в файл кеша с помощью задания cron или аналогичного, или просто сохранить его непосредственно в файл.
Однако это решение не обязательно устраняет риски безопасности. Вы все равно будете эффективно выполнять произвольный код, что все равно означает, что хакер может нанести большой урон при сравнительно простом взломе.
Поэтому я рекомендую переосмыслить, почему вам необходимо ввести код ввода PHP для ввода в ваше программное обеспечение.
Что-то вроде этого может быть полезно …
<?php echo writedata($code_to_parse); ?> <?php function writedata($data){ if(substr($data,0,2)=="?>"){ eval($data); // eval will run & echo the code immediately, so return an empty $code $code=""; }else{ $code="$data"; } return $code; } ?>
Теперь вы можете обрабатывать простой html и смешанный php / html с помощью одного вызова функции.
Пример данных:
?>Bonjour. The time now is <?php echo $timenow; ?> in Paris. <div class="bluebox">Perfect day for swimming</div>
Есть некоторые побочные эффекты, использующие eval (), помните, что он будет выполняться, как только его вызывать, поэтому иногда могут появляться неожиданные результаты.