테스트 사이트 - 개발 중인 베타 버전입니다

시간별 접속자 관련 문의 채택완료

웹메이킹 3년 전 조회 1,859

관리자 메인페이지에 시간별 접속자 차트(그래프)작업을 하고 있는 초보자 입니다.

시간항목, 오늘 접속자 출력까지는 시간별 출력이 잘되고 있습니다. 

문제는 어제 접속자와 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개

채택된 답변
+20 포인트
e
3년 전

우선 아래 소스는 총합계라 필요 없는 부분이구요..

</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개

웹메이킹
3년 전
안녕하세요
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]
웹메이킹
3년 전
$fr_date = date("Y-m-d",strtotime("-2 day"));
$to_date = date("Y-m-d");

// 3일간의 접속자수가 오늘, 어제, 엊그제 전부 동일하게 출력이 됩니다.
수정을 해보고는 있지만 도무지 어떻게 해야할지 감이 안오네요..
e
eyekiss
3년 전
group by vi_date, vi_hour
이 부분을 수정하세요.
웹메이킹
3년 전
안녕하세요 eyekiss님
알려주신 수정부분을 체크해서 아래와 같이 적용해보았는데도 같은 현상이 나타납니다.
[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]

어디서 문제인지 잘 모르겠습니다.
e
eyekiss
3년 전
group by vi_date, vi_hour
로 변경을 하세요.
웹메이킹
3년 전
group by vi_hour 이부분을 아래와 같이 수정을 해봐도 결과는 같습니다.. ㅠㅠ

group by vi_date, vi_hour

다른 부분부터 샘플작업을 해야 겠네요...
e
eyekiss
3년 전
$count = isset($arr[$date][$hour]) ? (int) $arr[$hour] : 0;
제가 오타를 찾았네요.. 아래와 같이 수정하세요..
3군데 모두..
$count = isset($arr[$date][$hour]) ? (int) $arr[$date][$hour] : 0;
웹메이킹
3년 전
eyekiss 님
늦게까지 검토하시고 조언해 주셔서 감사합니다.
알려주신것 처럼 $count = isset($arr[$date][$hour]) ? (int) $arr[$date][$hour] : 0;
했을경우 전부 0으로 표시되는군요...

몇일동안 이 부분에서 헤메고 있네요.. 여러 자료를 찾아보고 테스트 해보는 중인데.. 너무 어렵네요.. ㅎㅎ

늦은시간까지 조언해 주신점 다시한번 감사드립니다.
e
eyekiss
3년 전
$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 ";

이렇게 수정하세요..
제가 테스트도 해봤습니다.
웹메이킹
3년 전
안녕하세요 eyekiss 님
알려주신 부분은 저도 어제 적용해봤는데 역시 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
e
eyekiss
3년 전
혹시 카톡(eyekissing)으로 ftp 정보 공유해주시면 봐드릴 수는 있습니다.
수고하세요~

댓글을 작성하려면 로그인이 필요합니다.

 " 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개

웹메이킹
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]
엑스엠엘
3년 전
$result를 각각 따로 하신 거 맞죠?
웹메이킹
3년 전
엑스엠엘님

$result 를 각각 따로 하라는 얘기가 어떤 의미인지요?
초보자라 너무 어렵네요..ㅠㅠ
조금 자세히 설명좀 부탁드려도 될까요?
엑스엠엘
3년 전
<?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_2 = sql_fetch($sql);
// 여기서는 다른 변수에 담아서 나중에 이걸 사용해야 합니다.
?>
웹메이킹
3년 전
이전에 그렇게 해봤는데요 시간대별로 접속자수가 나오는게 아니라 전체 합계로 출력이 되어버리더라구요 그래서 아래와 같이 하면 어제, 오늘, 엊그제 시간대별로 접속자수가 표시는 되는데 전부 동일하게 표시가 되네요..
[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]

초보자라 배우는 중인데 너무 어렵네요..ㅠㅠ

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인