Marie-Aude Posté 2 Juin 2008 Posté 2 Juin 2008 (modifié) 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é 3 Juin 2008 par Dudu
Portekoi Posté 2 Juin 2008 Posté 2 Juin 2008 Bonjour, Est ce que ta page est bien sous la forme "page.php" ? Si oui, remplace ton <?php mafonction() ?> par <?php echo "Hello World";?> Portekoi
Dan Posté 2 Juin 2008 Posté 2 Juin 2008 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 ! >
Marie-Aude Posté 2 Juin 2008 Auteur Posté 2 Juin 2008 (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é 2 Juin 2008 par Marie-Aude
Portekoi Posté 2 Juin 2008 Posté 2 Juin 2008 Tu ne transformerais pas les caractères du type '<' en code html ? Je pense que cela vient d'un truc comme dans le genre
Marie-Aude Posté 2 Juin 2008 Auteur Posté 2 Juin 2008 ç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
Portekoi Posté 2 Juin 2008 Posté 2 Juin 2008 ils ne sont pas transformé à l'insertion? Tu veux dire que tu stockes "<?php mafonction() ?>" dans ta base de données?
Marie-Aude Posté 2 Juin 2008 Auteur Posté 2 Juin 2008 Oui directement. Et ils apparaissent exactement comme ça dans le code source (la page est en utf-8)
Portekoi Posté 2 Juin 2008 Posté 2 Juin 2008 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
Marie-Aude Posté 2 Juin 2008 Auteur Posté 2 Juin 2008 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.
KaRaK Posté 2 Juin 2008 Posté 2 Juin 2008 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.
Marie-Aude Posté 2 Juin 2008 Auteur Posté 2 Juin 2008 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 displayelseif ($sel1 ['url']== ""){$str1 = "";$str2 = "";$str3 = "";$str4 = "";$str5 = "";$str6 = $sel1 ['affiche'];$str7 = ""; }//Sinon on met toutelse{$str1 = "<a href=\"http://";$str2 = $sel1 ['url'];$str3 = "\" title=\"";$str4 = $sel1 ['bal_titre'];$str5 = "\" >";$str6 = $sel1 ['affiche'];$str7 = "</a>";}//affichage de la chaineecho $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] ?>
blman Posté 2 Juin 2008 Posté 2 Juin 2008 (modifié) 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é 2 Juin 2008 par blman
Marie-Aude Posté 2 Juin 2008 Auteur Posté 2 Juin 2008 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
captain_torche Posté 2 Juin 2008 Posté 2 Juin 2008 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 !
tisha_carpenter Posté 2 Juin 2008 Posté 2 Juin 2008 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: <?phpfunction 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 dela hamada qui commence aux portes de Tazzarine, et les oasis naturelles quiabritent encore aujourd\'hui les nomades berbères.';$lg=8;eval('?>'.$texte); // devient include_string();?> Attention aux possibles injections de code PHP.
Marie-Aude Posté 2 Juin 2008 Auteur Posté 2 Juin 2008 _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.
KaRaK Posté 2 Juin 2008 Posté 2 Juin 2008 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 ?
Marie-Aude Posté 2 Juin 2008 Auteur Posté 2 Juin 2008 (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é 2 Juin 2008 par Marie-Aude
captain_torche Posté 3 Juin 2008 Posté 3 Juin 2008 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 !
Marie-Aude Posté 3 Juin 2008 Auteur Posté 3 Juin 2008 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.
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant