시간별 접속자 관련 문의 채택완료
관리자 메인페이지에 시간별 접속자 차트(그래프)작업을 하고 있는 초보자 입니다.
시간항목, 오늘 접속자 출력까지는 시간별 출력이 잘되고 있습니다.
문제는 어제 접속자와 2일전(엊그제) 접속자 출력이 시간별로 출력이 되는게 아니라 총 접속자 수가 표시가 됩니다.
이리저리 찾아보고 테스트를 해봐도 시간별로 접속자수가 표시가 되지 않네요..ㅠㅠ
너무 초보인지라 고수님들의 도움을 받고자 이렇게 문의 드립니다.
사용된 소스코드는 아래와 같습니다.
</p>
<p><?php</p>
<p>//sql 쿼리</p>
<p> </p>
<p>$sql_common =" select SUBSTRING(vi_time,1,2) as vi_hour, count(vi_id) as cnt from {$g5['visit_table']} where vi_date between ";</p>
<p> </p>
<p>// 어제</p>
<p>$sql = "$sql_common '" . date("Y-m-d",strtotime("-1 day")) . "' and '" . date("Y-m-d",strtotime("-1 day")) . " 23:59:59'";</p>
<p>$result = sql_fetch($sql);</p>
<p> </p>
<p>// 엊그제(2일전)</p>
<p>$sql = "$sql_common '" . date("Y-m-d",strtotime("-2 day")) . "' and '" . date("Y-m-d",strtotime("-2 day")) . " 23:59:59'";</p>
<p>$result = sql_fetch($sql);</p>
<p>?> </p>
<p> </p>
<p><!-- #adm_visitor_time --></p>
<p><div id="sh_adm_visitor_time"></p>
<p><?php</p>
<p>$max = 0;</p>
<p>$sum_count = 0;</p>
<p>$arr = array();</p>
<p> </p>
<p>$sql = " select SUBSTRING(vi_time,1,2) as vi_hour, count(vi_id) as cnt</p>
<p> from {$g5['visit_table']}</p>
<p> where vi_date between '{$fr_date}' and '{$to_date}'</p>
<p> group by vi_hour</p>
<p> order by vi_hour ";</p>
<p>$result = sql_query($sql);</p>
<p>for ($i=0; $row=sql_fetch_array($result); $i++) {</p>
<p> $arr[$row['vi_hour']] = $row['cnt'];</p>
<p> </p>
<p> if ($row['cnt'] > $max) $max = $row['cnt'];</p>
<p> </p>
<p> $sum_count += $row['cnt'];</p>
<p>}</p>
<p> </p>
<p>?></p>
<p>
시간별 접속자 차트
</p>
<p> <h3>시간별 방문자 현황 (최근 3일)<a href=""></a></h3></p>
<p> </p>
<p> <div class="graph_wrap"></p>
<p> <div id="visitor_graph"></div></p>
<p> <script></p>
<p> var eg2 = new Easygraphs({</p>
<p> container: document.getElementById('visitor_graph'),</p>
<p> width: 550,</p>
<p> height: 160,</p>
<p> padding: {</p>
<p> top: 30,</p>
<p> right: 30,</p>
<p> left: 65</p>
<p> },</p>
<p> tooltip: {</p>
<p> template: '{{ category }}: {{ value }}',</p>
<p> widthAuto: true,</p>
<p> color: '#222',</p>
<p> background: '#FFF'</p>
<p> },</p>
<p> yAxis: {</p>
<p> text: {</p>
<p> toFixed: 0</p>
<p> },</p>
<p> title: {</p>
<p> text: '방문자수'</p>
<p> },</p>
<p> grid: {</p>
<p> show: false</p>
<p> }</p>
<p> },</p>
<p> xAxis: {</p>
<p> labels: [</p>
<p> <?php</p>
<p> $k = 0;</p>
<p> if ($i) {</p>
<p> for ($i=0; $i<24; $i++) {</p>
<p> $hour = sprintf("%02d", $i);</p>
<p> $count = isset($arr[$hour]) ? (int) $arr[$hour] : 0;</p>
<p> </p>
<p> $rate = ($count / $sum_count * 100);</p>
<p> $s_rate = number_format($rate, 1);</p>
<p> ?> <?php echo $hour ?></p>
<p> <?php</p>
<p> }</p>
<p> }</p>
<p> ?> </p>
<p> ]</p>
<p> },</p>
<p> data: [</p>
<p> {</p>
<p> name: '오늘',</p>
<p> dots: {</p>
<p> color: 'rgb(3, 169, 245)'</p>
<p> },</p>
<p> line: {</p>
<p> width: 1,</p>
<p> color: 'rgb(3, 169, 245)'</p>
<p> },</p>
<p> values: [</p>
<p> <?php</p>
<p> $k = 0;</p>
<p> if ($i) {</p>
<p> for ($i=0; $i<24; $i++) {</p>
<p> $hour = sprintf("%02d", $i);</p>
<p> $count = isset($arr[$hour]) ? (int) $arr[$hour] : 0;</p>
<p> </p>
<p> $rate = ($count / $sum_count * 100);</p>
<p> $s_rate = number_format($rate, 1);</p>
<p> ?> <?php echo number_format($count) ?></p>
<p> <?php</p>
<p> }</p>
<p> }</p>
<p> ?> </p>
<p> ]</p>
<p> },</p>
<p> {</p>
<p> name: '어제',</p>
<p> dots: {</p>
<p> color: 'rgb(255, 140, 4)'</p>
<p> },</p>
<p> line: {</p>
<p> width: 1,</p>
<p> color: 'rgb(255, 140, 4)'</p>
<p> },</p>
<p> values: [</p>
<p> <?php</p>
<p> $k = 0;</p>
<p> if ($i) {</p>
<p> for ($i=0; $i<24; $i++) {</p>
<p> $hour = sprintf("%02d", $i);</p>
<p> $count = isset($arr[$hour]) ? (int) $arr[$hour] : 0;</p>
<p> </p>
<p> $rate = ($count / $sum_count * 100);</p>
<p> $s_rate = number_format($rate, 1);</p>
<p> ?> <?php echo number_format($result['cnt']) ?></p>
<p> <?php</p>
<p> }</p>
<p> }</p>
<p> ?> </p>
<p> </p>
<p> ]</p>
<p> },</p>
<p> {</p>
<p> name: '엊그제',</p>
<p> dots: {</p>
<p> color: 'rgb(97, 108, 119)'</p>
<p> },</p>
<p> line: {</p>
<p> width: 1,</p>
<p> color: 'rgb(97, 108, 119)'</p>
<p> },</p>
<p> values: [</p>
<p> <?php</p>
<p> $k = 0;</p>
<p> if ($i) {</p>
<p> for ($i=0; $i<24; $i++) {</p>
<p> $hour = sprintf("%02d", $i);</p>
<p> $count = isset($arr[$hour]) ? (int) $arr[$hour] : 0;</p>
<p> </p>
<p> $rate = ($count / $sum_count * 100);</p>
<p> $s_rate = number_format($rate, 1);</p>
<p> ?> <?php echo number_format($result['cnt']) ?></p>
<p> <?php</p>
<p> }</p>
<p> }</p>
<p> ?> </p>
<p> </p>
<p> ]</p>
<p> }</p>
<p> ]</p>
<p> });</p>
<p> eg2.render();</p>
<p> </script></p>
<p> </div></p>
<p> </p>
<p></div></p>
<p><!-- #adm_visitor_time --></p>
<p>
시간
labels: [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', ]
오늘 방문자
values: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ] //시간별 접속자 정상출력
어제 방문자
values: [ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, ] // 시간별 접속자 총합계 출력
엊그제 방문자
values: [ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, ] // 시간별 접속자 총합계 출력
시간과 오늘 방문자는 정상적으로 출력이 되는데 어제, 엊그제 방문자수가 총 합계로 출력이 되네요..
고수님들의 조언 및 도움 부탁드리겠습니다.
오늘도 즐거운 하루 되세요~
답변 2개
우선 아래 소스는 총합계라 필요 없는 부분이구요..
</p>
<p><?php
//sql 쿼리
$sql_common =" select SUBSTRING(vi_time,1,2) as vi_hour, count(vi_id) as cnt from {$g5['visit_table']} where vi_date between ";
// 어제
$sql = "$sql_common '" . date("Y-m-d",strtotime("-1 day")) . "' and '" . date("Y-m-d",strtotime("-1 day")) . " 23:59:59'";
$result = sql_fetch($sql);
// 엊그제(2일전)
$sql = "$sql_common '" . date("Y-m-d",strtotime("-2 day")) . "' and '" . date("Y-m-d",strtotime("-2 day")) . " 23:59:59'";
$result = sql_fetch($sql);
?> </p>
<p>
3일간 데이터를 불러와서 날짜별로 저장을 합니다.
</p>
<p>$fr_date = date("Y-m-d",strtotime("-2 day"));</p>
<p>$to_date = date("Y-m-d");</p>
<p>$sql = " select SUBSTRING(vi_time,1,2) as vi_hour, count(vi_id) as cnt
from {$g5['visit_table']}
where vi_date between '{$fr_date}' and '{$to_date}'
group by vi_hour
order by vi_hour ";
$result = sql_query($sql);
for ($i=0; $row=sql_fetch_array($result); $i++) {
$arr[$row['vi_date']][$row['vi_hour']] = $row['cnt'];
if ($row['cnt'] > $max) $max = $row['cnt'];
$sum_count += $row['cnt'];
}</p>
<p>
출력 부분을 날짜별로 출력을 합니다.
</p>
<p> <?php
$k = 0;
if ($i) {</p>
<p> $date = date("Y-m-d");
for ($i=0; $i<24; $i++) {
$hour = sprintf("%02d", $i);
$count = isset($arr[$date][$hour]) ? (int) $arr[$hour] : 0;
$rate = ($count / $sum_count * 100);
$s_rate = number_format($rate, 1);
?> <?php echo number_format($count) ?>
<?php
}
}
?> </p>
<p>
</p>
<p> <?php
$k = 0;
if ($i) {</p>
<p> $date = date("Y-m-d",strtotime("-1 day"));
for ($i=0; $i<24; $i++) {
$hour = sprintf("%02d", $i);
$count = isset($arr[$date][$hour]) ? (int) $arr[$hour] : 0;
$rate = ($count / $sum_count * 100);
$s_rate = number_format($rate, 1);
?> <?php echo number_format($count) ?>
<?php
}
}
?> </p>
<p>
</p>
<p> <?php
$k = 0;
if ($i) {</p>
<p> $date = date("Y-m-d",strtotime("-2 day"));
for ($i=0; $i<24; $i++) {
$hour = sprintf("%02d", $i);
$count = isset($arr[$date][$hour]) ? (int) $arr[$hour] : 0;
$rate = ($count / $sum_count * 100);
$s_rate = number_format($rate, 1);
?> <?php echo number_format($count) ?>
<?php
}
}
?> </p>
<p>
답변에 대한 댓글 11개
$to_date = date("Y-m-d");
// 3일간의 접속자수가 오늘, 어제, 엊그제 전부 동일하게 출력이 됩니다.
수정을 해보고는 있지만 도무지 어떻게 해야할지 감이 안오네요..
이 부분을 수정하세요.
알려주신 수정부분을 체크해서 아래와 같이 적용해보았는데도 같은 현상이 나타납니다.
[code]
$sql = " select SUBSTRING(vi_time,1,2) as vi_hour, count(vi_id) as cnt
from {$g5['visit_table']}
where vi_date between '{$fr_date}' and '{$to_date}'
group by SUBSTRING(vi_time,1,2)
order by vi_hour";
[/code]
어디서 문제인지 잘 모르겠습니다.
로 변경을 하세요.
group by vi_date, vi_hour
다른 부분부터 샘플작업을 해야 겠네요...
제가 오타를 찾았네요.. 아래와 같이 수정하세요..
3군데 모두..
$count = isset($arr[$date][$hour]) ? (int) $arr[$date][$hour] : 0;
늦게까지 검토하시고 조언해 주셔서 감사합니다.
알려주신것 처럼 $count = isset($arr[$date][$hour]) ? (int) $arr[$date][$hour] : 0;
했을경우 전부 0으로 표시되는군요...
몇일동안 이 부분에서 헤메고 있네요.. 여러 자료를 찾아보고 테스트 해보는 중인데.. 너무 어렵네요.. ㅎㅎ
늦은시간까지 조언해 주신점 다시한번 감사드립니다.
from {$g5['visit_table']}
where vi_date between '{$fr_date}' and '{$to_date}'
group by vi_date, vi_hour
order by vi_date, vi_hour ";
이렇게 수정하세요..
제가 테스트도 해봤습니다.
알려주신 부분은 저도 어제 적용해봤는데 역시 0,0,0,0,0.......0, 전부 이렇게 출력이 되었습니다.
알려주신 코드를 전부 적용해봤는데.. 저는 안되는군요 시간 되시면 한번 검토 부탁드립니다
[code]
// sql
<?php
$fr_date = date("Y-m-d",strtotime("-2 day"));
$to_date = date("Y-m-d");
$max = 0;
$sum_count = 0;
$arr = array();
$sql = " select vi_date, SUBSTRING(vi_time,1,2) as vi_hour, count(vi_id) as cnt
from {$g5['visit_table']}
where vi_date between '{$fr_date}' and '{$to_date}'
group by vi_date, vi_hour
order by vi_date, vi_hour ";
$result = sql_query($sql);
for ($i=0; $row=sql_fetch_array($result); $i++) {
$arr[$row['vi_date']][$row['vi_hour']] = $row['cnt'];
if ($row['cnt'] > $max) $max = $row['cnt'];
$sum_count += $row['cnt'];
}
?>
// 출력부분
<?php
$k = 0;
if ($i) {
$date = date("Y-m-d",strtotime("-1 day"));
for ($i=0; $i<24; $i++) {
$hour = sprintf("%02d", $i);
$count = isset($arr[$date][$hour]) ? (int) $arr[$date][$hour] : 0;
$rate = ($count / $sum_count * 100);
$s_rate = number_format($rate, 1);
?> <?php echo number_format($count) ?>
<?php
}
}
?>
[/code]
테스트까지 해주셨는데 저는 왜 안되는 걸까요? 혹시 php 버전과도 상관이 있을까요?
개인적인 생각으로는 php 버전과는 무관할듯 하긴한데.. 혹시 몰라 한번 적어봅니다.
이렇게 까지 신경써주셔서 너무 감사합니다.
php ver. 7.4.30
그누보드5 ver 5.5.8.2.3
수고하세요~
댓글을 작성하려면 로그인이 필요합니다.
" select SUBSTRING(vi_time,1,2) as vi_hour, count(vi_id) as cnt from {$g5['visit_table']} where vi_date between ";
where 끝나고
group by SUBSTRING(vi_time,1,2)
를 해 주어야 합니다.
접속자 수가 많다면
이런 방법말고
시간대 집계 테이블을 하나 만드시는 것이 좋습니다
답변에 대한 댓글 5개
알려주신 대로 수정을 해봐도 똑같이 오늘, 어제, 엊그제 접속자 수가 동일하게 출력됩니다.
아래처럼 적용하는게 맞는지요?
[code]
$sql = " select SUBSTRING(vi_time,1,2) as vi_hour, count(vi_id) as cnt
from {$g5['visit_table']}
where vi_date between '{$fr_date}' and '{$to_date}'
group by SUBSTRING(vi_time,1,2)
order by vi_hour";
[/code]
$result 를 각각 따로 하라는 얘기가 어떤 의미인지요?
초보자라 너무 어렵네요..ㅠㅠ
조금 자세히 설명좀 부탁드려도 될까요?
//sql 쿼리
$sql_common =" select SUBSTRING(vi_time,1,2) as vi_hour, count(vi_id) as cnt from {$g5['visit_table']} where vi_date between ";
// 어제
$sql = "$sql_common '" . date("Y-m-d",strtotime("-1 day")) . "' and '" . date("Y-m-d",strtotime("-1 day")) . " 23:59:59'";
$result = sql_fetch($sql);
// 엊그제(2일전)
$sql = "$sql_common '" . date("Y-m-d",strtotime("-2 day")) . "' and '" . date("Y-m-d",strtotime("-2 day")) . " 23:59:59'";
$result_2 = sql_fetch($sql);
// 여기서는 다른 변수에 담아서 나중에 이걸 사용해야 합니다.
?>
[code]
<?php
$k = 0;
if ($i) {
$date = date("Y-m-d",strtotime("-1 day"));
for ($i=0; $i<24; $i++) {
$hour = sprintf("%02d", $i);
$count = isset($arr[$hour]) ? (int) $arr[$hour] : 0;
$rate = ($count / $sum_count * 100);
$s_rate = number_format($rate, 1);
?> <?php echo number_format($count) ?>
<?php
}
}
?>
[/code]
초보자라 배우는 중인데 너무 어렵네요..ㅠㅠ
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인
eyekiss 님 바쁘신 와중에 이렇게 답변을 주셔서 감사드립니다.
알려주신대로 수정을 했을때 모든 접속자 수가 전부 동일하게 표시가 됩니다.
이리저리 수정을 해보고 있지만 어떻게 해야할지 모르겠네요..ㅠㅠ
[code]
<?php
$max = 0;
$sum_count = 0;
$arr = array();
$fr_date = date("Y-m-d",strtotime("-2 day"));
$to_date = date("Y-m-d");
$sql = " select SUBSTRING(vi_time,1,2) as vi_hour, count(vi_id) as cnt
from {$g5['visit_table']}
where vi_date between '{$fr_date}' and '{$to_date}'
group by vi_hour
order by vi_hour ";
$result = sql_query($sql);
for ($i=0; $row=sql_fetch_array($result); $i++) {
$arr[$row['vi_date']][$row['vi_hour']] = $row['cnt'];
if ($row['cnt'] > $max) $max = $row['cnt'];
$sum_count += $row['cnt'];
}
?>
[/code]
출력부분
[code]
<?php
$k = 0;
if ($i) {
$date = date("Y-m-d",strtotime("-1 day"));
for ($i=0; $i<24; $i++) {
$hour = sprintf("%02d", $i);
$count = isset($arr[$hour]) ? (int) $arr[$hour] : 0;
$rate = ($count / $sum_count * 100);
$s_rate = number_format($rate, 1);
?> <?php echo number_format($count) ?>
<?php
}
}
?>
[/code]