Filtrar y ordenar una tabla Mysql con Ajax

28

En este artículo  veremos como imprimir los datos de una tabla Mysql,  para luego poder ir filtrando los resultados  por diferentes tipos de búsqueda  tales como (entre rango fechas, ingresando criterios y seleccionando opciones), además cuanta con la opción ordenar por sus campos.

Esta sera la estructura de nuestra tabla MySQL:

CREATE TABLE `personas` (
  `id` int(11) NOT NULL auto_increment,
  `nombre` varchar(40) NOT NULL,
  `email` varchar(50) NOT NULL,
  `nacimiento` date NOT NULL,
  `pais` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=13 ;

El campo país esta relacionada con otra tabla países, que se encuentra en la descarga.

PLUGINS

Para nuestro calendario haremos uso del componente jquery ui.

<link rel="stylesheet" type="text/css" href="assets/jqueryui/css/smoothness/jquery-ui-1.8.16.custom.css"/>

<script type="text/javascript" src="assets/js/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="assets/jqueryui/js/jquery-ui-1.8.16.custom.min.js"></script>
<script type="text/javascript" src="assets/js/js.js"></script>
HTML

Sencillo html donde tenemos un formulario con los diferentes criterios de búsqueda, además una tabla para mostrarar los datos.

	<div id="content">
        <div class="filtro">
        	<form id="frm_filtro" method="post" action="">
                <ul>
                    <li><label>Nacimiento:    del</label>
                    	<input type="text" name="del" id="del" size="15" class="datepicker" />
                        al
                        <input type="text" name="al" id="al" size="15" class="datepicker" /></li>
                    <li><label>Nombre/Email:</label> <input type="text" name="nombre_email" size="25" /></li>
                    <li><label>Pais:</label>
                        <select name="pais">
                            <option value="0">--</option>
                            <!-- Listar Paises -->
                            <?php
                            $query = mysql_query("SELECT * FROM pais");
                            while($row = mysql_fetch_array($query)){
                                ?>
                                <option value="<?php echo $row['id_pais'] ?>">
                                    <?php echo $row['nombre_pais'] ?>
                                </option>
                                <?php
                            }
                            ?>
                        </select>
                    </li>
                    <li>
                    	<button type="button" id="btnfiltrar">Filtrar</button>
                    </li>
                    <li>
                    	<a href="javascript:;" id="btncancel">Todos</a>
                    </li>
                </ul>
            </form>
        </div>
        <table cellpadding="0" cellspacing="0" id="data">
        	<thead>
            	<tr>
                    <th width="22%"><span title="nacimiento">Fecha Nacimiento</span></th>
                    <th width="35%"><span title="nombre">Nombre</span></th>
                    <th width="30%"><span title="email">Email</span></th>
                    <th><span title="nombre_pais">Pais</span></th>
                </tr>
            </thead>
            <tbody>

            </tbody>
        </table>
	</div>
JAVASCRIPT

Script para la configuración del calendadio jqueryu ui ademas de la funcion filtrar() para hacer la búsqueda y orden de los registros.

// JavaScript Document
// variable general para ordenar los registros
var ordenar = '';
$(document).ready(function(){

	// Llamando a la funcion de busqueda al
	// cargar la pagina
	filtrar()

	// Configuracion del calendario
	var dates = $( "#del, #al" ).datepicker({
			yearRange: "-50",
			defaultDate: "+1w",
			changeMonth: true,
			changeYear: true,
			onSelect: function( selectedDate ) {
				var option = this.id == "del" ? "minDate" : "maxDate",
					instance = $( this ).data( "datepicker" ),
					date = $.datepicker.parseDate(
						instance.settings.dateFormat ||
						$.datepicker._defaults.dateFormat,
						selectedDate, instance.settings );
				dates.not( this ).datepicker( "option", option, date );
			}
	});

	// filtrar al darle click al boton
	$("#btnfiltrar").click(function(){ filtrar() });

	// boton cancelar
	// limpia todas las cajas de busqueda
	$("#btncancel").click(function(){
		$(".filtro input").val('')
		$(".filtro select").find("option[value='0']").attr("selected",true)
		filtrar()
	});

	// ordenar por campos
	$("#data th span").click(function(){
		var orden = '';
		//si existe algun orden de forma descendente
		if($(this).hasClass("desc"))
		{
			// eliminamos orden descendente y ascendente.
			$("#data th span").removeClass("desc").removeClass("asc")
			$(this).addClass("asc");
			ordenar = "&orderby="+$(this).attr("title")+" asc"
		}else
		{
			$("#data th span").removeClass("desc").removeClass("asc")
			$(this).addClass("desc");
			ordenar = "&orderby="+$(this).attr("title")+" desc"
		}
		filtrar()
	});
});

// funcion general para hacer el filtro
function filtrar()
{
	// funcion ajax de jquery, hara la peticion enviandole
	// los parametros, y este devolvera resultado en formato
	// json
	$.ajax({
		data: $("#frm_filtro").serialize()+ordenar,
		type: "POST",
		dataType: "json",
		url: "ajax.php?action=listar",
			success: function(data){
				var html = '';
				// si la consulta ajax devuelve datos
				if(data.length > 0){
					// hacemos un bucle al json, para recorrer cada registro
					// e irlos almacenando en filas html
					$.each(data, function(i,item){
						html += '<tr>'
							html += '<td>'+item.nacimiento+'</td>'
							html += '<td>'+item.nombre+'</td>'
							html += '<td>'+item.email+'</td>'
							html += '<td>'+item.pais+'</td>'
						html += '</tr>';

					});
				}
				// si no hay datos mostramos mensaje de no encontraron registros
				if(html == '') html = '<tr><td colspan="4" align="center">No se encontraron registros..</td></tr>'
				// añadimos  a nuestra tabla todos los datos encontrados mediante la funcion html
				$("#data tbody").html(html);
			}
	  });
}
PHP

Para finalizar archivo PHP que se encargara  consultar y responder las peticiones Ajax atravez del  javascript.

<?php
include("conexion.php");

if($_GET['action'] == 'listar')
{
	// valores recibidos por POST
	$vnm   = $_POST['nombre_email'];
	$vpais = $_POST['pais'];
	$vdel  = ($_POST['del'] != '' ) ? explode("/",$_POST['del']) : '';
	$val   = ($_POST['al']  != '' ) ? explode("/",$_POST['al']) : '';

	$sql = "SELECT * FROM personas pe, pais p
				WHERE pe.pais = p.id_pais ";	

	// Vericamos si hay algun filtro
	$sql .= ($vnm != '')      ? " AND CONCAT(nombre,' ', email) LIKE '%$vnm%'" : "";
	$sql .= ($vpais > 0)      ? " AND pe.pais = '".$vpais."'" : "";
	$sql .= ($vdel && $val)   ? " AND nacimiento BETWEEN '$vdel[2]-$vdel[1]-$vdel[0]'
														AND '$val[2]-$val[1]-$val[0]' " : "";

	// Ordenar por
	$vorder = $_POST['orderby'];

	if($vorder != ''){
		$sql .= " ORDER BY ".$vorder;
	}

	$query = mysql_query($sql);
	$datos = array();

	while($row = mysql_fetch_array($query))
	{
		$datos[] = array(
			'id'          => $row['id'],
			'nombre'      => $row['nombre'],
			'email'       => $row['email'],
			'nacimiento'  => $row['nacimiento'],
			'pais'        => $row['nombre_pais']
		);
	}
	// convertimos el array de datos a formato json
	echo json_encode($datos);
}

?>

Espero que sea de gran utilidad el script y no se olviden de dejar su comentario si tienen alguna duda.  :)

Ver demo Descargar
Etiquetas: , , ,

28 Responses

  1. Ricardo dice:

    hola muy buen ejemplo pero cuando quiero adaptarlo ami tabla me marca algunos errores no si puedes ayudarme,.,

  2. carlos dice:

    Es perfecto! se puede aplicar una paginación a los resultados?

  3. Francisco dice:

    Hola!

    Gracias por tu ejemplo/code.

    Si se pudiera agregar la funcionalidad de seleccionar un registro/fila para luego editarlo en un registro, al adicionar una columna mas “editar” al lado del campo Pais, es posible ?
    Como se podria hacer para tomar el valor del registro seleccionado?
    Tomando el valor del array datos?

    Disculpa si la pregunta te es obvia o tonta, pero estoy tratando de desarrollar una aplicacion web, y he estado buscando desde hace tiempo una aplicacion que me permitiera buscar y filtrar y de todas las que he visto, tu aplicacion me parece la ideal.

    Llegue a adaptar el funcionamiento de una aplicacion para insertar/editar/borrar registros de una base de datos utilizando la programacion estructurada.

    Luego de adaptarla y tenerla 100% en funcionamiento, salte a la programacion orientada a objetos, y al conseguir tu aplicacion, pues me tropeze con lo que es JSON y ya me he puesto a investigar…

    el caso es que ando un poco perdido, no se como implementar la opcion de seleccion mezclando todo tu codigo con programacion orientada a objetos, tu pagina y aplicaciones me parecen excelentes, si me pudieras ayudar… no pido que me facilites el codigo, pero me podrias ayudar indicando que deberia leer o hacia donde deberia “buscar” para dar con la forma de implentar tal opcion de seleccion/edicion ?

    Muchas gracias!

  4. RRM dice:

    Una preguntota lanza un error en el $vorder = $_POST['orderby'];
    me marca que el orderby no hay nada pero cuando le doy en un th ya se no me lanza un error entonces nesetio mandarle algo hace variable para que cuando entre lanze la consulta?

  5. edgar dice:

    amigo, esta bien tu post, y quiero adaptarlo a lo que estoy haciendo, pero en esta linea:

    $sql = “SELECT * FROM personas pe, pais p WHERE pe.pais = p.id_pais “;

    no se de donde sale el pe ni p? puedes explicarme a ver de que modo lo adapto. gracias de antemano.

    • admin dice:

      Hola te explico p y pe vienen a ser alias para las tablas que estoy usando (personas y paises), se hace uso de esto cuando en la consulta sql se van relacionan varias tablas entonces para identificar cuales campos son de cada tabla se usan los alias y se usa de esta forma
      pe.campotablapersonas, p.campotablapais.

  6. Jonathan dice:

    hola necesito ayuda para hacer un buscador asi como el que se muestra pero con mas menu/lista y poder filtrar. que tengan 4 list menu Filtre por tipo de vehiculo, estado, ciudad, numero de puestos del vehiculo, y sexo de conductor. me gustaria que me ayudaran ha hacerlo

  7. Monica dice:

    Hola,
    he descargado tu plugin y al adaptarlo a mi tabla no me sale ningún dato, pero tampoco me da ningún error, no se si es porque no he modificado todo lo necesario para cambiarle el origen de los datos o porque.
    Es que no me da ni el mensaje de no hay ningun dato ni nada.
    Podrias ayudarme??.

    Gracias y un saludo.

  8. tony dice:

    para listar todo lo de la tabla ??? al principio? me la carga vacia…

  9. Angello dice:

    Hola, primero que nada gracia por compartir!

    Descargue tu demo y cree la base de datos pero al momento de ejecutar la aplicación no me aparecen los registros… En el combobox si me aparecen los países, no me aparece ningún error ni nada que puede estarme fallando?

  10. Yohan dice:

    Excelente me da unas ideas de algunas cosas que queria realizar muchas gracias

  11. Liss dice:

    Excelente aportacion, pero tengo un problema, cuando quiero adapatar a mi proyecto no me funciona, no se que tengo mal, si me podrian ayudar x favor…..

  12. Alys dice:

    Enhorabuena!, muy buen ejemplo y muchas gracias, me ha servido muchísimo.

    Unsaludo

  13. Martin dice:

    hola que tal amigo excelente post me has salvado la vida solo una duda, si tuviera un select q me envia a tu proyecto y en ese select selecciono ej. mexico se podria cargar ese dato como variable y q a la hora de mostrar la tabla solo me muestre los datos de mexico? algo asi como el filtro que manejas pero desde una instancia anterior a tu tabla espero me haya explicado saludos

  14. felipe dice:

    Hola

    Como puedo cambiar el formato del calendario a año/mes/dia
    (YYYY/MM/DD)

    Saludos

  15. Intento de Programador dice:

    Grandísimo ejemplo!!

    Gran trabajo,solo le faltaría una paginación para ser perfecto!

  16. Stanley dice:

    necesito saber por que los datos no aparecen cuando cargo la pagina. porfavor me podrian ayudar ya subi la base y da en el box pero nada me gustaria que me pudieras ayudar

  17. Roberto dice:

    necesito saber por que a cargar la base los datos no me aparecen es para un proyecto universitario me gustaria que me ayduaras

  18. pep dice:

    Felicidades por el aporte- tengo un problema que no consigo solventar. En IE me da un error en data.lenght pues dice que es nulo o no esta definido.
    Si pudierais ayudar os estare agradecido

  19. Jorge dice:

    Gracias por tus aportes.
    Tengo un error que no consigo solventar. En IExplorer me da un error en la linea
    // si la consulta ajax devuelve datos
    if(data.length > 0) indicando que length es nulo o no esta definido.
    ¿alguien podria aportarme alguna pista para hacerlo funcionar?
    En Firefox me funciona perfectamente.

    Gracias

  20. juanca dice:

    no puedo adivinar que ocurre, el programa funciona, pero no encuentro porque razon no se muestran los datos al cargar el sitio por vez primera, o filtrar por vez primera, recién se consiguen ver los datos filtrados o no si clickeamos los spans (Fecha Nacimiento/ Nombre/Emai/Pais)
    pero al cargar no se muestran, o no veo que hayas diferencias con el demo, le falta algun echo al index.php? o al js.js?? si revisan mejor, saludos y gracias!

  21. aimara dice:

    Hola, muchas gracias por el excelente post. Quisiera saber como puedo aplicarle un paginado a los resultados. He estado tratando de hacerlo pero no sale bien.
    Gracias

  22. Ricardo dice:

    Hola, muchas gracias por tu script, lo he implementado muy bien y funciona a la perfección. Te cuento que a partir de este, estoy haciendo una agenda, donde me divida por meses los registros en pestañas. Es decir que me aparezca la pestaña “Enero 2013″ y dentro de ella se muestren los resultados que se encuentren con su fecha en Enero 2013 y así con todos los meses (Pueden ser solo los registros existentes).

    Tengo entendido que JqueryUI tiene unas Tabs, las que he trabajado con anterioridad. Pero no se cómo integrarla a este script ¿Tu me podrías dar una mano? Me imagino que la modificación debería hacerse entre el index y el js.js.

    Si puedes escribirme a mi correo rsilvaldeg[at]gmail.com estaré muy agredecido. Quizás después puedes hacer una actualización de este post con las modificaciones que haga.

    Saludos.

  23. Yusniel dice:

    Gracias por tu aporte mi servio mucha la parte para ordenar y concatenar la consulta….

Dejar un comentario


3 − tres =

© 2012 jQuery Easy. All rights reserved.
Diseñado por jQuery Easy.