erreur dans template.php phpwiki

Eléphanteau du PHP | 11 Messages

02 mai 2007, 11:58

Bonjour à tous,
J'ai installé PHPWIKI et à chaque page il me marque un méssage d'erreur :

Parse error: parse error, unexpected '}' in C:\wamp\www\lib\Template.php(146) : eval()'d code on line 40

ou est l'erreur ligne 146 ou ligne 40 ? et il n'y a pas de '}' en trop !

Merci par avance pour vos réponses

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

02 mai 2007, 13:16

...
Parse error: parse error, unexpected '}' in C:\wamp\www\lib\Template.php(146) : eval()'d code on line 40

ou est l'erreur ligne 146 ou ligne 40 ? et il n'y a pas de '}' en trop !

...
Il est apparent que la ligne 146 de Templete.php pointe sur l'instruction eval() et c'est en exécutant le code de eval() que le parser trouve une erreur à la ligne 40 de ce sous-code.

NB, que eval() permet d'exécuter du code php généré à la volée.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 11 Messages

02 mai 2007, 14:14

Voici le code

Code : Tout sélectionner

function Template ($name, &$request, $args = false) { global $WikiTheme; $this->_request =& $request; $this->_basepage = $request->getArg('pagename'); if (strstr($name, "/")) { $oldname = $WikiTheme->_name; $oldtheme = $WikiTheme->_theme; list($themename, $name) = explode("/", $name); $WikiTheme->_theme = "themes/$themename"; } $this->_name = $name; $file = $WikiTheme->findTemplate($name); if (!$file) { trigger_error("no template for $name found.", E_USER_WARNING); return; } if (isset($oldname)) { $WikiTheme->_name = $oldname; $WikiTheme->_theme = $oldtheme; } $fp = fopen($file, "rb"); if (!$fp) { trigger_error("$file not found", E_USER_WARNING); return; } <-------- ligne 40 $request->_TemplatesProcessed[$name] = 1; $this->_tmpl = fread($fp, filesize($file)); fclose($fp); //$userid = $request->_user->_userid; if (is_array($args)) $this->_locals = $args; elseif ($args) $this->_locals = array('CONTENT' => $args); else $this->_locals = array(); }

Code : Tout sélectionner

function printExpansion ($defaults = false) { if (!is_array($defaults)) // HTML object or template object $defaults = array('CONTENT' => $defaults); $this->_vars = array_merge($defaults, $this->_locals); extract($this->_vars); global $request; if (!isset($user)) $user = $request->getUser(); if (!isset($page)) $page = $request->getPage(); // Speedup. I checked all templates if (!isset($revision)) $revision = false; global $WikiTheme, $RCS_IDS, $charset; //$this->_dump_template(); $SEP = $WikiTheme->getButtonSeparator(); global $ErrorManager; $ErrorManager->pushErrorHandler(new WikiMethodCb($this, '_errorHandler')); eval('?>' . $this->_munge_input($this->_tmpl)); <---- ligne 146 $ErrorManager->popErrorHandler(); }

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

02 mai 2007, 14:50

Euh... je doute que l'on puisse commencer un eval() par la fermeture d'une balise php, mais j'avoue que je n'ai jamais essayé... ceci dit, je ne vois quand même pas l'intérêt d'utiliser la fonction eval si c'est pour lui passer du html.... :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 11 Messages

02 mai 2007, 15:04

Avez vous une solution svp ?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

02 mai 2007, 16:13

Ce que j'ai demandé c'est le code à la ligne 40 dans le code exécuté par eval()
C'est à dire: la méthode $this->_munge_input(...)
avec une explication sur le contenu du paramètre $this->_tmpl
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 11 Messages

03 mai 2007, 08:44

le code tu l'as plus haut

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

03 mai 2007, 09:24

Je crains qu'on se comprend pas là.
Vu l'instruction
eval('?>' . $this->_munge_input($this->_tmpl));
Cette dernière appelle la méthode $this->_munge_input() de la classe en cours où l'erreur est signalée à la line 40.

Le code que tu nous a donné ne correspond pas à la méthode $this->_munge_input() OK :!:
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 11 Messages

03 mai 2007, 09:47

Ce n'est pas moi qui fait le code ! ! ! !

ligne 40 : }
ligne 146 : eval('?>' . $this->_munge_input($this->_tmpl));

tu veux quoi de plus !

ViPHP
ViPHP | 3607 Messages

03 mai 2007, 10:35

le codes des méthodes suivantes:
  • _munge_input()
    _tmpl()
et au passage, si ce n'est pas toi qui a fait le code, la meilleur solution , c'est de demander des comptes à celui qui l'a fait!

Eléphanteau du PHP | 11 Messages

03 mai 2007, 10:53

voici le code de _munge_input :

Code : Tout sélectionner

function _munge_input($template) { // Convert < ?plugin expr ? > to < ?php $this->_printPluginPI("expr"); ? > $orig[] = '/<\?plugin.*?\?>/se'; $repl[] = "\$this->_mungePlugin('\\0')"; // Convert < ?= expr ? > to < ?php $this->_print(expr); ? > $orig[] = '/<\?=(.*?)\?>/s'; $repl[] = '<?php $this->_print(\1);?>'; return preg_replace($orig, $repl, $template); }
Voila ce qu'il y a après la ligne 40 :

Code : Tout sélectionner

$request->_TemplatesProcessed[$name] = 1; $this->_tmpl = fread($fp, filesize($file)); fclose($fp);

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

03 mai 2007, 12:45

Ok, Je pense qu'il faut échapper le $ dans le code contenu dans $repl, c'est à dire ajouter un anti-slash avant le $ dans cette ligne:

Code : Tout sélectionner

$repl[] = '<?php \$this->_print(\\1);?>';
Modifié en dernier par sadeq le 04 mai 2007, 11:36, modifié 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 11 Messages

04 mai 2007, 10:27

Bonjour
J'ai rajouter l'anti-slash après $this->_print(\1);?>';
mais ça ne marche toujours pas

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

04 mai 2007, 11:31

pas après, avant le $.

Désolé, dans ma dernière réponse l'anti-slash n'a pas été affiché.
Je reposte la modif à faire:
$repl[] = '<?php \$this->_print(\\1);?>';
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 11 Messages

04 mai 2007, 11:54

Désolé, tout à l'heure je voulais dire avant
J'ai fait un copier-coller du code, relancer apache, mais toujours le même problème