Faire un calcul dans une chaîne

Petit nouveau ! | 6 Messages

02 avr. 2008, 15:11

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.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

02 avr. 2008, 15:24

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...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 6 Messages

02 avr. 2008, 16:34

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 )"

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

02 avr. 2008, 17:09

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
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 6 Messages

02 avr. 2008, 17:17

Un grand merci.

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

ViPHP
ViPHP | 4674 Messages

02 avr. 2008, 17:32

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 ;-).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).