IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Utilisation de la fonction eval()


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2008
    Messages : 96
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    eval("\$res = $operation;");

    1 - $res = 4

    2 -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $operation = $form
    avec $form correponsant à mon attribut formule dans ma base de donnée
    j'obtiens alors l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre Expert

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Par défaut
    Regle n°3 ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2008
    Messages : 96
    Par défaut
    Voici mes tests (pour chaque test : $valeur = 10) :

    1 - Code de la formule en dur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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???

  4. #4
    Membre Expert

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string(10) "$valeur+ 2"
    string(23) "$resultat = $valeur+ 2;"
    resultat = 12
    Or, on voit que ton code renvoie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2008
    Messages : 96
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Membre Expert

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Par défaut
    Tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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<

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation de la fonction eval
    Par chris1495 dans le forum MATLAB
    Réponses: 6
    Dernier message: 06/06/2012, 15h20
  2. [POO] Utilisation de la fonction Eval
    Par DoubleU dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 26/11/2008, 19h12
  3. Comment utiliser la fonction eval ?
    Par chtom dans le forum Langage
    Réponses: 1
    Dernier message: 29/05/2008, 16h46
  4. [String] équivalent de la fonction eval() en javascript
    Par jeyce dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 01/09/2004, 08h42
  5. [LG]librairies : utiliser seulement quelques fonctions
    Par wwwroom dans le forum Langage
    Réponses: 13
    Dernier message: 14/05/2004, 22h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo