동시에 글 올릴 때 순서

동시에 글 올릴 때 순서

QA

동시에 글 올릴 때 순서

본문

출석체크 게시판인데요

0시를 기준으로 1,2,3등 순위을 매겨서 포인트를 차등 지급하고 있습니다.

그런데 경쟁이 생기면서 여러명이 동시에 0시에 출석을 하니까 문제가 있어서 문의드립니다.

 

1. 디비에 데이터가 생성되는게 순서(? wr_id) 와 맞질 않습니다.  그래서 정말 빠른순으로 등수를 매겼는지 의심이 듭니다.

   디비 여분 필드에 기록을 해봤습니다. wr_5가 출석을 클릭하여 $list.skin.php 에 $list[$i]['num'] 값을 넣은겁니다.

 

3556550771_1654298922.2223.png

 

2. 구조상 list.skin.php 에서 출석 순위를 매기는게 맞는건지 의구심이 듭니다. 

아래는 list.skin.php 에 ' for ($i=0; $i<count($list); $i++) { '코드 안에 삽입한 등수 기록 코드중 일부입니다.


                    if( $list[$i]['wr_5'] == "" AND substr( $list[$i]['wr_datetime'] , 0, 10 ) == date("Y-m-d") ) {
                            $p_rank = 0;
                            $p_day = 0;
                            $wr_2 = "";
                            $p_msg_day = "";
                            $p_msg_rank = "";
                            $p_msg_event = "";
                            $wr_5 = $list[$i]['num'];
                            if( $wr_5 == 1 ) { $p_rank = 300; $p_msg_rank = "1등 +300p " ; sql_query( " UPDATE g5_member SET gold = gold + 1 WHERE DATE(`wr_datetime`) = DATE( NOW() ) AND mb_id = '{$list[$i]['mb_id']}' " ); }
                            if( $wr_5 == 2 ) { $p_rank = 200; $p_msg_rank = "2등 +200p " ; sql_query( " UPDATE g5_member SET silver = silver + 1 WHERE DATE(`wr_datetime`) = DATE( NOW() ) AND mb_id = '{$list[$i]['mb_id']}' " ); }
                            if( $wr_5 == 3 ) { $p_rank = 100; $p_msg_rank = "3등 +100p " ; sql_query( " UPDATE g5_member SET bronze = bronze + 1 WHERE DATE(`wr_datetime`) = DATE( NOW() ) AND mb_id = '{$list[$i]['mb_id']}' " ); }
 
                            if( $p_msg_rank !="" AND $p_msg_day !="" ) { $p_msg_sp = ' | ' ; }
                            if( $p_msg_rank =="" AND $p_msg_day =="" ) { $p_msg_sp = ' ' ; }  //공백문자
                            $wr_2 = $p_msg_rank . $p_msg_sp . $p_msg_day . $p_msg_event ;
                            $sql = "UPDATE {$write_table} SET  wr_2 ='$wr_2', wr_5 ='$wr_5' WHERE mb_id = '{$list[$i]['mb_id']}' AND date(wr_datetime)=date(now())";
                            sql_query($sql);

 

동시 출석클릭시 일처리? 하는게 맞게 돌아가는건가요? 그렇다면 왜 디비에는 순서대로 기록이 안될까요


 

이 질문에 댓글 쓰기 :

답변 4

WHERE DATE(`wr_datetime`) = DATE( NOW() 

==

출석 체크면 건수가 아주 많아질 텐데

이런 조건문을 쓰시면 절대? 안 됩니다. index 사용을 포기하는 방식입니다.

WHERE `wr_datetime` between curdate() and curdate() + interval 1 day-interval 1 second

wr_datetime 컬럼은 적절하고 index에 포함되어 있어야 합니다.

절대 안되는 이유가 인덱스를 포기하는 방식이란게...  좀 더 상세히 가르쳐 주실 수 있나요..  기초가 부족해서 공부 좀 하고 싶습니다.
index에 포함되어 있어야 한다는게 무슨 뜻인지 잘 모르겠어요

초단위까지 출첵이 겹칠수있어서 첫번째 출첵 쿼리시에 테이블에 락을 걸고 출첵 후 락을 풀고하면 겹치지 않게 원하시는 결과가 나올거 같습니다.

common.lib.php 에 function get_uniqid() 한번 보시고 적용해보세요. 적용이 어려우시면 제작의뢰 이용해보세요. 크게 어려운코드가 아니라서 5만원이내로 의뢰가 가능하지 않을까 생각합니다.

php가 실행되고(이 시각을 저장), 이거 저거 하고 DB에 insert합니다.(wr_id 받아옴)

문제는 이 간격이 고르지 못할 수 있다는 거죠.

기준이 DB냐, php냐에 따라 정하시면 됩니다.

'wr_datetime 컬럼은 적절하고 index에 포함되어 있어야 합니다.'

이거 뜻이

적절 = 날짜 필드여야 한다는거고

index에 포함이란건

thumb-3556550771_1654335930.4329_730x544.png

여기에 추가 시키란 소린건가요?

 

 

답변을 작성하시기 전에 로그인 해주세요.
전체 145
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT