325 lines
12 KiB
PHP
325 lines
12 KiB
PHP
<?php
|
|
class Visit extends BaseCode {
|
|
function __construct(){
|
|
parent::__construct();
|
|
|
|
$this->DB->query_record = false; //query log 기록 금지
|
|
|
|
$this->DB->tableExists( TB_visit_sess );
|
|
$this->DB->tableExists( TB_visit_sess_count );
|
|
$this->DB->tableExists( TB_visit_log );
|
|
$this->DB->tableExists( TB_visit_log_count );
|
|
}
|
|
|
|
function getVisitList( $tb, $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 {$tb} where {$whereqry} ".(($orderby)?"order by {$orderby}":""). $this->DB->_limit($limit[0],$limit[1]);
|
|
$sql = $this->DB->addLimit("select {$field} from {$tb} where {$whereqry}",$orderby,$limit[0],$limit[1]);
|
|
$rst = $this->DB->qry($sql, $whererow);
|
|
$row = array();
|
|
while( $tmp = $this->DB->fetch_array($rst) ){
|
|
$tmp['visit_date'] = getDT_datetime($tmp['visit_date']);
|
|
$row[] = $tmp;
|
|
}
|
|
return $row;
|
|
}
|
|
|
|
function getVisitPage($tb, $sqldata=array(), $query=array(), $where=""){ //방문 리스트 (공통-페이징)
|
|
if( !$where ){
|
|
$where = new DB_where("and");
|
|
}
|
|
|
|
$where->add("visit_date >= ?", ($sqldata['sdate']?$sqldata['sdate']:_SDATENULL_)." 00:00:00.000");
|
|
$where->add("visit_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("visit_url like ?", "%{$sqldata['stxt']}%");
|
|
$subwhere->add("visit_ref like ?", "%{$sqldata['stxt']}%");
|
|
$subwhere->add("visit_ip like ?", "%{$sqldata['stxt']}%");
|
|
$subwhere->add("visit_sess like ?", "%{$sqldata['stxt']}%");
|
|
}
|
|
}
|
|
|
|
$wqry = $where->get_where();
|
|
$whereqry = $wqry['qry'];
|
|
$whererow = $wqry['val'];
|
|
|
|
$orderby = "nid 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']?:20;
|
|
$lists->rownum = $query['rownum']?:5;
|
|
$lists->getCommonList($tb);
|
|
for( $a=0 ; $a<@count($lists->rows) ; $a++ ){;
|
|
$lists->rows[$a]['visit_date'] = getDT_datetime($lists->rows[$a]['visit_date']);
|
|
}
|
|
return $lists;
|
|
}
|
|
|
|
function getVisitSessList( $field="*", $where="", $orderby="", $limit=array() ){ //사이트 접근 리스트
|
|
return $this->getVisitList(TB_visit_sess, $field, $where, $orderby, $limit);
|
|
}
|
|
|
|
function getVisitSessPage( $sqldata=array(), $query=array(), $where="" ){ //사이트 접근 리스트 페이지
|
|
return $this->getVisitPage(TB_visit_sess, $sqldata, $query, $where);
|
|
}
|
|
|
|
function getVisitLogList( $field="*", $where="", $orderby="", $limit=array() ){ //사이트 조회 리스트
|
|
return $this->getVisitList(TB_visit_log, $field, $where, $orderby, $limit);
|
|
}
|
|
|
|
function getVisitLogPage( $sqldata=array(), $query=array(), $where="" ){ //사이트 조회 리스트 페이지
|
|
return $this->getVisitPage(TB_visit_log, $sqldata, $query, $where);
|
|
}
|
|
|
|
function putVisitRec($vtype="",$cate_id=""){ //방문자 로그 기록
|
|
$ip = get_ip();
|
|
$time = time();
|
|
|
|
//세션생성
|
|
if( !$_SESSION['visit_sess'] ){
|
|
$_SESSION['visit_sess'] = md5($time.$ip);
|
|
}
|
|
|
|
if(
|
|
$_SESSION['visit_last_urls'] != $_SERVER['REQUEST_URI'] && $_SESSION['visit_last_ajax'] != $_SERVER['REQUEST_URI'] || //새로고침은 기록 안함
|
|
($_SESSION['visit_last_time'] + ($GLOBALS['_varsBaseCode']['refresh_time']?:3600)) < time() //새로고침이라 할지라도 일정시간 이내의 새로고침은 기록
|
|
){
|
|
//로그기록 등록
|
|
$this->putVisitDetailRec($vtype,$cate_id);
|
|
}
|
|
|
|
//마지막 페이지 접근내역
|
|
if( preg_match("/\.ajax\./i", $_SERVER['REQUEST_URI']) ){
|
|
$_SESSION['visit_last_ajax'] = $_SERVER['REQUEST_URI'];
|
|
}else{
|
|
$_SESSION['visit_last_urls'] = $_SERVER['REQUEST_URI'];
|
|
}
|
|
$_SESSION['visit_last_time'] = $time;
|
|
}
|
|
|
|
function putVisitDetailRec($vtype="",$cate_id=""){ //로그기록 등록
|
|
if( !$_SESSION['visit_sess'] ) return false;
|
|
|
|
//세션 로그기록 등록
|
|
$this->putVisitSessRec($vtype);
|
|
|
|
//방문 로그 등록 (페이지뷰)
|
|
$this->putVisitLogRec($vtype,$cate_id);
|
|
}
|
|
|
|
function putVisitSessRec($vtype=""){ //방문 세션 기록
|
|
if( !$_SESSION['visit_sess'] ) return false;
|
|
|
|
$where = new DB_where("and");
|
|
$where->add("visit_sess = ?", $_SESSION['visit_sess']);
|
|
$wqry = $where->get_where();
|
|
$whereqry = $wqry['qry'];
|
|
$whererow = $wqry['val'];
|
|
$sql = "select count(*) from ".TB_visit_sess." where {$whereqry}";
|
|
$cnt = $this->DB->queryFirstField($sql,$whererow);
|
|
if( !$cnt ){ //최초 세션 등록
|
|
$this->DB->insert( TB_visit_sess, array("visit_sess"=>$_SESSION['visit_sess'], "member_id"=>($GLOBALS['_Umem']['member_id']?:""), "visit_ip"=>get_ip(), "visit_total"=>1) ); //세션 추가
|
|
|
|
$where = new DB_where("and");
|
|
$where->add("visit_date = ?", date("Y-m-d"));
|
|
$wqry = $where->get_where();
|
|
$whereqry = $wqry['qry'];
|
|
$whererow = $wqry['val'];
|
|
$sql = "select count(*) from ".TB_visit_sess_count." where {$whereqry}";
|
|
$cnt = $this->DB->queryFirstField($sql, $whererow);
|
|
if( !$cnt ){ //시간별 세션등록통계가 없으면 insert
|
|
$this->DB->insert( TB_visit_sess_count, array("visit_week"=>date("w")) );
|
|
}
|
|
|
|
$sql = "update ".TB_visit_sess_count." set visit_total = visit_total + 1, h".date("H")." = h".date("H")." + 1 where {$whereqry}";
|
|
$this->DB->qry( $sql, $whererow );
|
|
}else{ //세션이 방문한 페이지수 증가
|
|
$sqladd = "";
|
|
if( $GLOBALS['_Umem']['member_id'] ){
|
|
$sqladd = "member_id = '{$GLOBALS['_Umem']['member_id']}',";
|
|
}
|
|
$sql = "update ".TB_visit_sess." set {$sqladd} visit_total = visit_total + 1, visit_fdate = CURRENT_TIMESTAMP where {$whereqry}";
|
|
$this->DB->qry( $sql, $whererow );
|
|
}
|
|
}
|
|
|
|
function putVisitLogRec($vtype="",$cate_id=""){ //방문페이지(페이지뷰) 기록
|
|
if( !$_SESSION['visit_sess'] ) return false;
|
|
|
|
$where = new DB_where("and");
|
|
$where->add("visit_date = ?", date("Y-m-d"));
|
|
$where->add("visit_type = ?", $vtype);
|
|
$wqry = $where->get_where();
|
|
$whereqry = $wqry['qry'];
|
|
$whererow = $wqry['val'];
|
|
$sql = "select count(*) from ".TB_visit_log_count." where {$whereqry}";
|
|
$cnt = $this->DB->queryFirstField($sql, $whererow);
|
|
if( !$cnt ){ //시간별 페이지뷰통계가 없으면 insert
|
|
$this->DB->insert( TB_visit_log_count, array("visit_type"=>$vtype,"visit_week"=>date("w")) );
|
|
}
|
|
|
|
//시간별 페이지뷰통계 증가
|
|
$sql = "update ".TB_visit_log_count." set visit_total = visit_total + 1, h".date("H")." = h".date("H")." + 1 where {$whereqry}";
|
|
$this->DB->qry( $sql, $whererow );
|
|
|
|
|
|
$connect_info = parse_user_agent();
|
|
$sql_row = array(
|
|
"visit_type" => $vtype,
|
|
"cate_id" => $cate_id?:"",
|
|
"visit_sess" => $_SESSION['visit_sess']?:"",
|
|
"visit_url" => $_SERVER['REQUEST_URI']?:"",
|
|
"visit_ref" => $_SERVER['HTTP_REFERER']?:"",
|
|
"visit_browser" => "{$connect_info['browser']} | {$connect_info['version']}",
|
|
"visit_os" => $connect_info['platform']?:"",
|
|
"visit_ip" => get_ip(),
|
|
);
|
|
|
|
//개별 페이지 방문 기록
|
|
return $this->DB->insert( TB_visit_log, $sql_row );
|
|
}
|
|
|
|
function setLoginRec(){ //로그인시 ID 기록
|
|
$where = new DB_where("and");
|
|
$where->add("visit_sess = ?", $_SESSION['visit_sess']);
|
|
$wqry = $where->get_where();
|
|
$whereqry = $wqry['qry'];
|
|
$whererow = $wqry['val'];
|
|
$sql = "update ".TB_visit_sess." set member_id = ? where {$whereqry}";
|
|
return $this->DB->qry($sql, array_merge(array($_SESSION['auth_mem_id']?:""),$whererow));
|
|
}
|
|
|
|
function getVisitData($mode, $type="LOG", $vtype="", $start_day="", $end_day="", $where=""){
|
|
if( !$end_day ) $end_day = date("Y-m-d");
|
|
if( !$start_day ) $start_day = date("Y-m-d",strtotime($end_day." -1 Month +1 day"));
|
|
|
|
if( !$where ){
|
|
$where = new DB_where("and");
|
|
}
|
|
$where->add("visit_date >= ?", $start_day);
|
|
$where->add("visit_date <= ?", $end_day);
|
|
|
|
if( $type == "LOG" ){
|
|
$where->add("visit_type = ?", $vtype);
|
|
$tbl = TB_visit_log_count;
|
|
}else{
|
|
$tbl = TB_visit_sess_count;
|
|
}
|
|
$wqry = $where->get_where();
|
|
$whereqry = $wqry['qry'];
|
|
$whererow = $wqry['val'];
|
|
|
|
$row = array();
|
|
switch( $mode ){
|
|
case "hour":
|
|
$h_row = array();
|
|
for( $a=0 ; $a<24 ; $a++ ){
|
|
$h_str = "h".str_pad($a, 2, "0", STR_PAD_LEFT);
|
|
$h_row[] = "sum({$h_str}) as {$h_str}";
|
|
}
|
|
$sql = "select ".implode(",",$h_row)." from {$tbl} where {$whereqry} ";
|
|
$row = $this->DB->queryFirstRow($sql, $whererow);
|
|
break;
|
|
|
|
case "day":
|
|
if( (strtotime($end_day) - strtotime($start_day)) > 31*86400 ) $end_day = date("Y-m-d",strtotime($start_day." +1 Month -1 day")); //1개월이내로 제한
|
|
$days = floor((strtotime($end_day) - strtotime($start_day)) / 86400);
|
|
|
|
for( $a=0 ; $a<=$days ; $a++ ){
|
|
$nday = date("Y-m-d", strtotime("{$start_day} +{$a} day"));
|
|
$row[$nday] = 0;
|
|
}
|
|
|
|
$sql = "select visit_date as date, visit_total as visit from {$tbl} where {$whereqry} ";
|
|
$rst = $this->DB->qry($sql, $whererow);
|
|
|
|
while( $tmp = $this->DB->fetch_array($rst) ){
|
|
$row[getDT_date($tmp['date'])] = $tmp['visit'];
|
|
}
|
|
break;
|
|
|
|
case "dayw":
|
|
$days = floor((strtotime($end_day) - strtotime($start_day)) / 86400);
|
|
|
|
$sql = "select visit_date as date, visit_total as visit from {$tbl} where {$whereqry} order by visit_date asc";
|
|
$rst = $this->DB->qry($sql, $whererow);
|
|
|
|
$trow = array();
|
|
while( $tmp = $this->DB->fetch_array($rst) ){
|
|
$trow[getDT_date($tmp['date'])] = $tmp['visit'];
|
|
}
|
|
$row = array();
|
|
for( $a=0 ; $a<7 ; $a++ ){
|
|
$dword = date("Y-m-d", strtotime($start_day." +{$a} days"));
|
|
$row[] = $trow[$dword] ?: 0;
|
|
}
|
|
|
|
break;
|
|
|
|
case "week":
|
|
$h_row = array();
|
|
for( $a=0 ; $a<7 ; $a++ ){
|
|
$h_row[] = "sum(iif(visit_week = {$a}, visit_total, 0)) as w{$a}";
|
|
}
|
|
$sql = "select ".implode(",",$h_row)." from {$tbl} where {$whereqry} ";
|
|
$row = $this->DB->queryFirstRow($sql, $whererow);
|
|
break;
|
|
|
|
case "mon":
|
|
$sday = explode("-",$start_day);
|
|
$eday = explode("-",$end_day);
|
|
if( (($eday[0]*12+intval($eday[1])) - ($eday[0]*12+intval($eday[1]))) != 12 ) $start_day = date("Y-m-d",strtotime($end_day." -11 Month")); //12개월이내로 제한
|
|
|
|
$sday = explode("-",$start_day);
|
|
$mons = ($eday[0]*12+intval($eday[1])) - ($sday[0]*12+intval($sday[1]));
|
|
|
|
$m_row = array();
|
|
for( $a=0 ; $a<=$mons ; $a++ ){
|
|
$m_str = date("Y-m",strtotime("{$sday[0]}-{$sday[1]}-01 +{$a} month"));
|
|
$m_row[] = "sum(iif(visit_date like '{$m_str}%', visit_total, 0)) as '{$m_str}'";
|
|
}
|
|
$sql = "select ".implode(",",$m_row)." from {$tbl} where {$whereqry} ";
|
|
$row = $this->DB->queryFirstRow($sql, $whererow);
|
|
break;
|
|
}
|
|
|
|
return array(
|
|
"start_day" => $start_day,
|
|
"end_day" => $end_day,
|
|
"mons" => $mons,
|
|
"days" => $days,
|
|
"data" => $row,
|
|
);
|
|
}
|
|
} |