Код PHP eval(), возвращенный из запроса mysql *не работает*

если я возьму и сделаю что-то вроде этого:


    $p = 10;
    $n = 3;
    $evalstr = "\$f = 0.99 + ((.025 * \$p) * \$n);";
    eval($evalstr);
    echo $f;

У меня отображается 1,74, ошибок нет, все в порядке, но когда у меня есть таблица mysql, содержащая эти уравнения (для целей этого примера, это точно такое же уравнение)... вот так:


    $p = 10;
    $n = 3;
    while ($result = mysql_fetch_assoc($results)) {
        $math = $result['math'];
        //at this point $math = "\$f = 0.99 + ((.025 * \$p) * \$n);"
        eval($math);
    }

Я получаю сообщение об ошибке Parse: синтаксическая ошибка, неожиданная T_VARIABLE, ожидание T_STRING в ajax\getprices.php(30): код eval() в строке 1

Не уверен, почему, если я печатаю echo $math, он идентичен тому, что у меня есть как $evalstr в первом примере. $p и $n на самом деле устанавливаются из переменных GET, но даже если я устанавливаю их вручную, как в примере, это не работает.


person Mike L.    schedule 18.10.2011    source источник
comment
Предложение. Старайтесь не хранить свой PHP в базе данных. Если у вас есть уязвимость SQL-инъекций, кто-то может полностью скомпрометировать всю вашу кодовую базу. Не только ваша база данных.   -  person Cyclone    schedule 19.10.2011
comment
ideone.com/T20A4 вы уверены, что $math действительно то, что вы говорите?   -  person Dejan Marjanović    schedule 19.10.2011
comment
Попробуйте заменить eval() на var_dump($math) и сообщите нам, точно что он выводит.   -  person Ilmari Karonen    schedule 19.10.2011


Ответы (2)


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

eval(stripslashes($math));

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

person aurora    schedule 18.10.2011
comment
это работает, тот же ответ, который я придумал, я удаляю косые черты вручную (всего 18 уравнений), и безопасность здесь не проблема, спасибо - person Mike L.; 19.10.2011

Я понял, кажется, что при определении кода eval как переменной мне нужно экранировать $, но при извлечении его из mysql как переменной он работает, если я отключу $

person Mike L.    schedule 18.10.2011