Selasa, 23 Februari 2016

Membuat Grafik Di codeigniter

Sekarang saya akan membuat postingan membuat chart statistik visitor dengan menggunakan framework Codeigniter dan library highcharts, pastinya para developer web sering mendapatkan  project untuk membuat grafik untuk membuat laporan tahunan, bulanan atau harian agar bisa mentracking data, setelah saya cari kemana-mana ternyata ada yang mudah nih, yang pasti ada kemauan dan selalu usaha pasti ada jalan keluar. 
Pertama yang pasti siapkan framework codeigniter yang sudah di atur confignya, dan download library highcharts, jangan lupa databasenya, kalo sudah siap yuk kita mulai:



untuk memudahkan saya akan kasih contoh table database nya, disini saya membuat database dengan nama grafik dengan tabel tbcounter;

CREATE TABLE IF NOT EXISTS `tbcounter` (
  `ip` varchar(2050) NOT NULL,
  `date` date NOT NULL,
  `hits` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `tbcounter` (`ip`, `date`, `hits`) VALUES
('10.88.25.1', '2016-01-16', 11),
('10.88.25.2', '2016-01-16', 3),
('10.88.25.3', '2016-01-17', 4),
('10.88.25.4', '2016-01-16', 11),
('10.88.25.5', '2016-02-16', 3),
('10.88.25.6', '2016-02-17', 4),
('10.88.25.10', '2016-02-23', 2),
('10.88.25.15', '2016-02-23', 1),
('10.88.25.13', '2016-03-16', 11),
('10.88.25.1', '2016-03-16', 3),
('10.88.25.5', '2016-03-17', 4),
('10.88.25.8', '2016-03-16', 11),
('10.88.25.10', '2016-03-16', 3),
('10.88.25.19', '2016-03-17', 4),
('10.88.25.27', '2016-04-23', 2),
('10.88.25.50', '2016-04-23', 1),
('10.88.25.6', '2016-04-16', 3),
('10.88.25.9', '2016-05-17', 4),
('10.88.25.11', '2016-05-23', 2),
('10.88.25.12', '2016-05-23', 1),
('10.88.25.16', '2016-05-16', 11),
('10.88.25.20', '2016-05-16', 3),
('10.88.25.32', '2016-06-17', 4),
('10.88.25.1', '2016-06-16', 11),
('10.88.25.35', '2016-06-16', 3),
('10.88.25.36', '2016-07-17', 4),
('10.88.25.26', '2016-07-23', 2),
('10.88.25.6', '2016-07-16', 3),
('10.88.25.9', '2016-08-17', 4),
('10.88.25.11', '2016-08-23', 2),
('10.88.25.12', '2016-08-23', 1),
('10.88.25.16', '2016-08-16', 11),
('10.88.25.20', '2016-08-6', 3),
('10.88.25.32', '2016-09-17', 4),
('10.88.25.1', '2016-09-16', 11),
('10.88.25.35', '2016-09-16', 3),
('10.88.25.36', '2016-09-17', 4),
('10.88.25.26', '2016-09-23', 2),
('10.88.25.16', '2016-10-16', 11),
('10.88.25.20', '2016-10-16', 3),
('10.88.25.32', '2016-10-17', 4),
('10.88.25.1', '2016-10-16', 11),
('10.88.25.35', '2016-11-16', 3),
('10.88.25.36', '2016-11-17', 4),
('10.88.25.26', '2016-11-23', 2),
('10.88.25.15', '2016-11-23', 1),
('10.88.25.13', '2016-12-16', 11),
('10.88.25.1', '2016-12-16', 3),
('10.88.25.5', '2016-12-17', 4),
('10.88.25.8', '2016-12-16', 11),
('10.88.25.10', '2016-12-16', 3),
('10.88.25.19', '2016-12-17', 4),
('10.88.25.27', '2016-12-23', 2),
('10.88.25.50', '2016-12-23', 1),
('10.88.25.6', '2016-12-16', 3),
('10.88.25.9', '2016-12-17', 4),
('10.88.25.11', '2016-12-23', 2),
('10.88.25.12', '2016-12-23', 1),
('10.88.25.20', '2016-12-25', 1);

kita buat control dengan nama control_grafik.php

class control_grafik extends CI_Controller {
 public function index() {  
   
   foreach($this->model_grafik->statistik_pengunjung()->result_array() as $row)
   {
    $data['grafik'][]=(float)$row['Januari'];
    $data['grafik'][]=(float)$row['Februari'];
    $data['grafik'][]=(float)$row['Maret'];
    $data['grafik'][]=(float)$row['April'];
    $data['grafik'][]=(float)$row['Mei'];
    $data['grafik'][]=(float)$row['Juni'];
    $data['grafik'][]=(float)$row['Juli'];
    $data['grafik'][]=(float)$row['Agustus'];
    $data['grafik'][]=(float)$row['September'];
    $data['grafik'][]=(float)$row['Oktober'];
    $data['grafik'][]=(float)$row['November'];
    $data['grafik'][]=(float)$row['Desember'];
   }
    
   $this->load->view('view_grafik', $data); 
 }

selanjutnya kita buat model dengan nama model_grafik.php


class Model_grafik extends CI_Model{
   function statistik_pengunjung()
 {
  
  $sql= $this->db->query("
  
  select
  ifnull((SELECT count(ip) FROM (tbcounter)WHERE((Month(date)=1)AND (YEAR(date)=2016))),0) AS `Januari`,
  ifnull((SELECT count(ip) FROM (tbcounter)WHERE((Month(date)=2)AND (YEAR(date)=2016))),0) AS `Februari`,
  ifnull((SELECT count(ip) FROM (tbcounter)WHERE((Month(date)=3)AND (YEAR(date)=2016))),0) AS `Maret`,
  ifnull((SELECT count(ip) FROM (tbcounter)WHERE((Month(date)=4)AND (YEAR(date)=2016))),0) AS `April`,
  ifnull((SELECT count(ip) FROM (tbcounter)WHERE((Month(date)=5)AND (YEAR(date)=2016))),0) AS `Mei`,
  ifnull((SELECT count(ip) FROM (tbcounter)WHERE((Month(date)=6)AND (YEAR(date)=2016))),0) AS `Juni`,
  ifnull((SELECT count(ip) FROM (tbcounter)WHERE((Month(date)=7)AND (YEAR(date)=2016))),0) AS `Juli`,
  ifnull((SELECT count(ip) FROM (tbcounter)WHERE((Month(date)=8)AND (YEAR(date)=2016))),0) AS `Agustus`,
  ifnull((SELECT count(ip) FROM (tbcounter)WHERE((Month(date)=9)AND (YEAR(date)=2016))),0) AS `September`,
  ifnull((SELECT count(ip) FROM (tbcounter)WHERE((Month(date)=10)AND (YEAR(date)=2016))),0) AS `Oktober`,
  ifnull((SELECT count(ip) FROM (tbcounter)WHERE((Month(date)=11)AND (YEAR(date)=2016))),0) AS `November`,
  ifnull((SELECT count(ip) FROM (tbcounter)WHERE((Month(date)=12)AND (YEAR(date)=2016))),0) AS `Desember`
 from tbcounter GROUP BY YEAR(date) 
  
  ");
  
  return $sql;
  
 } 
}

dan yang terakhir kita membuat view dengan nama view_grafik.php

<style>
 #chart{
   z-index:-10;} 
</style>
<body>
 <div id="chart">
</div>
<script src="&lt;?php echo base_url();?&gt;asset/highcharts/jquery.min.js" type="text/javascript"></script>
<script src="&lt;?php echo base_url();?&gt;asset/highcharts/highcharts.js" type="text/javascript"></script>
<script src="&lt;?php echo base_url();?&gt;asset/highcharts/modules/exporting.js" type="text/javascript"></script>
<script src="&lt;?php echo base_url();?&gt;asset/highcharts/modules/offline-exporting.js" type="text/javascript"></script>
<script type="text/javascript">
jQuery(function(){
 new Highcharts.Chart({
  chart: {
   renderTo: 'chart',
   type: 'line',
  },
  title: {
   text: 'Grafik Statistik pengunjung',
   x: -20
  },
  subtitle: {
   text: 'Count visitor',
   x: -20
  },
  xAxis: {
   categories: ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun',
                    'Jul', 'Ags', 'Sep', 'Okt', 'Nov', 'Des']
  },
  yAxis: {
   title: {
    text: 'Total pengunjung'
   }
  },
  series: [{
   name: 'Data dalam Bulan',
   data: <?php echo json_encode($grafik); ?>
  }]
 });
}); 
</script>
</body>


Nah setelah tahap diatas selesai silahkan tinggal running dilocalhost...hasilnya akan seperti dibawah ini...Tarataratatttaaaaaa...!!!!



selain itu tampilan juga bisa dieksport ke format .png dan .svg. untuk mempercantik bisa menambahkan themes dengan menambakan script


selain grafik model line basic anda juga bisa mengeksplor lagi grafik dengan model yang lain untuk lebih lanjut kunjungi highcharts.com, sekian postingan hari ini semoga bermanfaat untuk semuanya..


Demo

Semoga bermanfaat.

Previous Post
Next Post

37 komentar:

  1. Makasih gan tutorialnya sangat bermanfaat bagi saya,

    BalasHapus
  2. kalo mau buat grafik dalam perhari nya gimana ?

    BalasHapus
    Balasan
    1. bisa tinggal ganti quey model saja dan bikin loop tanggal per bulan

      Hapus
    2. bisa di contohin ?

      saya buat query gini tapi error :
      "select
      ifnull((SELECT count(ip) FROM (tbcounter)WHERE((Date(date)=1)AND (Month(date)=12)AND (YEAR(date)=2016))),0) AS `1`,
      ifnull((SELECT count(ip) FROM (tbcounter)WHERE((Date(date)=2)AND (Month(date)=12)AND (YEAR(date)=2016))),0) AS `2`,
      dst..
      from tbcounter GROUP BY month(date) and YEAR(date)"

      Hapus
  3. ini kenapa ya?

    Error Number: 1146

    Table 'grafik.report' doesn't exist

    SELECT * from report

    Filename: C:/xampp/htdocs/ci5/system/database/DB_driver.php

    Line Number: 691

    BalasHapus
    Balasan
    1. dari error terlihat bahwa tabel grafik dengan field report tidak ada, coba gan di cek query nya

      Hapus
  4. permisi, maaf mau nanya,

    tutorialnya sudah saya ikutin, cuman tabelnya saya coba pakai tabel sendiri, grafiknya berhasil, tapi hasilnya 0 kenapa ya?

    kalau tabel saya ada 5 kolom, apa query nya harus ada yang ditambah?

    BalasHapus
    Balasan
    1. bisa kasih contoh query yang sudah dibuat??

      Hapus
  5. masih ngikutin yg ditutorial sihh..

    $sql = $this->db->query("select
    ifnull((SELECT count(kode_aktiva) FROM (perbaikan)WHERE((Month(tgl_masuk)=1)AND (YEAR(tgl_masuk)=2016))),0) AS `Januari`,
    ifnull((SELECT count(kode_aktiva) FROM (perbaikan)WHERE((Month(tgl_masuk)=2)AND (YEAR(tgl_masuk)=2016))),0) AS `Februari`,
    ifnull((SELECT count(kode_aktiva) FROM (perbaikan)WHERE((Month(tgl_masuk)=3)AND (YEAR(tgl_masuk)=2016))),0) AS `Maret`,
    ifnull((SELECT count(kode_aktiva) FROM (perbaikan)WHERE((Month(tgl_masuk)=4)AND (YEAR(tgl_masuk)=2016))),0) AS `April`,
    ifnull((SELECT count(kode_aktiva) FROM (perbaikan)WHERE((Month(tgl_masuk)=5)AND (YEAR(tgl_masuk)=2016))),0) AS `Mei`,
    ifnull((SELECT count(kode_aktiva) FROM (perbaikan)WHERE((Month(tgl_masuk)=6)AND (YEAR(tgl_masuk)=2016))),0) AS `Juni`,
    ifnull((SELECT count(kode_aktiva) FROM (perbaikan)WHERE((Month(tgl_masuk)=7)AND (YEAR(tgl_masuk)=2016))),0) AS `Juli`,
    ifnull((SELECT count(kode_aktiva) FROM (perbaikan)WHERE((Month(tgl_masuk)=8)AND (YEAR(tgl_masuk)=2016))),0) AS `Agustus`,
    ifnull((SELECT count(kode_aktiva) FROM (perbaikan)WHERE((Month(tgl_masuk)=9)AND (YEAR(tgl_masuk)=2016))),0) AS `September`,
    ifnull((SELECT count(kode_aktiva) FROM (perbaikan)WHERE((Month(tgl_masuk)=10)AND (YEAR(tgl_masuk)=2016))),0) AS `Oktober`,
    ifnull((SELECT count(kode_aktiva) FROM (perbaikan)WHERE((Month(tgl_masuk)=11)AND (YEAR(tgl_masuk)=2016))),0) AS `November`,
    ifnull((SELECT count(kode_aktiva) FROM (perbaikan)WHERE((Month(tgl_masuk)=12)AND (YEAR(tgl_masuk)=2016))),0) AS `Desember`
    from perbaikan GROUP BY YEAR(tgl_masuk)
    ");

    BalasHapus
    Balasan
    1. dari query ga ada masalah, coba pada controller ubah script ini $this->load->view('view_grafik', $data); dengan echo json_encode($data); selanjutnya panggil di url http://localhost/project_anda/controllers_chart dan apakah ada nilai yg muncul pada json

      Hapus
  6. {"pesan":[],"sum_pesan":0,"grafik":[0,0,0,0,0,0,0,0,0,0,0,0]}

    hasilnya seperti itu...

    BalasHapus
    Balasan
    1. grafik":[0,0,0,0,0,0,0,0,0,0,0,0]} ini hasil json dari data per bulan berarti hasil query kosong tidak ada data nya, apa di database nya sudah di masukin data nya?dan untuk format tgl_masuk pada databse harus Y-m-d = 0000-00-00.

      Hapus
  7. format sudah sesuai, data di database juga ada isi...

    BalasHapus
    Balasan
    1. saya bantu koreksi script nya. silahkan kirim script controllers, views dan model grafik nya... beserta contoh tabel database nya ke irwandwiyanto@cahbagusnongkrongweb.xyz

      Hapus
    2. kalau format tidak sesuai cara mengatasinya gmn? data terlalu banyak jadi tidak mungkin mengubah manual

      Hapus
    3. Bagaiman contoh nya bisa dijelaskan lebih detail??

      Hapus
  8. sudah saya kirim, terimakasih sebelumnya..

    BalasHapus
    Balasan
    1. hehehe... setelah di cek... database nya tgl_masuk tahun 2017 sedangkan query yg dibuat tgl_masuk tahun 2016 ya pasti kosong gk ketemu... coba di cek ulang

      Hapus
  9. oh iya ternyata salah tahun, berarti kalau misal saya mau grafiknya sesuai tahun yang diinput tinggal nambahin where gitu ya..

    ini saya coba ganti query dari count jadi sum untuk total biaya, tapi range di garis vertikal nya berbahasa inggris, cara gantinya bagaimana?

    dan kalau misal di kode :
    yAxis: {
    title: {
    text: 'Total Pengeluaran Biaya'
    }
    },
    series: [{
    name: 'Total biaya pengeluaran dalam bulan Rp.',
    data:
    }]

    yang sebelum echo data ada " : " menghilangkannya bagaimana?

    BalasHapus
  10. Kalau datanya dari CSV bisa gak ya, atau jika sudah ada artikelnya bisa di share... trims

    BalasHapus
    Balasan
    1. Untuk menggunakan data dari csv bisa dilakukan, mungkin ini bisa membantu Contoh menggunakan data CSV.

      Hapus
    2. Terima kasih mas, sangat bermafaat. Sekarang sudah bisa...

      Hapus
  11. Maaf gan, ko gak bisa ya malah tampil blank putih aja ?

    BalasHapus
    Balasan
    1. coba check jquery nya dan hisghchart.js nya

      Hapus
  12. Maaf apakah setiap yang mengunjungi web kita akan otomatis menambahkan di database nya atau engga? makasih sebelumnya

    BalasHapus
    Balasan
    1. ya bisa asalkan setiap login data disimpan pada databse,

      Hapus
  13. gan punya saya kok tampilnya januari-desember trus sblah desember ada angka 12-23 seharusnya kan tampilnya cuman januari-desember
    terima kasih sebelumnya

    BalasHapus
    Balasan
    1. apa kah script nya dah benar kaya diatas?

      Hapus
    2. tambahin di controlernya $data="";

      Hapus
    3. ganti from tbcounter GROUP BY YEAR(date) jadi from tbcounter GROUP BY YEAR(CURDATE())

      Hapus
  14. saya ko jadi double ya bulannya smpe 24 bulan

    BalasHapus
  15. gan, sulit ga biar bisa ada selectbox per tahun?

    BalasHapus
  16. Bisa minta emailnya gan? karena domain cahbagusnongkrongweb.xyz sudah expire.

    BalasHapus
  17. kalo mau buat grafik dalam perhari nya gimana ?

    BalasHapus