BOARD

강좌·기초

그누보드 이번달 포인트 순위 랭킹 출력하기

페이지 정보

profile_image
작성자 최고관리자
댓글 0건 조회 6회 작성일 26-10-14 17:07

본문

그누보드 이번달 포인트 순위 랭킹 출력하기

그누보드 운영 중 사이트 내에서 이번달 포인트 순위를 집계하여 보여주는 코드를 직접 구현하려는 운영자·개발자를 위해, 회원 테이블과 포인트 테이블을 조인하여 월별 적립 포인트를 계산하고 랭킹을 출력하는 구체적인 SQL 쿼리와 반복문 출력 방법을 안내합니다.

이번달 포인트 순위 랭킹 SQL 쿼리 및 구현 방법

그누보드4 및 그누보드5 환경에서 이번달 포인트 순위를 집계하려면 회원 테이블(member_table)과 포인트 테이블(point_table)을 조인(LEFT JOIN)하고, 날짜 조건을 지정해야 합니다.

1. 이번달 포인트 집계 SQL 쿼리 및 날짜 조건 처리

날짜 조건은 date_format() 함수를 사용하여 point_table(B)의 적립 일시(po_datetime) 필드를 연-월('%Y-%m') 형태로 변환한 뒤, 현재 월 문자열과 비교하여 처리합니다.

<?php
$nowdate = date("Y-m", time()); // 이번달 (예: 2023-08)

$sql = "SELECT *, COUNT(B.mb_id) AS count, SUM(B.po_point) AS point \
 FROM {$g5['member_table']} AS A \
 LEFT JOIN {$g5['point_table']} AS B \
 ON (A.mb_id = B.mb_id AND A.mb_level < 10 AND A.mb_point >= 0) \
 WHERE date_format(B.po_datetime, '%Y-%m') = '{$nowdate}' \
 GROUP BY B.mb_id \
 ORDER BY point DESC \
 LIMIT 0, 10";

$result = sql_query($sql);
?>
  • 그누보드4 환경에서는 {$g5[...]} 대신 $g4['member_table'] 및 $g4['point_table'] 배열 변수를 사용합니다.
  • A.mb_level < 10 및 A.mb_point >= 0 조건으로 특정 레벨 및 포인트 조건을 제한할 수 있습니다.

2. 반복문을 통한 랭킹 HTML 출력

sql_query()로 받아온 결과셋은 sql_fetch_array() 반복문을 통해 순위별로 출력할 수 있습니다.

<table width="100%">
<?php 
for ($i = 1; $row = sql_fetch_array($result); $i++) { 
 $name = get_sideview($row['mb_id'], $row['mb_nick'], $row['mb_email'], $row['mb_homepage']); 
 $point = number_format($row['point']);
?>
 <tr> 
 <td><?php echo $i;?></td> 
 <td><?php echo $name;?></td> 
 <td align="right"><?php echo $point;?></td> 
 </tr> 
<?php }?> 
</table>

이번달 포인트 순위 랭킹 출력 방법

집계된 이번달 포인트 결과셋을 반복문으로 받아 웹 페이지에 상위 순위 회원 정보와 HTML 랭킹 테이블로 출력하려면 sql_query와 sql_fetch_array 함수를 활용한 반복문 코드를 사용합니다.

반복문 및 HTML 출력 코드 예시

그누보드4(G4) 환경에서는 다음과 같이 sql_query로 실행한 결과셋을 sql_fetch_array 반복문으로 순회하며 출력할 수 있습니다.

<table width="186" border="0" cellspacing="1" cellpadding="0">
 <col width="25" />
 <col />
 <col width="30" />
 <?php 
 for ($i=1; $point_row=sql_fetch_array($point_result); $i++) { 
 $point_name = get_sideview($point_row[mb_id], $point_row[mb_id], $point_row[mb_email], $point_row[mb_homepage]); 
?> 
 <tr> 
 <td><img src="img/ranking_<?php echo $i;?>.jpg" alt="" /></td> 
 <td style="padding-left:5px;"><?php echo $point_name;?></td> 
 <td align="right" style="padding-right:2px;"><?php echo number_format($point_row[point]);?></td> 
 </tr> 
 <?php }?> 
 </table>

그누보드5(G5) 및 아미나빌더 환경에서는 배열 키 접근 방식과 테이블 구조에 맞추어 아래와 같이 반복문을 구성할 수 있습니다.

<table width="100%">
 <tr> 
 <td colspan="3" style="text-align:center; background-color:#39F; font-size:1.2em; font-weight:bold; color:#fff; line-height:30px; padding:3px 0;">
 포인트 순위 <span style="font-size:0.9em;">(<?php echo substr($rank_nowdate, 0, 4)."년";?> <?php echo substr($rank_nowdate,5,2)."월";?>)</span> 
 </td> 
 </tr> 
 <?php 
 for ($i=1; $rank_row=sql_fetch_array($rank_result); $i++) { 
 $rank_member = sql_fetch("select mb_id, mb_nick, mb_email, mb_homepage from {$g5['member_table']} where mb_id = '".$rank_row['mb_id']."'"); 
 $rank_sideview = get_sideview($rank_member['mb_id'], cut_str($rank_member['mb_nick'], $config['cf_cut_name']), $rank_member['mb_email'], $rank_member['mb_homepage']); 
?> 
 <tr style="border-bottom:1px dotted #CCC;"> 
 <td style="width:70px; text-align:center; line-height:26px;"><?php echo $i;?></td> 
 <td><?php echo $rank_sideview;?></td> 
 <td style="text-align:right; padding-right:20px;"><?php echo number_format($rank_row['point']);?></td> 
 </tr> 
 <?php }?> 
 </table>

이번달 포인트 순위 랭킹 출력 시 관리자 제외 조건

그누보드에서 이번달 포인트 랭킹을 집계하고 출력할 때, 최고관리자나 특정 레벨 이상의 관리자 계정을 순위 목록에서 제외하려면 SQL 쿼리의 ON 또는 WHERE 조건절에 레벨 조건이나 최고관리자 아이디 제외 조건을 추가할 수 있습니다.

1. SQL 쿼리 조건 추가 방법

회원 테이블(member_table)과 포인트 테이블(point_table)을 조인하는 쿼리에서 관리자 레벨(예: 레벨 10 이상)을 제외하려면 mb_level 조건을 적용합니다.

$rank_sql = "select *, count(B.mb_id) as count, sum(B.po_point) as point from {$g5['member_table']} as A left join {$g5['point_table']} as B on (A.mb_id = B.mb_id and A.mb_level < 10 and A.mb_point >= 0) where date_format(B.po_datetime,'%Y-%m') = '{$rank_nowdate}' group by B.mb_id order by point desc LIMIT 0, 10 ";
  • 레벨 조건: A.mb_level < 10 조건을 추가하여 최고관리자(일반적으로 레벨 10)를 목록에서 제외합니다.
  • 최고관리자 아이디 직접 제외: 전체 포인트 랭킹 등 다른 방식의 쿼리에서는 $sql_common = " and mb_id!= '{$config['cf_admin']}' "; 또는 mb_level < 9와 같은 조건을 조합하여 관리자 계정이 노출되지 않도록 설정할 수 있습니다.

2. 다음 행동

  • 사용하는 그누보드 버전(G4 또는 G5)에 맞춰 포인트 집계 쿼리문의 조인 조건에 mb_level 제한이 포함되어 있는지 확인합니다.
  • 테스트 계정이나 운영자 계정으로 포인트를 적립한 후, 랭킹 목록에서 관리자 계정이 정상적으로 제외되어 출력되는지 웹페이지 화면에서 확인합니다.

상황별 판단 및 행동 가이드

내 상황우선할 판단다음 행동
그누보드4(G4) 환경에서 이번달 포인트 순위를 출력하려는 경우$g4['member_table'], $g4['point_table'] 배열 변수와 date_format(B.po_datetime, '%Y-%m') 조건을 포함한 SQL 쿼리 적용포인트 적립 내역 테이블을 회원 테이블과 LEFT JOIN한 뒤 sql_query()로 상위 랭커 데이터 추출
그누보드5(G5) 또는 아미나빌더 환경에서 월별 랭킹을 구현하는 경우{$g5['member_table']} 및 {$g5['point_table']} 변수를 사용하는 쿼리문 구조 선택sql_fetch_array() 반복문과 number_format(), get_sideview() 함수를 결합해 HTML 순위 표 출력
랭킹 목록에서 최고관리자나 특정 관리자 계정을 제외하려는 경우조인 조건 또는 검색 조건에 관리자 레벨(mb_level < 10)이나 관리자 아이디 제외 조건 추가쿼리문 내 mb_level < 10 조건이 포함되어 있는지 점검하고 테스트 계정으로 결과 확인

실전 FAQ

Q. 월별 포인트 집계 쿼리 실행 시 이번달 적립 포인트가 전부 0점으로 표시되거나 출력이 안 됩니다.

  • 실행 중 막히는 점: date_format(B.po_datetime, '%Y-%m') 조건문에서 날짜 포맷 형태가 맞지 않거나 point_table(g5_point)에 해당 월 데이터가 존재하지 않을 때 발생합니다.
  • 대안 및 예외 처리: $nowdate = date("Y-m", time()); 변수가 올바른 'YYYY-MM' 형식으로 생성되는지 echo로 먼저 출력하여 확인하고, 포인트 테이블(po_datetime)에 해당 월 날짜 데이터가 실제로 적립되어 있는지 데이터베이스를 점검하세요.

참고자료

기타 참고자료

댓글목록

등록된 댓글이 없습니다.