Listar resultados de una búsqueda con PHP + MySQL para AJAX

Bueno, la idea es realizar un PHP que nos devuelva un XML con resultados de una búsqueda pasada por parámetros POST y lo envíe como text/xml para poder ser recogido de forma fácil mediante JavaScript con el objeto XMLHttpRequest.

Supongamos ahora que tenemos una tabla llamada STOCK en donde almacenamos los registros referidos a cada producto que comercializa la empresa de Manolo. Los principales campos son ID, CÓDIGO DE PRODUCTO, DESCRIPCION, URLIMG (url de la imagen). Vamos a enviarle a nuestro buscador.php la variable buscar por POST para que la recoja en el caso que corresponda y realice la búsqueda.

Veamos un poco de código:

buscador.php

Código :

<?php
   header("Content-type: text/xml");

Antes que nada definiremos el formato de salida como text/xml para que se interprete el contenido como un archivo XML. Esto lo hacemos mediante la función header() que envía una cabecera.

Código :

require (“conexión.php”);

Aquí el archivo con los datos de la conexión a la base de datos, ojo! es muy recomendable que el archivo NO se encuentre en una carpeta pública.

Código :

$condicion = "";
$resultados = 0;

Definimos las variables en juego, $condicion se refiere a la las especificaciones del SELECT de la búsqueda, luego:

Código :

if (isset($_POST['buscar'])) {

      $cadena = htmlentities($_POST['buscar']);
      $cadena = str_replace(" ", "%", $cadena);
      
      $condicion .= " WHERE DESCRIP LIKE '%$cadena%'";
   }

Con htmlentities() prevenimos la inclusión de caracteres no deseados en la consulta. Es importante realizar un control sobre los parámetros pasados para evitar problemas de inyección SQL. Luego reemplazamos los espacios por comodines “%” para especificar que las palabras separadas deben aparecer juntas en los resultados de la búsqueda.

Código :

// REALIZAMOS LA CONSULTA SEGUN LOS PARAMETROS OBTENIDOS   
   $consulta = "SELECT * FROM STOCK$condicion ";
   if (!($res = mysql_query($consulta)))
      echo $consulta;

Así procedemos a realizar la consulta y obtener los resultados, en caso de que la consulta falle devolvemos el código SQL (es importante reemplazar esto por un mensaje de error pertinente).

Y, finalmente, creamos el documento XML mediante el objeto DOMDocument() y funciones como $objeto->appendChild(), $objeto->createElement(), $objeto->setAttribute() que sirven para agregar nodos, crear nodos y setear atributos de un nodo respectivamente, dentro del archivo XML:

Código :

// OBTENEMOS LA CANTIDAD DE RESULTADOS
   $resultados = mysql_num_rows($res);
   
   /** CREAMOS EL DOM DE NUESTRO XML
     * CON LA SIGUIENTE ESTRUCTURA:
      *
     * <productos n=$resultados>
     *       <producto>
     *         <codigo>codigo</codigo>
     *         <descripcion>descripcion</descripcion>
     *          <urlimg>urlimg</urlimg>
     *       </producto>
     *      ...
     * </productos>
     */
   $dom = new DOMDocument('1.0', 'UTF-8');
   $productos =$dom->appendChild($dom->createElement("productos"));
   $productos->setAttribute("n", $resultados);
   
   for ($i=0; $i<mysql_num_rows($res); $i++) {
   
      // DEFINIMOS LAS VARIABLES DE DATOS
      $txtCodigo = utf8_encode(mysql_result($res, $i, 'CODIGO'));
      $txtDescripcion = utf8_encode(mysql_result($res, $i, 'DESCRIP'));
      $txtUrlimg = utf8_encode(mysql_result($res, $i, 'urlimg'));
      
      // ANEXAMOS LOS NODOS
      $producto = $productos->appendChild($dom->createElement('producto'));
      $producto->setAttribute('id', $txtCodigo);
      
      $codigo = $producto->appendChild($dom->createElement('codigo'));
      $codigo->appendChild($dom->createTextNode($txtCodigo));
      
      $descripcion = $producto->appendChild($dom->createElement('descripcion'));
      $descripcion->appendChild($dom->createTextNode($txtDescripcion));
      
      $urlimg = $producto->appendChild($dom->createElement('urlimg'));
      $urlimg->appendChild($dom->createTextNode($txtUrlimg));
   }

Y, por último, devolvemos el resultado como un XML de la siguiente forma:

Código :

// UNA VEZ CREADO EL XML LO VOLCAMOS EN LA PANTALLA
   $dom->formatOutput = true;
   echo $dom->saveXML();
      
   mysql_close();
?>

Eso es todo, es bastante simple y provee un punto de partida para facilitar el trabajo con el lenguaje de servidor en AJAX y realizar un nexo entre los registros de una base de datos con la aplicación correspondiente, espero haya servido, saludos!

Enviar comentario

Deja una respuesta