5 ago 2015

Buscador en Tiempo Real Usando AJAX, PHP, MySQL

Buscador en Tiempo Real

En este ejemplo se realiza un buscador en tiempo real utilizando AJAX, PHP, y MySQL.



Bueno ¡ Manos a la Obra !


Para este ejemplo utilizaremos una pequeña base de datos llamada mydata en la cual tendremos una sola tabla llamada persona la cual  cuenta con dos campos Cod y Nombre.


Aqui el codigo de creacion de la base de datos:

-------------------------------------------------------------------------------------------------------------
CREATE DATABASE mydata;
USE mydata;
CREATE TABLE persona(cod int NOT NULL, nombre varchar(32) NOT NULL, primary key(cod));
-------------------------------------------------------------------------------------------------------------


Para realizar la conexión a la base de datos utilizaremos dos scripts PHP, un archivo llamado config.php, en este definiremos el nombre de la base de datos, host, usuario y contraseña, para acceder a la base de datos y el el archivo conexion.php usaremos estos valores para establecer la conexión.


Archivo config.php:
-------------------------------------------------------------------------------------------------------------
config.php
-------------------------------------------------------------------------------------------------------------
 
<?php
const HOST = "localhost";
const DB = "mydata";
const USER = "root";
const PASS = "";
?>
-------------------------------------------------------------------------------------------------------------


Archivo conexion.php:
-------------------------------------------------------------------------------------------------------------
conexion.php
-------------------------------------------------------------------------------------------------------------
 
<?php

require_once('config.php');

class conexion{

 private $db;

 public function conexion(){
  $this->db = new mysqli(HOST, USER, PASS, DB);
 }

 public function getConexion(){

 if($this->db->connect_errno){
  echo "Error en la Conexion con la base de datos";
 }
 else{
  return $this->db;
 }
 }

 public function closeConexion(){
  $this->db->close();
 }
}
?>
-------------------------------------------------------------------------------------------------------------


Continuamos con nuestro archivo HTML el cual tiene una estructura muy sencilla. nuestra plantilla contendrá un campo el cual sera usado para la búsqueda de los registros y contara con un espacio donde mostrar estos resultados. 

Archivo index.html:
-------------------------------------------------------------------------------------------------------------
index.html
-------------------------------------------------------------------------------------------------------------
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>Buscador</title>
    <script src="main.js"></script>
</head>
<body>
   <h1>Buscador AJAX, PHP, MySQL</h1>
    <input type="search" placeholder="Buscar" id="buscar">
    <div id="datos"></div>
</body>

</html>
-------------------------------------------------------------------------------------------------------------


Ahora continuamos con el archivo main.js, este sera el encargado de comenzar la búsqueda y mostrar los resultados arrojados por ella, para este se agregara una escucha al evento 'input' del campo 'buscar', este evento es disparado cuando se escribe algún carácter en el campo, luego que el evento se acciona la función buscar captura el valor del campo en ese momento y lo envía vía POST al archivo buscar.php, archivo que se encarga de procesar la búsqueda en la base de datos

Bueno sin mas preámbulos aquí esta el archivo main.js:
-------------------------------------------------------------------------------------------------------------
main.js
-------------------------------------------------------------------------------------------------------------
 
function buscar(){
    var pattern = document.getElementById('buscar').value;
    var solicitud = new XMLHttpRequest();
    var data  = new FormData();
    var url = 'buscar.php';

    data.append("pattern", pattern);
    solicitud.open('POST',url, true);
    solicitud.send(data);

    solicitud.addEventListener('load', function(e){

        var cajadatos = document.getElementById('datos');
        cajadatos.innerHTML = e.target.responseText;
        
    }, false);
}

window.addEventListener('load', function(){
    document.getElementById('buscar').addEventListener('input', buscar, false);
}, false);

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

Por ultimo tenemos el archivo buscar.php, que como se comentaba anteriormente es el encargado de realizar la búsqueda en la base de datos usando como patrón de búsqueda el patrón recibido por POST, así si se recibió una letra, por ejemplo la letra A el resultado de la consulta serán todos los registros cuyo nombre comienza con esta letra.

Archivo buscar.php

-------------------------------------------------------------------------------------------------------------
buscar.php
-------------------------------------------------------------------------------------------------------------
<?php
require_once('conexion.php');



if(!empty($_POST)){


    $pattern = $_POST['pattern'];

    $db = new conexion();
    $conex = $db->getConexion();

  $sql = "SELECT * FROM persona WHERE nombre LIKE '".$pattern."%';";

    if($result = $conex->query($sql)){

        $numrows = $result->num_rows;

        if($numrows > 0){
            $registros = "<table>
                        <tr>
                            <th>Codigo&lt/th >
                            <th>Nombre&lt/th >
                        </tr>";

            while($row = $result->fetch_assoc()){

                $registros = $registros.
                    "<tr>".
                    "<td>".$row['cod']."&lt/td >".
                    "<td>".$row['nombre']."&lt/td >".
                    "</tr>";
            }

            $registros = $registros."&lt/table >";

            print $registros;

        }else{
            print "No se Encontraron Coincidencias.";
        }
    }else{
        print $conex->error;
    }
}  

?>
-------------------------------------------------------------------------------------------------------------

¿ Tienes 1 hora diaria disponible y quieres ganar dinero por Internet ? Registrese aquí


16 comentarios:

  1. Hola compañero agradezco el tiempo que te tomaste para explicar y dar solución me parece perfecto este tutorial gracias buen dia

    ResponderBorrar
  2. Llevo mucho buscando un código el cual pudiera adaptar a mi proyecto y me sirviera, en verdad te lo agradezco, me sirvió mucho.

    ResponderBorrar
  3. Este comentario ha sido eliminado por el autor.

    ResponderBorrar
  4. Hola me ayudo mucho el codigo.pero quiero saber como hago para que al borrar con backspace o presionar la x que aparece en el campo de busqueda,no muestre todo el contenido almacenado en la bd. En este ejemplo,al borrar muestra todo y luego al tipear alguna letra hace la busqueda.quisiera que cuando se borre no muestre toda la informacion pero no se como hacerlo. Agradezco la ayuda

    ResponderBorrar
    Respuestas
    1. Hola, tengo la misma duda, lograste solucionarlo?

      Borrar
    2. Hola, Tal vez puedas solucionarlo usando un condicional,
      verificando la variable pattern de la función buscar

      if(pattern != ''){

      // codigo a ejecutar

      }

      Gracias por comentar, espero te ayude

      Borrar
    3. Funciona perfecto todo; para que no se quede el resultado al borrar y dejarlo vacío yo lo tengo así, cuando elimino la última letra escrita se queda a cero sin mostrar resultados.

      if(!empty($_POST)){
      if(strlen($_POST[pattern])>=1) {

      Borrar
  5. alguien sabe por que muestra las etiquetas en el resultado?

    ResponderBorrar
    Respuestas
    1. Solo borra esto &lt/ en las lineas 31 y 32 de archivo buscar.php
      y en lugar de eso pon esto <

      Borrar
  6. Buenas tardes excelente codigo funciona pero como hago para que me muestre los datos una vez entrado en el index, es decir que aparezcan los datos sin necesidad de teclear algo

    ResponderBorrar
  7. No veo nada de ajax o jquery, eso forma de programar es javascript de forma nativa

    ResponderBorrar
    Respuestas
    1. En el ejemplo no se usa jQuery, se usa la tecnologia AJAX de forma nativa usando solo javascript

      Nota: AJAX no depende de jQuery

      Gracias por comentar

      Borrar
  8. Realmente no tienes idea de como me ayudaste colega, muchas gracias.

    ResponderBorrar
  9. hola de casualidad alguien sabe por que si se ejecuta varias veces una búsqueda se cae todo el servicio como si consumiera todos los recursos esta consulta la tengo tal cual

    ResponderBorrar
    Respuestas
    1. Amigo deberías probar a cancelar las peticiones xhr cuando se genere una nueva consulta, así ahorrarías recursos en el servidor

      Borrar
  10. Buenas tardes, como hago para que solo me muestre los resultados si son exactos no que vaya haciendo una busqueda en tiempo real

    ResponderBorrar