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

게시글 일정 시간 지난후 자동 삭제 (2023-01-25 12:50 수정)

 

[주] 이후 강좌수정내용의 업데이트가 안될수 있습니다.

본 강좌의 최신업데이트는 https://www.happyjung.com/lecture/2621 에서 확인가능합니다.

가급적 동일한 내용을 유지하려고 노력하지만, 우선 작업은 위 링크입니다.

 

본 팁은 테스트하지 않은 내용이므로 적용시 주의가 필요합니다.

그누보드5 / extend / daypass_del.php  를 생성하고 그속에 내용을 추가

<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가

// 특정게시판에 적용하고 싶을때  Start
$ttable = array('게시판1', '게시판2', '게시판3');
foreach($ttable as $t) {
    $tbo_table = $t;
// 특정게시판에 적용하고 싶을때  End

/*
// 전체게시판에 적용하고 싶을때  Start
$sql = "select * from `{$g5['board_table']}` order by bo_table asc ";
$result = sql_query($sql);
while($data = sql_fetch_array($result)) {
    $tbo_table = $data["bo_table"];
// 전체게시판에 적용하고 싶을때  End
*/
    
    sql_query(" delete from `{$g5['write_prefix']}{$tbo_table}` where wr_datetime < date_add(now(), interval -1 day) ");
    sql_query(" delete from `{$g5['board_new_table']}` where bn_datetime < date_add(now(), interval -1 day) and bo_table = '{$tbo_table}' ");
    
    // 게시판의 글 수
    $sql = " select count(*) as cnt from `{$g5['write_prefix']}{$tbo_table}` where wr_is_comment = 0 ";
    $row = sql_fetch($sql);
    $bo_count_write = $row['cnt'];
    
    // 게시판의 코멘트 수
    $sql = " select count(*) as cnt from `{$g5['write_prefix']}{$tbo_table}` where wr_is_comment = 1 ";
    $row = sql_fetch($sql);
    $bo_count_comment = $row['cnt'];    

    if (isset($_POST['proc_count'])) {
        // 원글을 얻습니다.
        //$sql = " select wr_id from `{$g5['write_prefix']}{$tbo_table}` where wr_is_comment = 0 ";
        $sql = " select a.wr_id, (count(b.wr_parent) - 1) as cnt from `{$g5['write_prefix']}{$tbo_table}` a, {$g5['write_prefix']}{$tbo_table} b where a.wr_id=b.wr_parent and a.wr_is_comment=0 group by a.wr_id ";
        $result = sql_query($sql);
        for ($i=0; $row=sql_fetch_array($result); $i++) {
            /*
            // 코멘트수를 얻습니다.
            $sql2 = " select count(*) as cnt from `{$g5['write_prefix']}{$tbo_table}` where wr_parent = '{$row['wr_id']}' and wr_is_comment = 1 ";
            $row2 = sql_fetch($sql2);
            */
            
            sql_query(" update `{$g5['write_prefix']}{$tbo_table}` set wr_comment = '{$row['cnt']}' where wr_id = '{$row['wr_id']}' ");
        }
    }
    
    // 공지사항에는 등록되어 있지만 실제 존재하지 않는 글 아이디는 삭제합니다.
    $bo_notice = "";
    $tmp_notice = "";
    if ($board['bo_notice']) {
        $tmp_array = explode(",", $board['bo_notice']);
        for ($i=0; $i<count($tmp_array); $i++) {
            $tmp_wr_id = trim($tmp_array[$i]);
            $row = sql_fetch(" select count(*) as cnt from `{$g5['write_prefix']}{$tbo_table}` where wr_id = '{$tmp_wr_id}' ");
            if ($row['cnt']) {
                $bo_notice .= $tmp_notice . $tmp_wr_id;
                $tmp_notice = ",";
            }
        }
    }
    $sql = " update `{$g5['board_table']}` set ";
    if ($bo_notice) $sql .= " bo_notice = '{$bo_notice}', ";
    $sql .= " bo_count_write = '{$bo_count_write}', ";
    $sql .= " bo_count_comment = '{$bo_count_comment}' ";
    $sql .= " where bo_table = '{$tbo_table}' ";
    sql_query($sql);
}


참고자료
https://sir.kr/qa/149890

댓글 작성

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

로그인하기

댓글 72개

ㅊㅊ!! 특정 게시판도 부탁드려요 ㅠ
내용 일부 수정했습니다.
아마 저렇게 하면 될듯 싶네요...
감사합니다. 저번의 질문과 같이 링크하신 저 답변 작성자분의 팁대로 적용하였는데 글쓰기 시간의 24시간 뒤에 바로 삭제가 안되고 오늘 보니 글 써놓은지 2일 된 공지가 삭제되있더군요;;
아하.. 공지글인경우 삭제 예외조항을 추가할 필요가 있겠네요.
헉.. 적용시켜 봤더니 사이트 자체가 HTTP500 서버 오류가 뜨는군요.
코드 하나가 누락되었네요... 잠시만요
9번줄의 내용을 수정했습니다.
foreach($ttable as $t) 를
foreach($ttable as $t) { 이렇게 변경했습니다.
그래도 HTTP500 서버 오류가 뜹니다 ㅠ
네.. 일단 코드 오류가 더 있어서 수정했습니다.
500 에러는 확인해보겠습니다.
수정해주신 코드로 적용해보니 HTTP500 오류가 더 이상 뜨지 않습니다.
오늘 한번 테스트 해보겠습니당. 감사합니다.
소스 다시 변경했습니다.
1분으로 테스트 해봤는데.. 삭제가 되질 않습니다.
실행 조건이 어떻게 되는 지 알 수 있을까요?
조건은 wr_datetime < date_add(now(), interval -1 day 이렇게 변경해보세요
참고자료 : http://www.albumbang.com/board/board_view.jsp?board_name=free&no=143
빠르게 테스트해보려고 했는데 분이나 시간은 안되는 건가요?ㅠ
하루 기다려 봐야겠네요. 감사합니다.
wr_datetime < date_add(now(), interval -1 min 이렇게 변경하면 1분후가 되겠죠...
음.. 1분은 안되네염. 일단 1day로 해놓고 테스트 해볼게요.
감사합니다.
1분은 -1 min 이 아니고 -1 minute 였습니다.
1day 테스트 해보았습니다. 그런데 삭제가 안되네요. 글 쓴지 24시간 하고도 30분이 더 지났습니다 ㅠ
그런가요? 흐음... 쿼리에 부족함(?)이 있나 보네요.
방금 테스트를 해봤는데 정상 삭제되었습니다.
$ttable = array('111', '222', '333');
이렇게 게시판을 생성하고

sql_query(" delete from ".$g5['write_prefix'].$tbo_table." where wr_datetime < date_add(now(), interval -1 minute) ");

이렇게 1분후 삭제를 지시해봤습니다.

정상 삭제가 되었습니다.
1day로 설정해놨던 게시글은 방금 1minute으로 바꾸니 바로 삭제가 되더군요;
1day가 24hour 아닌가요?
그리고 혹시나 싶어서 글을 다시 쓰고 1분을 기다렸더니 역시나 또 삭제가 안됩니다.
도대체 어떤 조건으로 실행되는 건지 궁금합니다.
새로고침을 해야 extend 의 파일들이 작동합니다.
1분 경과후 새로고침 해보세요.
누군가의 접속이 있어야 시간체크를 하겠죠
당연히 새로고침을 해보고 테스트 해봤습니다.
로그인/로그아웃도 해보았고 사이트 재접속도 해보았습니다.
결론은 안되네요 ㅠㅠ 무언가에 문제가 있는 것 같습니다..
이거 누구 말을 믿어야 할지요,,ㅎ
확인을 위해 삽질을 일단 해야 하는지..ㅋ
질문있어요~ 게시판에 이미지가 있으면 이미지도 같이 삭제가되는 건가요?
첨부파일로 올린것은 같이 삭제됩니다.
에디터에서 업로드 한것은 삭제되지 않습니다.
폭파 후 새글 검색시 남아 있네요. ^^ 새글 화면에 제목은 안보이면서요 ....
아하.. 새글 g5_new 디비에도 글이 남아있었네요. ㅋㅋ...
QA 에 문의내용이 있어서 급조해서 만들었던거라서...
좋은 정보 감사 합니다.
고맙습니다. ^^
아미나 사용중입니다
게시물 삭제기능은 오류없이 잘 작동하고 있읍니다
삭제시 첨부이미지가 삭제되고 에디터로 올린 게시물이 삭제안된다고 하셧는데
현재 테스트중인데 첨부로 올린 게시물도 삭제 안되고 있읍니다
혹시 별다른 설정이 필요한건가요?
로직을 다시 살펴보니, 첨부파일 삭제쿼리가 없군요. ^^;;
글 삭제하기전에 첨부파일 확인해서 그파일을 삭제하는 로직이 먼저 돌아야 할듯 싶네요
만약 추가작업을 하게 된다면 컨텐츠몰에 등록할듯 싶습니다.
작업여부는 고민해보겠습니다.
컨텐츠몰에 관리화면에서 설정할수 있는 애드온으로 올려주시면 감사하겟읍니다
가능하시면 첨부파일과 에디터로 올린 이미지도 삭제할수 있엇으면 좋겟네요
사이트에 게시물이 많아지면서 기간정해서 기간날짜가 지난 게시물은 삭제하는게 사이트 운영에 많은 도움이 될거 같읍니다
저와같은 사이트운영하시는분들 위해서 꼭 작업해주셧으면 하는 바랩입니다
에디터로 올린 이미지 삭제는 안될듯 합니다.
본문에 포함된 이미지가 그 글에서 올린 건지, 다른 글에서 올린것을 복사해서 붙인건지 확인할 수 없습니다.
이것을 가능하게 하려면, 글 작성할때 에디터로 등록된건지를 기록하는 별도 로직이 필요합니다.

첨부파일은 삭제는 가능합니다.
조만간 작업해서 등록하겠습니다.
우선 좋은 팁 남겨주셔서 감사합니다.

저거 참고해서 만들어보고 있긴 한데요.. 지난글 포인트 삭감안되게 하려면 어떻게 해야 되나요?
지난글 포인트 삭감안되게라는게 무슨의미인지???
아~ 자동삭제할때마다 설정된 게시글 포인트를 차감되지 않나요?
자동삭제는 그냥 삭제될뿐입니다.
삭제로 인한 추가포인트 차감은 없습니다.
아~ 제말은 이해가 안갔나봐요..

정확히 얘기하면 게시글 작성 후 포인트 30점 주는 상태입니다.

게시글 삭제하면 바로 포인트 -30점 차감하게 되어있는 구조라.....

그런 얘기였어요.
정상적인(?) 글 삭제가 아니기때문에 차감은 없습니다 .^^
sql_query(" delete from ".$g5['write_prefix'].$tbo_table." where wr_datetime < date_add(now(), interval -1 day) ");
sql_query(" delete from ".$g5['new_win_table']." where wr_datetime < date_add(now(), interval -1 day) and bo_table = '".$tbo_table."' ");

혹시 이부분 -1 day 두개 다 바꿔야하나요?
네 -1 day 를 변경하면 삭제기간을 제어할 수 있습니다.
안녕하세요 꼭 필요한거가 여기있었네요!!! 삭제는 잘 작동되는데 다만 ..
공지사항을 항상 초기화 시켜버리네요 ...

공지를 작성 -> 새로 글을쓴다 -> 기존 공지글이 일반 글로 변함
공지글 작성 -> 새로운 공지그을 쓴다 -> 기존 공지글인 일반 글로 변함..

이걸 해제한 순정에서는 문제가 없습니다 ..
어떻게 수정하면 될까요 ..
공지글 체크하는 로직 위치를 변경했습니다.
본문을 다시 확인하셔서 사용해보세요
빠른 피드백 감사합니다 ^^ 공지 잘되네요
제가 아직 .. 초보라서 .. 혹시 공지는 삭제안되게 할려면 어떻게 설정해야될까요 ?
변경된 내용으로 적용하면 삭제되지 않은 게시글이 공지글인 경우에는 유지 될껍니다.
삭제되더라구요 ...
제가 처음에 말씀드렷던 공지가 해제되는 문제는 해결이됬는데
공지로 등록된 글들이 일반글과 같은 규칙으로 삭제되서 ...
공지글로 체크된것은 삭제가 안되길 원하시나 봅니다.
본 팁은 날짜 기준으로 삭제여부를 판단하는 것입니다.

공지글 여부를 먼저 판단하고 그것을 제외한 게시글만 삭제되도록 하려면
삭제 로직이 돌기전에 공지글은 게시글 작성일자를 삭제되지 않는 날짜로 변경하도록 하면 될듯 싶네요.
아 ! 그런거였군요
저는 이부분에서
// 공지사항에는 등록되어 있지만 실제 존재하지 않는 글 아이디는 삭제합니다.
공지를 안지워지개하는 방법이있는거구나 라고 착각을 한거였네요
답변 감사합니다!
혹시 new_win_table 테이블 삭제의 의미를 알수 있을까요?
해당 테이블은 새창관련 테이블인데
왠지 g5_board_new 테이블과 헷갈리신건 아닌지 궁금합니다.
지적하신 사항이 맞습니다.
new_win_table 를 board_new_table 로 수정했습니다.
제가 잘못알고 있을수도 있지만
위 쿼리에서 새글DB 까지 삭제해야 최근글에도 해당 글이 삭제되는데요

sql_query(" delete from {$g5['new_win_table']} where wr_datetime < date_add(now(), interval -1 day) and bo_table = '{$tbo_table}' ");

이 내용에서

{$g5['new_win_table']} 을 {$g5['board_new_table']} 로
wr_datetime 을 bn_datetime 으로 해야 될것 같습니다..
자동삭제가 아니고 자동으로 닫혔다가 나중에 관리자가 다시 풀어주게도 할 수 있는지요?
즉 일정 시간이 지나면 삭제가 아니고 자동으로 비밀글이 된다던지요...
감사합니다
자동삭제가 아니고 자동으로 닫혔다가 나중에 관리자가 다시 풀어주게도 할 수 있는지요?
>> 게시글 리스트에는 존재하게 되겠죠? 이것을 안보이게 하려면 스킨의 list 가져오는 것을 많이 수정해야 합니다.

즉 일정 시간이 지나면 삭제가 아니고 자동으로 비밀글이 된다던지요...
>> 비밀글은 목록에 노출되겠죠? 읽을 권한이 없을뿐...
해피정님~ 질문 또 있어요~ 일정시간이 지나면 게시글 자동 삭제되잖아요.

게시글, 추천 그대로 놔두고 오직 댓글만 삭제하려면 어디서 주석 달아야 할까요?
sql_query(" delete from {$g5['write_prefix']}{$tbo_table} where wr_datetime < date_add(now(), interval -1 day) ");
sql_query(" delete from {$g5['board_new_table']} where wr_datetime < date_add(now(), interval -1 day) and bo_table = '{$tbo_table}' ");

를 아래와 같이 변경하면 댓글만 삭제가 될듯 싶습니다.

sql_query(" delete from {$g5['write_prefix']}{$tbo_table} where wr_datetime < date_add(now(), interval -1 day) ") and wr_is_comment = 1;
//sql_query(" delete from {$g5['board_new_table']} where wr_datetime < date_add(now(), interval -1 day) and bo_table = '{$tbo_table}' ");
오~ 정말 감사합니다~

한번 테스트 해볼게요~ ^^

--------------------------------------------------------------------
테스트해보니 "syntax error, unexpected '='" 에러 나오네요... ㅠ.ㅠ

혹시 몰라서
sql_query(" delete from {$g5['write_prefix']}{$tbo_table} where wr_datetime < date_add(now(), interval -1 day) ") and wr_is_comment = 1;
에서

sql_query(" delete from {$g5['write_prefix']}{$tbo_table} where wr_datetime < date_add(now(), interval -1 day) and wr_is_comment = 1");
으로 바꿨더니 작동되네요..

문제는 리스트에 있는 코멘트 숫자는 그대로 남아있어서.. 이거 댓글 삭제됐으니 리스트에 있는 코멘트숫자도 같이 없애는 방법이 없을까요?
아... 제가 코드를 적으면서 실수를 했군요. -_-;;;
다시 확인해보니 게시판 리카운트하면 해결되네요~

정말 감사합니다.
게시글수 리카운트가 공지글이 있을때만 처리되도록 되어있었네요.
그것을 공지글과 관계없이 리카운트 되도록 내용 수정했습니다.
새로 적용해보니까 공지글에 메인, 공지 체크해놔도 풀어버리네요.;;;
정말 좋은 자료 감사드립니다.
추가적으로 삭제가 되버리면 어떤글이 삭제가 되었는지 확인할길이 없으니
휴지통처럼 특정 게시판에 옮기고 원글은 삭제할수는 없을까요?
sql_query(" delete from {$g5['board_new_table']} where wr_datetime < date_add(now(), interval -1 day) and bo_table = '{$tbo_table}' ");

이 부분은

wr_datetime 에서 bn_datetime 수정해야 할듯 싶어요.


지난번에

sql_query(" delete from {$g5['board_new_table']} where wr_datetime < date_add(now(), interval -1 day) and bo_table = '{$tbo_table}' ");

이거 새댓글 삭제하려면..

// 댓글 삭제
sql_query(" delete from {$g5['write_prefix']}{$tbo_table} where wr_datetime < date_add(now(), interval -1 day) ") and wr_is_comment = 1;
// 새댓글 삭제
sql_query(" delete from {$g5['board_new_table']} where bn_datetime < date_add(now(), interval -1 minute) and bo_table = '{$tbo_table}' and wr_parent <> wr_id");

쿼리문 맞는건지.. 이렇게 하면 될까요?


그리고.. 버그가 2가지 있는데..

댓글 수 안먹히는거 같고..
sql_query(" update {$g5['write_prefix']}{$tbo_table} set wr_comment = '{$row['cnt']}' where wr_id = '{$row['wr_id']}' ");

if (isset($_POST['proc_count'])) {
생략..
}

이 부분은 안먹혀서 지웠더니.. 댓글수 정상 작동되네요..



공지는 아무리 해도 다 풀립니다.. ㅠ.ㅠ
@언젠간 wr_datetime 에서 bn_datetime 수정했습니다
필요해서 삽질해야 하는데 여기 딱 있네요. 늘 유용한 팁 감사합니다.
특정 그룹의 게시판 전체에 적용하려면 어떻게 해야 하는지 부끄럽지만 질문드립니다.
--왕초보---

게시판 목록

그누보드5 팁자료실

글쓰기
🐛 버그신고