게시판에서 생성된 게시글 중 제가 원하는 게시글들에 동일한 댓글을 한번에 넣어려고 시도 중인데요.

 

검색을 해보니 비슷한 사례가 있어서 아래와 같이 디비에서 직접 입력했습니다.

 

UPDATE  
  xe_comments
SET 
  content = '입력하고자 하는 내용'
WHERE 
  document_srl IN (525566,원하는 문서번호.......)

 

해당 문서 댓글을 보면 아래와 같이 디비에서 입력한 댓글 내용이 중복해서 등록이 되는데요. 혹시 댓글이 한번만 등록이 되게끔 할 수 없을까요? 

2023-12-30 09,33,38.JPEG

 

문서번호 525566에 등록된 댓글

2023-12-30 09,48,30.JPEG

 

 

 

 

  • profile

    원하시는 동작이 정확히 무엇인지 모르겠습니다만,

    입력하신 쿼리는 해당 글에 이미 달려 있는 댓글의 내용을 일괄 변경하는 쿼리입니다.

    즉, 이미 달려 있는 댓글 갯수만큼 중복으로 등록되고,

    이미 달려 있는 댓글이 0개라면 아무 일도 일어나지 않습니다.

     

    만약 새 댓글을 작성하시려면 SQL로는 안됩니다.

    PHP를 사용해서 댓글 모듈의 insertComment() 함수를 호출하는 방식으로 구현해야

    댓글과 관련된 모든 데이터가 일관성있는 상태로 저장됩니다.

     

    예를 들어 새 댓글이 작성되면 시퀀스값도 업데이트되고,

    comments_list의 정렬 데이터도 변경되고,

    documents에서 해당 글의 댓글 수도 업데이트해 주어야 하는데,

    comments 테이블을 임의로 조작하면 이런 부분이 서로 맞지 않아서 댓글이 안 보이거나,

    심하면 시퀀스값이 꼬여서 앞으로 댓글 작성이 불가능해질 수도 있습니다.

  • profile ?
    네 새 댓글을 일괄 작성하려고 한 부분인데 sql로는 안되는 부분인거군요. 답변감사합니다
  • profile

    꼼수입니다. 그래도 db 쿼리로 바로 insert하는 것보다는 나을 듯해요.

    다만 몇 가지 전제가 있습니다.

    현재 접속한 회원이 관리자이고,

    달고자 하는 댓글이 대댓글이 아니며,

    댓글에 첨부파일이 없으며,

    타겟 문서가 잠금 상태가 아니며,

    삽입할 댓글 내용에 유니코드 심볼이 없다는 전제.

     

    1. 

    board.view.php의 적당한 곳. 예컨대 202행쯤 ( https://github.com/rhymix/rhymix/blob/7a7cdb6389072d624abb8e324653811b5ef3df0f/modules/board/board.view.php#L202 )쯤에 다음 코드를 붙여넣기해보세요.

    if ($this->user->is_admin === 'Y')
    {
        $target_srls = '문서번호, 문서번호, 문서번호';
        $target_list = array_map('trim', explode(',', $target_srls));
    
        $obj = new stdClass();
        $obj->content = '입력하고자 하는 내용';
        $obj->notify_message = 'Y'; // 대댓글 알림
        $obj->is_secret = 'N'; // 공개 댓글
    
        $oCommentController = getController('comment');
        foreach ($target_list as $target_srl)
        {
            $oDocument = DocumentModel::getDocument($target_srl);
            if (!$oDocument->isExists())
            {
                continue;
            }
    
            $obj->module_srl = $oDocument->get('module_srl');
            $obj->document_srl = intval($target_srl);
            $output = $oCommentController->insertComment($obj);
        }
    }

     

    2. 

    관리자 계정으로 들어가서 아무 게시판에나 딱 한번만 접근.

    그리고 board.view.php 파일에 붙여넣기했던 위 코드를 지우고 얼른 원본 파일로 복구합니다.

     

    3.

    그리고 해당 문서들을 열어보면 왠지 댓글이 달려 있을 듯합니다.

  • profile ?

    답변 감사합니다.

     

    운영중인 사이트 ( https://martmonster.com/seoul/2027?read_review_tab=evaluation )의 행사&소식 탭은 게시판의 댓글 영역이구요. 여기는 관리자만 댓글을 달수 있고 이러한 형태의 문서가 지역별 게시판로 천여개 정도 등록되어있습니다.

    동일한 내용의 댓글을 제가 희망하는 수십에서 수백개의 문서들에 자동으로 한번에 넣을 수 없을까 고민 중에 있었구요.

     

    우선 게시판 A에서 테스트로 생성한 문서번호 2개( 13282번과 13284 )를 알려주신 팁에 아래와 같이 적용을 했습니다.

     

    1. 게시판 글쓰기 댓글허용 및 공개 문서 관리자 로그인 테스트 글 작성 했습니다.

    1111.JPEG

     

    2.  board.view.php   :  $target_srls = '문서번호, 공백문서번호';

    1.JPEG

     

    이렇게 적용하고 관리자 로그인 상태에서 해당 테스트 게시판으로 접근, 목록 및 보기를 눌러보면 해당 문서 댓글에 아무런 내용이 등록되어 있지 않는데 혹시 제가 팁 적용을 잘못한 걸까요?

  • ? profile
    뭔가 빠진 게 있을 수 있는데 자세한 건 디버깅을 해봐야 알 것 같아요. 오류 메시지나 에러 로그를 확보해보세요.
  • profile ?
    네 확인 해보겠습니다. 답변 감사합니다.
  • ? profile

    이렇게 바꾸니 되는 것 같습니다.

     

    if ($this->user->is_admin === 'Y')
    {
        $target_srls = '문서번호, 문서번호, 문서번호';
        $target_list = array_map('trim', explode(',', $target_srls));
    
        $obj = new stdClass();
        $obj->content = '입력하고자 하는 내용';
        $obj->notify_message = 'Y'; // 대댓글 알림
        $obj->is_secret = 'N'; // 공개 댓글
        $obj->nick_name = $this->user->nick_name;
    
        $oCommentController = getController('comment');
        foreach ($target_list as $target_srl)
        {
            $oDocument = DocumentModel::getDocument($target_srl);
            if (!$oDocument->isExists())
            {
                continue;
            }
    
            $obj->module_srl = $oDocument->get('module_srl');
            $obj->document_srl = intval($target_srl);
            if (isset($obj->comment_srl))
            {
                $obj->comment_srl = null;
            }
            $output = $oCommentController->insertComment($obj, true);
        }
    }