Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Вычисление формулы

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Stoun
Отправлено: 13 Сентября, 2010 - 02:22:25
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Сент. 2010  


Помог: 0 раз(а)




Здравствуйте.
Прошу помочь в решении следующей задачи.
Есть набор переменных типа int.
$A = 2;
$B = 3;
$C = 4;
и т.д.
В виде строковой переменной есть формула, например $text = "A+B*C";
Всё никак не соображу, как с текстовой формулы сделать число, подставив в него значения переменных.
Помогите пожалуйста решить задачу.
Заранее спасибо.
(Добавление)
Решил проблему с помощью функции eval();
Не знаю лучший ли это вариант, но другого пока не придумал.
Вот что вышло:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. $A = 2;
  4. $B = 3;
  5. $C = 4;
  6. $text = "A+B*C";
  7. $text = str_replace("A",$A,$text);
  8. $text = str_replace("B",$B,$text);
  9. $text = str_replace("C",$C,$text);
  10. echo eval("return $text;");
  11.  
  12. ?>

Но я буду благодарен. за ваши варианты решения данной задачи.
 
 Top
AdMeen
Отправлено: 13 Сентября, 2010 - 10:11:25
Post Id



Посетитель


Покинул форум
Сообщений всего: 370
Дата рег-ции: Сент. 2009  
Откуда: Воронеж


Помог: 1 раз(а)




собственно, если не секрет, в чем смысл то? может можно решить задачу более простым методом
 
 Top
ded-mazay
Отправлено: 13 Сентября, 2010 - 11:22:31
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Нояб. 2009  


Помог: 0 раз(а)




Stoun
Действительно, зачем так?
Пишите ф-цию и все..

CODE (php):
скопировать код в буфер обмена
  1. function my_func($A = 0, $B = 0, $C = 0)
  2. {
  3.     $result = $A+$B*$C;
  4.     return $result;
  5. }
  6.  
  7. $A = 2;
  8. $B = 3;
  9. $C = 4;
  10.  
  11. echo my_func($A, $B, $C);

(Отредактировано автором: 13 Сентября, 2010 - 11:27:30)

 
 Top
JustUserR
Отправлено: 13 Сентября, 2010 - 11:49:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Stoun пишет:
В виде строковой переменной есть формула, например $text = "A+B*C";
В случае если вам необходимо проводить вычисление математических выражений определенного формата записанных в виде строки - то в общем случае нужно создать систему разбора таких формул которая будет проводить синтаксический анализ и выделять отдельные лексемы и тд Если используемые вами выражения полностью совместимы с оригинальными элементами языка PHP то для их выполнения можно использовать функцию eval или create_function - но существенным недостаточком в таком случае является невозможность прямого выполнения всех выражений от пользователя поскольку это категорически небезопасно Тем не менее вы можете использовать возможности модуля runkit по огранизации собственного интерпретатора кода - в таком случае все выражения будут выполняться в виртуальном окружении и вы можете получить требуемый результат


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Stoun
Отправлено: 13 Сентября, 2010 - 18:02:18
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Сент. 2010  


Помог: 0 раз(а)




ded-mazay такая функция не подойдёт, так как математическое выражение неизвестно, и количество переменных тоже. Пользователь вводит некоторое количество переменных, которые записаны в БД. А потом он вводит неопределённое количество математических выражений (с простыми арифметическими операциями), по которым вычисляются другие переменные. Собственно они потом и есть результатом программы.

JustUserR, не могли бы вы обьяснить в чем небезопасность использования функции eval()?
 
 Top
AdMeen
Отправлено: 14 Сентября, 2010 - 07:54:51
Post Id



Посетитель


Покинул форум
Сообщений всего: 370
Дата рег-ции: Сент. 2009  
Откуда: Воронеж


Помог: 1 раз(а)




Stoun пишет:

JustUserR, не могли бы вы обьяснить в чем небезопасность использования функции eval()?


Я конечно не JustUserR, но всё же постараюсь немного разъяснить ситуацию. Функция http://www.php.su/eval " target="_blank">eval , как вам известно, позволяет выполнить строку как php код, т.е. при недостаточной обработке входных данных, злоумышленник может выполнить произвольный php код в вашей системе. Последствия я так думаю объяснять не стоит.
А по теме, почитайте про обратную польскую нотацию. Реализуется она очень просто. Если что будет непонятно, спрашивайте.

(Отредактировано автором: 14 Сентября, 2010 - 07:59:06)

 
 Top
JustUserR
Отправлено: 14 Сентября, 2010 - 12:06:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Stoun пишет:
JustUserR, не могли бы вы обьяснить в чем небезопасность использования функции eval()?
Основные аспекты проблем с безопасностью которые могут возникнуть при использовании функции eval указал AdMeen - тем не менее применение динамически-вычисляемых выражений может привести к гораздо более трудно-обнаружимым проблемам с безопасностью Дело в том что функция eval обеспечивает вычисление выражений на основе значений переменных в реальном времени и применяет рефлексивный результат к основному уровню выполнения - в силу этого для проверки поступающей от пользователя информации необходимо производить поиск и очистку всех допустимых операторов PHP кроме арифметических Также при переходе от выражения в коде к рефлексивному вычислению будет происходить автоматическая интерполяция в строке что позволяет неявно выполнять выражения из других переменных - которые в свою очередь уже не являются напрямую контролируемыми
Кроме того для осуществления проверки пользовательских данных используются строковые функции и регулярные выражения - и в случае их неправильного построения возможен такой случай когда за счет изменения кодовой таблицы текущего соединения - шаблон регулярного выражения не произведет соответствующую фильтрацию


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB