Изменения типа переменной

iloveira

Новичок
Изменения типа переменной

Добрый день,

Столкнулся со следующей проблемой.

В БД хранятся формулы по которым на основании входных коэфициентов высчитываем результат.
Например такая "($a+5)*10";

Пишу следующий код:
PHP:
  $a = 10;
  
  echo $row['form'];
И разумеется получаю в броузере ($a+5)*10
Как быть?

Вроде бы нужно изменить тип переменной?

Заранее спасибо.
 

iloveira

Новичок
Автор оригинала: sage
зачем ты формулы хранишь в бд?
формулы вводятся пользователем и к тому же редактируемые.
До этого был реализован механизм с одним математическим действием - в базе хранил математическое действие и коэфициент.
Теперь стал вопрос о том, что нужно много действий.
Вот пытаюсь переделать.
 

alexei.lexx

Новичок
так echo формулу просто как текст выводит, а не математикой занимается.
читай доки по eval().
 

Фанат

oncle terrible
Команда форума
не нравится мне эта идея с eval
учитывая, что распарсить арифметику, в принципе, не такая сложная задача.

alexei.lexx
вот куда ты спешишь?
Человк видит пхп второй раз в жизни.
Синтаксис языка от строковой переменной отличить не может.
Надо его сначала спросить - что делает, зачем.
потом только отвечать. вредным ответом.
 

alexei.lexx

Новичок
Автор оригинала: Фанат
не нравится мне эта идея с eval
учитывая, что распарсить арифметику, в принципе, не такая сложная задача.

alexei.lexx
вот куда ты спешишь?
Человк видит пхп второй раз в жизни.
Синтаксис языка от строковой переменной отличить не может.
Надо его сначала спросить - что делает, зачем.
потом только отвечать. вредным ответом.
А в чём проблема? В безопасности? Человеку достаточно все параметры приводить к типу double, т.к. выражения у него арифметические. Тексты выражений он судя по всему задаёт сам.

Писать синтаксический анализатор для арифметических выражений, конечно, хорошая задача для разминки ума, только он сюда не за задачами лез...

Если есть здесь где-нибудь статья о безопасности использования eval, скинь ему. Я здесь сам новичок.
 

Фанат

oncle terrible
Команда форума
мои предложения - спросить. что ты делаешь. зачем. что в этой формуле, и почему именно так все пишется.

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

iloveira

Новичок
За 30 минут так и не воткнул...
Почему
eval("$"."temp"."=".$str.";"); работает

, а
eval("$temp=".$str.";"); нет.

Спасибо за помощь.

alexei.lexx
Вам особенно... всё получилось =)
 

Фанат

oncle terrible
Команда форума
alexei.lexx
достаточно все параметры приводить к типу double, т.к. выражения у него арифметические
какие ещё параметры?
Тексты выражений он судя по всему задаёт сам.
глаза разуй: формулы вводятся пользователем
только он сюда не за задачами лез...
ага.
а придурки, которые хотят, чтобы им все прислали по доллару в кошелек, пришли не за тем, чторбы их сообщения стирались.
если человек чего-то желает, то совсем не обязательно, что он это получит.
 

phprus

Moderator
Команда форума
alexei.lexx
Писать синтаксический анализатор для арифметических выражений, конечно, хорошая задача для разминки ума, только он сюда не за задачами лез...
А зачем его писать? готовых мало?

Черт. думал к предыдущему мессага добавиться а не успел.
 

iloveira

Новичок
Автор оригинала: Фанат
мои предложения - спросить. что ты делаешь. зачем. что в этой формуле, и почему именно так все пишется.

выполнить формулу, лежащую в базе данных - это решение некоей задачи. единственное решение, которое ты выдишь. Но, возможно, у этой задачи есть другие решения. их можно дать, если знать задачу.
Задача по расчёту требуемого материала для создания неких вещей.
Например кровати.
Есть различные формулы для различный типов кроватей (формулы вводит админ сайта).
Пользователь выбирает тип кровати вводит длину и ширину - скрипт выдаёт кол-во требуемого материала и чёткий список деталей, стоимость и т.д.. Если всё удовлетворяет, то списываем со склада и на производство.
 

zerkms

TDD infected
Команда форума
iloveira
зря благодарите. теперь у вас появилась огромная уязвимость на сайте
 

iloveira

Новичок
zerkms
пока ещё нет =)

Может быть подскажут как сделать правильнее.
 

phprus

Moderator
Команда форума
iloveira
Я уже дал ссылки на парсеры математических выражений. Они могут подойти.
 

Фанат

oncle terrible
Команда форума
phprus дал тебе две ссылки.
Хотя если вводит админ, а не пользователь, то опасность меньше, конечно.
Если не обращать на ошибки, которые будут возникать на сайте, если админ ошибся в скобках
 

alexei.lexx

Новичок
Автор оригинала: iloveira
За 30 минут так и не воткнул...
Почему
eval("$"."temp"."=".$str.";"); работает

, а
eval("$temp=".$str.";"); нет.

Спасибо за помощь.

alexei.lexx
Вам особенно... всё получилось =)
В выражении "$"."temp"."=".$str.";" ты конкатенируешь строки и получаешь в итоге строку вида
"$temp=2+2;"

В случае "$temp=".$str.";" вместо "$temp" подставляется значение переменной $temp (которая скорее всего пустая) и получается строка "=2+2;".

Это особенности использования кавычек (двойных) в строковых константах.

Но Фанат прав, опасную игрушку я тебе дал в руки :)
Совет: перед тем как программировать прочитай хоть какую-то дельную книгу по РНР.
 
Сверху