2013-04-08 3 views
4

Я столкнулся с этой проблемой раньше и ожидаю сделать это еще раз. Я хочу выполнить вычисление промежуточного итога как в javascript, так и в PHP. Возможно, мне захочется изменить расчет в какой-то момент.PHP/Javascript Validated Calculation

  • Необходимо выполнить в javascript, чтобы максимизировать скорость вычисления, чтобы пользователь знал, чего ожидать.
  • Он должен работать в PHP, чтобы я получал действительную промежуточную оценку, которой злоумышленник не может вмешиваться.

Как таковой:

  • Если бы я только запустить расчет на стороне клиента (в JavaScript), злоумышленник может взломать яваскрипт и изменить итог.
  • Если я выполняю только расчет на стороне сервера (на PHP), для пользователя должен быть вызван вызов AJAX, чтобы пользователь мог получить обновленный промежуточный итог.

Поэтому я хочу выполнить расчеты с обеих сторон. Единственный способ, которым я это видел, - это программировать вычисления в PHP и программировать вычисления в отдельном javascript.

вопрос вопрос, какой образец, техника или технология люди рекомендуют использовать для создания расчета на стороне сервера и сделать его совместимым с javascript при его отправке на клиентскую сторону?

Идея я, например, был PHP массив для расчета, который переводится в PHP код и код яваскрипта, например:

array(
    array(type => "operand", "name" => "variable_A"), 
    array(type => "operator", "name" => "multiply"), 
    array(type => "operand", "name" => "variable_B"), 
) 

Это может преобразовать в PHP:

return $variable_A * $variable_B; 

И в Javascript:

return variable_A * variable_B; 

Это оперативный образец пример. Я не знаю, как выглядят настоящие, если они существуют.

+0

«Поэтому я хочу выполнить расчет с обеих сторон. Единственный способ, которым я это видел, - это программировать вычисления в PHP и программировать вычисления в отдельном javascript». Таким образом, злоумышленник может видеть, что сделано в JS, правильно? – Voitcus

+0

Возможно, вам понравится [эта дискуссия] (http://stackoverflow.com/questions/4019418/process-mathematics-equations-in-php) – Voitcus

+0

@Voitcus Да, злоумышленник сможет найти вычисления в javascript , Идея серверной стороны заключалась бы в том, что они не могут вмешиваться в вывод вычисления, а только изменять вход. – Shoreline

ответ

0

ajax?

вы можете передать всю переменную, введенную с помощью javascript, и оставить сервер процесса на основе.

или я неправильно понял ваш вопрос?

+1

Я считаю, что OP не хотел ждать Ajax calc. – Zlatko

+0

oh, pardon me .. –

0

То, как я думаю о вашей проблеме, похоже на то, как вы ее описали: выполните двойной расчет. И я верю, что так делают «большие мальчики».

Пример: добавьте два номера. Так у вас есть такой код:

HTML фрагмент:

<form method="post" action="/add.php"> 
<input id="firstOperand" name="firstOperand" placeholder="First operand"/> 
<input id="secondOperand" name="firstOperand" placeholder="Second operand"/> 
<input type="submit" onclick="doCalculation()" value="Add"/> 
</form> 
<div id="result" /> 

Ваш JS может выглядеть следующим образом:

function doCalculation() { 
    var first = parseInt(document.getElementById('firstOperand').value); 
    var second = parseInt(document.getElementById('secondOperand').value); 

    var result = first + second; 
    // the minimum amount of error checking 
    if isNan('result') return false; 
    document.getElementById('result').innerHTML = result; 

    // Now use some framework (like jQuery) to make an Ajax call and pass the result to callback. 
    Framework.Ajax('/add.php?format=json', 'POST', {first: first, second: second}, callback); 
    return false; 
} 

function callback(response) b 
    var res = response.json.result; 
    var resultEl = document.getElementById('result'); 
    var errorEl = document.getElementById('error'); 
    // if our result is not correct, we want to update the user on it 
    if (res != parseInt(resultEl.innerHTML)) { 
    Framework.removeClass(errorEl, 'hidden'); 
    } 
    document.getElementById('result').innerHTML = res; 
} 

Конечно, ваша страница PHP результат (add.php) вернется json с результатом.Добавленная ценность здесь заключается в том, что вы также можете вернуть простой результат HTML (например, если js отключен).

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

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

+0

Проблема с отправкой вычисления через ajax - это время, необходимое пользователю для ожидания возврата с сервера. Если расчет выполняется в javascript, он будет достаточно быстрым, чтобы пользователь видел результат как мгновенный. Боюсь, что ваш ответ выходит за рамки вопроса. В любом случае, спасибо. – Shoreline

+0

Ну, вот что я сказал? Вы делаете локальный расчет и показываете результат. Затем в бэкэнд вы можете сделать вызов Ajax и проверить значение. Наконец, обратный вызов для вашего вызова Ajax ничего не сделает, если результаты совпадут или сообщит пользователю, что сервер ответил на другой результат, что было «сбережение ошибок» или что-то, что вы пытаетесь сделать. – Zlatko

+0

Хорошо, но мой вопрос заключается в том, как поддерживать расчет последовательно, не записывая его дважды. В идеале я бы представлял вычисления один раз на заднем плане, и вычисление было бы переведено на PHP и переведено в Javascript. Я не знаю, есть ли библиотека, которая будет это делать, и я не знаю, насколько она будет поддерживать exec и eval. – Shoreline