sir의 인기글 게시판과 같은 것이 구현되는 방법이 궁금합니다.
관련링크
본문
답변 2
요약하자면 hit 게시판 DB 테이블(링크를 걸기 위한 정보(게시판 id, 글 id)만 저장하기 위한 용도)을 만들어 놓고,
게시판별로 조회수, 추천수 등 인기게시판에 등록되기 위한 조건을 지정해놓습니다. (이건 게시판별 여분컬럼을 쓰셔도 되고 따로 인기게시판 조건용 테이블을 만드시면 됩니다)
ex) g5_hit, g5_hit_cond 만듦
g5_hit는 bo_table, wr_id, move_datetime 갖고 있음 (인기게시판 쪽에서 정렬조건(좋아요순, 조회순)까지 쓰고 싶으시다면 wr_good, wr_hit 등의 컬럼을 추가합니다. 다만 이렇게 되면 일반게시판들 글 읽을 때마다 g5_hit에 옮겨진 글이면 일일이 update문을 적용해줘야 할 겁니다. 아니면 게시판을 통테이블로 쓰거나)
g5_hit_cond는 bo_table, wr_hit, wr_good, wr_nogood 갖고 있음 (조건이 될 컬럼들)
옮기실 때 인기글의 조건을 여러 개로 정할지, 각각의 조건만 만족해도 인기게시판으로 옮기실지는 자유입니다
각 게시판에 해당 글이 이미 hit에 옮겨졌는지를 확인하는 boolean 용도의 컬럼 하나를 사용하여 (여분컬럼 쓰시면 될 겁니다)
해당 글을 view할 때, hit에 옮겨지지 않은 글 중에서 조건에 맞으면
아까 만들었던 hit 게시판 DB 테이블에 게시판 id와 글 id를 넘겨 레코드를 등록합니다
다만 추천 비추천에 따라 유동적으로 인기게시판에서 빠지거나 재등록되어야 하는 경우라면
해당 글을 view할 때, hit에 옮겨진 글 중에서 조건을 다시 확인하여 hit 게시판에서 다시 delete 해줘야 될 거에요
아래 확인해보세요
ex) g5_write_xxx (게시판 테이블)의 wr_1을 인기게시판에 등록되었는지의 여부로 사용
글을 봤을 때 (view.php)
// 인기글이든 아니든 view할 때마다 조건 확인 필요
$sql = "SELECT * FROM g5_hit_cond WHERE bo_table = '{$bo_table}'";
$hit_cond = sql_fetch($sql); // 조건 가져옴
if($view['wr_hit'] >= $hit_cond['wr_hit'] && $view['wr_good'] >= $hit_cond['wr_good'] && $view['wr_nogood'] <= $view['wr_nogood']){ // 예를 들어서
$hit_move = true;
}else{
$hit_move = false;
}
if(!$view['wr_1']){ // 아직 hit테이블에 옮겨지지 않은 경우
if($hit_move){ // 옮긴다
$sql = "INSERT INTO g5_hit ~~~~~~";
$result = sql_query($sql); // result에 따라 try catch문으로 에러 처리
}
}else{ // 이미 옮겨진 경우
if(!$hit_move){ // 비추천이 많아지거나 등으로 조건을 비충족하게 되었으므로 다시 제거한다
$sql = "DELETE FROM g5_hit WHERE ~~~~ LIMIT 1";
$result = sql_query($sql); // result에 따라 try catch문으로 에러 처리
}
}
이제 hit.php 와 같은 인기글 페이지로 가면 g5_hit 테이블을 읽게 하여 인기게시판 페이지를 구성합니다.
기본적으로는 옮겨진 시간(move_datetime)으로 하여 내림차순이 좋다고 봅니다만
따로 wr_hit이나 wr_good으로도 정렬하고 싶으시다면
위에 써놓은 것처럼 일반게시판에서 view할 때마다 g5_hit에 옮겨진 글들도 같이 UPDATE를 해줘야하기 때문에 그누보드처럼 게시판별로 테이블을 따로 사용하는 경우라면 리소스를 더 먹을 수 있습니다.
그리고 인기게시판 조건은 함수화해서 라이브러리에 넣어놓으시면 좋을 것입니다
function is_this_hit($wr_hit, $wr_good, $wr_nogood){
// 조건에 따라 return true, return false
}
제가 아는 방법은 이렇습니다만 더 효율적이고 좋은 방법이 많을 겁니다.
질문자님 사이트의 상황에 맞춰서 커스터마이징 해보세요.
!-->