728x90

내 Web Site에 로그인한 접속자의 통계를 구해보자.


접속자의 정보를 테이블에 기록하는 로직을 그려본다.

1. 로그인한 ID 정보를 기록한다.

2. 접속자의 IP 주소 정보를 구한다.

   $ip = $_SERVER[REMOTE_ADDR];    //방문자 IP저장

3. 오늘 날짜와 시간을 저장한다.

4. OS 정보를 추출하여 저장한다.

    - Web 브라우저에서 접속한 경우에는 $_SERVER['HTTP_USER_AGENT'] 에서 정보를 추출할 수 있다.

    - Android App, iOS App 에서 접속하는 경우에는 DeviceID를 가지고 식별하게 코드를 추가하면 된다.

5. 동일한 ID에 대해 하루에 한번만 저장할 것인가?

    접속할 때마다 기록할 것인가를 정한다.

    접속할 때마다 기록하면 테이블에 저장되는 Record 수가 많아진다.

    이 경우에는 매일 일정한 시간주기로 Raw Data 를 가지고 일단위 통계, 주간단위 통계, 월단위 통계를 만들고

    2개월이 넘어간 데이터는 삭제하는 방법등을 고려하는 것이 좋다.

    데이터 저장이 너무 많아지는 경우에는 테이블 설계시 partition 까지 고려하는 것이 좋을 수 있다.

6. Index 는 어떤 걸 자주 검색하게 될 것인가를 고려해서 설정한다.

7. 통계 생성을 고려한다면 테이블에 저장되는 값을 숫자로 표시되게 하는 걸 같이 고려한다.

8. 접속자의 접속정보를 테이블에 추가(Insert)한다.



1. 테이블 구조

CREATE TABLE IF NOT EXISTS AccessLog (
  uid int(11) NOT NULL AUTO_INCREMENT,
  ipaddr varchar(20) NOT NULL,
  date char(8) NOT NULL DEFAULT '',
  time varchar(10) NOT NULL,
  OS varchar(60) DEFAULT NULL,
  browser varchar(30) DEFAULT NULL,
  userID varchar(60) DEFAULT NULL,
  hit int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (uid),
  KEY ipaddr (ipaddr)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


2. phpClass 함수

관련 모든 함수는 첨부파일 참조

AccessClass.zip


조건기준 : IP주소와 오늘날짜를 기준으로 카운트

만약 userID 기준으로 접속기록을 남기려면 where 조건문을 수정해주면 된다.


function AccessLog($userID){
    // 테이블 구조 : uid, ipaddr, date, time, OS, browser, userID, hit
    global $db;
    $access_ip=$_SERVER['REMOTE_ADDR'];
    $getOS = $this->getOS(); // 접속 OS 정보
    $getBrowser = $this->getBrowser(); // 브라우저 접속 정보
    $date = date("Ymd"); // 오늘날짜
    $time = date("H:i:s"); // 시간
    $userID = $userID ? $userID : '';
    $sql ="select count(*) from rb_accessLog where ipaddr='".$access_ip."' and date='".$date."'";
    $result=mysql_query($sql);
    if($row=mysql_fetch_row($result)){
        if($row[0] == 0){ // 오늘 접속날짜 기록이 없으면
            $sql = "INSERT INTO rb_accessLog (ipaddr,date,time,OS,browser,userID,hit) ";
            $sql.= "VALUES ('$access_ip','$date','$time','$getOS','$getBrowser','$userID','1');";
            $result=mysql_query($sql);
        } else { // 접속 기록이 있으면 해당 IP주소의 카운트만 증가시켜라.
            $sql = "UPDATE rb_accessLog SET hit=hit+1 Where ipaddr='".$access_ip."'";
            $result=mysql_query($sql);
        }
    }
}


3. 사용법

로그인 정보를 검사하여 로그인이 성공(ID, PW 일치)하면 1, 실패하면 0 을 반환한다.

성공할 경우 SESSION 을 생성하고 접속 로그를 기록한다.


<?php
if(isset($_POST['loginID']) && !empty($_POST['loginID']) && isset($_POST['loginPW']) && !empty($_POST['loginPW'])) {
    $loginID = trim($_POST['loginID']);
    $loginPW = trim($_POST['loginPW']);

    require_once 'dbconnect.php'; // db접속
    require_once 'phpclass/AccessClass.php';
    require_once 'phpclass/loginClass.php';

    $a=new AccessClass();
    $c=new LoginClass();

    $row = $c->UserAuthCheck($loginID,$loginPW); // 성공(1), 실패(0)
    if($row == 1) {
        $_SESSION['userID'] = $row['id'];
        $_SESSION['userPW'] = md5($loginPW);
        $a->AccessLog($_SESSION['userID']); // 접속 로그 기록
    } else {
        $msg ='정보가 올바르지 않습니다';
        echo "<script>alert('".$msg."');history.go(-1);</script>";
    }
}

?>


블로그 이미지

Link2Me

,