테스트 사이트 - 개발 중인 베타 버전입니다

update 관련 미스테리한 질문입니다. 채택완료

강력드라이브 2년 전 조회 2,056

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

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

 

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

 

</p>

<p>$sql2 = "update {$member_table}";

$sql2 .= "    set jump_count = jump_count-1";

$sql2 .= " where mb_id = '".$member['mb_id']."'";</p>

<p>

 

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

 

</p>

<p>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;

    }

}</p>

<p>

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

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

정말 이상합니다.

 

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

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

너무 이해가 안되네요..

 

도대체 왜 이럴까요..

 

댓글을 작성하려면 로그인이 필요합니다.

답변 3개

채택된 답변
+20 포인트
2년 전

서버 데이터 관점에서 볼때

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

back 단에서 체크 되어야 하고

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

 

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

</p>

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

<p>

 

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

</p>

<p>$sql2 = "update {$member_table}";

$sql2 .= "    set jump_count = GREATEST(0, jump_count-1)";

$sql2 .= " where mb_id = '".$member['mb_id']."'";</p>

<p>

 

3. 쿼리에 조건 추가

</p>

<p>$sql2 = "update {$member_table}";

$sql2 .= "    set jump_count = jump_count-1";

$sql2 .= " where mb_id = '".$member['mb_id']."' AND jump_count > 0 ";</p>

<p>

 

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

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

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

 

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

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

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

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

 

</p>

<p>function jump(bo_table, wr_id, area1, area2, theme, gubun) {

    var jump_remain = <?=get_text($member['jump_count'])?>; // 점프 남은 횟수</p>

<p>    if (jump_remain <= 0) {

        alert("점프 가능 횟수가 없습니다!");

        return;

    }</p>

<p>    if (confirm("업체 정보 점프를 하시겠습니까?\n\n점프시 업체 리스트에서 1위로 올라갑니다.")) {

        var jumpButton = document.getElementById("jumpButton");

        jumpButton.disabled = true; // jump 버튼 비활성화</p>

<p>        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 함수가 중복 호출되는 것을 방지할 수 있을것 같습니다.

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

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

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

 

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

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

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

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인