Page 1 sur 1

Faire un calcul dans une chaîne

Posté : 02 avr. 2008, 15:11
par thierrys
Bonjour,
J'ai un petit souci :
J'ai une variable qui correspond à un calcul :
$calcul = "0.2*0.6*10";
L'utilisateur va indiquer la formule qui remplira la variable "$calcul".
L'intérêt est de conserver en mémoire le calcul initial.
La formule étant fréquemment différentes.
je souhaite obtenir la somme de la variable pour la multiplier à une quantité.
Si quelqu'un pouvait m'aider cela serait sympa.

Posté : 02 avr. 2008, 15:24
par Ryle
tu dois pouvoir utiliser la fonction eval(), mais il va te falloir être très rigoureux sur les contrôles à mettre en place pour que l'utilisateur ne puisse pas mettre n'importe quoi dedans...

Après s'il n'y a que des multiplications, un explode peut également te donner les différentes valeurs dans un tableau...

Posté : 02 avr. 2008, 16:34
par thierrys
Merci pour ta réponse.

Mais pourrais tu me donner un exemple de script.

1/ Pour Eval
$Calcul = "0.4*2";
$test = eval('$Calcul;');
var_dump ($test);
Le résultat donne Null.

2/Pour Explode
$Calcul = "0.4*2/3";
$Calcul2 = explode(" ",$Calcul);
print_r ($Calcul2); 
Le résultat donne
Array "( [0] => 0.4*2/3 )"

Posté : 02 avr. 2008, 17:09
par Ryle
Pour explode, il n'est valable que si tu as toujours le même opérateur et en splittant la chaine sur cet opérateur (comme c'était pas pécisé, je proposais au cas où, mais effectivement, si on met ce qu'on veut comme calcul, ça ne fonctionnera pas)

Pour le eval, il faut lui passer une chaine en paramètre, qui sera exécutée comme s'il s'agissait de code php.

Mettons que tu veuilles obtenir l'exécution du code :
$resultat = 0.4 * 2 / 3;
Il te faut donc écire :
eval('$resultat = 0.4 * 2 / 3;');
et on remplace la chaine du calcul par ta variable, ce qui donne :
$Calcul = "0.4 * 2 / 3"; 
eval('$resultat = '.$Calcul.';');

echo $resultat; // doit afficher 0.26

Posté : 02 avr. 2008, 17:17
par thierrys
Un grand merci.

Je voulais aussi rajouter, que ce forum est vraiment très bien, car les réponses sont simples et rapide.

Posté : 02 avr. 2008, 17:32
par Hywan
Merci, mais on sait qu'il est bien notre forum :roll:.

Plus sérieusement, l'eval est une bonne solution dans ton cas mais attention à la sécurité ! Il faut s'assurer que l'utilisateur ne rentre que des formules, et ce n'est pas franchement évident.
Imagine que je renseigne : require 'http://phpfrance.com';, ce serait une catastrophe[1].
Pense donc à protéger convenablement tes chaînes, même si je pense qu'il restera toujours des failles avec ce système :?.

[1] C'est pas PHPFrance la catastrophe hein ;-).