update 관련 미스테리한 질문입니다. 채택완료
전국적으로 비가 너무 많이 내리는데
아무쪼로 비 피해 없으시길 기원합니다.
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개
서버 데이터 관점에서 볼때
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 함수가 중복 호출되는 것을 방지할 수 있을것 같습니다.
이외에도 중복 호출을 막는 다양한 방법이 있을 수 있으니, 참고하셔서 원하시는 방식으로 구현 하시면 될 것 같습니다.
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인