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 :

interperter du code PHP contenu dans une string


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut interperter du code PHP contenu dans une string
    Bonjour à tous,

    une question de débutant :
    comment interpréter du code PHP contenu dans une String ?

    Pour utiliser du PHP en cascade on pense naturellement à utiliser la fonction include('fichier.php') qui permet l'inclusion de tout le code php contenu dans un fichier secondaire , par ex 'fichier.php'.

    Mais mon problème est autre :
    Je suis dans une page php qui appelle une chaine qui contient elle-même des commandes php, perdues au mileu de portions de code HTML !
    Et je voudrais interpréter cette chaîne, avant de l'imprimer dans le browser.

    Car sans interprétation, j'obtiens après un echo($str) quelque chose qui ressemble à celà dans le code source de la page HTML du browser:

    '<p>blablablabla <?php ma_fonction_PHP(); ?> suite du blablabla</p>'

    Je voudrais bien entendu interpréter la partie <?php ma_fonction_PHP(); ?>
    avant de l'afficher dans le source de la page HTML par l'intermédiaire de echo.

    J'ai cherché du côté de la fonction eval(), mais si j'ai bien compris eval() ne permet que l'interprétation des variables et pas des fonctions.

    Il y a certainement un problème de méthodologie, ou la possibilité d'utiliser une fonction que je ne connais pas...

    Mais pour l'instant je fais du sur place.

    Quelqu'un peut il m'aider ?

  2. #2
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    d'après la doc tu dois pouvoir utiliser des classes, des namespaces y tuty quanti avec eval. regarde mieux les discutions.

    Sinon écrire dans un fichier pourrait faire l'affaire. Je connais peu de cas ou tu va générer du code à la volée avec une vraie valeur ajoutée, parce que là tu vas vers de charmantes emmerdes point de vue programmation et sécurité.

    edit: essaie de faire sans: il y a déjà les inclusions de code, les fonctions, les classes, les namespaces, les fonctions anonymes, l'auto chargement de classes... et en plus tu as besoin d'exécuter du code mélangé à des données? Tu as regardé run_kit?
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    J'ai cherché du côté de la fonction eval(), mais si j'ai bien compris eval() ne permet que l'interprétation des variables et pas des fonctions.
    eval traite la chaine comme si c'était une ligne de code PHP.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par sabotage Voir le message
    eval traite la chaine comme si c'était une ligne de code PHP.
    merci, pour la réponse !

    Effectivement, eval() traite la chaine comme une ligne de code. J'ai dit une bêtise en affirmant que eval() ne s'applique pas aux fonctions.

    Mais eval() ne semble pas me convenir : il me faudrait une fonction qui agisse à la manière d'include(fichier.php), mais qui traite une chaine de caractères à la place d'un fichier.php. Cette chaine comportant à la fois du code HTML et du code PHP.

    Pour être plus explicite, mon problème vient du fait que je stocke du code HTML dans une base MySQL, et récupère ce code pour l'afficher de manière dynamique avec echo(chaine HTML récupérée dans MySQL).

    Cela fonctionne très bien. Mais tout se complique quand je veux ajouter quelques bouts de code PHP dans ce code HTML stocké dans MySQL. Apache imprime alors le code php dans le source sous la forme

    <p>blablablabla <?php ma_fonction_PHP(); ?> suite du blablabla</p>'

    alors que j'aurais voulu que :
    1) Apache imprime <p>blablablabla
    2) puis qu'il éxécute <?php ma_fonction_PHP(); ?>
    3) puis qu'il imprime suite du blablabla</p>

    Mais cette manière de penser est peut-être inappropriée .
    Est ce que j'ai tout faux ?

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Techniquement ca serait possible : on pourrait extraire de la chaine le code php et le traiter avec eval ; mais bon ce que tu veux faire n'est a mon sens pas sérieux.

    Ca serait déjà sale mais tu pourrais stocker la chaine sous la bonne forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "echo '<p>blablablabla' ; ma_fonction_PHP(); echo 'suite du blablabla</p>';"
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Techniquement ca serait possible : on pourrait extraire de la chaine le code php et le traiter avec eval ; mais bon ce que tu veux faire n'est a mon sens pas sérieux.

    Ca serait déjà sale mais tu pourrais stocker la chaine sous la bonne forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "echo '<p>blablablabla' ; ma_fonction_PHP(); echo 'suite du blablabla</p>';"
    En effet ce serait sale.

    Alors que
    si le fichier 'blabla.php' contient le code suivant
    <p>blablablabla <?php ma_fonction_PHP(); ?> suite du blablabla</p>'

    alors, include('blabla.php') est bien plus propre, et cela fonctionne !

    Seulement, le hic est que je ne dispose pas d'un fichier php 'blabla.php', mais d'une chaine qui contient la même chose que ce fichier blabla.php. Cette chaine étant issue d'une base MySQL.

    Y aurait-il un moyen de transformer cette chaine en une espèce de "fichier virtuel" pour pouvoir utiliser la fonction include ?

    ou alors il existe peut-être une équivalent de include qui s'applique à une chaine plutôt qu'à un fichier ?

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function test()
    {
        echo 'hello';
    }
     
    $str = '<p>blablablabla <?php test(); ?> suite du blablabla</p>';
     
    $tmp = tmpfile();
    $meta = stream_get_meta_data($tmp);
    fputs($tmp, $str);	
     
    include $meta['uri'];
     
    fclose($tmp);

  8. #8
    Membre averti
    Avatar de Psycadi
    Homme Profil pro
    Chef de projet - Expert en message box
    Inscrit en
    Juillet 2003
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet - Expert en message box

    Informations forums :
    Inscription : Juillet 2003
    Messages : 147
    Points : 364
    Points
    364
    Par défaut
    Tu pourrais peut-être générer un fichier sur le serveur, faire ton include puis le détruire.
    ρs¥

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    et sans fichier temporaire, mais avec allow_url_include sur On

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function test()
    {
        echo 'hello';
    }
     
    $str = '<p>blablablabla <?php test(); ?> suite du blablabla</p>';
    include 'data:,' . rawurlencode($str);

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    et sans fichier temporaire, mais avec allow_url_include sur On

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function test()
    {
    	echo 'hello';
    }
     
    $str = '<p>blablablabla <?php test(); ?> suite du blablabla</p>';
    include 'data://,' . $str;
    Merci beaucoup, les 2 méthodes fonctionnent !
    Je n'aurais jamais trouvé tout seul.

    Je me permets encore une petite question :
    Est ce que cette méthode est souvent utilisée ?
    Est il courant d'inclure du code PHP issu d'une base de donnée ?

    Mais encore une fois Merci

  11. #11
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    Avec eval( ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
     
    function foo( )
    {
        echo 'Je suis affiché depuis une fonction' ;
    }
     
    $buffer = '?><p style="color : red"><?php foo( ) ?></p>' ;
     
    eval($buffer) ;
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  12. #12
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    Est ce que cette méthode est souvent utilisée ?
    Est il courant d'inclure du code PHP issu d'une base de donnée ?
    Non à chaque fois.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  13. #13
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par veto_fr_2000 Voir le message
    Merci beaucoup, les 2 méthodes fonctionnent !
    Je n'aurais jamais trouvé tout seul.

    Je me permets encore une petite question :
    Est ce que cette méthode est souvent utilisée ?
    Est il courant d'inclure du code PHP issu d'une base de donnée ?

    Mais encore une fois Merci
    non personne n'utilise ca, même si c'est correct.
    par contre pour le code dans la base, je te déconseille vivement de faire ca, inspire toi du style BBCode si tu veux faire quelque chose du genre.

    mais si tu veux vraiment faire ca utilise plutôt la méthode de Sèb

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    non personne n'utilise ca, même si c'est correct.
    par contre pour le code dans la base, je te déconseille vivement de faire ca, inspire toi du style BBCode si tu veux faire quelque chose du genre.

    mais si tu veux vraiment faire ca utilise plutôt la méthode de Sèb
    3 méthodes qui fonctionnent !
    Je retiens celle de Seb, en attendant de trouver une autre solution à la création d'un site dynamique, que de stocker les pages html-php dans une base de données. Je m'étais inspiré pour cela du tutoriel suivant :
    http://pbnaigeon.developpez.com/tuto...ite-dynamique/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <div id="contenu">
    			<?php
    				// Affiche le contenu de la page en cours
    				echo $_ENV['contenu'];
    			?>
    		</div>
    $_ENV['contenu'] ayant été extrait de la base de donnée

    Merci à tous, pour votre aide et vos conseils !


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

Discussions similaires

  1. Instancier une classe dont le nom est contenu dans une String
    Par fyque dans le forum Général Python
    Réponses: 15
    Dernier message: 13/06/2008, 12h33
  2. Réponses: 4
    Dernier message: 18/02/2007, 20h28
  3. [MySQL] executer une commande php contenu dans une variable
    Par Stopher dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/11/2006, 15h44
  4. Réponses: 18
    Dernier message: 27/10/2006, 14h15
  5. [DEBUTANT]Recherche mot contenu dans une String
    Par lynxman dans le forum Langage
    Réponses: 7
    Dernier message: 16/12/2005, 11h49

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