Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.05.2015, 14:09
Новичок на форуме
Отправить личное сообщение для YegorSSS Посмотреть профиль Найти все сообщения от YegorSSS
 
Регистрация: 27.08.2014
Сообщений: 4

как реализовать вывод формулы подсчета из б/д.
Помогите, пожалуйста! Мне нужно реализовать такую задачу. В б/д находится разные формулы подсчета, например:
a*(b+c*d).
Переменные a,b,c и d задаются в полях формы. Как сделать, чтобы эти данные подсчитывались по разным формулам?
Ответить с цитированием
  #2 (permalink)  
Старый 27.05.2015, 14:26
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

SELECT field_a * (field_b + field_c * field_d) result
Ответить с цитированием
  #3 (permalink)  
Старый 27.05.2015, 16:12
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

Если с хранимыми процедурами не получится, то можно в поле хранить не формулу, а ссылку на функцию ее выполняющую, которая будет выполнена после выборки из базы. Например, в таблице 5 полей из которых первые четыре, это значения переменных a, b, c, d, а пятое ссылка на функцию "name_1":
$func = array(
    'name_1' => function($v) {
        return $v[0] * ($v[1] + $v[2] * $v[3]);
    }
);
$q = mysql_fetch_row(mysql_query('SELECT * FROM table_name'));
echo $func[$q[4]](array_slice($q, 0, 4));
Ответить с цитированием
  #4 (permalink)  
Старый 27.05.2015, 16:55
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от YegorSSS
В б/д находится разные формулы подсчета, например:
a*(b+c*d).
Текстом что ли? Ну тогда заменяйте по именам полей на значения и считайте eval'ом.

Опять же как взять имена полей из формулы в тексте. Ну если там как в примере, то регой выкинуть всё что не текст и разбив на букавки отрендерить поля с именами по буковкам. Потом replace значений и eval.

Если формулы в процедуре, да и вообще если и в тексте, в стопицот раз проще написать на каждую свою модель, при условии что они каждые 5 минут не меняются, конечно.
Ответить с цитированием
  #5 (permalink)  
Старый 27.05.2015, 17:00
Новичок на форуме
Отправить личное сообщение для YegorSSS Посмотреть профиль Найти все сообщения от YegorSSS
 
Регистрация: 27.08.2014
Сообщений: 4

Спасибо, сделал таким способом:
<script>
  function formul(a, b, c, d){ 
         return <?= mysql_fetch_row(mysql_query('SELECT formula FROM table_name')) ?>;
  }
</script>

Это вставил в код страницы, потом вызвал и подставил данные из формы.
Ответить с цитированием
  #6 (permalink)  
Старый 27.05.2015, 17:04
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

То есть это надо выполнять обязательно на клиенте? Ну тогда уж отдавать ему объект описывающий данные для формул, а не return <?= mysql_fetch_row....
Ответить с цитированием
  #7 (permalink)  
Старый 27.05.2015, 17:05
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

YegorSSS,

<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
</head>

<body>
<form action="http://">
<label for="">a = <input type="text"></label>
<label for="">b = <input type="text"></label>
<label for="">c = <input type="text"></label>
<label for="">d = <input type="text"></label>
<p></p>
</form>
<script>
 var f = ["a*(b+c*d)", "a+b+c+d", "(a+b)*(c+d)", "a+b", "++a"],
    inp = document.querySelectorAll("input"),
    p = document.querySelector("p"),
    factory = function(a) {
        return new Function(a.match(/\w+/g), "return " + a)
    },
    fn = function(a) {
       return  a.value = +a.value || 0;
    },
    res, arr;
document.forms[0].onchange = function() {
    arr = Array.prototype.map.call(inp, fn);
    res = "";
    f.forEach(function(a) {
        var b = 0,
            c = a.replace(/\w+/g, function() {
                return arr[b++]
            });
        res += a + " => " + c + " => " + factory(a).apply(this, arr) + "<br>"
    });
    p.innerHTML = res
};
</script>
</body>

</html>
Ответить с цитированием
  #8 (permalink)  
Старый 27.05.2015, 17:05
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от laimas
должен выполняться как хранимая процедура,
Заколебетесь хранить. Шли бы на sql.ru выпендриваться, чтоб ваш выпендреж там спецы обломали. Нашли тут благодарных профанов и впариваете им теории всего.

Хранимые процедуры нужны там, где клиент не детерминирован или скорее скомпилирован. Напрягите извилину. Есть 1 база и 100 клиентов, разных, готовых, ну какие-то там приложения на десктопе или на сервере через терминал - не важно. Важно что вы не можете взять и дописать им всем модельку подсчета чего-нить с какой-нить таблицы. Это невозможно. Тогда вы, как инженер баз данных - пишите процедуру прямо в самой базе данных и у всех чпок - считается-выбирается-сохраняется-реплицируется и тп - как полагается.

А нахрена козе баян для сайта на каком-нить php и js, где за час можно сгенерить сотню моделей и все будет работать как доктор прописал.

Кстати на моем федеральном хостинге нельзя создать ни вьюху ни хранимку. Потому что и не надо.
Ответить с цитированием
  #9 (permalink)  
Старый 27.05.2015, 17:09
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от YegorSSS
Это вставил в код страницы
Это называется модель и вы ее генерите. Остается еще рендер так же генерить и все будет чики-пуки.
Ответить с цитированием
  #10 (permalink)  
Старый 27.05.2015, 17:10
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Згинь гнида шелудивая, бабку свою будешь удивлять своим "гениальными словами", для меня ты пустышка. Не дай бог еще раз попадешься под руку,изловлю щенка, сниму штаны и набью морду. )
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отформатировать вывод используя innerHTML? Tachi Events/DOM/Window 4 17.12.2014 14:40
Как правильно реализовать наследование? Universe Общие вопросы Javascript 9 10.04.2014 16:05
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Как реализовать отправку содержимого из iframe нажатием комбинации клавиш ctrl+enter Naizer Общие вопросы Javascript 4 27.11.2013 17:39
Как реализовать? Fliand Элементы интерфейса 4 22.08.2009 19:47