Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Как узнать текст выражения, на котором eval() закончился с неизбежной оплошностью

Anna | 31.05.2014 | нет комментариев

Есть такая вот проблемка:

В коде используем eval для вычисления значения формул. В случае враждебной ошибки в тексте выражения PHP неизбежно заблуждается и всё, что остаётся в логах:

PHP Fatal Error: syntax error, unexpected ')' in Form/Validate/DinamicFormulaValues.php(149) : eval()'d code on line 1

Как вывести в консоль текст выражения, которое не удалось проевалить?

У меня в голове такой вариант:

$expression = "1   2)"; // здесь очевидно схожая синтаксическая оплошность - незакрытая скобка
$file = tempnam('/tmp', 'eval')
file_put_contents($file, "<?php return {$expression};");
$value = include($file);

Позже этого появляется оплошность
Parse error: syntax error, unexpected ')' in /tmp/eval1kGtG7 on line 1

(при надлежащей ухватке и чуточке рассудка это сообщение уходит почтой админу либо разработчикам)

Открываю файл /tmp/eval1kGtG7 и вижу синтаксическую ошибку

Ещё вариант:

$result = exec('php -l "'.$file.'"', $output); // это консольная команда проверки синтаксиса файла PHP
echo $result; // -> Errors parsing /tmp/eval1kGtG7
echo implode("n", $output);  // -> PHP Parse error:  syntax error, unexpected ')' in /tmp/eval1kGtG7 on line 1

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

Ещё вариант

if (false === @eval($expression)) {
    var_dump(error_get_last()); // выводится текст сообщения об ошибке
}

Недочет этого варианта: в error_get_last() остаётся итог от интерпретации предыдущего неудачного выражения, а проверок будет сотни — получается, что будет много неверных срабатываний на рекорректность.

Есть ли другие варианты?

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB