'Object of class stdClass could not be converted to string' 에러
CMS/프레임워크 | Rhymix 2.1 |
---|---|
개발 언어 | PHP 7.3 |
문제 페이지 주소 | 비공개 (작성 후 5일 경과) |
안녕하세요. 하루 하루 평온하게 넘어가는 날이 없네요;;
아래와 같은 에러가 나는데 항상 나는 건 아니고, 어쩌다? 나는 것 같습니다.
에러 메세지:
문제가 나오는 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>
<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>
스코스코
Lv. 5
댓글 4
원인은 $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';
}
}
https://www.php.net/manual/en/control-structures.alternative-syntax.php
이경우 중괄호 대신 콜론을 사용해는 대체 문법을 사용할 수 있습니다. 물론 제일 좋은건 모듈 자체를 제대로 수정하는겁니다.(함수 입력값에 이상한 값이 들어가지 않도록)
{@
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 형태로 출력하지 않도록 신신당부 해두었습니다;;
신신당부로 코딩을 해결하는 시대가 온 것 같습니다.
정말 감사합니다.
병주고 약주는 ChatGPT ㅋㅋㅋ
신신당부하려면 프롬프트가 길어지고, 그만큼 요금도 많이 들지요.
이래저래 OpenAI 샘형한테 돈 갖다 바치고 싹싹 빌어야 하는 것은 똑같네요. ㅠ