update 관련 미스테리한 질문입니다.
본문
전국적으로 비가 너무 많이 내리는데
아무쪼로 비 피해 없으시길 기원합니다.
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 함수가 중복 호출되는 것을 방지할 수 있을것 같습니다.
이외에도 중복 호출을 막는 다양한 방법이 있을 수 있으니, 참고하셔서 원하시는 방식으로 구현 하시면 될 것 같습니다.
!-->