스티커 모듈이 php8.0에서 오류를 뿜는 이유
CMS/프레임워크 | Rhymix 1.9 |
---|---|
개발 언어 | PHP 7.4 |
PHP8.0에서 변경된 모듈 분법 관련해서 에러가 발생하는것 같습니다.
PHP8,0 + 라이믹스 2.0에서 스티커 모듈이 활성화되어있을 경우 사이트가 백지(500 Fatal error)발생하고
로그를 찍어보면 아래 로그를 확인할 수 있습니다.
현재 8.0을 서버에서 내려버려서 테스트는 불가능하나, 당시 500에러가 발생했던 사유는 이것입니다.
stderr: "NOTICE: PHP message: PHP Fatal error: Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)` in sticker.controller.php on line 1416"
이 부분은 sticker.controller.php 파일의 하기 부분이 문제였고 (1411번째줄)
function insertStickerLog($obj, $sequence = false){
$logged_info = Context::get('logged_info');
$idx = $sequence ? $sequence : getNextSequence();
$sticker_srl = $obj->sticker_srl ? $obj->sticker_srl : 0;
$sticker_file_srl = $obj->sticker_file_srl ? $obj->sticker_file_srl : null;
$member_srl = $obj->member_srl ? $obj->member_srl : $logged_info ? $logged_info->member_srl : 0;
$type = $obj->type ? $obj->type : null;
$comment_srl = $obj->comment_srl ? $obj->comment_srl : null;
$document_srl = $obj->document_srl ? $obj->document_srl : null;
$content = $obj->content ? $obj->content : null;
$point = $obj->point ? $obj->point : $obj->use_point ? $obj->use_point : $obj->price ? $obj->price : null;
$ipaddress = $obj->ipaddress ? $obj->ipaddress : $_SERVER['REMOTE_ADDR'];
$regdate = $obj->regdate ? $obj->regdate : date("YmdHis");
위 부분만 어떻게 문법에 맞게 수정을 하면 돌아는 갈 것 같은데 문법을 잘 몰라서...
일단 다른 운영자님들께도 공유가 필요할 것 같아 공규합니다.
댓글 10
라인하고
$point = $obj->point ? $obj->point : $obj->use_point ? $obj->use_point : $obj->price ? $obj->price : null;
라인을 주석 처리하니 PHP 8.0에서도 사이트 접속은 가능해졌습니다. 확실히 해당 라인이 문제인 것 같습니다.
if($obj->member_srl)
{
$member_srl = $obj->member_srl;
}
elseif(Context::get('logged_info')
{
$member_srl = $logged_info->member_srl;
}
else
{
$member_srl = 0;
}
아랫부분
if($obj->point)
{
$point = $obj->point;
}
elseif($obj->use_point)
{
$point = $obj->use_point;
}
elseif($obj->price)
{
$point = $obj->price;
}
else
{
$point = null
}
으로 수정하신다음 사용해보세요.
오타가 있었네요.
if($obj->member_srl)
{
$member_srl = $obj->member_srl;
}
else if(Context::get('logged_info'))
{
$member_srl = $logged_info->member_srl;
}
else
{
$member_srl = 0;
}
if($obj->point)
{
$point = $obj->point;
}
else if($obj->use_point)
{
$point = $obj->use_point;
}
else if($obj->price)
{
$point = $obj->price;
}
else
{
$point = null;
}
a ? b : c ? d : e --> (a ? b : c) ? d : e
혹은
a ? b : c ? d : e -> a ? b : (c ? d : e)
로 바꾸라는 메시지 같네요. 바꿔서 테스트 해보셨는지...
스티커 모듈을 개발하신 후하니님께서 해당 코드 작성을 어떤 의도로 하셨냐에 따라 괄호를 왼쪽에다 붙일지 오른쪽에다 붙일지 생각해봐야할 것 같네요 ㅜㅜ
제일 앞부분이나 뒷부분이나 전부 데이터를 $member_srl 에 대입하는 방법이므로 이런경우는 그냥 스위치나 if elseif else 가 가장 깔끔합니다.