728x90
https://link2me.tistory.com/2311
SQL 데이터를 차트로 그리는 통계를 구현하는 코드를 예제로 작성했다.
statsClass.php
<?php
class statsClass {
// 테이블 비우기
function AccessLogTableTruncate($tablename){
global $db;
$sql ="TRUNCATE TABLE ".$tablename."";
mysqli_query($db,$sql);
}
function rb_access_Stats($date){
global $db;
$sql ="select count(date) from rb_access_Stats where date='".$date."'"; // 기록된 데이터 있는지 조회
$result=mysqli_query($db,$sql);
if($row=mysqli_fetch_row($result)){
return $row[0];
}
}
function AccessLogCnt($date){
global $db;
$sql ="select count(distinct userID),sum(hit) from rb_accessLog_tmp where date='".$date."'";
$result=mysqli_query($db,$sql);
if($row=mysqli_fetch_row($result)){
return $row;
}
}
// 통계데이터가 쌓이고 있는지 검사하는 로직
function AccessLogIsData($date){
global $db;
$sql ="select userID from rb_accessLog_tmp where date='".$date."'";
$result=mysqli_query($db,$sql);
if($row=mysqli_fetch_row($result)){
if($row[0] == NULL) { // 데이터가 하나도 없으면
return 0;
} else {
return 1;
}
}
}
// 년월 DB 추출
function extract_YM(){
global $db;
$sql ="select distinct(YM) from rb_access_Stats order by YM DESC";
$result = mysqli_query($db,$sql);
return $result;
}
// 년월의 max date 구해서 배열 -> 문자열 만들기
function maxdate_YM($ym){
global $db;
date_default_timezone_set('Asia/Seoul');
if(empty($ym)){
$cur_year = date("Y");
$cur_month = date("m");
} else {
$cur_year = substr($ym,0,4);
$cur_month = substr($ym,4,2);
}
// 현재 월의 마지막 날짜를 일단 선택하도록 처리하고, 년/월을 선택하면 자동으로 변경
$last_date = date("t", mktime(0, 0, 1, $cur_month, 1, $cur_year));
$R=array();
for($i=0;$i < $last_date; $i++){
$R[$i]=$i+1;
}
return $R; // 배열로 반환
}
function dailyCnt_value($ym){
global $db;
date_default_timezone_set('Asia/Seoul');
if(empty($ym)){
$ym = date("Ym"); // 입력이 없으면 현재월의 데이터를 추출하라.
$cur_year = date("Y");
$cur_month = date("m");
} else {
$cur_year = substr($ym,0,4);
$cur_month = substr($ym,4,2);
}
$R=array();
// 현재 월의 마지막 날짜를 일단 선택하도록 처리하고, 년/월을 선택하면 자동으로 변경
$last_date = date("t", mktime(0, 0, 1, $cur_month, 1, $cur_year));
for($i=1;$i <= $last_date; $i++){
$R[$i]='';
}
$sql ="select day,dailyCnt from rb_access_Stats ";
$sql.="where YM='".$ym."'";
$result = mysqli_query($db,$sql);
while($row=mysqli_fetch_row($result)){
// DB에 저장되는 날짜가 01, 02로 저장되는 것을 1, 2로 출력되도록 처리
$R[intval($row[0])] = $row[1];
}
return $R; // 배열로 반환
}
function userCnt_value($ym){
global $db;
date_default_timezone_set('Asia/Seoul');
if(empty($ym)){
$ym = date("Ym"); // 입력이 없으면 현재월의 데이터를 추출하라.
$cur_year = date("Y");
$cur_month = date("m");
} else {
$cur_year = substr($ym,0,4);
$cur_month = substr($ym,4,2);
}
$R=array();
// 현재 월의 마지막 날짜를 일단 선택하도록 처리하고, 년/월을 선택하면 자동으로 변경
$last_date = date("t", mktime(0, 0, 1, $cur_month, 1, $cur_year));
for($i=1;$i <= $last_date; $i++){
$R[$i]='';
}
$sql ="select day,IDCnt from rb_access_Stats ";
$sql.="where YM='".$ym."'";
$result = mysqli_query($db,$sql);
while($row=mysqli_fetch_row($result)){
// DB에 저장되는 날짜가 01, 02로 저장되는 것을 1, 2로 출력되도록 처리
$R[intval($row[0])] = $row[1];
}
return $R; // 배열로 반환
}
}
|
stats_db.php
<?php
require_once 'path.php';// root 폴더를 기준으로 상대적인 경로 자동 구하기
//require_once $g['path_root'].'sessionChk.php'; // 세션 체크
if(isset($_POST['ym'])){
require_once $g['path_config'].'dbconnect.php';
require_once $g['path_class'].'statsClass.php';
$s = new statsClass;
$ym = $_POST['ym'];
$data1 = $s->dailyCnt_value($ym);
$data2 = array_values($s->userCnt_value($ym));
$ticks = $s->maxdate_YM($ym);
$R = array('data1'=>$data1,'data2'=>$data2, 'ticks'=>$ticks);
echo json_encode($R);
}
?>
|
차트 출력 파일 : accessStats.php
<?php
error_reporting(0);
//*
ini_set("display_startup_errors", 1);
ini_set("display_errors", 1);
error_reporting(E_ALL);
// */
require_once 'path.php';// root 폴더를 기준으로 상대적인 경로 자동 구하기
require_once $g['path_config'].'config.php';
require_once $g['path_config'].'dbconnect.php';
require_once $g['path_class'].'statsClass.php';
$s = new statsClass();
$R = $s->extract_YM();
date_default_timezone_set('Asia/Seoul');
if(isset($_GET['ym'])){
$ym = $_GET['ym'];
} else {
if(date("d") === '01'){ // 1 일에는 전월 출력하도록 설정
$ym = date("Ym", mktime(0,0,0,date("m")-1, date("d"), date("Y")));
} else {
$ym = date("Ym");
}
}
$ticks = json_encode($s->maxdate_YM($ym));
$line1 = json_encode(array_values($s->dailyCnt_value($ym)));
$line2 = json_encode(array_values($s->userCnt_value($ym)));
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="robots" content="noindex,nofollow"/>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<?php header('Cache-Control: no-cache, no-store, must-revalidate'); // HTTP 1.1 ?>
<?php header('Pragma: no-cache'); // HTTP 1.0 ?>
<?php header('Expires: 0'); // Proxies ?>
<?php header('X-Frame-Options:SAMEORIGIN',true);?>
<?php header('X-Content-Type-Options: nosniff',true);?>
<?php header('X-XSS-Protection:1;mode=block',true);?>
<title>일일 접속 통계</title>
<link rel="shortcut icon" href="/img/etc/favicon.ico">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.1/css/all.css">
<link href="/css/bootstrap.min.css" rel="stylesheet">
<link href="/css/mdb.lite.css" rel="stylesheet">
<link href="/css/jquery-ui.css" rel="stylesheet">
</head>
<body>
<div class="row">
<div class="col-md-2">
</div>
<div class="col-md-8 col-xl-8 col-lg-8">
<p class="h5 my-4">일일 접속 통계</p>
<div class="card shadow mb-4">
<canvas id="myChart"></canvas>
</div>
<div class="float-right info mt-4">
<select class="browser-default custom-select" name="month" id="selectmonth">
<option value="">년월 선택</option>
<?php
while ($row = mysqli_fetch_array($R)){
echo "<option value='".$row[0]."' ";
if($row[0] === $ym) echo "selected='selected'";
echo ">".$row[0]."</option>\n";
}
?>
</select>
</div>
</div>
</div>
<script type="text/javascript" src="/js/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="/js/popper.min.js"></script>
<script type="text/javascript" src="/js/bootstrap.min.js"></script>
<script type="text/javascript" src="/js/mdb.lite.min.js"></script>
<script type="text/javascript" src="/js/jquery-ui.js"></script>
<script type="text/javascript" src="/js/jsencrypt.min.js"></script>
<script type="text/javascript" src="/js/user/user.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.4.0/Chart.min.js"></script>
<script>
var xAxis = <?php echo $ticks;?>;
var adIDData1 = <?php echo $line1;?>;
var adIDData2 = <?php echo $line2;?>;
drawPlot(adIDData1, adIDData2, xAxis);
function drawPlot(adIDData1, adIDData2, xAxis){
var ctx = document.getElementById("myChart").getContext('2d');
var myChart = new Chart(ctx, {
type: 'bar',
data: {
labels: xAxis ,
datasets: [
{
label: '로그인수',
data: adIDData1 ,
backgroundColor: 'rgba(50, 169, 132, 0.5)',
borderColor: 'rgba(50,169,132,1)',
borderWidth: 1
},
{
label: '사용자수',
data: adIDData2 ,
backgroundColor: 'rgba(54, 162, 235, 0.5)',
borderColor:'rgba(54, 162, 235, 1)',
borderWidth: 1
},
]
},
options: {
scales: {
yAxes: [{
ticks: {
beginAtZero: true
}
}]
}
}
});
}
$('#selectmonth').on('change',function(){
if(this.value !== ""){
var optVal=$(this).find(":selected").val();
$.post('stats_db.php',{ ym:optVal },function(msg){
//console.log(msg); // 배열 형태로 넘어오는지 확인 목적
var jsonObj = $.parseJSON(msg); // JSON 문자열을 JavaScript object 로 반환
var data1 = $.map(jsonObj.data1, function(el) { return el });
var data2 = jsonObj.data2;
var xAxis = jsonObj.ticks;
drawPlot(data1,data2,xAxis);
});
}
});
</script>
</body>
</html>
|
728x90
'Web 프로그램 > PHP 응용 및 활용' 카테고리의 다른 글
PDO 코드를 MySQLi 코드로 변경 처리 방법 (0) | 2023.09.08 |
---|---|
PHP 회원 form jQuery POST 처리 (0) | 2023.07.13 |
PHP 날짜 차이 계산 및 활용 (0) | 2022.04.24 |
Java 암호화 및 PHP 복호화 (0) | 2021.07.08 |
PHP 특정날짜 구하기 (0) | 2021.04.17 |