จากเนื้อหาตอนที่แล้ว เราได้เข้าใจหลักการดึงข้อมูลจากฐานข้อมูลมาสร้าง
เป็น series หรือชุดข้อมูลสำหรับ highcharts เบื้องต้นอย่างง่าย
ดึงข้อมูลจากฐานข้อมูล มาแสดงใน highcharts เบื้องต้น
https://www.ninenik.com/content.php?arti_id=641 via @ninenik
แต่ในการใช้งานจริง เราจะพบว่า ข้อมูลนั้นเป็นไปได้ที่จะมีไม่ครบ คอลัมน์
เช่น เรามีคอลัมน์เดือนทั้งหมด 12 คอลัมน์ และมีข้อมูลครบทุกเดือน
กราฟของเราจะทำงานถูกต้อง
แต่ถ้าเรามีบางเดือน ไม่มีข้อมูล ก็จะเป็นผลให้ชุดข้อมูล มีจำนวนไม่ถึง 12
กราฟก็จะทำงานไม่ถูกต้อง ดังนั้นเนื้อหาในตอนนี้ จะเป็นแนวทางการแก้ไข
ปัญหาดังกล่าว รวมถึงการเพิ่มเติมในส่วนของการแสดงข้อมูลเปรียบเทียบ
สินค้าตั้งแต่ 2 รายการขึ้นไปมาแสดง
คำสั่ง sql ตาราง tbl_sell (มีเพิ่มส่วนของสินค้า B เข้ามาสองรายการลำดับที่ 13 และ 14)
CREATE TABLE `tbl_sell` ( `id_sell` int(11) NOT NULL auto_increment, `name` varchar(100) NOT NULL, `qty` int(11) NOT NULL, `date_sell` date NOT NULL, PRIMARY KEY (`id_sell`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ; -- -- Dumping data for table `tbl_sell` -- INSERT INTO `tbl_sell` VALUES (1, 'สินค้า A', 49, '2015-01-01'); INSERT INTO `tbl_sell` VALUES (2, 'สินค้า A', 71, '2015-02-01'); INSERT INTO `tbl_sell` VALUES (3, 'สินค้า A', 106, '2015-03-01'); INSERT INTO `tbl_sell` VALUES (4, 'สินค้า A', 129, '2015-04-01'); INSERT INTO `tbl_sell` VALUES (5, 'สินค้า A', 144, '2015-05-01'); INSERT INTO `tbl_sell` VALUES (6, 'สินค้า A', 176, '2015-06-01'); INSERT INTO `tbl_sell` VALUES (7, 'สินค้า A', 135, '2015-07-01'); INSERT INTO `tbl_sell` VALUES (8, 'สินค้า A', 148, '2015-08-01'); INSERT INTO `tbl_sell` VALUES (9, 'สินค้า A', 216, '2015-09-01'); INSERT INTO `tbl_sell` VALUES (10, 'สินค้า A', 194, '2015-10-01'); INSERT INTO `tbl_sell` VALUES (11, 'สินค้า A', 95, '2015-11-01'); INSERT INTO `tbl_sell` VALUES (12, 'สินค้า A', 54, '2015-12-01'); INSERT INTO `tbl_sell` VALUES (13, 'สินค้า B', 39, '2015-03-01'); INSERT INTO `tbl_sell` VALUES (14, 'สินค้า B', 75, '2015-06-01');
ตารางประกอบคำอธิบาย tbl_sell
| id_sell | name | qty | date_sell |
| 1 | สินค้า A | 49 | 2015-01-01 |
| 2 | สินค้า A | 71 | 2015-02-01 |
| 3 | สินค้า A | 106 | 2015-03-01 |
| 4 | สินค้า A | 129 | 2015-04-01 |
| 5 | สินค้า A | 144 | 2015-05-01 |
| 6 | สินค้า A | 176 | 2015-06-01 |
| 7 | สินค้า A | 135 | 2015-07-01 |
| 8 | สินค้า A | 148 | 2015-08-01 |
| 9 | สินค้า A | 216 | 2015-09-01 |
| 10 | สินค้า A | 194 | 2015-10-01 |
| 11 | สินค้า A | 95 | 2015-11-01 |
| 12 | สินค้า A | 54 | 2015-12-01 |
| 13 | สินค้า B | 39 | 2015-03-01 |
| 14 | สินค้า B | 75 | 2015-06-01 |
1. เบื้องต้นแก้ไขไฟล์ chartoptions.js เล็กน้อย ปรับหัวข้อใหม่เป็นเปรียบเทียบรายการ
var chartOptions={
chart: {
type: 'column'
},
title: {
text: 'เปรียบเทียบสินค้า A และ B ที่ขายได้แยกรายเดือน'
},
subtitle: {
text: 'ที่มา: แสดงหัวข้อย่อย'
},
xAxis: {
categories: [
'ม.ค.',
'ก.พ.',
'มี.ค.',
'เม.ย.',
'พ.ค.',
'มิ.ย.',
'ก.ค.',
'ส.ค.',
'ก.ย.',
'ต.ค.',
'พ.ย.',
'ธ.ค.'
],
crosshair: true
},
yAxis: {
min: 0,
title: {
text: 'จำนวน (ชิ้น)'
}
},
plotOptions: {
column: {
pointPadding: 0.2,
borderWidth: 0
}
}
}
2. โครงสร้างไฟล์ทดสอบ highcharts_db.php เหมือนเดิมจากตอนที่แล้ว
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Highcharts</title>
</head>
<body>
<div style="width:80%;margin:auto;">
<div id="hc_container" style="min-width: 310px; height: 400px; margin: 0 auto"></div>
</div>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>
<script src="chartoptions.js"></script>
<script type="text/javascript">
$(function () {
// ดึงข้อมูลจากฐานข้อมูลสร้างตัวแปร object series ข้อมูลสำหรับใช้งาน
$.getJSON( "series_db.php",{
year:'2015' // ส่งค่าตัวแปร ไปถ้ามี ในที่นี้ ส่งปีไป เพราะจะดูข้อมูลรายเดือนของปีที่ก่ำหนด
},function(data) {
var dataSeries=data; // รับค่าข้อมูลตัวแปร object series
$('#hc_container').highcharts(
$.extend(chartOptions,{
series:dataSeries
})
);
});
});
</script>
</body>
</html>
3. ไฟล์ดึงข้อมูลจากฐานข้อมูลสร้างรูปแบบ json object สำหรับ highcharts
ไฟล์ series_db.php
<?php
header("Content-type:application/json; charset=UTF-8");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
// เชื่อมต่อฐานข้อมูล
$link=mysql_connect("localhost","root","") or die("error".mysql_error());
mysql_select_db("test",$link);
mysql_query("set character set utf8");
$more_q="";
if(isset($_GET['year']) && $_GET['year']!=""){
$more_q.="AND DATE_FORMAT(date_sell,'%Y') ='".$_GET['year']."' ";
}
// การเรียงข้อมูลหรือ order by ควรใช้ id สินค้าค้าหรือชื่อสินค้า และ วันที่
$q="
SELECT name,date_sell,SUM(qty) as sum_qty FROM tbl_sell
WHERE 1 $more_q
GROUP BY name,DATE_FORMAT(date_sell,'%Y-%m')
ORDER BY name,date_sell
";
$qr=mysql_query($q);
while($rs=mysql_fetch_array($qr)){
$char_month=substr($rs['date_sell'],5,2); // หาตัวเลขสองตัวระบุเดิอน เช่น 01,12,11
$arr_name[$rs['name']]=$rs['name']; // เก็บชื่อสินค้า key เป็นไปได้ให้ใช้ id แทนชื่อจะดีกว่า
$json_data[$rs['name']][$char_month]=intval($rs['sum_qty']); // เก็บข้อมูลแต่ละเดือนถ้ามี
}
// จัดรูปแบบข้อมูลก่อนแปลงเป็น json object
// วนลูปแสดง array โดยยึด key ของชื่อสินค้า ซึ่งในที่นี้จะมีสินค้าสองรายการ
if(count($arr_name)>0){
foreach($arr_name as $val_name){ // วนลูปเพื่อใช้งาน ชื่อสินค้า
// เทคนิคการกำหนดข้อมูลให้ครบเดือน กรณีข้อมูลของบางเดือนไม่มีในฐานข้อมูล
for($i=1;$i<=12;$i++){
$char_chk=str_pad($i,2,"0",STR_PAD_LEFT);
if(!isset($json_data[$val_name][$char_chk])){ // ตรวจสอบ key เดือนไหนไม่มี
$json_data[$val_name][$char_chk]=0; // .ให้กำหนดค่าเป็น 0
}
}
ksort($json_data[$val_name]); // จัดเรียง key ข้อมูลใหม่ ให้ไล่จาก 01,02,....,11,12
$json_series[]=array(
"name"=>$val_name,
"data"=>array_values($json_data[$val_name]) // เปลี่ยน key เป็น 0,1,2,...
);
}
}
$json= json_encode($json_series); // แปลงข้อมูล array เป็น ข้อความ json object นำไปใช้งาน
// ทำให้ json ไฟล์รองรับ callback function สำหรับ cross domain
if(isset($_GET['callback']) && $_GET['callback']!=""){
echo $_GET['callback']."(".$json.");";
}else{
echo $json;
}
exit;
?>
จะเห็นว่าในส่วนของไฟล์ series_db.php เราจะมีการปรับการกำหนดค่าต่างๆ ให้เหมาะสม
รวมทั้งเทคนิคการกำหนดค่าให้กับชุดข้อมูลที่ขาดไปให้ครบตามจำนวนคอลัมน์
แนวทางนี้จะกับคอลัมน์ที่เป็น เดือน 12 หากรูปแบบงานอื่น ที่มีจำนวนคอลัมน์หรือเงื่อนไข
ต่างไปจากนี้ ต้องปรับค่าใหม่ให้เหมาะสมตามแต่รูปแบบนั้น
ตัวอย่างผลลัพธ์ที่ได้