Extra Form
PHP PHP 7.2
CMS XpressEngine

XE에 회원 그룹을 db에 저장하는데 요상한 것이 오래전부터 있습니다. 아시는 분은 아시고 계실텐데요.

 

그룹번호    회원번호    날짜

3               1234          x일

3               1234          y일

3               1234          z일

3               1234          a일

 

이런식으로 되어 저장을 합니다. 

 

그래서 어떤 회원은 1개만 기록 되어 있는 경우도 있고 어떤 회원은 불필요하게 여러개 가진 경우도 있습니다.

 

 

어제 사이튼 운영기간 최초로 그룹지정해서 단체쪽지를 보냈다가 저런 것 때문에 같은 회원이 target에 반복해서 수집되는 바람에 중복문자가 나가 제가 수작업으로 하나하나 다 지우느라 고생좀 했습니다.

 

1.XE는 왜 어떤 상황에서 저렇게 중복해서 계속 저장하는 건가요??

 

 

 

2.그래서 보통 코어에서 회원그룹 가져올때  배열에 가져온다운 중복은 1개만 뽑는 걸로 압니다.

 

제가 어제 사용한 모듈의 쿼리 입니다.

 

<query id="getMemberTotalsByGroup" action="select">
    <tables>
        <table name="member" alias="member"/>
        <table name="member_group_member" alias="member_group"/>
    </tables>
    <columns>
        <column name="member.member_srl" alias="member_srl" />
        <column name="member_group.group_srl" alias="group_srl" />
    </columns>
    <conditions>
        <condition operation="in" column="member_group.group_srl" var="group_srls" notnull="notnull" />
        <condition operation="equal" column="member.member_srl" var="member_group.member_srl" pipe="and" notnull="notnull" />
    </conditions>
    <navigation />
</query>
 

쿼리에서 중복을 아예 제거하게 할 수 있을까요 ?? 아니면  php에서 해줘야 할까요?

 

 

위 쿼리가 사용되는 곳이

            case -2: // 특정 그룹 
                $args->receiver_group = Context::get('receiver_group');
                $receiver_list = explode('|@|', $args->receiver_group);
                if(!count($receiver_list)) return new BaseObject(-1, 'msg_check_group');

                $receiver_count = count($receiver_list);
                $group_srl_list = array();
                for($i=0;$i<$receiver_count;$i++) {
                    $group_srl = (int)trim($receiver_list[$i]);
                    if(!$group_srl) continue;
                    $group_srl_list[] = $group_srl;
                }

                // 그룹에 해당하는 회원정보 구해옴
                $output = $this->getMemberListWithin($group_srl_list);
                if(!$output->toBool()) return $output;
                $groups_data = $output->data;
                foreach($groups_data as $key => $val) {
                    $target[] = $val->member_srl;
                }

 

 

 

 

 

 

        /**
         * @brief 그룹에 해당하는 회원목록을 구함 (관리자)
         **/
        function getMemberListWithin($group_srl) {
            $args->group_srls = implode(',',$group_srl);
            return executeQuery('msg_admin.getMemberTotalsByGroup',$args);
        }

 

여기 입니다.

 

 

 

1,2 두가지가 궁금합니다.

  • profile
            /**
             * @brief 쪽지보내기 (관리자용)
             **/
            function procMsg_adminAdminInsert() {
    // 필수 정보들을 미리 추출
                $args = Context::gets('title','content','receiver_target');
    
    // 변수 검사
    $title = trim($args->title);
    $content = trim($args->content);
    if(!$title) return new BaseObject(-1, 'msg_title_is_null');
    if(!$content) return new BaseObject(-1, 'msg_content_is_null');
    
                // 로그인정보 구해옴
    $logged_info = Context::get('logged_info');
    
    // receiver_target에 따라 받는이 지정
    $oMemberModel = &getModel('member');
                $oCommunicationController = &getController('communication');
    $target = array();
    switch ($args->receiver_target) {
                case -1: // 특정 사용자
        $args->receiver_value = Context::get('receiver_value');
                    $receiver_list = explode('|@|', $args->receiver_value);
                    if(!count($receiver_list)) return new BaseObject(-1, 'null_user_id');
    
        $receiver_count = count($receiver_list);
                    for($i=0;$i<$receiver_count;$i++) {
                        $user_id = trim($receiver_list[$i]);
    $member_srl = $oMemberModel->getMemberSrlByUserID($user_id);
                        if(!$user_id || !$member_srl) continue;
                        $target[] = $member_srl;
                    }
    break;
                case -2: // 특정 그룹 
        $args->receiver_group = Context::get('receiver_group');
                    $receiver_list = explode('|@|', $args->receiver_group);
                    if(!count($receiver_list)) return new BaseObject(-1, 'msg_check_group');
    
        $receiver_count = count($receiver_list);
                    $group_srl_list = array();
                    for($i=0;$i<$receiver_count;$i++) {
                        $group_srl = (int)trim($receiver_list[$i]);
                        if(!$group_srl) continue;
    $group_srl_list[] = $group_srl;
                    }
    
                    // 그룹에 해당하는 회원정보 구해옴
                    $output = $this->getMemberListWithin($group_srl_list);
                    if(!$output->toBool()) return $output;
    $groups_data = $output->data;
                    foreach($groups_data as $key => $val) {
                        $target[] = $val->member_srl;
                    }
    break;
                default: // 전체 사용자
                    // 전체 회원정보 구해옴
                    $output = $this->getMemberTotal();
                    if(!$output->toBool()) return $output;
                    if(!$output->data) break;
                    $members_data = $output->data;
                    foreach($members_data as $key => $val) {
                        $target[] = $val->member_srl;
    }
                    break;
                }
    
                if(!count($target)) return new BaseObject(-1,'msg_not_founded');
    
    // 쪽지 발송
    foreach($target as $receiver_srl) {
    if($receiver_srl == $logged_info->member_srl) continue;
        $output = $oCommunicationController->sendMessage($logged_info->member_srl, $receiver_srl, $title, $content);
                    if(!$output->toBool()) continue;
    }
    
                $this->add('message_type', Context::get('message_type'));
    $this->add('page', Context::get('page'));
    
    $this->setMessage("success_registed");
            }

     

     

                // receiver_target에 따라 받는이 지정
                $oMemberModel = &getModel('member');
                $oCommunicationController = &getController('communication');
                $target = array();
                $target = array_unique($target);   // 이렇게 추가하면 중복이 잘 제거 되는건가요????
                switch ($args->receiver_target) {

     

    20번째 줄 $target = array(); 요 배열을 중복 제거 해주면 될까요???