En esta ocasión quiero compartir un script php que nos servirán como guía a la hora que necesitemos realizar una búsqueda de fechas, usando el plugins jQuery datepicker, con lo se filtraran los datos entre dos fecha dadas, para este ejemplo se ha usado una tabla de datos (DataTables), basándonos entre un rango de fechas en especifico, los datos que usaremos para este ejemplo son los datos de una factura de venta (tipo de documento, nombre del cliente, nombre del producto, precio unitario, iva, estado y fecha de la venta).
Si debes usar Datatables en algún proyecto, entonces puedes añadir características adicionales de busqueda usando este plugins, para este ejemplo nos hemos centrado en el filtrado de datos buscando entre un rango de fechas, pero se le puede agregar los filtros que desees; bien podrías filtrar datos usando un campo de tipo select para buscar en la tabla de ventas que tipo de documento se necesita filtrar. Consideramos que con este ejemplo se te hara mas fácil agregar distintos filtros de búsqueda usando datatables.
Lo que haremos:
Crear una base de datos desde nuestro servidor de base de datos, para nuestro ejemplo la hemos nombrado “datepicker”, pero tu puedes llamarla como desees. Luego de haber creado la base de datos debemos ejecutar la siguiente consulta SQL.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
-- phpMyAdmin SQL Dump -- version 4.5.1 -- http://www.phpmyadmin.net -- -- Servidor: 127.0.0.1 -- Tiempo de generación: 30-07-2017 a las 21:24:48 -- 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: `datepicker` -- -- -------------------------------------------------------- -- -- Estructura de tabla para la tabla `ventas` -- CREATE TABLE `ventas` ( `id` int(11) NOT NULL, `documento` varchar(213) NOT NULL, `cliente` varchar(255) NOT NULL, `producto` varchar(255) NOT NULL, `precio` double(12,2) NOT NULL, `iva` double NOT NULL, `estado` varchar(213) NOT NULL, `fecha` date NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -- Volcado de datos para la tabla `ventas` -- INSERT INTO `ventas` (`id`, `documento`, `cliente`, `producto`, `precio`, `iva`, `estado`, `fecha`) VALUES (1, 'Factura', 'David E. Gary', 'Shuttering Plywood', 1500.00, 5, 'Pendiente', '2017-01-14'), (2, 'Factura', 'Eddie M. Douglas', 'Aluminium Heavy Windows', 2000.00, 16, 'Rechazada', '2017-01-08'), (3, 'Factura', 'Oscar D. Scoggins', 'Plaster Of Paris', 150.00, 17, 'Pendiente', '2016-12-29'), (4, 'Factura', 'Clara C. Kulik', 'Spin Driller Machine', 350.00, 11, 'Pendiente', '2016-12-30'), (5, 'Factura', 'Christopher M. Victory', 'Shopping Trolley', 100.00, 19, 'Aprobada', '2017-01-01'), (6, 'Boleta', 'Jessica G. Fischer', 'CCTV Camera', 800.00, 10, 'Pendiente', '2017-01-02'), (7, 'Boleta', 'Roger R. White', 'Truck Tires', 2000.00, 12, 'Rechazada', '2016-12-28'), (8, 'Boleta', 'Susan C. Richardson', 'Glass Block', 200.00, 11, 'Aprobada', '2017-01-04'), (9, 'Ticket', 'David C. Jury', 'Casing Pipes', 500.00, 20, 'Pendiente', '2016-12-27'), (10, 'Ticket', 'Lori C. Skinner', 'Glass PVC Rubber', 1800.00, 17, 'Rechazada', '2016-12-30'), (11, 'Ticket', 'Shawn S. Derosa', 'Sony HTXT1 2.1-Channel TV', 180.00, 8, 'Aprobada', '2017-01-03'), (12, 'Factura', 'Karen A. McGee', 'Over-the-Ear Stereo Headphones ', 25.00, 18, 'Rechazada', '2017-01-01'), (13, 'Factura', 'Kristine B. McGraw', 'Tristar 10" Round Copper Chef Pan with Glass Lid', 20.00, 15, 'Pendiente', '2016-12-30'), (14, 'Factura', 'Gary M. Porter', 'ROBO 3D R1 Plus 3D Printer', 600.00, 14, 'Aprobada', '2017-01-02'), (15, 'Boleta', 'Sarah D. Hunter', 'Westinghouse Select Kitchen Appliances', 35.00, 12, 'Pendiente', '2016-12-29'), (16, 'Boleta', 'Diane J. Thomas', 'SanDisk Ultra 32GB microSDHC', 12.00, 14, 'Rechazada', '2017-01-05'), (17, 'Boleta', 'Helena J. Quillen', 'TaoTronics Dimmable Outdoor String Lights', 16.00, 11, 'Aprobada', '2017-01-04'), (18, 'Ticket', 'Arlette G. Nathan', 'TaoTronics Bluetooth in-Ear Headphones', 25.00, 14, 'Rechazada', '2017-01-03'), (19, 'Ticket', 'Ronald S. Vallejo', 'Scotchgard Fabric Protector, 10-Ounce, 2-Pack', 20.00, 15, 'Pendiente', '2017-01-03'), (20, 'Ticket', 'Felicia L. Sorensen', 'Anker 24W Dual USB Wall Charger with Foldable Plug', 12.00, 13, 'Aprobada', '2017-01-04'); -- -- Índices para tablas volcadas -- -- -- Indices de la tabla `ventas` -- ALTER TABLE `ventas` ADD PRIMARY KEY (`id`); -- -- AUTO_INCREMENT de las tablas volcadas -- -- -- AUTO_INCREMENT de la tabla `ventas` -- ALTER TABLE `ventas` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=21; /*!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 */; |
Archivo index.php: El archivo index se encargara de mostrar los datos haciendo uso del plugins datatables, desde donde también se hará una llamada vía ajax al archivo llamado ajax.php. El código del index.php es mostrado a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
<html> <head> <title>Filtrar datos por fechas usando datatables con PHP y MySQL</title> <link rel="stylesheet" href="bootstrap-3.3.7/css/bootstrap.min.css"> <link rel="stylesheet" href="bootstrap-3.3.7/css/csscustom.css"> <link href="plugins/datatables/dataTables.bootstrap.css" rel="stylesheet" type="text/css" /> <link rel="stylesheet" href="plugins/datepicker/datepicker3.css"> <style> body { margin:0; padding:0; background-color:#f1f1f1; } .box { width:1270px; padding:20px; background-color:#fff; border:1px solid #ccc; border-radius:5px; margin-top:25px; } </style> </head> <body> <div class="container box"> <h1 align="center"> Filtrar datos por fechas usando datatables con PHP y MySQL</h1> <br /> <div class="table-responsive" style="overflow-x: hidden;"> <br /> <div class="row"> <div class="input-daterange"> <div class="col-md-4"> <input type="text" name="start_date" id="start_date" class="form-control" /> </div> <div class="col-md-4"> <input type="text" name="end_date" id="end_date" class="form-control" /> </div> </div> <div class="col-md-4"> <input type="button" name="search" id="search" value="Buscar" class="btn btn-info active" /> </div> </div> <br /> <table id="order_data" class="table table-striped table-hover"> <thead> <tr> <th>Orden ID</th> <th>Documento</th> <th>Cliente</th> <th>Producto</th> <th>Precio</th> <th>Iva</th> <th>Estado</th> <th>Fecha</th> </tr> </thead> </table> </div> </div> <script src="bootstrap-3.3.7/js/jQuery-2.1.4.min.js"></script> <script src="bootstrap-3.3.7/js/bootstrap.min.js"></script> <script src="plugins/datepicker/bootstrap-datepicker.js"></script> <script src="plugins/datatables/jquery.dataTables.js" type="text/javascript"></script> <script src="plugins/datatables/dataTables.bootstrap.js" type="text/javascript"></script> </body> </html> <script type="text/javascript" language="javascript" > $(document).ready(function(){ $('.input-daterange').datepicker({ "locale": { "separator": " - ", "applyLabel": "Aplicar", "cancelLabel": "Cancelar", "fromLabel": "Desde", "toLabel": "Hasta", "customRangeLabel": "Custom", "daysOfWeek": [ "Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa" ], "monthNames": [ "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" ], "firstDay": 1 }, format: "yyyy-mm-dd", autoclose: true }); fetch_data('no'); function fetch_data(is_date_search, start_date='', end_date='') { var dataTable = $('#order_data').DataTable({ "language":{ "lengthMenu":"Mostrar _MENU_ registros por página.", "zeroRecords": "Lo sentimos. No se encontraron registros.", "info": "Mostrando página _PAGE_ de _PAGES_", "infoEmpty": "No hay registros aún.", "infoFiltered": "(filtrados de un total de _MAX_ registros)", "search" : "Búsqueda", "LoadingRecords": "Cargando ...", "Processing": "Procesando...", "SearchPlaceholder": "Comience a teclear...", "paginate": { "previous": "Anterior", "next": "Siguiente", } }, "processing" : true, "serverSide" : true, "sort": false, "order" : [], "ajax" : { url:"ajax.php", type:"POST", data:{ is_date_search:is_date_search, start_date:start_date, end_date:end_date } } }); } $('#search').click(function(){ var start_date = $('#start_date').val(); var end_date = $('#end_date').val(); if(start_date != '' && end_date !='') { $('#order_data').DataTable().destroy(); fetch_data('yes', start_date, end_date); } else { alert("Por favor seleccione la fecha"); } }); }); </script> |
Archivo ajax.php: este archivo se encargará de hacer las consulta a la base de datos, los cuales son solicitadas desde el archivo index.php, creado anteriormente. Los datos extraído son enviados vía json al archivo index.php, y este se encarga de mostrar las vista dentro de dicho archivo simpre haciendo uso del plugins datatables. El código del archivo ajax.php es el siguiente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
<?php $connect = mysqli_connect("localhost", "root", "", "datepicker");//Configurar los datos de conexion $columns = array('id','documento', 'cliente', 'producto', 'precio', 'iva','estado', 'fecha'); $query = "SELECT * FROM ventas WHERE "; if($_POST["is_date_search"] == "yes") { $query .= 'fecha BETWEEN "'.$_POST["start_date"].'" AND "'.$_POST["end_date"].'" AND '; } if(isset($_POST["search"]["value"])) { $query .= ' (id LIKE "%'.$_POST["search"]["value"].'%" OR cliente LIKE "%'.$_POST["search"]["value"].'%" OR producto LIKE "%'.$_POST["search"]["value"].'%" OR documento LIKE "%'.$_POST["search"]["value"].'%" OR precio LIKE "%'.$_POST["search"]["value"].'%") '; } if(isset($_POST["order"])) { $query .= 'ORDER BY '.$columns[$_POST['order']['0']['column']].' '.$_POST['order']['0']['dir'].' '; } else { $query .= 'ORDER BY id DESC '; } $query1 = ''; if($_POST["length"] != -1) { $query1 = 'LIMIT ' . $_POST['start'] . ', ' . $_POST['length']; } $number_filter_row = mysqli_num_rows(mysqli_query($connect, $query)); $result = mysqli_query($connect, $query . $query1); $data = array(); while($row = mysqli_fetch_array($result)) { $fecha=date("d/m/Y", strtotime($row["fecha"])); $sub_array = array(); $sub_array[] = $row["id"]; $sub_array[] = $row["documento"]; $sub_array[] = $row["cliente"]; $sub_array[] = $row["producto"]; $sub_array[] = $row["precio"]; $sub_array[] = $row["iva"]; $sub_array[] = $row["estado"]; $sub_array[] = $fecha; $data[] = $sub_array; } function get_all_data($connect) { $query = "SELECT * FROM ventas"; $result = mysqli_query($connect, $query); return mysqli_num_rows($result); } $output = array( "draw" => intval($_POST["draw"]), "recordsTotal" => get_all_data($connect), "recordsFiltered" => $number_filter_row, "data" => $data ); echo json_encode($output); ?> |
Se debe tomar especial atención a la linea 2 del archivo ajax.php, ya que debemos colocar los datos que correspondan a la conexión de nuestra base de datos.
1 |
$connect = mysqli_connect("localhost", "root", "", "datepicker");//Configurar los datos de conexion |
Bien este seria un pequeño ejemplo sobre como filtrar datos por fechas usando datatables con PHP y MySQL, eres libre de descargar este script y adaptarlo a tus proyecto de desarrollo web con PHP y MySQL.
Te invito a que descargues los archivos fuentes utilizados para este tutorial a continuacion: