질문/조언질답게시판
Extra Form
PHP PHP 7.0
CMS Rhymix

항상 라이믹스와 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);

}


?>

 

  • ?
    모듈을 조금 뒤적뒤적하니까, setPoint에
    $oPointController->setPoint( $member_srl, $point, $mode )

    이렇게 들어가던데, $mode값이 없어서 그럴 수도 있을려나요?
  • profile

    더한 결과를 넣어주는 것이라면 $mode는 따로 지정할 필요 없습니다.

     

    일단은 캐시 문제가 의심됩니다. 포인트가 초기화된다기보다는... 기존에 x 포인트가 있고 거기에 y 포인트를 지급해서 x+y 포인트를 만들어 놓았는데, 출석할 때 기존의 x 포인트를 기준으로 z 포인트를 더해서 x+z 포인트를 만들어 버린다고 보면 되겠습니다. x라는 데이터가 어딘가에 남아 있으니까 그런 일이 일어나겠지요?

     

    포인트 지급 후 출석하기까지 얼마나 시간차가 있나요? 혹시 몇 초 내에 출석하면 포인트가 초기화되는데, 한두 시간이 지나서 출석하면 문제가 없나요? 아니면 포인트를 지급하는 작업이 출석과 거의 동시에 (예: 로그인 직후에) 이루어지나요? 만약 그렇다면 캐시 문제일 가능성이 높습니다. 시스템 설정 → 고급 설정 메뉴에서 어떤 캐시 방법이 선택되어 있는지 확인해 보시기 바랍니다.

     

    직접 작성하신 스크립트에서 getPoint(회원번호); 를 해도 결과가 이상하게 나온다면 getPoint(회원번호, true); 를 해보세요. 만약 그렇게 했을 때 정확하게 나온다면 그것도 캐시 문제입니다. (이 경우, 포인트를 지급한 직후에 getPoint(회원번호, true); 를 한번 해주시면 캐시를 강제로 갱신하는 데 도움이 될 수도 있습니다.)

  • profile ?
    답변 감사합니다.

    캐시는 아예 사용하지 않았고, 이번에 sqlite 캐시를 사용한 다음 모든 스크립트에 setPoint(회원번호, 포인트, 'update'); 를 사용하니까 귀신같이 잘 되는군요.

    일단 포인트 지급 후 출석까지 시간 상관없이 무조건 그렇게 됩니다.

    알려주신 것 처럼 문제를 해결하기 위해 일단은 모든 스크립트 하단에 종료하기 전 getPoint(회원번호, true);를 실행해보겠습니다.

    감사합니다.
  • ? profile
    해결되었다니 다행이긴 한데, 두 가지 조치를 동시에 하시는 바람에;;; 둘 중 어느 쪽이 도움이 된 건지 알 수 있으면 좋겠네요.^^