웹마스터 팁
주민등록 입력 폼 1.2.0
2009.04.10 16:19
에고.. 왠지 버젼이 바뀔때 마다 기존에 적은걸 다시 적는 기분이 드네요 ㅡㅡ;;
기존에 올렸던 주민등록 입력 폼에 많은 분들이 문의 해주신 내용들과 불편했던 내용들을 한꺼번에 다시 한번 정리 했습니다.
1.2.0 버젼 기준으로 좀더 세세하게 다시 수정 하였습니다.
첨부 파일은 1.2.0 full 새로 다운 받아서 아래 내용만 수정 하였습니다.
아래 내용 작성 끝나면 다시 삭제될 자료 ;;;
1. DB Tool
개인 서버 사용자 -
http://www.navicat.com/download.html - non-commercial(Free) - lite version 으로 다운 받으시면 됩니다.
비 상업사이트에 한해 무료 제공인듯 합니다.
해당 sql서버에 직접 접속이 가능하다면 프로그램은 개인 로컬PC에 설치하고 원격으로 서버에 접속도 가능합니다.
호스팅 업체 사용자 -
http://www.phpmyadmin.net/home_page/downloads.php
설치 후 웹페이지를 통해 접속하는 프로그램입니다.
아래 설명은 navicat 기준으로 설명합니다.
1. DBTool 을 사용하여 xe_member 테이블의 디자인 보기를 선택합니다.
2. insert field 를 (필드 삽입)을 선택하여 jumin - char(13) 으로 필드를 생성 합니다.
3. /xe/modules/member/skins/default/filter/signup.xml
<filter name="signup" module="member" act="procMemberInsert" extend_filter="member.getJoinFormList" confirm_msg_code="confirm_submit">
<form>
<node target="user_id" required="true" minlength="2" maxlength="80" filter="userid" />
<node target="password1" required="true" minlength="6" maxlength="20" />
<node target="password2" required="true" minlength="6" maxlength="20" equalto="password1" />
<node target="user_name" required="true" minlength="2" maxlength="40" />
<node target="nick_name" required="true" minlength="2" maxlength="40" />
<node target="email_address" required="true" minlength="1" maxlength="200" filter="email"/>
<node target="jumin" required="true" minlength="13" maxlength="13" filter="jumin"/>
</form>
<parameter>
<param name="accept_agreement" target="accept_agreement" />
<param name="member_srl" target="member_srl" />
<param name="user_id" target="user_id" />
<param name="password" target="password1" />
<param name="user_name" target="user_name" />
<param name="nick_name" target="nick_name" />
<param name="jumin" target="jumin" />
<param name="homepage" target="homepage" />
<param name="blog" target="blog" />
<param name="birthday" target="birthday" />
<param name="allow_mailing" target="allow_mailing" />
<param name="email_address" target="email_address" />
</parameter>
<response callback_func="completeInsert">
<tag name="error" />
<tag name="message" />
<tag name="redirect_url" />
</response>
</filter>
4. /xe/modules/member/queries/insertMember.xml
<query id="insertMember" action="insert">
<tables>
<table name="member" />
</tables>
<columns>
<column name="member_srl" var="member_srl" filter="number" notnull="notnull" />
<column name="user_id" var="user_id" filter="userid" notnull="notnull" />
<column name="email_address" var="email_address" filter="email" notnull="notnull" />
<column name="password" var="password" notnull="notnull" />
<column name="email_id" var="email_id" notnull="notnull" />
<column name="email_host" var="email_host" notnull="notnull" />
<column name="user_name" var="user_name" notnull="notnull" minlength="1" maxlength="40" />
<column name="nick_name" var="nick_name" notnull="notnull" minlength="1" maxlength="40" />
<column name="homepage" var="homepage" />
<column name="jumin" var="jumin" />
<column name="blog" var="blog" />
<column name="birthday" var="birthday" />
<column name="allow_mailing" var="allow_mailing" default="Y" />
<column name="allow_message" var="allow_message" default="Y" />
<column name="denied" var="denied" default="N" />
<column name="limit_date" var="limit_date" />
<column name="regdate" var="regdate" default="curdate()" />
<column name="last_login" var="last_login" default="curdate()" />
<column name="is_admin" var="is_admin" default="N" />
<column name="description" var="description" />
<column name="extra_vars" var="extra_vars" />
</columns>
</query>
5. /xe/modules/member/queries/getMemberSrl.xml
<query id="getMemberSrl" action="select">
<tables>
<table name="member" />
</tables>
<columns>
<column name="member_srl" />
</columns>
<conditions>
<condition operation="equal" column="user_id" var="user_id" pipe="and" />
<condition operation="equal" column="email_address" var="email_address" pipe="and" />
<condition operation="equal" column="nick_name" var="nick_name" pipe="and" />
<condition operation="equal" column="jumin" var="jumin" pipe="and" />
</conditions>
</query>
6.xe/modules/member/tpl/js/signup_check.js
- line 17
function memberSetEvent() {
var fo_obj = xGetElementById('fo_insert_member');
for(var node_name in fo_obj) {
var obj = fo_obj[node_name];
if(!obj || typeof(obj.nodeName)=="undefined" || obj.nodeName != "INPUT") continue;
if(node_name != "user_id" && node_name != "nick_name" && node_name != "email_address" && node_name!="jumin") continue;
xAddEventListener(obj, 'blur', memberCheckValue);
}
}
7. /xe/modules/member/lang/ko.lang.php
-line 80
$lang->search_target_list = array(
'user_id' => '아이디',
'user_name' => '이름',
'nick_name' => '닉네임',
'email_address' => '메일주소',
'jumin' => 주민등록번호,
'regdate' => '가입일시',
'regdate_more' => '가입일시(이상)',
'regdate_less' => '가입일시(이하)',
'last_login' => '최근로그인일시',
'last_login_more' => '최근로그인일시(이상)',
'last_login_less' => '최근로그인일시(이하)',
'extra_vars' => '확장변수',
);
// 관리자 페이지에서 주민등록번호로 검사 필드 추가
- line 142 ~ 143 / line 165
$lang->msg_exists_jumin = '이미 존재하는 주민등록번호입니다. 계정도용이 의심 될 경우 관리자에게 연락 주세요.';
$lang->msg_false_jumin_no = '잘못된 주민등록번호 형식입니다.';
$lang->about_jumin = '- 를 제외한 숫자 13자리를 입력해 주세요.';
8. /xe/common/lang/ko.lang.php
- line 89
$lang->jumin = '주민등록번호';
- line 299
$lang->filter->invalid_jumin = '잘못된 %s 형식입니다.';
9. /xe/modules/member/skins/default/signup_form.html
- line 67
<tr>
<th><div>{$lang->jumin}</div></th>
<td>
<input type="password" name="jumin" id="jumin" value="" maxlength="13" class="inputTypeText"/> <input type="checkbox" name="foreigner" value="1" /> 외국인 (*외국인인 경우 체크 하세요)
<p>{$lang->about_jumin}</p>
</td>
</tr>
10. /xe/modules/member/member.controller.php
- line 501 ~ 514
/**
* @brief 회원 가입시 특정 항목들에 대한 값 체크
**/
function procMemberCheckValue() {
$name = Context::get('name');
$value = Context::get('value');
if(!$value) return;
$oMemberModel = &getModel('member');
// 로그인 여부 체크
$logged_info = Context::get('logged_info');
switch($name) {
case 'user_id' :
// 금지 아이디 검사
if($oMemberModel->isDeniedID($value)) return new Object(0,'denied_user_id');
// 중복 검사
$member_srl = $oMemberModel->getMemberSrlByUserID($value);
if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_user_id');
break;
case 'nick_name' :
// 중복 검사
$member_srl = $oMemberModel->getMemberSrlByNickName($value);
if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_nick_name');
break;
case 'email_address' :
// 중복 검사
$member_srl = $oMemberModel->getMemberSrlByEmailAddress($value);
if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_email_address');
break;
case 'jumin' : // 주민등록 번호 검사
// 형식 검사
if($oMemberModel->isTrueNumber($value)==false) return new Object(0,'msg_false_jumin_no');
//중복 검사
$member_srl = $oMemberModel->getMemberSrlByJumin($value);
if($member_srl && $logged_info->member_srl != $member_srl) return new Object(0,'msg_exists_jumin');
break;
case 'jumin2' : // 외국인 번호 검사.
// 형식 검사
if($oMemberModel->isTrueNumber2($value)==false) return new Object(0,'msg_false_jumin_no');
//중복 검사
$member_srl = $oMemberModel->getMemberSrlByJumin($value);
if($member_srl && $logged_info->member_srl != $member_srl) return new Object(0,'msg_exists_jumin');
break;
}
}
// 외국인가입이 필요없는 경우는 case 'jumin2' : 아래는 삭제 하셔도 됩니다.
- line 532
/**
* @brief 회원 가입
**/
function procMemberInsert() {
$oModuleModel = &getModel('module');
$config = $oModuleModel->getModuleConfig('member'+
'+
');
// 관리자가 회원가입을 허락하였는지 검사
if($config->enable_join != 'Y'+
') return $this->stop('msg_signup_disabled');
// 약관에 동의하였는지 검사 (약관이 있을 경우만)
if($config->agreement && Context::get('+
'accept_agreement')!='Y') return $this->stop('msg_accept_agreement');
// 필수 정보들을 미리 추출
$args = Context::gets('user_id','user_name','nick_name','jumin','homepage','blog','birthday','email_address','password','allow_mailing');
$args->member_srl = getNextSequence();
// 넘어온 모든 변수중에서 몇가지 불필요한 것들 삭제
$all_args = Context::getRequestVars();
unset($all_args->module);
unset($all_args->act);
unset($all_args->is_admin);
unset($all_args->description);
unset($all_args->group_srl_list);
unset($all_args->body);
unset($all_args->accept_agreement);
unset($all_args->signature);
// 메일 인증 기능 사용시 회원 상태를 denied로 설정
if ($config->enable_confirm == 'Y') $args->denied = 'Y';
// 모든 request argument에서 필수 정보만 제외 한 후 추가 데이터로 입력
$extra_vars = delObjectVars($all_args, $args);
$args->extra_vars = serialize($extra_vars);
// member_srl의 값에 따라 insert/update
$output = $this->insertMember($args);
if(!$output->toBool()) return $output;
// 로그인 시킴
if ($config->enable_confirm != 'Y') $this->doLogin($args->user_id);
$this->add('+
'member_srl', $args->member_srl);
if($config->redirect_url) $this->add('+
'redirect_url', $config->redirect_url);
if ($config->enable_confirm == 'Y') {
$msg = sprintf(Context::getLang('msg_confirm_mail_sent'), $args->email_address);
$this->setMessage($msg);
}
else $this->setMessage('success_registed');
}
- line 1444
/**
* @brief member 테이블에 사용자 추가
**/
function insertMember(&$args, $password_is_hashed = false) {
// trigger 호출 (before)
$output = ModuleHandler::triggerCall('member.insertMember', 'before', $args);
if(!$output->toBool()) return $output;
// 멤버 설정 정보에서 가입약관 부분을 재확인
$oModuleModel = &getModel('module');
$config = $oModuleModel->getModuleConfig('member');
$logged_info = Context::get('logged_info');
// 임시 제한 일자가 있을 경우 제한 일자에 내용 추가
if($config->limit_day) $args->limit_date = date("YmdHis", time()+$config->limit_day*60*60*24);
// 입력할 사용자의 아이디를 소문자로 변경
$args->user_id = strtolower($args->user_id);
// 필수 변수들의 조절
if($args->allow_mailing!='Y') $args->allow_mailing = 'N';
if($args->denied!='Y') $args->denied = 'N'+
';
$args->allow_message= 'Y';
if($logged_info->is_admin == 'Y') {
if($args->is_admin!='Y') $args->is_admin = 'N';
} else {
unset($args->is_admin);
}
list($args->email_id, $args->email_host) = explode('@', $args->email_address);
// 홈페이지, 블로그의 주소 검사
if($args->homepage && !preg_match("/^http:\/\//i",$args->homepage)) $args->homepage = 'http://'.$args->homepage;
if($args->blog && !preg_match("/^http:\/\//i",$args->blog)) $args->blog = 'http://'+
'.$args->blog;
// 모델 객체 생성
$oMemberModel = &getModel('member');
// 금지 아이디인지 체크
if($oMemberModel->isDeniedID($args->user_id)) return new Object(-1,'denied_user_id');
// 아이디, 닉네임, email address 의 중복 체크
$member_srl = $oMemberModel->getMemberSrlByUserID($args->user_id);
if($member_srl) return new Object(-1,'msg_exists_user_id');
$member_srl = $oMemberModel->getMemberSrlByNickName($args->nick_name);
if($member_srl) return new Object(-1,'msg_exists_nick_name');
$member_srl = $oMemberModel->getMemberSrlByEmailAddress($args->email_address);
if($member_srl) return new Object(-1,'msg_exists_email_address');
$member_srl = $oMemberModel->getMemberSrlByJumin($args->jumin);
if($member_srl) return new Object(-1, 'msg_exists_jumin');
$oDB = &DB::getInstance();
$oDB->begin();
// DB에 입력
$args->member_srl = getNextSequence();
if($args->password && !$password_is_hashed) $args->password = md5($args->password);
elseif(!$args->password) unset($args->password);
$output = executeQuery('member.insertMember', $args);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
// 입력된 그룹 값이 없으면 기본 그룹의 값을 등록
if(!$args->group_srl_list) {
$default_group = $oMemberModel->getDefaultGroup(0);
// 기본 그룹에 추가
$output = $this->addMemberToGroup($args->member_srl,$default_group->group_srl);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
// 입력된 그룹 값이 있으면 해당 그룹의 값을 등록
} else {
$group_srl_list = explode('|@|', $args->group_srl_list);
for($i=0;$i<count($group_srl_list);$i++) {
$output = $this->addMemberToGroup($args->member_srl,$group_srl_list[$i]);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
}
}
// 메일 인증 모드 사용시(가입된 회원이 denied일 때) 인증 메일 발송
if ($args->denied == 'Y') {
// 인증 DB에 데이터를 넣음
$auth_args->user_id = $args->user_id;
$auth_args->member_srl = $args->member_srl;
$auth_args->new_password = $args->password;
$auth_args->auth_key = md5(rand(0, 999999));
$auth_args->is_register = 'Y';
$output = executeQuery('member.insertAuthMail', $auth_args);
if (!$output->toBool()) {
$oDB->rollback();
return $output;
}
// 메일 내용을 구함
Context::set('auth_args', $auth_args);
Context::set('member_info', $args);
$member_config = $oModuleModel->getModuleConfig('member');
if(!$member_config->skin) $this->member_config->skin = "default";
if(!$member_config->colorset) $this->member_config->colorset = "white";
Context::set('member_config', $member_config);
$tpl_path = sprintf('%sskins/%s', $this->module_path, $member_config->skin);
if(!is_dir($tpl_path)) $tpl_path = sprintf('%sskins/%s', $this->module_path, 'default');
$oTemplate = &TemplateHandler::getInstance();
$content = $oTemplate->compile($tpl_path, 'confirm_member_account_mail');
// 사이트 웹마스터 정보를 구함
$oModuleModel = &getModel('module');
$member_config = $oModuleModel->getModuleConfig('member');
// 메일 발송
$oMail = new Mail();
$oMail->setTitle( Context::getLang('msg_confirm_account_title') );
$oMail->setContent($content);
$oMail->setSender( $member_config->webmaster_name?$member_config->webmaster_name:'webmaster', $member_config->webmaster_email);
$oMail->setReceiptor( $args->user_name, $args->email_address );
$oMail->send();
}
// trigger 호출 (after)
if($output->toBool()) {
$trigger_output = ModuleHandler::triggerCall('member.insertMember', 'after', $args);
if(!$trigger_output->toBool()) {
$oDB->rollback();
return $trigger_output;
}
}
$oDB->commit(true);
$output->add('member_srl', $args->member_srl);
return $output;
}
11. /xe/modules/member/member.model.php
- line 244
/**
* @brief jumin에 해당하는 member_srl을 구함
**/
function getMemberSrlByJumin($jumin){
$args->jumin = $jumin;
$output = executeQuery('member.getMemberSrl', $args);
return $output->data->member_srl;
}
- line 270 ~ 321
/**
* @brief 주민등록번호 형식 확인
**/
function isTrueNumber($jumin){
$total = 0;
for($i=0;$i<13;$i++){
$sval = substr($jumin, $i, 1);
if($i < 8){
$total = $total + ($sval * ($i+2));
}
if($i > 7 && $i < 12){
$total = $total + ($sval * ($i-6));
}
}
$total = $total % 11;
$total2 = 11 - $total;
if($total2 > 9) $total2 = $total2 % 10;
$total = substr($jumin, 12, 1);
if($total == $total2) return true;
else return false;
}
/**
* @brief 외국인번호 확인
**/
function isTrueNumber2($jumin){
for($i=0;$i<13;$i++){
$buf[$i] = (int)substr($jumin, $i, 1);
}
$odd = (int)$buf[7] * 10 + (int)$buf[8];
if($odd % 2 != 0){
return false;
}
if(($buf[11] != 6) && ($buf[11] != 7) && ($buf[11] != 8) && ($buf[11] != 9)){
return false;
}
$multi = "2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5";
$multipliers = str_split(",", $multi);
$sum = 0;
for($i=0;$i<12;$i++){
$sum += (int)$bnf[$i] *= (int)$multipliers[$i];
}
$sum = 11 - ($sum % 11);
if($sum >= 10) $sum -= 10;
$sum += 2;
if($sum >= 10) $sum -=10;
if($sum != $buf[12]) {
return false;
} else {
return true;
}
}
// 외국인 가입이필요없는 경우 외국인 번호 체크 삭제
12. /xe/common/js/xml-js_filter.js
- line 192 ~ 19
function XmlJsFilterExecuteFilter(filter, value) {
switch(filter) {
case "email" :
case "email_address" :
var regx = /^[_0-9a-zA-Z-]+(\.[_0-9a-zA-Z-]+)*@[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*$/;
return regx.test(value);
break;
case "userid" :
case "user_id" :
var regx = /^[a-zA-Z]+([_0-9a-zA-Z]+)*$/;
return regx.test(value);
break;
case "homepage" :
var regx = /^(http|https|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-\/\~]+)+(:[0-9]{2,4})*$/;
return regx.test(value);
break;
case "korean" :
var regx = /^[가-힣]*$/;
return regx.test(value);
break;
case "korean_number" :
var regx = /^[가-힣0-9]*$/;
return regx.test(value);
break;
case "alpha" :
var regx = /^[a-zA-Z]*$/;
return regx.test(value);
break;
case "alpha_number" :
var regx = /^[a-zA-Z][a-zA-Z0-9\_]*$/;
return regx.test(value);
break;
case "number" :
return !isNaN(value);
break;
case "jumin" :
return juminChk(value);
break;
case "jumin2" :
return juminChk2(value);
break;
}
return null;
}
- line 203 ~ 247
function juminChk(val) {
var total = 0;
var sval;
for(i=0;i<13;i++) {
sval = val.substr(i, 1);
if(i < 8) {
total = total + (sval * (i + 2));
}
if(i > 7 && i < 12) {
total = total + (sval * (i - 6));
}
}
total = total % 11;
var total2 = 11 - total;
if(total2 > 9) total = total2 % 10;
total = val.charAt(12);
if(total == total2) return true;
else return false;
}
function juminChk2(val) {
var sum = 0;
var odd = 0;
var buf = new Array(13);
for(i=0;i<13;i++) buf[i] = parseInt(reg_no.charAt(i));
odd = buf[7] * 10 + buf[8];
if(odd % 2 != 0) {
return false;
}
if((buf[11] != 6) && (buf[11] != 7) && (buf[11] != 8) && (buf[11] != 9)) {
return false;
}
var multipliers = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5];
for(i=0,sum=0;i<12;i++) sum += (buf[i] *= multipliers[i]);
sum = 11 - (sum % 11);
if(sum >= 10) sum -= 10;
sum += 2;
if(sum >= 10) sum -= 10;
if(sum != buf[12]) {
return false;
} else {
return true;
}
}
- line 306 ~ 310
function XmlJsFilterCheckFieldItem() {
for(var i=0; i<extra_vars.length;i++) {
var name = extra_vars[i];
this.addFieldItem(name, false, 0, 0, "", "");
}
for(var i=0; i<this.field.length;i++) {
var item = this.field[i];
var target = item[0];
var required = item[1];
var minlength = item[2];
var maxlength = item[3];
var equalto = item[4];
var filter = item[5].split(",");
if(typeof(this.fo_obj[target])=='undefined') continue;
for(var j=0; j<notnull_list.length; j++) {
if(notnull_list[j]==target) required = true;
}
var value = this.getValue(target);
if(!required && !value) continue;
if(required && !value && this.fo_obj[target]) return this.alertMsg(target,'isnull');
if(minlength>0 && maxlength>0 && (value.length < minlength || value.length > maxlength)) return this.alertMsg(target, 'outofrange', minlength, maxlength);
if(equalto) {
var equalto_value = this.getValue(equalto);
if(equalto_value != value) return this.alertMsg(target, 'equalto');
}
if(filter.length && filter[0]) {
for(var j=0;j<filter.length;j++) {
var filter_item = filter[j];
if(filter_item == 'jumin') {
if(document.getElementById(filter_item).form.foreigner.checked == true){
filter_item = 'jumin2';
}
}
if(!this.executeFilter(filter_item, value)) return this.alertMsg(target, "invalid_"+filter_item);
}
}
}
return true;
}
//외국인 번호를 체크하실게 아니면 역시 jumin2 관련 된 부분은 삭제 가능합니다.
/// CONAN 의 삭제 요청에 삭제 대신 관련 설명을 추가하도록 하겠습니다.
아래 13번 항목은 관리자 페이지에서 주민등록 번호를 출력하는 부분이며
14번 항목은 개인정보 항목에서 주민등록 번호를 출력하는 부분입니다.
개인적으로는 뒷자리를 1****** 으로 표시하여 사용하고 있습니다만.
다른 사용자가 주민등록번호를 보는것을 원치 않으실 경우 아래 항목은 적용하지 마시길 바랍니다.
{substr($member_info->jumin, 0, 6)} - {substr($member_info->jumin, 6, 1)}******
위와 같이 적용할 경우 890123-1****** 형식으로 출력됩니다.
아래 13,14 항목을 적용하지 않으셔도 사용상에 문제는 발생하지 않습니다.
13. /xe/modules/member/tpl/member_info.html
- line 97 ~ 100
<tr>
<th scope="row"><div>{$lang->jumin}</div></th>
<td>{substr($member_info->jumin, 0, 6)} - {substr($member_info->jumin, 6, 7)}</td>
</tr>
14. /xe/modules/member/skins/default/member_info.html
- line 37 ~ 40
<tr>
<th><div>{$lang->jumin}</div></th>
<td>{substr($member_info->jumin, 0, 6)} - {substr($member_info->jumin, 6, 7)}</td>
</tr>
15. /xe/modules/member/member.admin.model.php // 관리자 페이지에서 주민등록번호로 검사
- line 74 ~ 76
/**
* @brief 회원 목록을 구함
**/
function getMemberList() {
// 검색 옵션 정리
$args->is_admin = Context::get('is_admin')=='Y'?'Y':'';
$args->is_denied = Context::get('is_denied')=='Y'?'Y':'';
$args->selected_group_srl = Context::get('selected_group_srl');
$search_target = trim(Context::get('search_target'));
$search_keyword = trim(Context::get('search_keyword'));
if($search_target && $search_keyword) {
switch($search_target) {
case 'user_id' :
if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword);
$args->s_user_id = $search_keyword;
break;
case 'user_name' :
if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword);
$args->s_user_name = $search_keyword;
break;
case 'nick_name' :
if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword);
$args->s_nick_name = $search_keyword;
break;
case 'email_address' :
if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword);
$args->s_email_address = $search_keyword;
break;
case 'regdate' :
$args->s_regdate = ereg_replace("[^0-9]","",$search_keyword);
break;
case 'regdate_more' :
$args->s_regdate_more = substr(ereg_replace("[^0-9]","",$search_keyword) . '00000000000000',0,14);
break;
case 'regdate_less' :
$args->s_regdate_less = substr(ereg_replace("[^0-9]","",$search_keyword) . '00000000000000',0,14);
break;
case 'last_login' :
$args->s_last_login = $search_keyword;
break;
case 'last_login_more'+
' :
$args->s_last_login_more = substr(ereg_replace("[^0-9]","",$search_keyword) . '+
'00000000000000',0,14);
break;
case 'last_login_less' :
$args->s_last_login_less = substr(ereg_replace("[^0-9]","",$search_keyword) . '00000000000000',0,14);
break;
case 'extra_vars' :
$args->s_extra_vars = ereg_replace("[^0-9]","",$search_keyword);
break;
case 'jumin' : // 검색대상이 jumin 이면..
$args->s_jumin = ereg_replace("[^0-9]","",$search_keyword);
break;
}
}
// selected_group_srl이 있으면 query id를 변경 (table join때문에)
if($args->selected_group_srl) {
$query_id = 'member.getMemberListWithinGroup';
$args->sort_index = "member.member_srl";
} else {
$query_id = 'member.getMemberList';
$args->sort_index = "member_srl";
}
// 기타 변수들 정리
$args->page = Context::get('page'+
');
$args->list_count = 40;
$args->page_count = 10;
return executeQuery($query_id, $args);
}
16 . /xe/modules/member/quries/getMemberList.xml
- line 16
<query id="getMemberList" action="select">
<tables>
<table name="member" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="is_admin" var="is_admin" />
<condition operation="equal" column="denied" var="is_denied" pipe="and" />
<group pipe="and">
<condition operation="like" column="user_id" var="s_user_id" />
<condition operation="like" column="user_name" var="s_user_name" pipe="or" />
<condition operation="like" column="nick_name" var="s_nick_name" pipe="or" />
<condition operation="like" column="email_address" var="s_email_address" pipe="or" />
<condition operation="like" column="jumin" var="s_jumin" pipe="or" />
<condition operation="like" column="extra_vars" var="s_extra_vars" pipe="or" />
<condition operation="like_prefix" column="regdate" var="s_regdate" pipe="or" />
<condition operation="like_prefix" column="last_login" var="s_last_login" pipe="or" />
<condition operation="more" column="member.regdate" var="s_regdate_more" pipe="or" />
<condition operation="less" column="member.regdate" var="s_regdate_less" pipe="or" />
<condition operation="more" column="member.last_login" var="s_last_login_more" pipe="or" />
<condition operation="less" column="member.last_login" var="s_last_login_less" pipe="or" />
</group>
</conditions>
<navigation>
<index var="sort_index" default="member_srl" order="desc" />
<list_count var="list_count" default="20" />
<page_count var="page_count" default="10" />
<page var="page" default="1" />
</navigation>
</query>
추가로 첨부파일에 /xe/modules/member/ 폴더를 압축한 파일 첨부 합니다.
- 위 내용은 주민등록 번호가 필수 입력 사항이 아닙니다.
// 덧 : 이거 하느라 하느 업무의 반을 날려먹었군요 ㅎㅎ 오늘 좀 여유가 있어서 정리해봅니다.
그 동안 제가 올린 주민등록번호 입력 폼 게시물을 보고 고생 하셨던 분들에게 좀 더 도움이 되시길 바랍니다.
** 첨부 파일을 다운 받으시는 분들은
** 아래 항목은 관리자 페이지에서 회원의 주민등록 번호를 볼수 있는 기능이니 보안관련 문제가 발생 할수 있습니다.
아래 내용을 적용하지 않으셔도 사용에 문제는 발생하지 않습니다.
13. /xe/modules/member/tpl/member_info.html
- line 97 ~ 100
<tr>
<th scope="row"><div>{$lang->jumin}</div></th>
<td>{substr($member_info->jumin, 0, 6)} - {substr($member_info->jumin, 6, 7)}</td>
</tr>
첨부 파일 중 위 소스를 확인 하여 꼭 수정해 주세요 첨부 파일에 $ 기호가 누락되어있습니다.
- [2009/02/16] 웹마스터 팁 주민등록번호 입력 폼 추가 (1.1.5 기준) *39
댓글 55
-
불패의초인
2009.08.31 10:38
-
개돌
2009.09.10 12:04
제가 최근에 일이 너무 바빠서 이제서야 확인을 하네요 ㅠ.ㅠ
char 라는 형식은 정확히 일치하는 크기를 지정할 때 사용합니다.
예를 들어 주민등록 번호는 6+7의 정확히 13자리 숫자를 사용하고 생년월일은 4+2+2(년/월/일) 의 8자리를 사용합니다.
이런 경우 char를 사용합니다. 예를 들어 1980년 11월 4일 을 19801104 가 아닌 1980114(04가 아닌 4)로 적어서 7이 될경우는 오류가 되는 겁니다.
varchar는 설정한 숫자 까지 지정 가능입니다.
전화번호의 경우 지역번호(서울 02의 두자리 다른 지역은 3자리 ) + 국번(3~ 4자리) + 전화번호 (4자리) 로 이루어 져있어서
11자리가 됩니다. 구분을 위해 중간에 -(하이픈) 문자까지 포함하므로 13자리를 보통 설정합니다.
하지만 02-111-1111 과 같은 11자리를 넣어도 되고 031-222-2222 와 같은 12자리도 들어가고 031-1234-5678 과 같은 13자리도 가능합니다 다만 0000-0000-0000 처럼 14자리가 되면 오류가 됩니다.(오버 플로우)
char와 varchar에 대해서는 이해가 되셨는지요
제가 업무가 DB쪽 업무를 하는 사람은 아니고 MYSQL이 주 DB툴도 아니어서 저도 잘 이해가 안가네요.
char(13)으로 컬럼을 만들 수 없다는 답변에 대해서요.
그렇다고 varchar를 사용하면 안되는 것은 아닙니다.
위에 말씀 드린 것처럼 varchar는 13이 들어와도 되고 아니어도 되거든요. 13자리를 넘지만 않으면 됩니다.
그리고 아래 첨부하신 이미지는 invalid_jumin 잘못된 주민등록 번호일때 표시되는 경고문이 설정이 안된 것 같고요 주민등록 번호 체크 함수에 오류가 있나봅니다.
자세한 내용은 이전 댓글들 한번 확인 부탁드립니다.
비슷한 오류에 대한 내용이 있습니다.
-
불패의초인
2009.08.31 10:44
킁...........ㅋㅋ; 미리내 운영자님이 말한데로......아무리 바꿔도 안되는...
ALTER TABLE `xe_member` CHANGE `jumin` `jumin` char(13) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL
-
불패의초인
2009.08.31 11:17
뭐가 문제일까요....역시나char 형식이 아니여서 그런거라면
전 아예 못할꺼 같네요......;
-
불패의초인
2009.09.11 09:16
1.2.5 버전에서도 잘 돌아갈까요??? 버전 안맞아두 될런가요?..
제목 | 글쓴이 | 날짜 |
---|---|---|
주민등록 입력 폼 1.2.0 [55] | 개돌 | 2009.04.10 |
http://www.도메인주소/~as/xe/ 로 로그인 접속후~ [3] | wjnam | 2009.09.07 |
팝업창 띄우기 [16] | 레망 | 2008.03.16 |
[수정] 쉽게 간단하게(?) 플래시 그래프를 게시판에 넣어 보세요 ^^ [3] | 상오기 | 2009.08.27 |
에디터 본문 및 댓글 입력 글자크기 줄이기 [5] | HIKARU | 2008.11.24 |
에디터의 옵션 설정하기.. 컴포넌트 보이지 않게 등.. [4] | 지허 | 2007.10.01 |
http 두번 븥는 문제 .. 위젯 스타일 스퀘어 페이스 more 버그입니다. [2] | 최영석222 | 2009.07.25 |
이전글,다음글 얻기 (검색결과 까지 포함) (수정) [8] | 라르게덴 | 2008.06.05 |
[초보팁] 우리말 수정하기(예제: 가입창 이름란 삭제) [3] | 블루파티 | 2008.08.19 |
블로그, 홈페이지 가입시 자동 입력되는 http:// 없애기 [2] | 류영무 | 2008.09.09 |
페이지 모듈에도 게시판제목 처럼 다는 쉬운방법... [2] | 만쓰별(정만) | 2009.01.23 |
홈페이지 주소 깔끔하게 사용하기 [초보용] [14] | 똑디 | 2007.10.13 |
XOOPS (News Module) → XE 자료 옮기기 [3] | June Oh | 2009.08.17 |
Cooliris Embed a Wall 위젯 v2.0에 동영상 반영시키기 [3] | 철쌤 | 2009.08.08 |
하드 압축 하실때 tar cvfpz 쓰시는분들..... [3] | 우리아기 | 2009.08.13 |
통합검색에서 확장변수 검색하기 [5] | StyleD | 2008.10.12 |
회원 팝업메뉴에서 작성글 클릭시 다른 아이디 검색 안되게 하기 [3] | 절망린 | 2009.07.03 |
사이트 주소로 접속했을때 XE폴더로 이동하기 #2 [15] | 베니 | 2008.03.28 |
[비나무님글 ] xe_official_v2 레이아웃 사이트맵 없애는 방법 [3] | 토니박스 | 2009.07.29 |
상단로그인..? [10] | 빽짱구 | 2008.04.15 |
고객님이 말씀하신 jumin필드를 추가해 드렸으며 형식은 char이라고 하셨는데 크기가 13이면
varchar로 변경이 됩니다. 전에도 안내 드린것처럼 에러가 발생되실수도 있으니
이점 참고 하시기 바랍니다.
미리내 운영자님이 추가시켜줬긴했는데
char 은 13 크기 안된데요 이거 하신분 되체 어케 된거죠?