Aller au contenu

Inclure une instruction php dans un champs texte


Marie-Aude

Sujets conseillés

Bonjour,

j'ai une base avec des textes. Dans ces textes j'inclus du php, par exemple :

blablblbba <?php mafonction() ?> tadaopcez

ma fonction devrait renvoyer toto.

J'affiche ensuite ce code dans ma page html. Le php n'est pas reconnu, ni exécuté : dans le code source il apparait en violet en italique, mais le résultat n'est pas visible à l'écran. Et j'ai à l'écran blablblbba tadaopcez

Comment faire pour avoir blablblbba toto tadaopcez ?

Je suis sur un mutualisé donc je ne peux pas toucher au php.ini

Merci d'avance

Modifié par Dudu
Lien vers le commentaire
Partager sur d’autres sites

Ta page a bien une extension .php, et non une extension .html ?

Sinon, et selon les hébergeurs, tu as possibilité avec la directyve AddHandler de faire interprété le php contenu dans les pages .html (mais ce n'est pas le top question performances)

<edit: coiffé au poteau ! :) >

Lien vers le commentaire
Partager sur d’autres sites

Posté (modifié)

Oui la page est bien en .php

Il y a plein de fonctions dedans qui s'affichent sans problème.

C'est juste le fait de récupérer le pavé de texte à partir d'un enregistrement dans une base au lieu d'entrer le code directement, qui pose problème.

-http://www.mezgarne.com/maroc/circuit.php?lng=fr&ct=ct02

Dans le carré jaune, "5 jours de marche " etc... il y a une instruction php qui devrait afficher quelque chose après "dans la". On voir l'instruction dans la source, mais elle ne renvoie rien (et elle fonctionne, si je la saisit directement dans la page)

Et c'est tout le texte entre les balises <?php et ?> qui ne fonctionne pas, donc mettre echo à la place ne changerait rien

Modifié par Marie-Aude
Lien vers le commentaire
Partager sur d’autres sites

ça doit être ça, mais comment éviter de le faire ?

La fonction va simplement chercher le texte dans une base, et l'affiche, via un echo.

Comment éviter que les caractères < soient transformés ?

Mon champ est un longtext, j'ai essayé en binary (blob) et ça ne change rien

Lien vers le commentaire
Partager sur d’autres sites

DOnc c'est normal... ton code reviens à afficher une chaine de caractères...

Si dans ta base tu as ceci <?echo "lulu";?>, le résultat sera en faites echo "<?echo "lulu";?>";

Je ne me souviens plus de la fonction pour exécuter un code...

Je dois chercher :)

Essaie ca :

$varBd = "echo 'lulu'";
eval($varBd);

Pour info : http://pt.php.net/eval

Lien vers le commentaire
Partager sur d’autres sites

Ca marche pas.

Ca ne renvoie rien.

Par ailleurs, je ne vois pas comment faire, sachant que cet appel à une fonction peut se trouver n'importe où à l'intérieur du texte...

Mon texte stocké dans la base étant : blab bla bla <?php mafonction ($var)?> blba blaba

En plus, si ça renvoyait effectivement du html, ça devrait afficher dans le texte le <?php mafonction ($var)?> or il est purement est simplement pas affiché.

Je me demande si il ne s'agit pas plutôt d'une sécurité dans la config du serveur.

Lien vers le commentaire
Partager sur d’autres sites

Hello Marie Aude,

Peut être que tu pourrais nous donner la portion de code qui récupère en base et affiche ?

Avec un peu de chance nous trouverons la solution comme ça.

Lien vers le commentaire
Partager sur d’autres sites

Tiens :) vous z'ici

Bon c'est un peu compliqué, enfin imbriqué :)

La fonction qui est incluse va chercher un mot dans une base de donnée, et renvoie un affichage, avec un lien si il existe dans la base, et si il n'y a pas de lien, juste le mot :

function monurl($Leslug, $lg) 

//Appelle la ligne correspondant dans la base
$q1 = "SELECT * FROM lesliens WHERE lg = '$lg' AND slug = '$Leslug'";
$r1 = mysql_query ($q1) or die ("La requte ne peut pas tre excute");
$sel1 = mysql_fetch_array ($r1, MYSQL_ASSOC);

//calcul de la chaine concatener
//Si le slug tout est vide et on affiche juste le mot

if ($sel1 ['slug']== "")
{
$str1 = "";
$str2 = "";
$str3 = "";
$str4 = "";
$str5 = "";
$str6 = $Leslug;
$str7 = ""; }

//Si l'url n'existe pas on afffiche le display
elseif ($sel1 ['url']== "")
{
$str1 = "";
$str2 = "";
$str3 = "";
$str4 = "";
$str5 = "";
$str6 = $sel1 ['affiche'];
$str7 = ""; }
//Sinon on met tout

else
{
$str1 = "<a href=\"http://";
$str2 = $sel1 ['url'];
$str3 = "\" title=\"";
$str4 = $sel1 ['bal_titre'];
$str5 = "\" >";
$str6 = $sel1 ['affiche'];
$str7 = "</a>";}

//affichage de la chaine
echo $str = $str1.$str2.$str3.$str4.$str5.$str6.$str7;
}

C'est bien pour le linking interne :)

Ensuite c'est beaucoup plus simple, j'ai une base des circuits, avec un champ "descriptif", (entre autres) et je souhaite tout simplement afficher ce champs descriptif.

Exemple de texte stocké dans le champs :

Cinq journées de marche dans le désert, accessibles à tous, des étapes variées, entre les palmeraies de la <?php monurl('draa", $lg) ?>, les regs arides de la hamada qui commence aux portes de Tazzarine, et les oasis naturelles qui abritent encore aujourd'hui les nomades berbères.

Ce qui devrait afficher normalement :

Cinq journées de marche dans le désert, accessibles à tous, des étapes variées, entre les palmeraies de la vallée du Draa, les regs arides de la hamada qui commence aux portes de Tazzarine, et les oasis naturelles qui abritent encore aujourd'hui les nomades berbères.

(en gras c'est le retour de la fonction)

Le paramètre $lg est passé par l'url de la page.

J'ai une requête qui reprend toutes les données du circuit, pour la langue.

Je stocke le résultat dans une array en variable globale, $ctbase.

Et ensuite je saupoudre ce dont j'ai besoin où j'ai envie, via des echo ou des appels de fonction, dans le code html, donc dans ce cas

<?php echo $ctbase[resume] ?>

Lien vers le commentaire
Partager sur d’autres sites

Marie-Aude, il va falloir passé en mode débuggage là. Avant de dire que c'est l'affichage qui ne fonctionne pas, test pas à pas ton code. (si tu a fait un copier/coller de la fonction, j'ai l'impression qu'il manque déjà des accolades et je parirais que ce sont les traitements qui font que la fonction n'affiche rien puisque le code s'arréterait sur une condition qui n'affiche rien)

1- Dans ta fonction, affiche le résultat de ta requête. Si tu peux, test là dans phpMyAdmin

2- Dans chacune de tes conditions, affiche une donnée (genre affiche "condition 1" si le programme entre dans la condition 1, "condition 2" si il entre dans la condition 2, ...). Affiche des données qui vont te permettre de suivre ce que retourne ton code pas à pas.

3- Enfin, à la fin, affiche l'état de toutes tes variables.

Juste une note au passage d'ordre pratique :

Tu verra à la longue que ce n'est pas pratique d'afficher un résultat à la fin d'une fonction. Une fonction retourne un résultat mais ne l'affiche pas (une fonction traite, le programme affiche en gros)

function monurl($Leslug, $lg){

echo "ma fonction est bien appelée";

$sql="SELECT * FROM TABLE";
echo $sql." : la requête à tester dans phpmyadmin, voir les résultats qu'elle retourne";
$r=mysql_query($sql);

if($cas1){
echo "je suis dans la condition 1, str est nulle";
$str='';
}
else if ($cas2){
echo "je suis dans la condition 2, str est nulle";
$str='';
}
else if($cas3){
$str="pouic";
echo "je suis dans la condition 3 : str=".$str;
}

echo "la valeur retournée est ".$str;

return $str;
}

echo monurl($Leslug, $lg);

Modifié par blman
Lien vers le commentaire
Partager sur d’autres sites

Salut blman.... j'utilise cette fonction depuis des mois sans aucun problème.

Je l'utilise sur la même page, mais en l'entrant directement dans le code et elle fonctionne.

Si vous êtes allés voir la page que je vous indique, vous pouvez voir dans le code source le texte suivant

entre les palmeraies de la <?php monurl('draa", $lg) ?>, les regs

Le problème n'est donc pas la fonction, le problème est que quand cette fonction est insérée dans le code par le biais d'un enregistrement de la base de données, le "code" n'est plus interprété comme du php, ou mal, il ne renvoie rien.

Or la fonction renvoie la valeur du paramètre, quand elle ne trouve rien dans la base (et ça c'est testé...), de plus le

<?php monurl('draa", $lg) ?>

apparait dans le code, tel quel.

Donc ce n'est pas la fonction qui ne va pas, c'est ce qu'à indqiué Portekoi.

Simplement sa solution a l'air de marcher avec les variables, pas avec les fonctions :)

Lien vers le commentaire
Partager sur d’autres sites

A ta place, je ferais une expression régulière qui isolerait tout ce qu'il trouve entre <?php et ?>, autant de fois que nécessaire dans ton texte.

Ensuite, sur chacune de ces valeurs, j'effectuerais un exec(le code trouvé).

Toutefois, il va sans dire que cette manipulation peut être extrêmement dangereuse. Il faut veiller à ce que personne d'autre que toi ne puisse accéder à l'édition de ces valeurs.

Edit : je viens d'analyser ton code, il y a sans doute moyen de faire énormément plus simple. Je regarde ça si j'ai du temps.

Edit 2 : si j'ai bien compris (corrige moi si je me trompe), tu as une table avec une correspondance entre certains mots et certaines urls.

Dans ce cas, imaginons que tu aies deux entrées dans cette table :

mot = webmaster-hub; url = http://www.webmaster-hub.com

mot = pageshub; url = http://www.pageshub.fr

Tu commences par créer deux array en faisant une requête sur ta table. On va construire ces arrays de manière à avoir directement le lien :

<?php
$sql = "SELECT mot, url FROM table_mots";
$req = mysql_query($sql);
$tab_recherche = array();
$tab_remplace = array();
while($row = mysql_fetch_assoc($req)) {
$tab_recherche[] = $row['mot'];
$tab_remplace[] = '<a href="'.$row['url'].'">'.$row['mot'].'</a>';
}
?>

Il suffit ensuite d'effectuer un simple str_replace sur ton texte pour avoir la version avec les mots remplacés :

<?php
$texte = "pageshub, l'annuaire de sites de webmaster-hub, possède déjà plus de 10 000 sites enregistrés !";
$texte = str_replace($tab_recherche, $tab_remplace, $texte);
echo $texte;
?>

Ce qui donnera tout simplement :

pageshub, l'annuaire de sites de webmaster-hub, possède déjà plus de 10 000 sites enregistrés !
Lien vers le commentaire
Partager sur d’autres sites

Par ailleurs, je ne vois pas comment faire, sachant que cet appel à une fonction peut se trouver n'importe où à l'intérieur du texte...

Mon texte stocké dans la base étant : blab bla bla <?php mafonction ($var)?> blba blaba

Si c'est pour faire un genre de include_string(), alors eval() est bien la bonne fonction. Par contre, eval() considère un <?php implicite, il faut donc simplement le fermer par un ?> explicite:

<?php

function monurl($param1,$param2) {
echo "'monurl a reçu $param1 et $param2'";
}

$texte='
Cinq journées de marche dans le désert, accessibles à tous, des étapes variées,
entre les palmeraies de la <?php monurl(\'draa\', $lg) ?>, les regs arides de
la hamada qui commence aux portes de Tazzarine, et les oasis naturelles qui
abritent encore aujourd\'hui les nomades berbères.
';

$lg=8;

eval('?>'.$texte); // devient include_string();

?>

Attention aux possibles injections de code PHP.

Lien vers le commentaire
Partager sur d’autres sites

_AT_Captain,

la logique de la fonction est plus compliquée que cela :

1- mot clé

2- langue

3- affichage du mot clé dans la langue

4- url

Le plus drôle, c'est que l'url peut ne PAS encore exister, si je sais que je vais faire une page là dessus un jour, mais qu'elle n'est pas encore prête.

Enfin sur un grand texte, je ne veux pas remplacer toutes les occurrences avec un lien, seulement celles que je choisis.

Donc je dirais : la fonction monurl telle qu'elle convient parfaitement aux besoins de mon site :) . La seule chose qui pourrait éventuellement être simplifié c'est la construction de la chaine elle même, mais c'est peanuts. Je l'ai mise uniquement parce que Karax voulait voir le code source, mais le problème n'est pas là, le problème est de savoir pourquoi la chaîne <?php monurl ($var1, $var2) ?> n'est pas interprétée comme un code php par le navigateur quand elle est insérée via un echo à partir d'une base de données.

Lien vers le commentaire
Partager sur d’autres sites

Hello,

Je ne me suis pas encore plongé dans le code mais n'y aurait-il pas un problème de porté de variable, celle appelées dans la fonction par exemple ?

Lien vers le commentaire
Partager sur d’autres sites

Posté (modifié)

tisha merci beaucoup :) ça marche enfin !

Karak, non, non pas de portée de variable non plus, la fonction eval était bien la solution :)

Modifié par Marie-Aude
Lien vers le commentaire
Partager sur d’autres sites

Ravi que tu aies trouvé une solution, mais je maintiens que c'est une méthode qui reste dangereuse : si quelqu'un a accès d'une manière ou d'une autre à l'édition de ce contenu, il peut faire ce qu'il veut sur ton serveur !

Lien vers le commentaire
Partager sur d’autres sites

Certes, mais étant donné la façon de mettre à jour le contenu (chargement manuel de fichier texte exporté d'une base access), si quelqu'un accède à ça il a déjà tous les accès :)

Le seul "backend" en ligne c'est directement phpmyadmin... donc je pense que le risque est assez faible, même si sur le fonds tu as raison.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...