27.05.2015, 14:09
|
Новичок на форуме
|
|
Регистрация: 27.08.2014
Сообщений: 4
|
|
как реализовать вывод формулы подсчета из б/д.
Помогите, пожалуйста! Мне нужно реализовать такую задачу. В б/д находится разные формулы подсчета, например:
a*(b+c*d).
Переменные a,b,c и d задаются в полях формы. Как сделать, чтобы эти данные подсчитывались по разным формулам?
|
|
27.05.2015, 14:26
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
SELECT field_a * (field_b + field_c * field_d) result
|
|
27.05.2015, 16:12
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
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));
|
|
27.05.2015, 16:55
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Сообщение от YegorSSS
|
В б/д находится разные формулы подсчета, например:
a*(b+c*d).
|
Текстом что ли? Ну тогда заменяйте по именам полей на значения и считайте eval'ом.
Опять же как взять имена полей из формулы в тексте. Ну если там как в примере, то регой выкинуть всё что не текст и разбив на букавки отрендерить поля с именами по буковкам. Потом replace значений и eval.
Если формулы в процедуре, да и вообще если и в тексте, в стопицот раз проще написать на каждую свою модель, при условии что они каждые 5 минут не меняются, конечно.
|
|
27.05.2015, 17:00
|
Новичок на форуме
|
|
Регистрация: 27.08.2014
Сообщений: 4
|
|
Спасибо, сделал таким способом:
<script>
function formul(a, b, c, d){
return <?= mysql_fetch_row(mysql_query('SELECT formula FROM table_name')) ?>;
}
</script>
Это вставил в код страницы, потом вызвал и подставил данные из формы.
|
|
27.05.2015, 17:04
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
То есть это надо выполнять обязательно на клиенте? Ну тогда уж отдавать ему объект описывающий данные для формул, а не return <?= mysql_fetch_row....
|
|
27.05.2015, 17:05
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
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>
|
|
27.05.2015, 17:05
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Сообщение от laimas
|
должен выполняться как хранимая процедура,
|
Заколебетесь хранить. Шли бы на sql.ru выпендриваться, чтоб ваш выпендреж там спецы обломали. Нашли тут благодарных профанов и впариваете им теории всего.
Хранимые процедуры нужны там, где клиент не детерминирован или скорее скомпилирован. Напрягите извилину. Есть 1 база и 100 клиентов, разных, готовых, ну какие-то там приложения на десктопе или на сервере через терминал - не важно. Важно что вы не можете взять и дописать им всем модельку подсчета чего-нить с какой-нить таблицы. Это невозможно. Тогда вы, как инженер баз данных - пишите процедуру прямо в самой базе данных и у всех чпок - считается-выбирается-сохраняется-реплицируется и тп - как полагается.
А нахрена козе баян для сайта на каком-нить php и js, где за час можно сгенерить сотню моделей и все будет работать как доктор прописал.
Кстати на моем федеральном хостинге нельзя создать ни вьюху ни хранимку. Потому что и не надо.
|
|
27.05.2015, 17:09
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Сообщение от YegorSSS
|
Это вставил в код страницы
|
Это называется модель и вы ее генерите. Остается еще рендер так же генерить и все будет чики-пуки.
|
|
27.05.2015, 17:10
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Згинь гнида шелудивая, бабку свою будешь удивлять своим "гениальными словами", для меня ты пустышка. Не дай бог еще раз попадешься под руку,изловлю щенка, сниму штаны и набью морду. )
|
|
|
|