라이믹스 setpoint 후 출석체크시 포인트 증발
CMS/프레임워크 | Rhymix 1.9 |
---|---|
개발 언어 | PHP 7.0 |
항상 라이믹스와 XE를 만드시는 모든 기여자분들께 감사한 마음과 존경스러운 마음으로 커뮤니티를 만들고 시스템을 만들고 있습니다.
이번에 특별한 프로젝트가 있어 ajax요청으로 포인트를 별도 지급하는 시스템을 만들었습니다.
DB로 수정하니 캐시데이터를 수정하는 라이믹스/XE 특성상 DB쿼리가 아닌
// 포인트 가져오기
$point = getModel('point')->getPoint($mb_srl);
$result = $point + $reward;
getController('point')->setPoint($mb_srl, $result);
함수로 포인트를 가져오고, 정상적으로 포인트 목록에 추가되는거 까지 확인을 했습니다.
근데 문제는 이렇게 지급받은 포인트가 출석하기 버튼을 누르는 순간 초기화 되고 ajax요청을 받기전 포인트에서 +출석점수 가 되는걸 확인했는데요..
제가 뭘 잘못 하고 있을까요?
조언을 구해보고자 질답올립니다.
감사합니다.
++ 그리고 혹시나하여 회원의 포인트를 지급하고 조회했는데.. 포인트가 안맞기까지 하네요
아래 코드를 사용해서 ajax요청하여 얼럿으로 띄우면 예를 들어 지급전 포인트가 450점이고, 지급하고 나서 1000점을 맞췄다면 얼럿으로는 450점이라고 나옵니다.
<?php
define('__XE__',true);
//XE 컨피그 주소
require_once $_SERVER['DOCUMENT_ROOT'].'/config/config.inc.php';
$oContext = &Context::getInstance();
$oContext->init();
try {
## 회원 member_srl
$mb_srl = $_GET['mb_srl'];
if(!$mb_srl) {
throw new exception('조회할 회원의 회원 번호가 없습니다.');
}
// 포인트 가져오기
$point = getModel('point')->getPoint($mb_srl);
//XE 컨텍스트 종료
$oContext->close();
## 마무리
$ajax_result['success'] = true;
$ajax_result['data'] = $mb_srl.'번의 포인트는'.$point.'입니다.';
} catch(exception $e) {
$ajax_result['success'] = false;
$ajax_result['msg'] = $e->getMessage();
$ajax_result['code'] = $e->getCode();
} finally {
echo json_encode($ajax_result, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);
}
?>
define('__XE__',true);
//XE 컨피그 주소
require_once $_SERVER['DOCUMENT_ROOT'].'/config/config.inc.php';
$oContext = &Context::getInstance();
$oContext->init();
try {
## 회원 member_srl
$mb_srl = $_GET['mb_srl'];
if(!$mb_srl) {
throw new exception('조회할 회원의 회원 번호가 없습니다.');
}
// 포인트 가져오기
$point = getModel('point')->getPoint($mb_srl);
//XE 컨텍스트 종료
$oContext->close();
## 마무리
$ajax_result['success'] = true;
$ajax_result['data'] = $mb_srl.'번의 포인트는'.$point.'입니다.';
} catch(exception $e) {
$ajax_result['success'] = false;
$ajax_result['msg'] = $e->getMessage();
$ajax_result['code'] = $e->getCode();
} finally {
echo json_encode($ajax_result, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);
}
?>
댓글 4
$oPointController->setPoint( $member_srl, $point, $mode )
이렇게 들어가던데, $mode값이 없어서 그럴 수도 있을려나요?
더한 결과를 넣어주는 것이라면 $mode는 따로 지정할 필요 없습니다.
일단은 캐시 문제가 의심됩니다. 포인트가 초기화된다기보다는... 기존에 x 포인트가 있고 거기에 y 포인트를 지급해서 x+y 포인트를 만들어 놓았는데, 출석할 때 기존의 x 포인트를 기준으로 z 포인트를 더해서 x+z 포인트를 만들어 버린다고 보면 되겠습니다. x라는 데이터가 어딘가에 남아 있으니까 그런 일이 일어나겠지요?
포인트 지급 후 출석하기까지 얼마나 시간차가 있나요? 혹시 몇 초 내에 출석하면 포인트가 초기화되는데, 한두 시간이 지나서 출석하면 문제가 없나요? 아니면 포인트를 지급하는 작업이 출석과 거의 동시에 (예: 로그인 직후에) 이루어지나요? 만약 그렇다면 캐시 문제일 가능성이 높습니다. 시스템 설정 → 고급 설정 메뉴에서 어떤 캐시 방법이 선택되어 있는지 확인해 보시기 바랍니다.
직접 작성하신 스크립트에서 getPoint(회원번호); 를 해도 결과가 이상하게 나온다면 getPoint(회원번호, true); 를 해보세요. 만약 그렇게 했을 때 정확하게 나온다면 그것도 캐시 문제입니다. (이 경우, 포인트를 지급한 직후에 getPoint(회원번호, true); 를 한번 해주시면 캐시를 강제로 갱신하는 데 도움이 될 수도 있습니다.)
캐시는 아예 사용하지 않았고, 이번에 sqlite 캐시를 사용한 다음 모든 스크립트에 setPoint(회원번호, 포인트, 'update'); 를 사용하니까 귀신같이 잘 되는군요.
일단 포인트 지급 후 출석까지 시간 상관없이 무조건 그렇게 됩니다.
알려주신 것 처럼 문제를 해결하기 위해 일단은 모든 스크립트 하단에 종료하기 전 getPoint(회원번호, true);를 실행해보겠습니다.
감사합니다.