Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/05/2008, 17h47   #1
Nouveau Membre du Club
 
Inscription : mars 2008
Messages : 96
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : mars 2008
Messages : 96
Points : 38
Points : 38
Par défaut Utilisation de la fonction eval()

Bonjour,

J'explique le context :

1 - j'ai un formulaire me permettant de renseigner un champ avec comme identifiant associé : $valeur

3 - je souhaite ensuite exécuter un calcul avec la fonction eval() de PHP.


J'applique pour chaque cas le code suivant :

Code :
eval("\$res = $operation;");

1 - $res = 4

2 -
Code :
1
2
$operation = "$valeur + 2";
avec $valeur = 2
$res = 4

Les résultats sont donc correct.

Maintenant je vais chercher une formule dans une base de donnée MySQL.
Mon attribut est de type TEXT et la formule égal à :

Si j'applique de nouveau ma fonction eval avec le code suivant :

Code :
1
2
$operation = $form
avec $form correponsant à mon attribut formule dans ma base de donnée
j'obtiens alors l'erreur suivante :

Code :
1
2
Parse error: syntax error, unexpected '/' in 
XXX.php(70) : eval()'d code on line 1
Avez-vous une explication à ce problème?

Merci
[ced] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 09h17   #2
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
Regle n°3 ^^

Code :
1
2
3
$chaineAEvaluer=....;
echo '<pre>'; var_dump($chaineAEvaluer); echo '</pre>'; 
eval($chaineAEvaluer);
Ca devrait t'aider a voir le probleme. L'origine de la chaine n'a pas d'importance.
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 11h07   #3
Nouveau Membre du Club
 
Inscription : mars 2008
Messages : 96
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : mars 2008
Messages : 96
Points : 38
Points : 38
Voici mes tests (pour chaque test : $valeur = 10) :

1 - Code de la formule en dur :

Code :
1
2
3
4
$formule = "\$resultat = $valeur+ 2;";
echo '<pre>'; var_dump($formule ); echo '</pre>';
eval($formule);
print "<p>resultat = ".$resultat ."</p>";
Résultat CORRECT :

Code :
1
2
string(14) "$resultat = 10 + 2;"
resultat = 12
2 - Une partie du code de la formule est récupéré dans une Base de Donnée. (A savoir : $formule = $valeur+ 2).

Code :
1
2
3
4
5
echo '<pre>'; var_dump($formule); echo '</pre>';
$formule= "\$resultat = " . $formule. ";";
echo '<pre>'; var_dump($formule); echo '</pre>';
eval($formule);
print "<p>resultat = ".$resultat ."</p>";
Résultat NON CORRECT

Code :
1
2
3
4
string(22) "$valeur+ 2"
string(30) "$resultat = $valeur+ 2;"
Parse error: syntax error, unexpected '/' in D:\XXX.php(101) : eval()'d code on line 1
resultat =

Quelq'un a t-il un avis sur mon PROBLEME SVP???
[ced] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 11h31   #4
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
Code :
1
2
3
4
5
6
7
8
9
<?php
$valeur=10;
$formule='$valeur+ 2';
echo '<pre>'; var_dump($formule); echo '</pre>';
$formule= "\$resultat = " . $formule. ";";
echo '<pre>'; var_dump($formule); echo '</pre>';
eval($formule);
print "<p>resultat = ".$resultat ."</p>";
?>
Ce code fonctionne...

et renvoie :
Code :
1
2
3
string(10) "$valeur+ 2"
string(23) "$resultat = $valeur+ 2;"
resultat = 12
Or, on voit que ton code renvoie :

Code :
1
2
string(22) "$valeur+ 2"
string(30) "$resultat = $valeur+ 2;"
pour $formule... donc tu as des caracteres en trop ?!
A mon avis, lorsque tu récupere l'info depuis la base, les caracteres spéciaux ($ et +) doivent etre encodés dans un autre charset, ce qui provoque l'erreur de eval.

Essaye le code :
Code :
echo mb_detect_encoding($formule);
lorsque tu récuperes ta chaine de ta base de donnée.
Puis, les fonctions mb_* pour convertir ta chaine dans le meme format que celui que tu utilise pour php (ascii c'est tres bien pour des trucs aussi simple, mais tu peux essayer UTF8 si tu en as mis partout ;o)
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 11h50   #5
Nouveau Membre du Club
 
Inscription : mars 2008
Messages : 96
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : mars 2008
Messages : 96
Points : 38
Points : 38
Le nombre de caractère indiqué par la fonction var_dump() est faussé car j'ai renommé mes variables sur le forum pour que se soit plus lisible.

Dans les tests suivants, les noms de variable ne sont pas retouché. ;o)

Voici donc ton test qui fonctionne (jai rajouté la ligne : echo mb_detect_encoding($formule)

Code :
1
2
3
4
5
6
7
8
$valeur=10;
$formule='$valeur+ 2';
echo mb_detect_encoding($formule);
echo '<pre>'; var_dump($formule); echo '</pre>';
$formule= "\$resultat = " . $formule. ";";
echo '<pre>'; var_dump($formule); echo '</pre>';
eval($formule);
print "<p>resultat = ".$resultat ."</p>";
Ce qui donne :

Code :
1
2
3
4
5
6
7
ASCII
 
string(10) "$valeur+ 2"
 
string(23) "$resultat = $valeur+ 2;"
 
resultat = 12
Voici maintenant avec la chaine de caractère récupéré à partir de la Base de donnée

Code :
1
2
3
4
5
6
7
$valeur=10;
echo mb_detect_encoding($formule);
echo '<pre>'; var_dump($formule); echo '</pre>';
$formule= "\$resultat = " . $formule. ";";
echo '<pre>'; var_dump($formule); echo '</pre>';
eval($formule);
print "<p>resultat = ".$resultat ."</p>";
Ce qui me donne l'ERREUR suivante :

Code :
1
2
3
4
5
6
7
8
9
ASCII
 
string(15) "$valeur + 2"
 
string(28) "$resultat = $valeur + 2;"
 
Parse error: syntax error, unexpected '/' in D:\XXX(101) : eval()'d code on line 1
 
resultat =

Le code est donc bien ASCII

Mais on observe tout de même des caractères en trop dans le deuxième cas...
Comment remédier à ce problème?

MERCI
[ced] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 11h56   #6
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
Tu peux faire :

Code :
1
2
3
for($i=0; $i<strlen($formule); $i++) {
	echo $i.' : '.ord($formule[$i]).' = &gt;'.$formule[$i].'&lt;<br>';
}
ce qui me renvoie chez moi :

Code :
1
2
3
4
5
6
7
8
9
10
0 : 36 = >$<
1 : 118 = >v<
2 : 97 = >a<
3 : 108 = >l<
4 : 101 = >e<
5 : 117 = >u<
6 : 114 = >r<
7 : 43 = >+<
8 : 32 = > <
9 : 50 = >2<
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 11h59   #7
Nouveau Membre du Club
 
Inscription : mars 2008
Messages : 96
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : mars 2008
Messages : 96
Points : 38
Points : 38
et moi :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0 : 36 = >$<
1 : 118 = >v<
2 : 97 = >a<
3 : 108 = >l<
4 : 101 = >e<
5 : 117 = >u<
6 : 114 = >r<
7 : 32 = > <
8 : 43 = >+<
9 : 32 = > <
10 : 50 = >2<
11 : 60 = ><<
12 : 47 = >/<
13 : 112 = >p<
14 : 62 = >><
OK je vois maintenant d'où vient le problème...
Ca correspond à un caractère de retour à la ligne ??

Tu as une idée pour supprimer la fin de la chaîne, outre la fonction substr()
[ced] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 12h02   #8
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
non, ca veux dire que tu as les caracteres :

"</p>" a la fin de ta formule ^^

Tu peux aussi les voir en faisant :
Code :
echo htmlentities($formule);
Tu dois donc mal enregistrer tes formules dans la base en amont
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 12h08   #9
Nouveau Membre du Club
 
Inscription : mars 2008
Messages : 96
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : mars 2008
Messages : 96
Points : 38
Points : 38
Je suis allé voir dans phpMyadmin la table de la base de donné en question.

J'ai bien la formule égal à : $valeur + 2

La balise </p> est-elle censé être visible dans la table?

Je regarde de suite lors de l'insertion de ma formule dans ma base voir si le problème peut venir de la !!!!

Merci pour tes réponses
[ced] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 12h12   #10
Nouveau Membre du Club
 
Inscription : mars 2008
Messages : 96
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : mars 2008
Messages : 96
Points : 38
Points : 38
Bon, je n'ose même pas annoncé mon erreur

J'ai regardé mon code (un peu bordélique)

et j'ai vu dans un coin : $formule = $rows[0]->formule."</p>";

Pourquoi cette ligne? certainement un copier-coller venu de nul part...

En tout cas je te remercie pour ton aide !!!



Donc oui maintenant ça fonctionne !!!
[ced] est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h46.


 
 
 
 
Partenaires

Hébergement Web