Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
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 08/12/2010, 12h54   #1
Invité de passage
 
Inscription : avril 2008
Messages : 5
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 5
Points : 2
Points : 2
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 ?
veto_fr_2000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 14h07   #2
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
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 : 951
Points : 1 063
Points : 1 063
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 Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 14h11   #3
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Citation:
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.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 16h05   #4
Invité de passage
 
Inscription : avril 2008
Messages : 5
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 5
Points : 2
Points : 2
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 ?
veto_fr_2000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 16h40   #5
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
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 :
"echo '<p>blablablabla' ; ma_fonction_PHP(); echo 'suite du blablabla</p>';"
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/12/2010, 17h17   #6
Invité de passage
 
Inscription : avril 2008
Messages : 5
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 5
Points : 2
Points : 2
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 :
"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 ?
veto_fr_2000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 17h29   #7
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 464
Points : 8 464


Code :
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);
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/12/2010, 17h30   #8
Membre confirmé
 
Avatar de Psycadi
 
Homme Olivier
Développeur de message box en .Net
Inscription : juillet 2003
Messages : 138
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur de message box en .Net

Informations forums :
Inscription : juillet 2003
Messages : 138
Points : 227
Points : 227
Envoyer un message via MSN à Psycadi
Tu pourrais peut-être générer un fichier sur le serveur, faire ton include puis le détruire.
Psycadi est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/12/2010, 17h39   #9
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 464
Points : 8 464
et sans fichier temporaire, mais avec allow_url_include sur On

Code :
1
2
3
4
5
6
7
function test()
{
    echo 'hello';
}
 
$str = '<p>blablablabla <?php test(); ?> suite du blablabla</p>';
include 'data:,' . rawurlencode($str);
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/12/2010, 18h00   #10
Invité de passage
 
Inscription : avril 2008
Messages : 5
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 5
Points : 2
Points : 2
Citation:
Envoyé par stealth35 Voir le message
et sans fichier temporaire, mais avec allow_url_include sur On

Code :
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
veto_fr_2000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 18h04   #11
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 817
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 817
Points : 3 442
Points : 3 442
Avec eval( ) :

Code :
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
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/12/2010, 18h05   #12
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 817
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 817
Points : 3 442
Points : 3 442
Citation:
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
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/12/2010, 18h06   #13
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 464
Points : 8 464
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/12/2010, 18h34   #14
Invité de passage
 
Inscription : avril 2008
Messages : 5
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 5
Points : 2
Points : 2
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 :
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 !

veto_fr_2000 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 17h02.


 
 
 
 
Partenaires

Hébergement Web