Generar gráficas de barras con PHP y MySQL usando Chart.js

Compartir

Generar gráficas de barras con PHP y MySQL usando Chart.js

En este post voy a compartir como generar  gráficas de barras con PHP y MySQL usando Chart.js, he querido usar este ejemplo ya que uso este tipo de gráficas  en uno de mis sistemas web de pago: Sistema de Control de Inventario y Facturación y he pensado que podría ser útil compartir esta información, sobre como generar dichos gráficos.

Empezando

He usado el CDN de Bootstrap y jQuery en este tutorial, así que necesitas conexión a Internet para que funcionen. La librería Chart.js  que he utilizado en este tutorial se incluye en el archivo descargable de este tutorial.

Creando nuestra base de datos

Primero, vamos a crear nuestra base de datos.

1. Abre phpMyAdmin. 2. Haz clic en bases de datos, cree una base de datos y asígnele el nombre como test_chartjs (asi la he nombrado para este ejemplo). 3. Después de crear una base de datos, haz clic en el SQL y pega el código a continuación.

-- phpMyAdmin SQL Dump
-- version 4.5.1
-- http://www.phpmyadmin.net
--
-- Servidor: 127.0.0.1
-- Tiempo de generación: 17-01-2018 a las 23:50:58
-- Versión del servidor: 10.1.19-MariaDB
-- Versión de PHP: 7.0.13

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00";

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8mb4 */;

-- -- Base de datos: `test_chartjs` --

-- --------------------------------------------------------

-- -- Estructura de tabla para la tabla `purchases` --

CREATE TABLE `purchases` ( `purchasesid` int(11) NOT NULL, `amount` double NOT NULL, `purchase_date` date NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- -- Volcado de datos para la tabla `purchases` --

INSERT INTO `purchases` (`purchasesid`, `amount`, `purchase_date`) VALUES (1, 50, '2018-01-17'), (2, 60, '2018-02-09');

-- --------------------------------------------------------

-- -- Estructura de tabla para la tabla `sales` --

CREATE TABLE `sales` ( `salesid` int(11) NOT NULL, `amount` double NOT NULL, `sales_date` date NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- -- Volcado de datos para la tabla `sales` --

INSERT INTO `sales` (`salesid`, `amount`, `sales_date`) VALUES (1, 25, '2018-01-17'), (2, 35, '2018-02-02');

-- -- Índices para tablas volcadas --

-- -- Indices de la tabla `purchases` -- ALTER TABLE `purchases` ADD PRIMARY KEY (`purchasesid`);

-- -- Indices de la tabla `sales` -- ALTER TABLE `sales` ADD PRIMARY KEY (`salesid`);

-- -- AUTO_INCREMENT de las tablas volcadas --

-- -- AUTO_INCREMENT de la tabla `purchases` -- ALTER TABLE `purchases` MODIFY `purchasesid` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3; -- -- AUTO_INCREMENT de la tabla `sales` -- ALTER TABLE `sales` MODIFY `salesid` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Creando conexión a la base de datos

Ahora vamos a crear la conexión a la base de datos, para ello creamos un archivo llamado "conexion.php" y pegamos el código siguiente:

<?php
	$db_host="localhost";//Nombre del host
	$db_user="root";//Usuario de la base de datos
	$db_pass="";//Contraseña de usuario de base de datos
	$db_name="test_chartjs";//Nombre de la base de datos
	$conn = new mysqli($db_host, $db_user, $db_pass, $db_name);

if ($conn->connect_error) { die("Conexión falló: " . $conn->connect_error); } ?>

index.php

Este es nuestro archivo de inicio  que contiene nuestro formulario de adición simple de datos y nuestra representación estadística de datos extraídos de la base de datos. Esto también contiene nuestro script de que genera la gráfica de barras.

<!DOCTYPE html>
<html>
<head>
	<title>Generar gráficas de barras con PHP usando Chart.js</title>
	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" />
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
	<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

<!-- ChartJS --> <script src="chart.js/Chart.js"></script> </head> <body> <div class="container-fluid"> <h1 class="page-header text-center">Reporte de datos usando Chart.js</h1> <div class="row"> <div class="col-md-3"> <h3 class="page-header text-center">Añadir compra/venta</h3> <form method="POST" action="add_data.php"> <div class="form-group"> <label>Monto:</label> <input type="text" class="form-control" name="amount" required> </div> <div class="form-group"> <label>Fecha:</label> <input type="date" class="form-control" name="sales_date" required> </div>

<div class="form-group"> <label>Tipo de transacción:</label> <select name="type" id="type" class='form-control' required> <option value="">--Selecciona--</option> <option value="1">Ventas</option> <option value="2">Compras</option> </select> </div> <button type="submit" class="btn btn-primary"><span class="glyphicon glyphicon-floppy-disk"></span> Guardar</button> </form> </div> <div class="col-md-9"> <div class="box box-success"> <div class="box-header with-border"> <?php //set timezone date_default_timezone_set('America/El_Salvador'); $year = date('Y'); ?> <h3 class="box-title">Reporte de compras & Ventas <?php echo $year; ?></h3>

</div> <div class="box-body"> <div class="chart"> <canvas id="barChart" style="height:230px"></canvas> </div> </div> <!-- /.box-body --> </div> </div> </div> </div> <?php include('data.php'); ?> <script> $(function () { var barChartData = { labels : ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'], datasets: [ { label : 'Compras', fillColor : 'rgba(210, 214, 222, 1)', strokeColor : 'rgba(210, 214, 222, 1)', pointColor : 'rgba(210, 214, 222, 1)', pointStrokeColor : '#c1c7d1', pointHighlightFill : '#fff', pointHighlightStroke: 'rgba(220,220,220,1)', data : [ "<?php echo $pjan; ?>", "<?php echo $pfeb; ?>", "<?php echo $pmar; ?>", "<?php echo $papr; ?>", "<?php echo $pmay; ?>", "<?php echo $pjun; ?>", "<?php echo $pjul; ?>", "<?php echo $paug; ?>", "<?php echo $psep; ?>", "<?php echo $poct; ?>", "<?php echo $pnov; ?>", "<?php echo $pdec; ?>" ] }, { label : 'Ventas', fillColor : 'rgba(60,141,188,0.9)', strokeColor : 'rgba(60,141,188,0.8)', pointColor : '#3b8bba', pointStrokeColor : 'rgba(60,141,188,1)', pointHighlightFill : '#fff', pointHighlightStroke: 'rgba(60,141,188,1)', data : [ "<?php echo $tjan; ?>", "<?php echo $tfeb; ?>", "<?php echo $tmar; ?>", "<?php echo $tapr; ?>", "<?php echo $tmay; ?>", "<?php echo $tjun; ?>", "<?php echo $tjul; ?>", "<?php echo $taug; ?>", "<?php echo $tsep; ?>", "<?php echo $toct; ?>", "<?php echo $tnov; ?>", "<?php echo $tdec; ?>" ] } ] } var barChartCanvas = $('#barChart').get(0).getContext('2d') var barChart = new Chart(barChartCanvas) var barChartData = barChartData barChartData.datasets[1].fillColor = '#00a65a' barChartData.datasets[1].strokeColor = '#00a65a' barChartData.datasets[1].pointColor = '#00a65a' var barChartOptions = { //Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value scaleBeginAtZero : true, //Boolean - Whether grid lines are shown across the chart scaleShowGridLines : true, //String - Colour of the grid lines scaleGridLineColor : 'rgba(0,0,0,.05)', //Number - Width of the grid lines scaleGridLineWidth : 1, //Boolean - Whether to show horizontal lines (except X axis) scaleShowHorizontalLines: true, //Boolean - Whether to show vertical lines (except Y axis) scaleShowVerticalLines : true, //Boolean - If there is a stroke on each bar barShowStroke : true, //Number - Pixel width of the bar stroke barStrokeWidth : 2, //Number - Spacing between each of the X value sets barValueSpacing : 5, //Number - Spacing between data sets within X values barDatasetSpacing : 5, //String - A legend template legendTemplate : '<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<datasets.length; i++){%><li><span style="background-color:<%=datasets[i].fillColor%>"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>', //Boolean - whether to make the chart responsive responsive : true, maintainAspectRatio : true }

barChartOptions.datasetFill = false barChart.Bar(barChartData, barChartOptions)

}) </script> </body> </html>

add_data.php

Este es nuestro código PHP que permite  agregar registros a nuestra base de datos.

<?php
	include("conexion.php");//Me conecto a la base de datos

$amount=floatval($_POST['amount']); $date=$_POST['sales_date']; $type=intval($_POST['type']); if ($type==1){ $sql="insert into sales (amount, sales_date) values ('$amount', '$date')"; } else if ($type==2){ $sql="insert into purchases (amount, purchase_date) values ('$amount', '$date')"; } $conn->query($sql);

header('location:index.php'); ?>

data.php

Por último, vamos a crear  nuestro código PHP que contiene los datos que se van a utilizar para generar la gráfica de barras con PHP y MySQL  usando chart.js

<?php
	include("conexion.php");//Me conecto a la base de datos
	//set timezone
	date_default_timezone_set('America/El_Salvador');
	$year = date('Y');
	$total=array();
	for ($month = 1; $month <= 12; $month ++){
		$sql="select *, sum(amount) as total from sales where month(sales_date)='$month' and year(sales_date)='$year'";
		$query=$conn->query($sql);
		$row=$query->fetch_array();

$total[]=$row['total']; }

$tjan = $total[0]; $tfeb = $total[1]; $tmar = $total[2]; $tapr = $total[3]; $tmay = $total[4]; $tjun = $total[5]; $tjul = $total[6]; $taug = $total[7]; $tsep = $total[8]; $toct = $total[9]; $tnov = $total[10]; $tdec = $total[11];

$pyear = $year - 1; $pnum=array();

for ($pmonth = 1; $pmonth <= 12; $pmonth ++){ $sql="select *, sum(amount) as ptotal from purchases where month(purchase_date)='$pmonth' and year(purchase_date)='$year'"; $pquery=$conn->query($sql); $prow=$pquery->fetch_array();

$ptotal[]=$prow['ptotal']; }

$pjan = $ptotal[0]; $pfeb = $ptotal[1]; $pmar = $ptotal[2]; $papr = $ptotal[3]; $pmay = $ptotal[4]; $pjun = $ptotal[5]; $pjul = $ptotal[6]; $paug = $ptotal[7]; $psep = $ptotal[8]; $poct = $ptotal[9]; $pnov = $ptotal[10]; $pdec = $ptotal[11]; ?>

Y aquí termina este tutorial. Te invito a que descargues los archivos fuentes usados para este ejemplo y realices las pruebas que consideres necesarias.

DESCARGAR ARCHIVOS

 

Obed Alvarado

Sobre el autor

Artículo redactado por Obed Alvarado. Comparto experiencias prácticas sobre PHP, MySQL, aplicaciones web, instalación en hosting y herramientas para negocios.

Comentarios