JeuWeb - Crée ton jeu par navigateur
[Résolu] Interprétation calcul (PHP) - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Résolu] Interprétation calcul (PHP) (/showthread.php?tid=7543)

Pages : 1 2


[Résolu] Interprétation calcul (PHP) - Sôbi - 22-12-2015

Bonjour à tous et à toutes,

Une nouvelle problématique se pose à moi.
Ayant la flemme de faire des calculs ou de les programmer, je voudrais plutôt que se soit un ami qui s'y penche au lieu que se soit moi.
Mais je bute tout de même.

Je m'explique :
J'ai des variable de bases par exemple :
Code PHP :
<?php 
$A
= 10;
$B = 0; 
$C
= 10;

Ensuite une requête va contacter la base de données, dans la colonne "requete_fight" où il y a la requête du style:
Code PHP :
<?php 
$A
+ $B * $C

que je met dans une variable :
Code PHP :
<?php 
$fight
= $requete["requete_fight"];

Du coup quand je fait un 
Code PHP :
<?php 
echo $fight;
j'ai bien : $A + $B * $C

Du coup, je me dis : C'est bien, mais je veux maintenant l'interprétation, donc je fais :
Code PHP :
<?php 
eval( "\$test = \"$fight\";" );

Quand je fait 
Code PHP :
<?php 
echo $test ;
J'ai : 10 + 0 * 10


Cool ! Maintenant je veux le résultat que je veux mettre dans une variable ...

Mince ... Je cale ... 

Auriez vous une idée de comment je peux faire ? 
Ou une idée pour faire autrement ? Big Grin

Je vous remercie d'avance pour votre aide Smile

Cdlt,
Sôsô.


RE: Interprétation calcul (PHP) - Xenos - 22-12-2015

Salut,

wow, donc il y a du code PHP (une formule) qui est stocké dans le SGBD (MySQL? osef en fait), que PHP va récupérer puis exécuter?! Outre les énormes problèmes d'injection et de sécurité, je ne suis pas sûr que ce genre d'archi soit fiable et pratique sur le long terme...

Le SGBD renvoie la chaine de caractère "$A + $B * $C".
$fight contient alors la chaine string "$A + $B * $C".
"\$test = \"$fight\";" vaut donc $test = "$A + $B * $C";
On l'eval(), donc PHP exécute $test = "$A + $B * $C"; donc $test vaut "10 + 0 * 10"

Deux solutions: soit tu supprimes les quotes de l'éval, qui devient donc "\$test = $fight;" et qui sera évalué à $test = $A + $B * $C; donc à $test = 10 + 0 * 10, soit tu ré-évale le résultat de $test


Mais franchement, cela sent le foin comme archi... :\


RE: Interprétation calcul (PHP) - Polou - 23-12-2015

Bonsoir,

Je me permets de rajouter que supprimer les quotes ne changera pas.
Code PHP :
<?php 
$fight
= "10 + 0 * 10";
var_dump($fight);
eval(
"$test = $fight;" );
var_dump($test);
Retournera une syntax error.
Si tu fais
Code PHP :
<?php 
$fight
= "10 + 0 * 10";
var_dump($fight);
eval(
'$test = '.$fight.';' );
var_dump($test);
Là ça marchera


RE: Interprétation calcul (PHP) - Sôbi - 23-12-2015

(22-12-2015, 11:52 PM)Xenos a écrit : Outre les énormes problèmes d'injection et de sécurité, je ne suis pas sûr que ce  
 
Mais franchement, cela sent le foin comme archi... :\

JE suis tout à fait d'accord avec toi ! Wink
Ceci n'est pas DU TOUT sur le long terme. 
En effet, c'est juste temporaire, le temps qu'il trouve la bonne formule Smile

(23-12-2015, 12:05 AM)Polou a écrit : Bonsoir,

Je me permets de rajouter que supprimer les quotes ne changera pas.
Code PHP :
<?php 
$fight
= "10 + 0 * 10";
var_dump($fight);
eval(
"$test = $fight;" );
var_dump($test);
Retournera une syntax error.
Si tu fais
Code PHP :
<?php 
$fight
= "10 + 0 * 10";
var_dump($fight);
eval(
'$test = '.$fight.';' );
var_dump($test);
Là ça marchera


Je vais tenter vos idées Big Grin
Merci en tout cas, je me retournerais vers vous si ca marche Smile


RE: Interprétation calcul (PHP) - Sôbi - 23-12-2015

(23-12-2015, 12:05 AM)Polou a écrit :  
Code PHP :
<?php 
$fight
= "10 + 0 * 10";
var_dump($fight);
eval(
'$test = '.$fight.';' );
var_dump($test);
 

La ça fonctionne mais maintenant, j'ai le typage de la réponse avec, exemple :
Citation :float(0.5)
ou encore
Citation :int(10)

Je vais tout de même pas couper ca ? xD


RE: Interprétation calcul (PHP) - Polou - 23-12-2015

Ben c'est le var_dump qui te renvoie en plus le type de la reponse (http://us2.php.net/manual/fr/function.var-dump.php).
Fais un
Code PHP :
<?php 
echo $test;
à la place


RE: Interprétation calcul (PHP) - Sôbi - 23-12-2015

(23-12-2015, 12:32 AM)Polou a écrit : Ben c'est le var_dump qui te renvoie en plus le type de la reponse (http://us2.php.net/manual/fr/function.var-dump.php).
Fais un
Code PHP :
<?php 
echo $test;
à la place

Pfff ! J'suis bête ! Je devais tout de même être pas mal fatigué hier ! x')

Pour comprendre donc, le fait de sortir la variable des guillemets va vraiment lui permettre d'interpréter le résultat ... 

Merci beaucoup en tout cas ! Smile


RE: [Résolu] Interprétation calcul (PHP) - Xenos - 23-12-2015

Oui, Polou, syntaxe error car tu as perdu l'antislash dans la bataille: c'est eval( "\$test = $fight;" ); que j'ai proposé (sans antislash, $test sera remplacé par sa valeur dans l'eval, et donnera un null = 10 + 0 * 10) Wink



Quand tu fais un eval, le mieux est de créer une variable intermédiaire contenant le code à evaluer, puis d'évaluer cette variable. Cela permet d'afficher le code ou de le faire parser par PHP pour le comprendre:


<?php
$A = 10;
$B = 0;
$C = 5;
$fight = '$A + $B * $C';
$code1 = "\$test1 = $fight;";
$code2 = "\$test2 = \"$fight\";";
eval($code1);
eval($code2);

var_dump(array(
"Code1" => array(
"Evaled code" => $code1,
"Tokenized code" => array_map(function ($token) { return is_array($token) ? token_name($token[0]) . ': ' . $token[1] : $token; }, token_get_all("<?php $code1 ?>")),
"Test value" => $test1
),
"Code2" => array(
"Evaled code" => $code2,
"Tokenized code" => array_map(function ($token) { return is_array($token) ? token_name($token[0]) . ': ' . $token[1] : $token; }, token_get_all("<?php $code2 ?>")),
"Test value" => $test2
)
));

Test: http://tests.reinom.com/php/eval-token.php (forcément moins lisible que si XDebug était utilisé!)


RE: [Résolu] Interprétation calcul (PHP) - Ter Rowan - 24-12-2015

hello, quelques pensées :

dans une majorité des cas, ça pue cette architecture effectivement, cependant si tu es dans un système où des formules entre en jeu mais on ne connait pas à priori la formule, il faut bien stocker cette formule, entrée par un utilisateur, dans la bdd (quitte à faire tous les contrôles qui vont bien)


sinon xenos, pour les vardump et compagnie, si tu veux avoir un retour plus clair, mais <pre></pre> autour, ça affiche la hiérarchie(enfin je crois)


RE: [Résolu] Interprétation calcul (PHP) - Akira777 - 24-12-2015

(24-12-2015, 10:43 AM)Ter Rowan a écrit : hello, quelques pensées :

dans une majorité des cas, ça pue cette architecture effectivement, cependant si tu es dans un système où des formules entre en jeu mais on ne connait pas à priori la formule, il faut bien stocker cette formule, entrée par un utilisateur, dans la bdd (quitte à faire tous les contrôles qui vont bien)


sinon xenos, pour les vardump et compagnie, si tu veux avoir un retour plus clair, mais <pre></pre> autour, ça affiche la hiérarchie(enfin je crois)

Rien à voir, mais sache que si tu actives l'extension XDebug (souvent activé en dev) les var_dump sont automatiquement formatés et colorisés.

[Image: 1450955685-vardump.png]