PHP 5.3.5 で CakePHP 2.1.2 を使用しており、通常は正常に動作する「Cakemenu」というプラグインを使用しています。プラグインはメニューを db テーブルに保存し、メニュー リンクは次のようなテキストとして保存されます。
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 がエラーを処理していない限り、すべて正常に動作します。たとえば、ブラウザでコントローラーの名前を間違えると、メニューが表示され、コントローラーが見つからないというメッセージが表示されます。代わりに、eval ステートメントのある行を指すページいっぱいの「解析エラー: 構文エラー、予期しない $end in...」というメッセージが表示されます。評価されている変数を出力すると、通常はエンコードされていない Html エンティティで (誤って) エンコードされていることがわかります。
評価するのに適した文字列:
$parse = array('plugin'=>null,'controller'=>'assets','action'=>'index');
評価する文字列が正しくありません:
$parse = array('plugin'=>null,'controller'=>'Parts','action'=>'add');
問題を一時的に修正するために、問題のある文字を置き換えるだけの 2 つのステートメントを追加しました
$value['Menu']['link'] = str_replace( ''','\'',$value['Menu']['link']);
$value['Menu']['link'] = str_replace( '>','>',$value['Menu']['link']);
そして、すべてが再びうまく機能します。役立つ可能性があるその他の情報として、メニューの生成に使用されるデータの配列がアプリの beforeFilter で読み取られ、ビュー変数に保存されてから、メニューがビューの要素として生成されることが挙げられます。
このエラーにより、CakePHP (または PHP) がロードまたは構成プロセスをスキップし、文字列が誤って処理されると考えています。助けていただければ幸いです、ありがとう