Extra Form
PHP PHP 7.3
CMS Rhymix 2.1

안녕하세요. 하루 하루 평온하게 넘어가는 날이 없네요;;

 

아래와 같은 에러가 나는데 항상 나는 건 아니고, 어쩌다? 나는 것 같습니다. 

 

에러 메세지:

image.png

문제가 나오는 line 69는 '{@ echo str_replace("\n", '<br />', $value->answer); }' 이고

$value->answer 값은 아마도 API 응답으로 받는 값인데 정상이 아닌경우? 에러가 나는게 아닐까 하는 생각입니다.

 

이 라인을 아예 지우면, 에러 메세지는 나오지 않지만 해당하는 내용(?)이 안나오고,

ChatGPT의 조언에 따라, $value->answer 가 문자열인 경우와 아닌 경우, 빈 값인 경우 나눠서 분기처리를 하면

'syntax error, unexpected end of file' 이런 에러가 나게됩니다..

 

정상으로 나오는 페이지 링크: https://scorefactory.io/factory2ielts/2505724?list_type=card&search_target=tag&search_keyword=Describe+a+time+when+you+answered+a+phone+call+from+someone+you+didn%26%23039%3Bt+know+in+a+public+place

 

조언 구해 봅니다 ㅠ.ㅠ

 

<div class="advice-section-item" data-key="{$key}">
<div class="advice-section-item__title">
{$value->title}
</div>
<div class="advice-section-item__content">
<!--@if(str_ends_with($key, '-audio') && $value->file_srl && $value->sub_srl)-->
{@
    $value = $__Context->value;
$output = executeQueryArray("ai_voice.getVoiceInfoByTargetSrl", [
'target_srl' => $value->sub_srl,
]);
$val = (object)[
'comment_srl' => $value->sub_srl,
'file_srl' => $value->file_srl,
'sid' => $output->data[0]->sid,
'uploaded_filename' => FileModel::getFile($value->file_srl)->uploaded_filename,
];
$msCount = $value->sub_srl;
$zModel = getModel("z_music");
$specIsMobile = $zModel->checkMobile();
$specCutStrNickLength = 16;
$specCutStrContentLength = 40;
if ($specIsMobile === true):
$specCutStrNickLength = 10;
$specCutStrContentLength = 20;
endif;
  $specApiUrl = getNotEncodedFullUrl("") . "modules/z_music/lib/zp/publisher.php";
eval(base64_decode('JHZhbHVlID0gJF9fQ29udGV4dC0+dmFsdWU7CgkJCQkJCSRvdXRwdXQgPSBleGVjdXRlUXVlcnlBcnJheSgiYWlfdm9pY2UuZ2V0Vm9pY2VJbmZvQnlUYXJnZXRTcmwiLCBbCgkJCQkJCQkndGFyZ2V0X3NybCcgPT4gJHZhbHVlLT5zdWJfc3JsLAoJCQkJCQldKTsKCQkJCQkJJHZhbCA9IChvYmplY3QpWwoJCQkJCQkJJ2NvbW1lbnRfc3JsJyA9PiAkdmFsdWUtPnN1Yl9zcmwsCgkJCQkJCQknZmlsZV9zcmwnID0+ICR2YWx1ZS0+ZmlsZV9zcmwsCgkJCQkJCQknc2lkJyA9PiAkb3V0cHV0LT5kYXRhWzBdLT5zaWQsCgkJCQkJCQkndXBsb2FkZWRfZmlsZW5hbWUnID0+IEZpbGVNb2RlbDo6Z2V0RmlsZSgkdmFsdWUtPmZpbGVfc3JsKS0+dXBsb2FkZWRfZmlsZW5hbWUsCgkJCQkJCV07CgkJCQkJCSRtc0NvdW50ID0gJHZhbHVlLT5zdWJfc3JsOwoJCQkJCQkkek1vZGVsID0gZ2V0TW9kZWwoInpfbXVzaWMiKTsKCQkJCQkJJHNwZWNJc01vYmlsZSA9ICR6TW9kZWwtPmNoZWNrTW9iaWxlKCk7CgkJCQkJCSRzcGVjQ3V0U3RyTmlja0xlbmd0aCA9IDE2OwoJCQkJCQkkc3BlY0N1dFN0ckNvbnRlbnRMZW5ndGggPSA0MDsKCQkJCQkJaWYgKCRzcGVjSXNNb2JpbGUgPT09IHRydWUpOgoJCQkJCQkJJHNwZWNDdXRTdHJOaWNrTGVuZ3RoID0gMTA7CgkJCQkJCQkkc3BlY0N1dFN0ckNvbnRlbnRMZW5ndGggPSAyMDsKCQkJCQkJZW5kaWY7CgkJCQkJICAkc3BlY0FwaVVybCA9IGdldE5vdEVuY29kZWRGdWxsVXJsKCIiKSAuICJtb2R1bGVzL3pfbXVzaWMvbGliL3pwL3B1Ymxpc2hlci5waHAiOw=='));
include _XE_PATH_ . "modules/z_music/lib/inc/player.php";
$zModel = getModel("z_music");
$transHtml = $zModel->makeSpeechText(
DB::getInstance(), $val, $zModel->getConfig(), $value->sub_srl
);
eval(base64_decode('ZWNobyAkcGxheWVySHRtbDs=')); // echo $playerHtml;
echo $transHtml;
}
<!--@else-->
{@ echo str_replace("\n", '<br />', $value->answer); }
<!--@endif-->
</div>
</div>

 

  • Lv5

    image.png

    원인은 $value->answer 이 문자열이 아니라 json 형태일때 (API가 잘못응답함), 이런 문제가 생기는 것 같아요.

     

    그래서 ChatGPT의 조언대로 아래와 같이 고치면 되어야할 것 같은데, 'syntax error, unexpected end of file' 이 에러를 생성하네요.

     

    {@
    if (isset($value->answer)) {
    // JSON인지 확인
    $decoded = json_decode($value->answer, true); // 배열 형태로 디코딩
    if (json_last_error() === JSON_ERROR_NONE) {
    // JSON을 HTML-friendly 문자열로 변환
    $jsonString = json_encode($decoded, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    echo nl2br(htmlspecialchars($jsonString));
    } elseif (is_string($value->answer)) {
    // 일반 문자열 처리
    echo str_replace("\n", '<br />', $value->answer);
    } else {
    echo 'invalid';
    }
    } else {
    echo 'invalid';
    }
    }

     

  • Lv19
    if문의 중괄호가 템플릿 문법의 중괄호와 겹쳐서 if문이 닫히는 순간 템플릿 문법도 닫혀서 발생합니다.

    https://www.php.net/manual/en/control-structures.alternative-syntax.php
    이경우 중괄호 대신 콜론을 사용해는 대체 문법을 사용할 수 있습니다. 물론 제일 좋은건 모듈 자체를 제대로 수정하는겁니다.(함수 입력값에 이상한 값이 들어가지 않도록)
  • Lv19 Lv5
    말씀하신 내용을 적용해서,
    {@
    if (isset($value->answer)):
    // JSON인지 확인
    $decoded = json_decode($value->answer, true); // 배열 형태로 디코딩
    if (json_last_error() === JSON_ERROR_NONE):
    // JSON을 HTML-friendly 문자열로 변환
    $jsonString = json_encode($decoded, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    echo nl2br(htmlspecialchars($jsonString));
    elseif (is_string($value->answer)):
    // 일반 문자열 처리
    echo str_replace("\n", '<br />', $value->answer);
    else:
    echo 'invalid';
    endif;
    else:
    echo 'invalid';
    endif;
    }

    이렇게 입력하니까 한방에 해결되었습니다.
    $value->answer 값이 ChatGPT API 의 응답인데, 절대로 JSON 형태로 출력하지 않도록 신신당부 해두었습니다;;
    신신당부로 코딩을 해결하는 시대가 온 것 같습니다.

    정말 감사합니다.
  • Lv5 Lv37

    병주고 약주는 ChatGPT ㅋㅋㅋ
    신신당부하려면 프롬프트가 길어지고, 그만큼 요금도 많이 들지요.
    이래저래 OpenAI 샘형한테 돈 갖다 바치고 싹싹 빌어야 하는 것은 똑같네요. ㅠ