HANYANG_REACT/lib/app/member.class.php

612 lines
21 KiB
PHP

<?php
class Member extends BaseCode {
var $member_id;
var $TB;
function __construct( $member_id="" ){
parent::__construct();
$this->DB->tableExists(TB_member);
$this->DB->tableExists(TB_member_log);
$this->DB->tableExists(TB_member_union);
$this->member_id = $member_id?:(isset($GLOBALS['_Umem']['member_id'])?$GLOBALS['_Umem']['member_id']:"");
$this->TB = " (select mem.*, meu.cust_id, meu.cust_name from ". TB_member ." as mem left join ". TB_member_union . " as meu on mem.member_id = meu.member_id) as m ";
}
public function getMemberList( $field="*", $where="", $orderby="", $limit=array() ){
if( !$where ){
$where = new DB_where("and");
}
$wqry = $where->get_where();
$whereqry = $wqry['qry'];
$whererow = $wqry['val'];
//$sql = "select {$field} from ".$this->TB." where {$whereqry} ".(($orderby)?"order by {$orderby}":""). $this->DB->_limit($limit[0],$limit[1]);
$sql = $this->DB->addLimit("select {$field} from ".$this->TB." where {$whereqry}", $orderby, $limit[0],$limit[1]);
$rst = $this->DB->qry($sql, $whererow);
$row = array();
while( $tmp = $this->DB->fetch_array($rst) ){
$row[] = $this->getMemberInfo($tmp);
}
return $row;
}
public function getMemberSel( $field="*", $where="", $orderby="", $limit=array() ){
if( !$where ){
$where = new DB_where("and");
}
$where->add("member_status = ?",1);
$mlist = $this->getMemberList("member_id, part_name",$where,"part_name, member_name asc", $limit);
$mem_list = array();
for( $a=0 ; $a<@count($mlist) ; $a++ ){
$mem_list[] = array(
"id" => $mlist[$a]['member_id'],
"text" => $mlist[$a]['part_name'],
);
}
return $mem_list;
}
public function getMemberSelect($key, $val, $where=""){
$rows = $this->getMemberList("{$key}, {$val}", $where, "member_name asc");
$selrows = array();
foreach( (array)$rows as $row ){
$selrows[$row[$key]] = $row[$val];
}
return $selrows;
}
public function getMemberPage($sqldata=array(), $query=array(), $where=""){ //관리자 리스트 (페이징)
if( !$where ){
$where = new DB_where("and");
}
$where->add("reg_date >= ?", ($sqldata['sdate']?$sqldata['sdate']:_SDATENULL_)." 00:00:00.000");
$where->add("reg_date <= ?", ($sqldata['fdate']?$sqldata['fdate']:_FDATENULL_)." 23:59:59.999");
if( $sqldata['stxt'] ){
$subwhere = $where->sub_where("or");
if( $sqldata['sfld'] ){
$subwhere->add("{$sqldata['sfld']} like ?", "%{$sqldata['stxt']}%");
}else{
$subwhere->add("member_id like ?", "%{$sqldata['stxt']}%");
$subwhere->add("member_name like ?", "%{$sqldata['stxt']}%");
}
}
$wqry = $where->get_where();
$whereqry = $wqry['qry'];
$whererow = $wqry['val'];
$orderby = "reg_date desc";
if( $sqldata['ofld'] && $sqldata['oasc'] ){
$orderby = "{$sqldata['ofld']} {$sqldata['oasc']}";
}
$query = array_merge(array(
"mode" => $sqldata['mode'],
"viewnum" => $sqldata['viewnum'],
"sdate" => $sqldata['sdate']?:"",
"fdate" => $sqldata['fdate']?:"",
"sfld" => $sqldata['sfld'],
"stxt" => $sqldata['stxt'],
"ofld" => $sqldata['ofld'],
"oasc" => $sqldata['oasc'],
), $query);
$lists = new clist();
$lists->fld = "*";
$lists->where = $whereqry;
$lists->whererow = $whererow;
$lists->orderby = $orderby;
$lists->url = $_SERVER['PHP_SELF'];
$lists->query = $query;
$lists->page = $sqldata['page']?:1;
$lists->linktype = "";
$lists->viewnum = $query['viewnum']?:$GLOBALS['_varsBaseCode']['line_num'];
$lists->rownum = $query['rownum']?:$GLOBALS['_varsBaseCode']['page_num'];
$lists->getCommonList($this->TB);
for( $a=0 ; $a<@count($lists->rows) ; $a++ ){
$lists->rows[$a] = $this->getMemberInfo($lists->rows[$a]);
}
return $lists;
}
public function getMemberLogList($field="*",$where="", $orderby="",$limit=array()){ //관리자 리스트
$tbl = "(select L.*, M.member_name, M.company_name from ".TB_member_log." as L left join ".TB_member." as M on L.member_id = M.member_id) as L";
if( !$where ){
$where = new DB_where("and");
}
$wqry = $where->get_where();
$whereqry = $wqry['qry'];
$whererow = $wqry['val'];
//$sql = "select {$field} from {$tbl} where {$whereqry} ".(($orderby)?"order by {$orderby}":""). $this->DB->_limit($limit[0],$limit[1]);
$sql = $this->DB->addLimit("select {$field} from {$tbl} where {$whereqry}", $orderby, $limit[0],$limit[1]);
$rst = $this->DB->qry($sql, $whererow);
$row = array();
while( $tmp = $this->DB->fetch_array($rst) ){
$tmp['login_date'] = getDT_datetime($tmp['login_date']);
$row[] = $tmp;
}
return $row;
}
public function getMemberLogPage($sqldata=array(), $query=array(), $where=""){ //관리자 리스트 (페이징)
$tbl = "(select L.*, M.member_name from ".TB_member_log." as L left join ".TB_member." as M on L.member_id = M.member_id) as L";
if( !$where ){
$where = new DB_where("and");
}
$where->add("login_date >= ?", ($sqldata['sdate']?$sqldata['sdate']:_SDATENULL_)." 00:00:00.000");
$where->add("login_date <= ?", ($sqldata['fdate']?$sqldata['fdate']:_FDATENULL_)." 23:59:59.999");
if( $sqldata['stxt'] ){
$subwhere = $where->sub_where("or");
if( $sqldata['sfld'] ){
$subwhere->add("{$sqldata['sfld']} like ?", "%{$sqldata['stxt']}%");
}else{
$subwhere->add("member_id like ?", "%{$sqldata['stxt']}%");
$subwhere->add("member_name like ?", "%{$sqldata['stxt']}%");
$subwhere->add("ip_addr like ?", "%{$sqldata['stxt']}%");
$subwhere->add("browser like ?", "%{$sqldata['stxt']}%");
$subwhere->add("con_domain like ?", "%{$sqldata['stxt']}%");
$subwhere->add("OS like ?", "%{$sqldata['stxt']}%");
}
}
$wqry = $where->get_where();
$whereqry = $wqry['qry'];
$whererow = $wqry['val'];
$orderby = "login_date desc";
if( $sqldata['ofld'] && $sqldata['oasc'] ){
$orderby = "{$sqldata['ofld']} {$sqldata['oasc']}";
}
$query = array_merge(array(
"mode" => $sqldata['mode'],
"viewnum" => $sqldata['viewnum'],
"sdate" => $sqldata['sdate']?:"",
"fdate" => $sqldata['fdate']?:"",
"sfld" => $sqldata['sfld'],
"stxt" => $sqldata['stxt'],
"ofld" => $sqldata['ofld'],
"oasc" => $sqldata['oasc'],
), $query);
$lists = new clist();
$lists->fld = "*";
$lists->where = $whereqry;
$lists->whererow = $whererow;
$lists->orderby = $orderby;
$lists->url = $_SERVER['PHP_SELF'];
$lists->query = $query;
$lists->page = $sqldata['page']?:1;
$lists->linktype = "";
$lists->viewnum = $query['viewnum']?:$GLOBALS['_varsBaseCode']['line_num'];
$lists->rownum = $query['rownum']?:$GLOBALS['_varsBaseCode']['page_num'];
$lists->getCommonList($tbl);
for( $a=0 ; $a<@count($lists->rows) ; $a++ ){
$lists->rows[$a]['login_date'] = getDT_datetime($lists->rows[$a]['login_date']);
}
return $lists;
}
public function getMember( $member_id="", $where="" ) {
$member_id = $member_id?:$this->member_id;
if( !$member_id ) return 0;
if( !$where ){
$where = new DB_where("and");
}
$where->add("member_id = ?",$member_id);
$wqry = $where->get_where();
$whereqry = $wqry['qry'];
$whererow = $wqry['val'];
$this->DB->query_record = false; //query log 기록 금지
$sql = "select * from ".$this->TB." where {$whereqry}";
$rst = $this->DB->qry($sql, $whererow);
$row = $this->DB->fetch_array($rst);
$row = $this->getMemberInfo($row);
$where = new DB_where("and");
$where->add("member_id = ?",$member_id);
$wqry = $where->get_where();
$whereqry = $wqry['qry'];
$whererow = $wqry['val'];
if( $this->isAdmin() ){ //관리자의 경우 회원의 마지막 로그인 정보를 주고, 일반회원은 자신의 현재 로그인 이전의 로그인 정보를 준다.
$sql = "select login_date as last_login, ip_addr as last_ip from ".TB_member_log." where {$whereqry} order by login_date desc";
$rst = $this->DB->qry($sql, $whererow);
$lrow = $this->DB->fetch_array($rst);
$row['login_ip'] = $lrow['last_ip']?:"";
$row['login_date'] = $lrow['last_login'];
}
$this->DB->query_record = true; //query log 기록 재개
return $row;
}
public function getMemberWhere( $wrow ) {
$where = new DB_where("and");
foreach( $wrow as $key => $val ){
$where->add("{$key} = ?",$val);
}
$wqry = $where->get_where();
$whereqry = $wqry['qry'];
$whererow = $wqry['val'];
$sql = "select * from ".$this->TB." where {$whereqry}";
$rst = $this->DB->qry($sql, $whererow);
$row = $this->getMemberInfo($this->DB->fetch_array($rst));
return $row;
}
public function getMemberInfo( $row ){
if( isset($row['member_mobile']) && $row['member_mobile'] ) $row['member_mobile'] = $this->lcrypt->dec_secure($row['member_mobile']);
if( isset($row['member_mail']) && $row['member_mail'] ) $row['member_mail'] = $this->lcrypt->dec_secure($row['member_mail']);
if( isset($row['member_phone']) && $row['member_phone'] ) $row['member_phone'] = $this->lcrypt->dec_secure($row['member_phone']);
return $row;
}
public function putMember( $sqldata=array() ) { //가입
if( $this->DB->tableExists( TB_member ) ){
$sql_row = array(
"member_id" => $sqldata['member_id']?:"",
"member_pw" => $sqldata['member_pw']?$this->lcrypt->pw_make($sqldata['member_pw']):"",
"member_name" => $sqldata['member_name']?:"",
"member_mobile" => $sqldata['member_mobile']?$this->lcrypt->enc_secure($sqldata['member_mobile']):"",
"member_mail" => $sqldata['member_mail']?$this->lcrypt->enc_secure($sqldata['member_mail']):"",
"member_certi_key" => $sqldata['member_certi_key']?:"",
"member_status" => $sqldata['member_status']?:1,
"member_auth" => $sqldata['member_auth']?:"",
"reg_date" => $this->DB->sqleval("getdate()"),
"mod_date" => $this->DB->sqleval("getdate()"),
);
return $this->DB->insert( TB_member, $sql_row);
}
return 0;
}
public function setMember( $sqldata ) { //정보 수정
if( !$this->isAdmin() ){
$sqldata['member_id'] = $GLOBALS['_Umem']['member_id'];
}
$sql_row = array(
"member_name" => $sqldata['member_name'],
"member_mobile" => $sqldata['member_mobile']?$this->lcrypt->enc_secure($sqldata['member_mobile']):"",
"member_mail" => $sqldata['member_mail']?$this->lcrypt->enc_secure($sqldata['member_mail']):"",
"mod_date" => $this->DB->sqleval("getdate()"),
);
if( $this->isAdmin() ){
if( $sqldata['member_certi_key'] ){
$sql_row['member_certi_key'] = $sqldata['member_certi_key'];
}
}
if( $sqldata['member_status'] ){
$sql_row['member_status'] = $sqldata['member_status'];
}
if( $sqldata['member_auth'] ){
$sql_row['member_auth'] = $sqldata['member_auth'];
}
if( $sqldata['member_pw'] ){
$sql_row["member_pw"] = $this->lcrypt->pw_make($sqldata['member_pw']);
}
return $this->DB->update( TB_member, $sql_row, "member_id = ?", array($sqldata['member_id']));
}
public function setMemberParts( $sqldata ){
if( !$sqldata['member_id'] || $GLOBALS['_Umem']['member_id'] && !$this->isAdmin() ){
$sqldata['member_id'] = $GLOBALS['_Umem']['member_id'];
}
$where = new DB_where("and");
if( is_array($sqldata['member_id']) ){
//$where->add("member_id in ?",$sqldata['member_id']);
$subwhere = $where->sub_where("or");
foreach( $sqldata['member_id'] as $val ){
$subwhere->add("member_id = ?",$val);
}
}else{
$where->add("member_id = ?",$sqldata['member_id']);
}
$wqry = $where->get_where();
$whereqry = $wqry['qry'];
$whererow = $wqry['val'];
unset($sqldata['member_id']);
return $this->DB->update( TB_member, $sqldata, $whereqry, $whererow );
}
public function delMember( $member_id ) { //회원 삭제
if( $this->isAdmin() ){
$where = new DB_where("and");
$where->add("member_id = ?",$member_id);
$wqry = $where->get_where();
$whereqry = $wqry['qry'];
$whererow = $wqry['val'];
return $this->DB->delete( TB_member, $whereqry, $whererow );
}
return 0;
}
public function getMemberUnion($member_id, $where=""){
if( !$where ){
$where = new DB_where("and");
}
$where->add("member_id = ?", $member_id);
$wqry = $where->get_where();
$whereqry = $wqry['qry'];
$whererow = $wqry['val'];
$sql = "select * from ".TB_member_union." where {$whereqry}";
return $this->DB->queryFirstRow($sql, $whererow);
}
public function putMemberUnion($sqldata){
$sql_row = Array(
"member_id" => $sqldata['member_id'],
"cust_id" => $sqldata['cust_id']?:"",
"cust_name" => $sqldata['cust_name']?:"",
);
return $this->DB->insert(TB_member_union, $sql_row);
}
public function setMemberUnion($sqldata){
$sql_row = Array(
"member_id" => $sqldata['member_id'],
"cust_id" => $sqldata['cust_id']?:"",
"cust_name" => $sqldata['cust_name']?:"",
);
$uinfo = $this->getMemberUnion($sql_row['member_id']);
if( $uinfo['member_id'] && $uinfo['member_id'] == $sql_row['member_id'] ){
$where = new DB_where("and");
$where->add("member_id = ?", $sql_row['member_id']);
$wqry = $where->get_where();
$whereqry = $wqry['qry'];
$whererow = $wqry['val'];
return $this->DB->update(TB_member_union, $sql_row, $whereqry, $whererow);
}else{
return $this->putMemberUnion($sql_row);
}
}
public function delMemberUnion($member_id){
$where = new DB_where("and");
$where->add("member_id = ?", $member_id);
$wqry = $where->get_where();
$whereqry = $wqry['qry'];
$whererow = $wqry['val'];
return $this->DB->delete(TB_member_union, $whereqry, $whererow);
}
public function active( $member_id ) { //활동
return $this->setMemberParts( array(
"member_id" => $member_id,
"member_status" => 1
));
}
public function pause( $member_id ) { //임시정지
return $this->setMemberParts( array(
"member_id" => $member_id,
"member_status" => 2
));
}
public function withdraw( $member_id ) { //탈퇴 / 퇴사처리
return $this->setMemberParts( array(
"member_id" => $member_id,
"member_status" => 3
));
}
public function join( $sqldata ) { //가입
return $this->putMember( $sqldata );
}
public function login($member_id, $member_pw) { // 로그인
$result = 0;
if( !$member_id || !$member_pw ){
return $result;
}
$row = $this->pwCheck($member_id, $member_pw);
if( $row ){
if( $row['member_status'] == 1 && $row['member_auth'] ){
$_SESSION['auth_mem_id'] = $member_id;
// 로그인 시점의 microtime
list ( $usec, $sec ) = explode ( " ", microtime () );
$rand_no = rand ( 100000, 999999 );
$login_security_key = str_replace ( '.', '', get_ip() ) . $sec . str_replace ( '.', '', $usec ) . $rand_no;
$_SESSION['auth_login_security_key'] = $login_security_key;
//$result = $row; //가입요청 및 임시중지등 등록된 회원 상태를 알리기 위해 if 밖으로 조정
if( class_exists("Visit") && $_SESSION['visit_sess'] ){ //방문세션이 존재하면 방문세션 테이블에 ID를 기록한다.
$vsobj = new Visit();
$vsobj->setLoginRec();
}
}
$result = $row;
}
return $result;
}
public function loginAforce($member_id) { // 관리자용 회원 강제 로그인
$result = 0;
if( !$member_id || !$this->isAdmin() ){
return $result;
}
$row = $this->getMember($member_id);
if( $row['member_id'] ){
$where = new DB_where("and");
$where->add("member_id = ?",$member_id);
$where->add("login_success = ?",1);
$wqry = $where->get_where();
$whereqry = $wqry['qry'];
$whererow = $wqry['val'];
//$sql = "select login_security_key from ".TB_member_log." where {$whereqry} order by login_date desc ".$this->DB->_limit(0,1);
$sql = $this->DB->addLimit("select login_security_key from ".TB_member_log." where {$whereqry}","login_date desc",0,1);
$login_security_key = $this->DB->queryFirstField($sql,$whererow);
$_SESSION['auth_mem_id'] = $member_id;
$_SESSION['auth_login_security_key'] = $login_security_key;
$result = 1;
}else{
$result = 0;
}
return $result;
}
public function pwCheck( $member_id, $member_pw ){ //비밀번호 체크
$row = $this->getMember($member_id);
if( $row['member_pw'] ){
if( $this->lcrypt->pw_match($member_pw, $row['member_pw']) ){
return $row;
}
}
return 0;
}
public function logout(){ //로그아웃
//session_destroy();
$_SESSION['auth_mem_id'] = "";
$_SESSION['auth_login_security_key'] = "";
return 1;
}
public function logRec( $member_id, $login_page, $log_rst ){ //로그인 기록
$result = 0;
if( $this->DB->tableExists( TB_member_log ) ){
$where = new DB_where("and");
$where->add("member_id = ?",$member_id);
$where->add("login_success = ?",1);
$wqry = $where->get_where();
$whereqry = $wqry['qry'];
$whererow = $wqry['val'];
//자신의 현재 로그인 이전의 로그인 정보를 기록한다.
$crow = $this->DB->queryFirstRow( "select count(*)+1 as login_count from ".TB_member_log." where {$whereqry}", $whererow );
$lrow = $this->DB->queryFirstRow( "select top 1 login_date, ip_addr as last_ip from ".TB_member_log." where {$whereqry} order by login_date desc", $whererow );
$sql_row = array(
"member_id" => $member_id,
"login_count" => $crow['login_count']?:0,
"login_ip" => $lrow['last_ip']?:"",
"login_date" => getDT_datetime($lrow['login_date']),
);
$this->setMemberParts($sql_row);
$connect_info = parse_user_agent();
if( is_array($connect_info['browser']) ){
$connect_info['browser'] = substr(json_encode($connect_info['browser']),0,40);
}
$sql_row = array(
"member_id" => $member_id,
"ip_addr" => get_ip(),
"login_page" => $login_page,
"login_success" => $log_rst?1:0,
"login_date" => $this->DB->sqleval("getdate()"),
"login_security_key" => $_SESSION['auth_login_security_key']?:"",
"sess_file_name" => session_id(),
"browser" => "{$connect_info['browser']} | {$connect_info['version']}",
"con_domain" => $_SERVER['HTTP_HOST']?:"",
"os" => $connect_info['platform']?:"",
"os_bit" => ""
);
$result = $this->DB->insert( TB_member_log, $sql_row);
}
return $result;
}
public function loginCheck( $member_id="" ){ //로그인 체크
$member_id = $member_id?:$_SESSION['auth_mem_id'];
if( $member_id ){
if( !defined('_SINGLE_LOGIN_') || !_SINGLE_LOGIN_ || _SINGLE_LOGIN_ && $this->multiLoginBlock() ){
$row = $this->getMember( $member_id );
unset($row['member_pw']);
return $row;
}else{
return $this->logout();
}
}
return 0;
}
public function multiLoginBlock(){ //멀티 로그인 차단
$where = new DB_where("and");
$where->add("member_id = ?",$GLOBALS['_Umem']['member_id']);
$where->add("login_success = ?",1);
$wqry = $where->get_where();
$whereqry = $wqry['qry'];
$whererow = $wqry['val'];
//$sql = "select login_security_key from ".TB_member_log." where {$whereqry} order by login_date desc ".$this->DB->_limit(0,1);
$sql = $this->DB->addLimit("select login_security_key from ".TB_member_log." where {$whereqry}","login_date desc",0,1);
$match_login_security_key = $this->DB->queryFirstField($sql,$whererow);
if( $match_login_security_key == $_SESSION['auth_login_security_key'] ){
return 1;
}
return 0;
}
public function temp_pw_gen( $len=0 ){ //임시비밀번호 생성
if( $len < 1 ) $len = 8;
$str = 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%&*ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$temp_pw = "";
for($i=0; $i<$len; $i++) {
$temp_pw .= $str[random_int(0, strlen($str)-1)];
}
return $temp_pw;
}
public function isAdmin($admin_id="", $suonly=""){ //관리 권한 있는지 확인
if( !$admin_id || $admin_id && $admin_id == $GLOBALS['_Umem']['member_id'] ){
$arow = $GLOBALS['_Umem'];
}else{
$arow = $this->getMember($admin_id);
}
if( $suonly ){//기준정보에서 SA 코드자체를 변경할수 있으므로 suonly 는 사용에 주의
$adminrow = array("SA");
}else{
if( is_array($GLOBALS['_varsAuthAdmin']) ){
$adminrow = array_keys($GLOBALS['_varsAuthAdmin']);
}else{
$adminrow = array("SA","A");
}
}
if( in_array($arow['member_auth'], $adminrow) ){
return true;
}else{
return false;
}
}
}