Extra Form
PHP PHP 7.4
CMS Rhymix

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");

 

위 부분만 어떻게 문법에 맞게 수정을 하면 돌아는 갈 것 같은데 문법을 잘 몰라서...

 

일단 다른 운영자님들께도 공유가 필요할 것 같아 공규합니다.

  • ?
    $member_srl = $obj->member_srl ? $obj->member_srl : $logged_info ? $logged_info->member_srl : 0;

    라인하고

    $point = $obj->point ? $obj->point : $obj->use_point ? $obj->use_point : $obj->price ? $obj->price : null;

    라인을 주석 처리하니 PHP 8.0에서도 사이트 접속은 가능해졌습니다. 확실히 해당 라인이 문제인 것 같습니다.
  • ? profile
    일단 개발자님게 의뢰릘 들려서 새 스티커 모듈을 개발하기 이전에, 일단 기능이 작동이라도 하도록 땜빵을 목표로 한다면 해당 구문에 대한 수정방법이 공유되면 좋을것 같습니다
  • profile
    윗부분

    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
    }


    으로 수정하신다음 사용해보세요.
  • profile profile
    감사합니다! 바로 테스트 하러 가겠습니다 = 333
  • profile profile
    해결되었습니다. php8.0에서도 스티커 모듈 정상 사용 가능합니다.
  • profile profile

    오타가 있었네요.

    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;
    }

  • profile profile
    넵 별도의 에디터 없이 댓글 창에 바로 쓰니까 오타가 좀 있습니다;
  • profile
    전 비개발자라 저 에러가 뭔지 모르는데

    a ? b : c ? d : e --> (a ? b : c) ? d : e

    혹은

    a ? b : c ? d : e -> a ? b : (c ? d : e)

    로 바꾸라는 메시지 같네요. 바꿔서 테스트 해보셨는지...
  • profile profile
    네 그런데 제 생각에 저 괄호를 뒤에 모으는것과 앞에 모으는것과 차이가 존재하는것 같습니다.

    스티커 모듈을 개발하신 후하니님께서 해당 코드 작성을 어떤 의도로 하셨냐에 따라 괄호를 왼쪽에다 붙일지 오른쪽에다 붙일지 생각해봐야할 것 같네요 ㅜㅜ
  • profile profile
    저 항목은 3항식 기법중에서 지원하지 않는 방식을 쓰는겁니다.

    제일 앞부분이나 뒷부분이나 전부 데이터를 $member_srl 에 대입하는 방법이므로 이런경우는 그냥 스위치나 if elseif else 가 가장 깔끔합니다.