로그인하면 사이트 방문자수가 2씩 증가하는 현상, 정보
로그인하면 사이트 방문자수가 2씩 증가하는 현상,본문
안녕하세요.
사이트에 방문자수 카운트를 잡았는데, 페이지를 새로고침하거나 이동할 때마다 1씩 증가하게
수정하였습니다.
원 소스는
<?
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가
// 컴퓨터의 아이피와 쿠키에 저장된 아이피가 다르다면 테이블에 반영함
$tmp_row = sql_fetch(" select max(vi_id) as max_vi_id from $g4[visit_table] ");
$vi_id = $tmp_row[max_vi_id] + 1;
// $_SERVER 배열변수 값의 변조를 이용한 SQL Injection 공격을 막는 코드입니다. 110810
$remote_addr = mysql_real_escape_string($_SERVER['REMOTE_ADDR']);
$referer = mysql_real_escape_string($_SERVER['HTTP_REFERER']);
$user_agent = mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']);
$sql = " insert $g4[visit_table] ( vi_id, vi_ip, vi_date, vi_time, vi_referer, vi_agent ) values ( '$vi_id', '$remote_addr', '$g4[time_ymd]', '$g4[time_his]', '$referer', '$user_agent' ) ";
//$sql = " insert $g4[visit_table] ( vi_id, vi_ip, vi_date, vi_time, vi_referer, vi_agent ) values ( '$vi_id', '$_SERVER[REMOTE_ADDR]', '$g4[time_ymd]', '$g4[time_his]', '$_SERVER[HTTP_REFERER]', '$_SERVER[HTTP_USER_AGENT]' ) ";
$result = 1;
// 정상으로 INSERT 되었다면 방문자 합계에 반영
if ($result) {
$sql = " insert $g4[visit_sum_table] ( vs_count, vs_date) values ( 1, '$g4[time_ymd]' ) ";
$result = sql_query($sql, FALSE);
// DUPLICATE 오류가 발생한다면 이미 날짜별 행이 생성되었으므로 UPDATE 실행
if (!$result) {
$sql = " update $g4[visit_sum_table] set vs_count = vs_count + 1 where vs_date = '$g4[time_ymd]' ";
$result = sql_query($sql);
}
// INSERT, UPDATE 된건이 있다면 기본환경설정 테이블에 저장
// 방문객 접속시마다 따로 쿼리를 하지 않기 위함 (엄청난 쿼리를 줄임 ^^)
// 오늘
$sql = " select vs_count as cnt from $g4[visit_sum_table] where vs_date = '$g4[time_ymd]' ";
$row = sql_fetch($sql);
$vi_today = $row[cnt];
// 어제
$sql = " select vs_count as cnt from $g4[visit_sum_table] where vs_date = DATE_SUB('$g4[time_ymd]', INTERVAL 1 DAY) ";
$row = sql_fetch($sql);
$vi_yesterday = $row[cnt];
// 최대
$sql = " select max(vs_count) as cnt from $g4[visit_sum_table] ";
$row = sql_fetch($sql);
$vi_max = $row[cnt];
// 전체
//$sql = " select count(*) as cnt from $g4[visit_table] ";
$sql = " select sum(vs_count) as total from $g4[visit_sum_table] ";
$row = sql_fetch($sql);
$vi_sum = $row[total];
$visit = "오늘:$vi_today,어제:$vi_yesterday,최대:$vi_max,전체:$vi_sum";
// 기본설정 테이블에 방문자수를 기록한 후
// 방문자수 테이블을 읽지 않고 출력한다.
// 쿼리의 수를 상당부분 줄임
sql_query(" update $g4[config_table] set cf_visit = '$visit' ");
}
?>
이렇게 되는데 로그인을 하지 않고 페이지 새로고침을 하면, 카운트가 1씩 증가합니다.
그런데 로그인하고 새로고침하면 카운트가 2씩 증가하는데 왜 그런지 모르겠네요.
위 set vs_count = vs_count + 1 부분을 수정을 해봤는데요,
저 부분을 set vs_count = vs_count + 2 로 하게 되면, 방문자수가 4씩 증가합니다.
또 set vs_count = vs_count + 0.5 로 하게되면 그대로 2씩 증가하고요;;
set vs_count = vs_count 로 하게되면 아예 증가하지 않습니다.
set vs_count = vs_count + 0 도 마찬가지구요.
다른 걸 손봐야 되는 걸까요... 아시는 분 가르쳐주시면 고맙겠습니다.
사이트에 방문자수 카운트를 잡았는데, 페이지를 새로고침하거나 이동할 때마다 1씩 증가하게
수정하였습니다.
원 소스는
<?
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가
// 컴퓨터의 아이피와 쿠키에 저장된 아이피가 다르다면 테이블에 반영함
$tmp_row = sql_fetch(" select max(vi_id) as max_vi_id from $g4[visit_table] ");
$vi_id = $tmp_row[max_vi_id] + 1;
// $_SERVER 배열변수 값의 변조를 이용한 SQL Injection 공격을 막는 코드입니다. 110810
$remote_addr = mysql_real_escape_string($_SERVER['REMOTE_ADDR']);
$referer = mysql_real_escape_string($_SERVER['HTTP_REFERER']);
$user_agent = mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']);
$sql = " insert $g4[visit_table] ( vi_id, vi_ip, vi_date, vi_time, vi_referer, vi_agent ) values ( '$vi_id', '$remote_addr', '$g4[time_ymd]', '$g4[time_his]', '$referer', '$user_agent' ) ";
//$sql = " insert $g4[visit_table] ( vi_id, vi_ip, vi_date, vi_time, vi_referer, vi_agent ) values ( '$vi_id', '$_SERVER[REMOTE_ADDR]', '$g4[time_ymd]', '$g4[time_his]', '$_SERVER[HTTP_REFERER]', '$_SERVER[HTTP_USER_AGENT]' ) ";
$result = 1;
// 정상으로 INSERT 되었다면 방문자 합계에 반영
if ($result) {
$sql = " insert $g4[visit_sum_table] ( vs_count, vs_date) values ( 1, '$g4[time_ymd]' ) ";
$result = sql_query($sql, FALSE);
// DUPLICATE 오류가 발생한다면 이미 날짜별 행이 생성되었으므로 UPDATE 실행
if (!$result) {
$sql = " update $g4[visit_sum_table] set vs_count = vs_count + 1 where vs_date = '$g4[time_ymd]' ";
$result = sql_query($sql);
}
// INSERT, UPDATE 된건이 있다면 기본환경설정 테이블에 저장
// 방문객 접속시마다 따로 쿼리를 하지 않기 위함 (엄청난 쿼리를 줄임 ^^)
// 오늘
$sql = " select vs_count as cnt from $g4[visit_sum_table] where vs_date = '$g4[time_ymd]' ";
$row = sql_fetch($sql);
$vi_today = $row[cnt];
// 어제
$sql = " select vs_count as cnt from $g4[visit_sum_table] where vs_date = DATE_SUB('$g4[time_ymd]', INTERVAL 1 DAY) ";
$row = sql_fetch($sql);
$vi_yesterday = $row[cnt];
// 최대
$sql = " select max(vs_count) as cnt from $g4[visit_sum_table] ";
$row = sql_fetch($sql);
$vi_max = $row[cnt];
// 전체
//$sql = " select count(*) as cnt from $g4[visit_table] ";
$sql = " select sum(vs_count) as total from $g4[visit_sum_table] ";
$row = sql_fetch($sql);
$vi_sum = $row[total];
$visit = "오늘:$vi_today,어제:$vi_yesterday,최대:$vi_max,전체:$vi_sum";
// 기본설정 테이블에 방문자수를 기록한 후
// 방문자수 테이블을 읽지 않고 출력한다.
// 쿼리의 수를 상당부분 줄임
sql_query(" update $g4[config_table] set cf_visit = '$visit' ");
}
?>
이렇게 되는데 로그인을 하지 않고 페이지 새로고침을 하면, 카운트가 1씩 증가합니다.
그런데 로그인하고 새로고침하면 카운트가 2씩 증가하는데 왜 그런지 모르겠네요.
위 set vs_count = vs_count + 1 부분을 수정을 해봤는데요,
저 부분을 set vs_count = vs_count + 2 로 하게 되면, 방문자수가 4씩 증가합니다.
또 set vs_count = vs_count + 0.5 로 하게되면 그대로 2씩 증가하고요;;
set vs_count = vs_count 로 하게되면 아예 증가하지 않습니다.
set vs_count = vs_count + 0 도 마찬가지구요.
다른 걸 손봐야 되는 걸까요... 아시는 분 가르쳐주시면 고맙겠습니다.
댓글 전체
소스를 보면 해당부분은 무조건 실행되게 되어있네요.
따라서 페이지를 두번 호출한다고 볼수있을꺼 같습니다
우선 $g4[visit_table] 테이블에도 로그가 두개씩 쌓이는지 먼저 확인하셔야 될꺼 같고요
두개씩 쌓인다면 페이지 호출을 두번 하는것이니 호출하는 부분을 확인해보셔야 합니다
따라서 페이지를 두번 호출한다고 볼수있을꺼 같습니다
우선 $g4[visit_table] 테이블에도 로그가 두개씩 쌓이는지 먼저 확인하셔야 될꺼 같고요
두개씩 쌓인다면 페이지 호출을 두번 하는것이니 호출하는 부분을 확인해보셔야 합니다
넓은 마인드님 감사합니다. 해결했습니다^^