Calcul Validé PHP / Javascript

J'ai rencontré ce problème avant et je m'attends à le faire à nouveau: je veux exécuter un calcul de sous-total en javascript et en PHP. Je voudrais peut-être modifier le calcul à un moment donné.

  • Il doit fonctionner sous javascript pour maximiser la vitesse du calcul, de sorte que l'utilisateur sait à quoi s'attendre.
  • Il doit fonctionner en PHP afin que je reçois un sous-total valide dont un utilisateur malveillant ne peut pas interférer.

En tant que tel:

  • Si je lance uniquement le calcul côté client (en javascript), un utilisateur malveillant peut pirater le javascript et modifier le sous-total.
  • Si je n'exécute que le calcul sur le côté serveur (en PHP), un appel AJAX devrait être attendu pour que l'utilisateur obtienne son sous-total mis à jour.

Je veux donc effectuer le calcul des deux côtés. La seule façon dont j'ai vu cela est de programmer le calcul en PHP et de programmer le calcul en javascript séparé.

Ma question est: quel modèle, quelle technique ou quelle technologie les gens recommanderaient-ils d'utiliser pour créer le calcul sur le côté du serveur et le rendre compatible avec javascript lorsqu'il est envoyé au client?

Une idée que j'avais, par exemple, était un tableau PHP pour le calcul, qui se traduit par un code PHP et un code javascript, par exemple:

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

Cela pourrait se transformer en PHP:

 return $variable_A * $variable_B; 

Et dans Javascript:

 return variable_A * variable_B; 

C'est un exemple de modèle opérationnel. Je ne sais pas à quoi ressembleraient les vrais si elles existent.

Ajax ?

Vous pouvez passer toute la variable avec javascript et laisser le serveur de processus basé.

Ou j'ai mal compris votre question?

La façon dont je pense à votre problème est comme vous l'avez décrit: faites un double calcul. Et je crois que c'est ainsi que les «grands garçons» le font.

Exemple: Ajoutez deux nombres. Donc, vous avez un code comme ceci:

Extrait 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" /> 

Votre JS pourrait ressembler à:

 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; } 

Bien sûr, votre page de résultat PHP (add.php) renverrait json avec le résultat. La valeur ajoutée ici est que vous pouvez également renvoyer un résultat HTML simple (comme si js est désactivé).

Votre rappel peut également vérifier s'il y a eu une erreur dans le résultat renvoyé et afficher ce message d'erreur également. Ou si le résultat est épuisé, affichez une notification indiquant que le "résultat" n'est pas enregistré. Mais ce n'est pas dans la portée de la question, je suppose (au moins, hors de la portée de la réponse).

Remarque: ce n'est que le code sur le dessus de ma tête, pas testé, écrit directement dans la boîte à réponses, probablement certaines choses devraient être faites mieux.