apt Posté 6 Mai 2005 Posté 6 Mai 2005 Bonjour, J'ai trouve dans un script un code que je souhaiterais bien le comprendre. 1 - Pourquoi on ne change pas ces deux lignes : $html_header=InCludePageHtml("template/header.html");eval("echo stripslashes(\"$html_header\");"); Tout simplement par cette ligne : include 'template/header.html'; ? 2 - Dans la fonction InCludePageHtml : function InCludePageHtml($file) { return addslashes(implode("",file("$file"))); } Pourquoi on lit le fichier a inclure par implode en ajoutant addslashes ? 3 - Apres cela on fait inverser le processus avec stripslashes ? 4- Pourquoi utiliser eval et echo en meme temps ? Merci.
Thanh Posté 6 Mai 2005 Posté 6 Mai 2005 Lu, Qu'on ait 1 ou 1000 appel, on a que la fonction à modifier. Imagines toi remplacer l'appel de fonction par le même code ;-)
apt Posté 6 Mai 2005 Auteur Posté 6 Mai 2005 Ce que je voulais comprendre, c'est ce systeme d'integration de template c'est tout
Boo2M0rs0 Posté 6 Mai 2005 Posté 6 Mai 2005 Lu, En fait on n'utilise pas include() pour pouvoir insérer des donnés dans le template plus facilement. Avec include le template contiendrai des <?php echo $ma_variable ?> Avec ce code écrire $ma_variable sera plus court et plus clair Ce code utilise une astuce dans php qui fait que les variables à l'intérieur de doubles guillemets sont décodées si elles existent. Le addslashes permet quant à lui d'éviter les erreurs de syntaxes, car si un double guillemet existe dans un des template, il provequera surement une erreur de syntaxes avec eval. Quant à la fonction InCludePageHtml() je pense qu'elle a été créée pour prévoir l'évolutivité au cas où on déciderait de classer les fichiers de template dans un autre dosier.
apt Posté 6 Mai 2005 Auteur Posté 6 Mai 2005 vu cote code, c'est pratique ou on doit apporter qq changement ?
Boo2M0rs0 Posté 7 Mai 2005 Posté 7 Mai 2005 Oui c'est assez bien mais si tu compte t'en servir saches que tu ne devrait utiliser que des templates dont tu es sur du contenu. Un template écrit par un visiteur serait une faille de sécurité car il pourrait afficher n'importe quelle variable variable de ton script (par exemple les variables qui contiennent le mot de passe de ta base de donné :s).
apt Posté 7 Mai 2005 Auteur Posté 7 Mai 2005 Merci Boo2M0rs0. Y'a-t-il une difference entre inserer des fichiers dont l'extention est : file.html file.php file.inc file.inc.php et est-ce qu'on doit changer la methode d'appeler un template pour chaque extention ? Merci.
Boo2M0rs0 Posté 7 Mai 2005 Posté 7 Mai 2005 Il n'y a pas de différence, le script utilise file donc il prend le contenu tel quel;) D'ailleurs si tu compte executer du code php dans ces fichiers finissant en .php, il ne sera pas interprété.
apt Posté 7 Mai 2005 Auteur Posté 7 Mai 2005 mais parfois on trouve meme du code php dans fichiers avec *.html ou *.inc ou *.inc.php dans ce cas selon ton idee tout code php ne sera pas interpreter ?
nalrem Posté 7 Mai 2005 Posté 7 Mai 2005 mais parfois on trouve meme du code php dans fichiers avec *.html ou *.inc ou *.inc.php dans ce cas selon ton idee tout code php ne sera pas interpreter ? <{POST_SNAPBACK}> En fait ça dépend de la manière dont est configuré le serveur apache. On peut faire interpréter du code php à toute sorte de fichiers. Ca dépend aussi des différentes inclusions. Si on reste sur la config om seule l'extensions php peut interpréter du php, on peut imager que si tu inclus un fichier html contenant du code php dans un fichier php, le code sera interprété. C'est à creuser donc
apt Posté 7 Mai 2005 Auteur Posté 7 Mai 2005 Donc si je peux me permettre de dire : lorsqu'il y'a du code php dans un template, quelque soit son extention, en l'integre directement avec INCLUDE :- include 'templates/file.ext'; dans un cas general, ca veut dire seulement du code html, on doit recuper le contenu du fichier et le controler avant tout integration dans une page. C juste au faux ?
Anonymus Posté 9 Mai 2005 Posté 9 Mai 2005 La fonction 'eval' permet justement d'executer tout texte (ou fichier dans ce cas) comme une commande php. Autrement dit, s'il y a une variable dans ce code, elle sera comprise comme étant du 'code' valide. S'il y a un problème, 'eval' renverra 'faux', mais pas d'erreurs. Ce code permet donc d'executer du php à partir de tout fichier quelque soit son extension.
Boo2M0rs0 Posté 9 Mai 2005 Posté 9 Mai 2005 Je ne suis pas sur que eval gère les balises du php (<? , <?php et ?> ). Chez moi il renvoi une erreur lorsque le code est faux du genre "Parse error: parse error, unexpected $ in index.php(6) : eval()'d code on line 1", mais je pense que cela dépend du niveau d'erreur choisi. En plus ce code n'execute pas le code php de la page mais une commande echo qui a en argument le code de la page chargée. (les addslashes servent à éviter que le script ne soit détourné). Peut être qu'en imaginant un exemple c'est plus facile à visualiser: le code d'un template.htm: <body><h1>$titre</h1><?php echo "<p>$texte</p>"; ?></body> (oui je vous rassure c'est qu'un exemple pour prouver les limites de la chose ) On va dire que $titre = acceil et $texte = Page en construction On charge la page dans : Le code ne change pas. On ajoute les slashs avant les doubles guillemets: <body><h1>$titre</h1><?php echo \"<p>$texte</p>\"; ?></body> On va créer une commande qui va être executé par eval elle contient: echo "<body><h1>$titre</h1><?php echo \"<p>$texte</p>\"; ?></body>"; Quand on voit ceci on se rend compte immédiatement que les balises <?php ne pourront pas être executés et cela ne va pas donner le résultats voulu: <body><h1>Acceil</h1><?php echo "<p>Page en construction</p>"; ?></body> Dans ce cas il aurait fallu utiliser la méthode include. dans un cas general, ca veut dire seulement du code html, on doit recuper le contenu du fichier et le controler avant tout integration dans une page. Je ne sais pas si include execute le php dans des fichiers qui n'ont pas .php à la fin (avec la configuration classique), à tester :/
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant