PHP Eval

Résolu/Fermé
Poil - 16 juil. 2008 à 18:13
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 - 16 juil. 2008 à 19:14
Bonjour,
J'ai un soucis sur un eval,

Je récupère depuis une base de donnée une expression, dans cette expression je fais un str_replace et elle ressemble donc à cela quand je l'affiche :
($PSYS_maxPerm - $dbc_maxPerm - $spoolrsv_maxPerm)

Donc mon str_replace
$foovar=str_replace('[TYPE]',$typeesp['var_type_espace'][$i],$catespc['chaine_baseS'][$j]);
echo $foovar;

ensuite je veux que PHP évalue mon expression
$myvar=eval('$foovar;');

mais si je fais un echo de $myvar, la variable est vide.

Si j'affiche chaque variable contenu de mon expression:
echo $PSYS_maxPerm.' '.$dbc_maxPerm.' '.$spoolrsv_maxPerm;
3.77692582244E+12 2137464490844 1639461331600

en mettant en forme avec un round et divisez par /1000000 :
03776.926 - 2137.464 - 1639.461 = 0

Une idée ?
A voir également:

4 réponses

croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
16 juil. 2008 à 18:18
Remplace donc
$myvar=eval('$foovar;');

par
$myvar=eval( $foovar . ";" );
0
Non plus :(

Si je fais

1: echo $foovar.'<br />';
2: echo eval ($foovar . ';');

3: $myvar=eval( $foovar . ";" );
4: echo $myvar;

Ca me donne juste
1:
($PSYS_maxPerm - $dbc_maxPerm - $spoolrsv_maxPerm)
($PSYS_currentPerm - $dbc_currentPerm - $spoolrsv_currentPerm)
($PSYS_freePerm - $dbc_freePerm - $spoolrsv_freePerm)
($PSYS_skewedPerm - $dbc_skewedPerm - $spoolrsv_skewedPerm)

Cdt
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
16 juil. 2008 à 18:30
Pour clarifier ton test :
echo '1:' . $foovar . '<br />';
echo '2:' . eval ( $foovar . ';' ) . '<br />';

$myvar = eval( $foovar . ";" );
echo '3:' . $myvar;


Et donne le résultat par un copié/collé
0
1:($PSYS_maxPerm - $dbc_maxPerm - $spoolrsv_maxPerm)
2:
3:1:($PSYS_currentPerm - $dbc_currentPerm - $spoolrsv_currentPerm)
2:
3:1:($PSYS_freePerm - $dbc_freePerm - $spoolrsv_freePerm)
2:
3:1:($PSYS_skewedPerm - $dbc_skewedPerm - $spoolrsv_skewedPerm)
2:
3:
0
Y a un truc que je ne saisi pas avec la fonction eval en PHP :)

$foovar = '3 + 4';
echo '1:' . $foovar . '<br />';
echo '2:' . eval ( $foovar . ';' ) . '<br />';

$myvar = eval( $foovar . ";" );
echo '3:' . $myvar . '<br />';


1:3 + 4
2:
3:
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114 > Poil
16 juil. 2008 à 18:51
Je viens de consulter la doc de la fonction eval dont la valeur de retour est décrite par :
eval() retourne NULL sauf si return est appelée dans le code évalué, auquel cas la valeur passée à return est retournée. Dans le cas d'une erreur de syntaxe dans le code évalué, eval() retourne FALSE. Dans le cas d'une erreur fatale dans le code évalué, l'ensemble du script se terminera. En PHP 3, eval() ne retourne pas de valeur.

Essaye le code suivant :
$foovar = '3 + 4';
echo '1:' . $foovar . '<br />';
echo '2:' . eval ( '$monResultat=' . $foovar . ';' ) . '<br />';
echo '3:' . $monResultat;


après exécution la variable $monResultat contiendra le résultat (7).

Modifie donc ton script final pour inttégrer le résultat dans une variable passée à eval.
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
16 juil. 2008 à 18:42
Je comprends que ces 4 echos sont dans une boucle. Pour avancer pas à pas, ne passe qu'une seule fois dans la boucle et modifie ton code de test :

echo '1:' . $foovar . '<br />';
echo '2:' . eval ( $foovar . ';' ) . '<br />';

$myvar = eval( $foovar . ";" );
echo '3:' . $myvar . '<br />';

echo '4:'; var_dump( $PSYS_maxPerm ) ; echo '<br>';
echo '5:'; var_dump( $dbc_maxPerm ); echo '<br>';
echo '6:'; var_dump( $spoolrsv_maxPerm ); echo '<br>';
0
1:($PSYS_maxPerm - $dbc_maxPerm - $spoolrsv_maxPerm)
2:
3:
4:float(3776925822440)
5:string(13) "2137464490844"
6:string(13) "1639461331600"


Merci de ton temps :)
0
Je viens de tout forcer en float au niveau de l'affectation des variables.

1:($PSYS_maxPerm - $dbc_maxPerm - $spoolrsv_maxPerm)
2:
3:
4:float(3776925822440)
5:float(2137464490840)
6:float(1639461331600)
0
Arf tu m'as donné la solution
$foovar = '3 + 4';
echo '1:' . $foovar . '<br />';
echo '2:' . eval ( '$monResultat=' . $foovar . ';' ) . '<br />';
echo '3:' . $monResultat;


Comme un c** je faisais $myvar=eval or le eval il retourne true ou false et non le résultat de l'opération.

Merci beaucoup !
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
16 juil. 2008 à 19:14
S'il est nécessaire de te consoler, je suis aussi un C**. On peut aussi considérer que nous avons appris deux choses :
- le fonctionnement de eval
- l'importance de lire la doc.
0