2010-09-01 4 views
1
<?php 
eval("if (1==1){"); 
echo ('abc'); 
eval("}"); 
?> 

Тогда я получаю ошибку: Ошибка синтаксического анализа: Ошибка синтаксического анализа в C: \ WAMP \ WWW \ Test \ index.php (2): Eval() 'd-код в строке 1 abc Ошибка анализа: ошибка синтаксического анализа в C: \ wamp \ www \ test \ index.php (4): код eval() 'в строке 1
Как исправить?состояние с Eval {PHP}

+0

Я хочу создать шаблон egine – Snoob

+0

Вы хотите использовать механизм шаблонов для создания шаблона? – BoltClock

+0

№ сделать шаблон двигателя. Ответьте на мой вопрос, пожалуйста, – Snoob

ответ

9

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

Отказ от ответственности в сторону, я думаю, проблема заключается в том, что вы начинаете выражение в eval, которое должно быть полным.

Вы могли бы попробовать это вместо:

<?php 
    $test = eval("return 1==1;"); 

    if($test) 
    { 
     echo 'abc'; 
    } 

редактировать:

Цель состоит в том, чтобы сделать что-то вроде этого:

[if {expression}][blog_title][endif] 

Вот идея. Вместо того, чтобы позволить пользователю вводить какое-либо выражение, просто используйте переменную, которую пользователь может установить. Например:

[if should_show_blog_title][blog_title][endif] 

Затем пользователь может сделать это (псевдо-иш код, так как я не уверен, что ваш шаблонный API выглядит):

$template = new Template(); 

// shows blog title 
$template->set_variable('should_show_blog_title', 1 == 1); // 1 == 1 is true, so the variable is true 
$template->set_variable('blog_title', 'Awesomesauce Blog!'); 

// doesn't show title 
$template->set_variable('should_show_blog_title', 1 == 0); // 1 == 0 is false, so the variable is false 
$template->set_variable('blog_title', 'Awesomesauce Blog!'); 

Другой идеей было бы предоставить ограниченное число операторов или функций, которые пользователь может использовать. Вместо eval При этом вы должны проанализировать его. Например:

[if not_empty(blog_title)][blog_title][end if] 

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

Вы должны посмотреть на Mustache, какой вид следует за первой идеей. Реализация на самом деле довольно проста. PHP-реализация усов здесь: mustache.php. Вы можете просмотреть образцы и некоторый код, чтобы узнать, можете ли вы получить некоторые идеи.

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

+2

Не уверен, почему я был заблокирован. – notJim

+0

Спасибо за ваш комментарий, это моя проблема: [если somecondition] [blog_title] [ENDIF] Но я не знаю, как написать шаблон двигатель с условием, как это :( – Snoob

+1

жаль, что я мог upvote вам больше , notJim. – Zach

3

Простой ...

<?php 
eval(
    "if (1==1){". 
    "echo ('abc');". 
    "}"); 
?>

вещи в eval(' ... ') должно быть само завершено выражение или утверждение и «}» не является.

+0

Я думаю, что это лучший ответ. Объясняет, ПОЧЕМУ он получает ошибку. У меня есть аналогичный вопрос: http://stackoverflow.com/questions/5437403/php-eval-logical-operator-error – Brenden

Смежные вопросы