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

동시에 글 올릴 때 순서 채택완료

타버린나무 3년 전 조회 2,013

출석체크 게시판인데요

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

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

 

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

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

 

 

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

아래는 list.skin.php 에 ' for ($i=0; $i

</p>

<p>                    if( $list[$i]['wr_5'] == "" AND substr( $list[$i]['wr_datetime'] , 0, 10 ) == date("Y-m-d") ) {</p>

<p>                            $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']}' " ); }</p>

<p>                            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']}' " ); }

 </p>

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

<p>                            $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);</p>

<p>

 

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

 

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

답변 4개

채택된 답변
+20 포인트
WHERE DATE(`wr_datetime`) = DATE( NOW() 

==

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

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

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

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

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

답변에 대한 댓글 4개

타버린나무
3년 전
절대 안되는 이유가 인덱스를 포기하는 방식이란게... 좀 더 상세히 가르쳐 주실 수 있나요.. 기초가 부족해서 공부 좀 하고 싶습니다.
index에 포함되어 있어야 한다는게 무슨 뜻인지 잘 모르겠어요
타버린나무
3년 전
검색으로 알아보니
https://argc.tistory.com/107

SELECT * FROM [TABLE_NAME] WHERE [DATE_FIELD] = CURDATE();

이게 오늘 데이타라고 나오는데... 어떤 차이가 있나요
엑스엠엘
3년 전
https://www.google.com/search?q=mysql+%EC%9D%B8%EB%8D%B1%EC%8A%A4%EB%9E%80
참고하세요.
엑스엠엘
3년 전
php도 mysql도
날짜 구하는 함수가 있습니다.
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html
https://www.php.net/manual/en/function.date.php

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

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

이거 뜻이

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

index에 포함이란건

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

 

 

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

답변에 대한 댓글 1개

엑스엠엘
3년 전
어떤 query 문이 있느냐에 따라 다릅니다.
캡쳐하신 이미지에 보이는 인덱스들에는 wr_datetime이 없으니
아예 인덱스를 활용할 후보조차 안 되는군요.

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

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

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

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

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

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

세크티
3년 전

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

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

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

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

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

로그인