2012-08-02 42 views
0

我使用CakePHP 2.1.2和PHP 5.3.5以及一个名为'Cakemenu'的插件,它通常可以正常工作。插件存储与菜单链接一个数据库表的菜单存储为文本像CakePHP Cakemenu插件由于错误的字符串编码导致全局错误后失败

array('plugin'=>null,'controller'=>'assets','action'=>'index'); 

在插件助手得到的值,然后执行该代码的文本转换为数组:

//Try to evaluate the link (if starts with array) 
    if (eregi('^array', $value['Menu']['link'])) { 
     $code = "\$parse = " . $value['Menu']['link'] . ";"; 
     $result = eval($code); 
     if (is_array($parse)) { 
     $value['Menu']['link'] = $parse; 
     } 
    } 

除非CakePHP处理错误,否则一切正常。例如,如果我在浏览器中输错了控制器的名称,我应该得到一个菜单,然后丢失控制器消息。相反,我得到一个页面完整的“解析错误:语法错误,意外的$ end in ...”消息指向eval语句的行。如果我打印出正在获得评估的变量,我发现它通常不会用Html实体编码(不正确)。要eval'ed

好字符串:

$parse = array('plugin'=>null,'controller'=>'assets','action'=>'index'); 

错误的字符串被eval'ed:

$parse = array('plugin'=>null,'controller'=>'Parts','action'=>'add'); 

要暂时解决我添加了两个语句的问题只需更换有问题的字符

$value['Menu']['link'] = str_replace(''','\'',$value['Menu']['link']); 
    $value['Menu']['link'] = str_replace('>','>',$value['Menu']['link']); 

一切都很好。其他一些可能有用的信息是,在应用程序的beforeFilter期间读取用于生成菜单的数据数组,并将其保存在视图变量中,然后将菜单作为视图中的元素生成。

我在想这个错误会导致CakePHP(或PHP)跳过一些加载或配置过程,导致字符串被错误处理。任何帮助,将不胜感激,谢谢

+0

使用eval并不是一个好主意,因为我相信你听说过。是否有可能对插件做出贡献并使用'serialize()'和'unserialize()'来代替? – jeremyharris 2012-08-02 16:04:03

+0

也许,但我没有写插件,Nik Chankov做过。我将它更新为CakePHP 2,但是它是原创的。当前设计的唯一优点是我可以手动编辑数据库,因为数组以文本形式存储。我也可以写一个解析例程,可能不会太难。 – Matt 2012-08-07 00:52:24

回答

0

您的beforeFilter()方法将不会在错误页面上执行。您必须亲自处理您的错误,并手动拨打beforeFilter()。我写了一个关于如何使用自定义错误页面的blog post - 请密切关注控制器回调部分。

+0

之前的过滤器是数据读取的地方,所以它正在执行,也许老版本的CakePHP没有。我再次通过添加评论来检查,它的工作原理。问题是,读取并存储在视图变量中的数据具有编码的特殊字符而不是纯文本。但是我认为你在正确的轨道上发生错误时没有执行或加载某些东西。谢谢 – Matt 2012-08-03 16:24:15

相关问题