我使用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)跳过一些加载或配置过程,导致字符串被错误处理。任何帮助,将不胜感激,谢谢
使用eval并不是一个好主意,因为我相信你听说过。是否有可能对插件做出贡献并使用'serialize()'和'unserialize()'来代替? – jeremyharris 2012-08-02 16:04:03
也许,但我没有写插件,Nik Chankov做过。我将它更新为CakePHP 2,但是它是原创的。当前设计的唯一优点是我可以手动编辑数据库,因为数组以文本形式存储。我也可以写一个解析例程,可能不会太难。 – Matt 2012-08-07 00:52:24