디비, 파일 모두 백업 후, 라이믹스 2.1로 잘 넘어오긴 했습니다만 오류는 잡는 중입니다. (__);

 

업데이트 후 웹사이트 접속해보니 사용자 화면에서 이런 오류가 뜨네요.

 

TypeError #0 "Illegal offset type in isset or empty" in files/cache/addons/pc.php on line 52
 

 

해당 오류를 찾아 해당 부분을 뒤져보면 아래와 같습니다..

/files/cache/addons/pc.php (52라인)

 

$before_time = microtime(true); $rm = 'run_selected'; $ml = array ( 'wpstore' => true, ); $_m = Context::get('mid'); $addon_file = RX_BASEDIR . 'addons/ap_extra_search/ap_extra_search.addon.php'; $addon_info = unserialize('O:8:"stdClass":13:{s:15:"xe_validator_id";s:31:"modules/addon/tpl/setup_addon/1";s:4:"type";s:3:"and";s:10:"type_multi";s:2:"or";s:4:"skin";s:7:"ea_imin";s:8:"position";s:10:"filter-box";s:4:"spot";s:5:"below";s:12:"select2radio";s:1:"N";s:8:"category";s:1:"N";s:5:"basic";s:1:"N";s:9:"signature";s:1:"N";s:12:"range_search";s:1:"N";s:13:"xe_run_method";s:12:"run_selected";s:8:"mid_list";a:1:{i:0;s:7:"wpstore";}}'); $run = isset($ml[$_m]); if ($run && file_exists($addon_file)): include($addon_file); $after_time = microtime(true); if (class_exists("Rhymix\\Framework\\Debug") && Rhymix\Framework\Debug::isEnabledForCurrentUser()): Rhymix\Framework\Debug::addTrigger(array( "name" => "addon." . $called_position, "target" => "ap_extra_search", "target_plugin" => "ap_extra_search", "elapsed_time" => $after_time - $before_time, )); endif; endif;

 

해당 오류를 chatgpt한테 물어보았습니다.

 

Illegal offset type in isset or empty 오류는 PHP에서 배열의 인덱스로 배열이나 객체와 같은 유형을 사용하려고 할 때 발생합니다. 이는 배열의 인덱스가 반드시 정수 또는 문자열이어야 하기 때문입니다.

이 코드에서는 배열의 인덱스로 사용되는 부분이 $_m을 이용하는 부분인 것 같습니다:

 

만약 Context::get('mid')이 배열이나 객체를 반환한다면, 이 부분에서 "Illegal offset type in isset or empty" 오류가 발생할 것입니다. $_m이 문자열이나 정수 값이 아니라 다른 형태로 반환되는지 확인해 보는 것이 좋습니다.

 

이 코드에서는 $ml이라는 배열이 생성되고, Context::get('mid')의 반환값을 그 배열의 키로 사용하려고 하고 있습니다. 다만, 이 반환값이 문자열이나 정수가 아닌 경우에는 "Illegal offset type in isset or empty" 오류가 발생합니다.

'Illegal offset type in isset or empty' 오류는 주로 배열의 인덱스가 문자열이나 정수가 아닐 때 발생합니다. 배열의 인덱스는 반드시 정수 또는 문자열이어야 하며, 그 외의 값(배열, 객체 등)은 사용할 수 없습니다.

Context::get('mid')가 반환하는 값을 체크하거나 그 값이 항상 문자열이나 정수를 반환하도록 수정하셔야 합니다. 반환값이 배열이나 객체라면 이를 적절한 형태로 변환해야 합니다.

 

$_m = Context::get('mid');
if (is_array($_m)) {
    $_m = serialize($_m);
} else if (is_object($_m)) {
    $_m = serialize((array)$_m);
}
 

이렇게 하면 $_m이 배열이나 객체인 경우 그것을 문자열로 변환하여, 배열의 키로 사용할 수 있게 합니다. 단, 이렇게 직렬화된 키를 나중에 역직렬화하여 원래의 객체나 배열을 복구할 수 있습니다.

 

해당 코드는 라이믹스 코어 부분이라 함부로 손대기는 어렵습니다만-_-;;

modules/addon/addon.controller.php (108라인)

// 추가
$buff[] = 'if (is_array($_m)) { $_m = serialize($_m); } else if (is_object($_m)) { $_m = serialize((array)$_m);}';

 

이렇게 추가해주면 해당 오류는 없이 보여지긴 합니다..

 

아마 해당 캐시 오류를 보고 추측해보자면, 

이건 ap_extra_search 애드온에서 한개의 게시판에 대해서 애드온 적용을 했을 때 발생했구요.

혹은 이전에 제가 개발 작업할 때 멋대로 작업했던 찌꺼기가 남아있어서 그랬을 수도 있구요.

 

그리고 이 수정작업을 하면서 느꼈던 건데, 원래 배열로 들어가는 건데 1개만 입력되어졌기 때문에 배열이 아닌 문자로 인식이 되었던게 문제가 된거 같은데요.

비슷하게, 사용자확장변수 키가 들어갈 때도, 체크박스로 되어있는 경우 여러개를 선택하면 |@| 구분자로 배열로 들어가집니다만,

1개만 선택하면 |@| 구분자 없이 1개만 들어가서 문자열로 인식될 수 있는 문제가 있긴 하더군요..@_@;;

 

이번에 이온디스토어 개편 작업하면서 필터링 기능을 좀 넣다보니 해당 부분 이슈를 어떻게 처리할지 고민 중이었는데..

좀 더 고민해봐야겠습니다..

 

 
댓글은 로그인 사용자만 작성 가능합니다. 로그인하기