update 관련 미스테리한 질문입니다.

update 관련 미스테리한 질문입니다.

QA

update 관련 미스테리한 질문입니다.

답변 3

본문

전국적으로 비가 너무 많이 내리는데

아무쪼로 비 피해 없으시길 기원합니다.

 

update를 해주는데 부여된 갯수에서 실행할때마다 -1씩 해주는 쿼리인데요.

 


$sql2 = "update {$member_table}";
$sql2 .= "    set jump_count = jump_count-1";
$sql2 .= " where mb_id = '".$member['mb_id']."'";

 

주요 쿼리라 해봤자 이게 다 인데요.

 


function jump(bo_table,wr_id,area1,area2,theme,gubun) {
    //alert(bo_table);
    //alert(wr_id);
    var jump_remain = "<?=get_text($member['jump_count'])?>";    // 점프 남은 횟수
    if(jump_remain > 0) {
        if (confirm("업체 정보 점프를 하시겠습니까?\n\n 점프시 업체 리스트에서 1위로 올라갑니다."))
            location.href = '<?=G5_BBS_URL?>/jump.php?bo_table=' + bo_table + '&wr_id=' + wr_id + '&area1=' + area1 + '&area2=' + area2 + '&theme=' + theme + '&gubun=' + gubun + '&jump=ok';
    } else {
        alert("점프 가능 횟수가 없습니다!");
        return;
    }
}

jump_count 가 0이 되면 자바스크립트로 막아두어 더이상 update 페이지가 실행이 안되는데

가끔씩 보면 jump_count의 수가 -450 이런식으로 되어 있을때가 있거든요

정말 이상합니다.

 

기본 jump_count가 30인데 update가 실행 될때마다 -1 밖에 되지 않고

0이되면 실행이 안되도록 막아두었는데 어떻게 -450 , -600 이런 숫자가 되는지

너무 이해가 안되네요..

 

도대체 왜 이럴까요..

 

이 질문에 댓글 쓰기 :

답변 3

서버 데이터 관점에서 볼때

front 단 체크는 의미가 없습니다.

back 단에서 체크 되어야 하고

다음과 같은 방법중 하나를 선택할수 있습니다.

 

1. 음수로 떨어지는 상황을 구조적으로 방지


ALTER TABLE {$member_table} MODIFY COLUMN jump_count int unsigned NOT NULL DEFAULT 0;

 

2. 음수로 떨어지지 않도록 함수 사용


$sql2 = "update {$member_table}";
$sql2 .= "    set jump_count = GREATEST(0, jump_count-1)";
$sql2 .= " where mb_id = '".$member['mb_id']."'";

 

3. 쿼리에 조건 추가


$sql2 = "update {$member_table}";
$sql2 .= "    set jump_count = jump_count-1";
$sql2 .= " where mb_id = '".$member['mb_id']."' AND jump_count > 0 ";

 

4. 업데이트 할 컬럼의 select 후 값에 따른 업데이트 유무 판별

우선순위는 php -> js 입니다.
클라단에서 처리하지마시고 서버단에서 처리하세요.

 

select 로 먼저 해당 데이터 채크 후 0 이 아니면 update 하거나

베르만님이 제안해주신 방법으로 처리하는게 더 효율적으로 보여집니다.

만약 어떻게든 js 에서 우선 처리해야 하는 상황이라면 ajax 처리를 권장합니다.

다음과 같은 방법도 있으니 참고해 보세요

 

질문 내용으로 봐서는 jump_count가 음수로 변하는 이유는 아마 jump() 함수가 여러 번 호출되어서 그렇게 되는 것으로 생각합니다.

jump() 함수가 호출될 때마다 $sql2 .= " set jump_count = jump_count-1" 쿼리가 실행되고, jump_count가 0 이하로 감소할 수 있겠죠.

jump() 함수가 중복 호출되지 않도록 할 수 있을것 같습니다. 

예를 들어, jump 버튼 클릭 시 버튼을 비활성화하거나, jump_count가 0 이하일 때는 jump 함수를 실행하지 않도록 조건을 추가하면 될 것 같습니다.

 


function jump(bo_table, wr_id, area1, area2, theme, gubun) {
    var jump_remain = <?=get_text($member['jump_count'])?>; // 점프 남은 횟수
    if (jump_remain <= 0) {
        alert("점프 가능 횟수가 없습니다!");
        return;
    }
    if (confirm("업체 정보 점프를 하시겠습니까?\n\n점프시 업체 리스트에서 1위로 올라갑니다.")) {
        var jumpButton = document.getElementById("jumpButton");
        jumpButton.disabled = true; // jump 버튼 비활성화
        location.href = '<?=G5_BBS_URL?>/jump.php?bo_table=' + bo_table + '&wr_id=' + wr_id + '&area1=' + area1 + '&area2=' + area2 + '&theme=' + theme + '&gubun=' + gubun + '&jump=ok';
    }
}

 

이렇게 하면  jump 버튼을 jumpButton이라는 id를 가진 요소로 가정하고, 버튼을 클릭하면 버튼을 비활성화(disabled)시키는 방식을 사용함으로써  jump 함수가 중복 호출되는 것을 방지할 수 있을것 같습니다.

이외에도 중복 호출을 막는 다양한 방법이 있을 수 있으니, 참고하셔서 원하시는 방식으로 구현 하시면 될 것 같습니다.

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
전체 101
© SIRSOFT
현재 페이지 제일 처음으로