PHP : Calcul opération dans une variable

PHP : Calcul opération dans une variable - PHP - Programmation

Marsh Posté le 29-04-2009 à 17:43:14    


Bonjour,  
Je ne trouve pas comment calculer une opération enregistrée dans une variable en PHP.  
L'opération est entrée par les internautes grâce à des boutons dans un formulaire (style calculatrice). Je récupère les données et je les enregistre dans $operation.
Il doit bien y avoir une fonction ou une combine qui permette de transformer le texte d'une variable en opération. Mais je ne trouve pas.
 
Exemple :  
Le texte contenue dans $operation est "1+2*3"  
" echo $operation " me donne " 1+2*3 " or je voudrais qu'il affiche le résultat de l'opération : "7"  
 
J’ai essayer la fonction eval() mais ça ne marche pas.

Code :
  1. eval( "\$resultat = \"$operation\";" );
  2. echo $resultat;


Savez-vous comment faire?  
Merci d'avance

Reply

Marsh Posté le 29-04-2009 à 17:43:14   

Reply

Marsh Posté le 29-04-2009 à 18:01:03    

Au lieu de :
eval( "\$resultat = \"$operation\";" );
Essayer :
eval("$resultat = $operation;" );

Reply

Marsh Posté le 29-04-2009 à 18:07:25    

Cool, la plus grosse faille de sécurité jamais inventée [:moule_bite]
 
J'espère qu'il y a un contrôle du contenu :D

Reply

Marsh Posté le 29-04-2009 à 18:21:50    

J'ai essayer  
eval("$resultat = $operation;" );  
 
Le mass
Parse error: syntax error, unexpected '=' : eval()'d code on line 1

Reply

Marsh Posté le 29-04-2009 à 18:24:50    

J'ai essayé :
eval("$resultat = $operation;" );
 
Voici le message d'erreur
"Parse error: syntax error, unexpected '=' in C:\wamp\www\test.php(26) : eval()'d code on line 1"
 

Reply

Marsh Posté le 29-04-2009 à 21:53:25    

$resultat est une variable du contexte d'exécution, que tu veux remplir, alors que $operation est une variable du contexte d'évaluation que tu veux lire. Même sans savoir comment fonctionne eval(), ça ne peut clairement pas marcher.  
Je pense que ça devrait plutôt être un truc du genre :  

Code :
  1. eval("$resultat = ".$operation.";" );


Pour que ce soit le contenu de $operation qui soit évalué, et non la variable.
 
[Edité : si eval porte sur le contexte d'exécution, ce sera plutôt  

Code :
  1. eval("$resultat = $operation" );


 ou n'importe quoi pour échapper $resultat]
 
[Edité bis : balise code]

Message cité 1 fois
Message édité par guybrush02 le 29-04-2009 à 21:56:06
Reply

Marsh Posté le 29-04-2009 à 22:31:15    

Nan mais faut aussi à tout prix vérifier $operation, parce que sinon on peut faire exécuter ce qu'on veut

Reply

Marsh Posté le 30-04-2009 à 17:12:42    

guybrush02 a écrit :

$resultat est une variable du contexte d'exécution, que tu veux remplir, alors que $operation est une variable du contexte d'évaluation que tu veux lire. Même sans savoir comment fonctionne eval(), ça ne peut clairement pas marcher.  
Je pense que ça devrait plutôt être un truc du genre :  

Code :
  1. eval("$resultat = ".$operation.";" );


Pour que ce soit le contenu de $operation qui soit évalué, et non la variable.
 
[Edité : si eval porte sur le contexte d'exécution, ce sera plutôt  

Code :
  1. eval("$resultat = $operation" );


 ou n'importe quoi pour échapper $resultat]
 
[Edité bis : balise code]


 [:o_non]  

Code :
  1. eval("\$resultat = $operation" );

Reply

Marsh Posté le 30-04-2009 à 17:13:22    

FlorentG a écrit :

Nan mais faut aussi à tout prix vérifier $operation, parce que sinon on peut faire exécuter ce qu'on veut


c'est surtout qu'il faut pas utiliser eval()  :o

Reply

Marsh Posté le 30-04-2009 à 17:34:25    

Code :
  1. $resultat = eval("return ($operation)" )


[:classe++]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 30-04-2009 à 17:34:25   

Reply

Marsh Posté le 30-04-2009 à 17:59:35    

masklinn a écrit :

Code :
  1. $resultat = eval("return ($operation)" )


[:classe++]


Code :
  1. $resultat = eval("return $operation;" );

Reply

Marsh Posté le 30-04-2009 à 18:52:28    


C'est ce que je souhaitais écrire, mais je crois que je peine un peu avec la mise en forme du forum  :ange:  
 
Finalement, ça marche ou pas ? ^^

Reply

Marsh Posté le 30-04-2009 à 19:02:21    

oui, mais utilise plutôt la solution de masklinn (on comprendra mieux d'où sort $resultat par la suite)

Reply

Marsh Posté le 30-04-2009 à 19:06:57    

Et faut nous donner l'adresse du site, histoire qu'on s'amuse un peu  [:icon3]

Reply

Marsh Posté le 01-05-2009 à 15:55:04    

Salut tout le monde,
merci pour vos tuyaux. Malheureusement, j'essaye d'exécuter vos propositions avec wamp5 mais aucune ne fonctionne. J'ai toujours un message de ce type qui s'affiche:  
"Parse error: syntax error, unexpected '=' in C:\wamp\www\fichier.php(81) : eval()'d code on line 1"

Reply

Marsh Posté le 01-05-2009 à 15:55:15    


 
Au faite FlorentG, pourquoi est-ce si dangereux d'utiliser eval(). Les protections suivantes suffisent-elles ?
1. Je protège mes variables avec htmlspecialchars().
2. Je vérifie avec des regex de n'avoir aucun caractère autre que ceux utiliser.
 

Reply

Marsh Posté le 01-05-2009 à 15:58:47    

A quel moment l'htmlspecialchars ? Et quelle regexp utilise-tu ?

Reply

Marsh Posté le 01-05-2009 à 16:15:05    

j'utilise htmlspecialchars en enregistrant ma variable $opération.

Spoiler :

$operation = htmlspecialchars($_POST['entree'])


 
Pour les regex, j'utilise le fonction preg_match() pour vérifier qu'il n'y que des caractères ou des expressions correspondant à une opération: 0,1,2,3,4,5,6,7,8,9,+,-,/,*,(,),sin(,cos(, sqrt( etc.

Reply

Marsh Posté le 01-05-2009 à 16:15:52    

$operation = htmlspecialchars($_POST['entree'])

Reply

Marsh Posté le 01-05-2009 à 16:27:19    

Je viens d'avoir ma réponse :
Voila ce qu'il fallait faire:
 

Code :
  1. echo eval("return $operation ;" );

Reply

Marsh Posté le 01-05-2009 à 16:35:26    

L'htmlspecialchars là ne sert strictement à rien. Il ne faut le faire qu'à l'affichage :)
 
Sinon poste exactement la regexp histoire de voir

Reply

Marsh Posté le 01-05-2009 à 16:50:01    

Pourquoi l'htmlspecialchars ne sert à rien. Une fois que je l'utilise je sais que ma variable $operation je sais que cette dernière ne contient pas de code html lisible. Du moins c'est je que j'ai compris (ça fait pas longtemps que je fais du html)

Reply

Marsh Posté le 01-05-2009 à 16:54:40    

Nan mais c'est pas à ce niveau là qu'il faut le faire, c'est uniquement lors de l'affichage. Pas avant de traiter l'opération

Reply

Marsh Posté le 01-05-2009 à 16:59:22    

ok, merci de l'info.
Sinon, tu penses qu'il y a besoin de sécuriser plus?

Reply

Marsh Posté le 01-05-2009 à 19:20:29    

Justement, faut nous filer la regexp histoire qu'on y jette un œil :D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed