XE의 요상한 회원 그룹 DB 기록 의문 그리고 코드 수정
CMS/프레임워크 | XE 1.x |
---|---|
개발 언어 | PHP 7.2 |
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 두가지가 궁금합니다.
댓글 1
* @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(); 요 배열을 중복 제거 해주면 될까요???