Ver Mensaje Individual
  #1 (permalink)  
Antiguo 09/10/2008, 07:05
Avatar de rogertm
rogertm
Mod->Cuba
 
Fecha de Ingreso: julio-2005
Ubicación: /home/Cuba/Habana/rogertm/
Mensajes: 2.922
Antigüedad: 18 años, 9 meses
Puntos: 638
Información [Aporte] Como hacer un buscador sencillo usando PHP y MySQL

Hola foreros, este es un aporte sore todo para los que se inician, pues regularmente suele ser un lio esto e hacer un buscador, pero si es realmente facil y rapido de hacer.

En nuestro ejemplo, tendremos una tabla en la Base de Datos del tipo MyISAM, ya que este motor soporta Funciones de búsqueda de texto completo (Full-Text). La tabla en si seria en donde guardaríamos las noticias de nuestro sitio web y la búsqueda la vamos a hacer en los campos Titulo y Cuerpo de la Noticia, por lo tanto nos centraremos en ellos solamente.

Los resultados de las búsquedas se ordenarán de forma tal, que los primeros serán los que mayor cantidad de coincidencias tengan con la cadena pasada a la consulta.

La tabla MySQL:
Código sql:
Ver original
  1. CREATE TABLE `noticias` (
  2. `noticia_ID` INT(11) NOT NULL AUTO_INCREMENT,
  3. `noticiaTitulo` VARCHAR(200) NOT NULL,
  4. `noticiaNoticia` text NOT NULL,
  5. PRIMARY KEY (`noticia_ID`),
  6. FULLTEXT KEY `buscador` (`noticiaTitulo`,`noticiaNoticia`)
  7. ) ENGINE=MyISAM;
El formulario HTML:
Todo lo vamos a hacer en una misma página: buscar.php

Código php:
Ver original
  1. <h1><a href="<?php echo $_SERVER['PHP_SELF']; ?>”>Buscador - By RogerTM</a></h1>
  2. <form name=”buscar” action=”<?php $_SERVER['PHP_SELF'] ?>” method=”get”>
  3. Buscar: <input type=”text” size=”50″ value=”<?php echo $_GET['frase']; ?>” name=”frase” />
  4. <input type=”submit” name=”buscar” value=”Buscar” />
  5. </form>

Codigo PHP:

Código php:
Ver original
  1. <?php
  2. // conectar al servidor
  3. $server_link = mysql_connect("localhost", "root", "");
  4. if(!$server_link){
  5.     die("Fall&oacute; la Conexi&oacute;n ". mysql_error());
  6. }
  7. // seleccionamos la base de datos
  8. $db_selected = mysql_select_db("data", $server_link);
  9. if(!$db_selected){
  10.     die("No se pudo seleccionar la Base de Datos ". mysql_error());
  11. }
  12. // varificamos que el formulario halla sido enviado
  13. if(isset($_GET['buscar']) && $_GET['buscar'] == 'Buscar'){
  14.     $frase = addslashes($_GET['frase']);
  15.     // hacemos la consulta de busqueda
  16.     $sqlBuscar = mysql_query("SELECT noticiaTitulo, noticiaNoticia,
  17.                              MATCH (noticiaTitulo, noticiaNoticia)
  18.                              AGAINST ('$frase' IN BOOLEAN MODE) AS coincidencias
  19.                              FROM noticias
  20.                              WHERE MATCH (noticiaTitulo, noticiaNoticia)
  21.                              AGAINST ('$frase' IN BOOLEAN MODE)
  22.                              ORDER BY coincidencias DESC", $server_link)
  23.                               or die(mysql_error());                              
  24.     $totalRows = mysql_num_rows($sqlBuscar);
  25.     // Enviamos un mensaje
  26.     // indicando la cantidad de resultados ($totalRows)
  27.     // para la frase busada ($frase)
  28.     if(!empty($totalRows)){
  29.         echo stripslashes("<p>Su b&uacute;squeda arroj&oacute; <strong>$totalRows</strong> resultados para <strong>$frase</strong></p>");        
  30.         // mostramos los resultados
  31.         while($row = mysql_fetch_array($sqlBuscar)){
  32.             echo "<strong><a href='#'>$row[noticiaTitulo]</a>:</strong> <em>Coincidencias: ". round($row['coincidencias']) ."</em><br />";
  33.             echo "<p>".substr(strip_tags($row['noticiaNoticia']), 0, 255)."...</p>";
  34.         }
  35.     }
  36.     // si se ha enviado vacio el formulario
  37.     // mostramos un mensaje del tipo Oops...!
  38.     elseif(empty($_GET['frase'])){
  39.         echo "Debe introducir una palabra o frase.";
  40.     }
  41.     // si no hay resultados
  42.     // otro mensaje del tipo Oops...!
  43.     elseif($totalRows == 0){
  44.         echo stripslashes("Su busqueda no arrojo resultados para <strong>$frase</strong>");
  45.     }
  46. }
  47. ?>

Nota sobre la consulta:
Cita:
La función MATCH() realiza una búsqueda de lenguaje natural para cadenas contra una colección de textos. Una colección es un conjunto de una o más columnas incluídas en un índice FULLTEXT. La cadena de búsqueda se da como argumento para AGAINST(). Para cada registro en la tabla MATCH() retorna un valor de relevancia, esto es, una medida de similaridad entre la cadena de búsqueda y el texto en el registro en las columnas mencionadas en la lista MATCH().
[...]
Para búsquedas FULL-TEXT en lenguaje natural, se requiere que las columnas nombradas en la función MATCH() sean las mismas columnas incluídas en algún índice FULLTEXT en su tabla. Para la consulta precedente, tenga en cuenta que las columnas nombradas en la función MATCH() (noticiaTitulo y noticiaNoticia) son las mismas que las nombradas en la definición del índice FULLTEXT de la tabla noticias.
[...]
La consulta retorna los valores de relevancia y también ordena los registros en orden decrecente de relevancia. Para conseguir este resultado, debe especificar MATCH() dos veces: una vez en la lista SELECT y otra en la cláusula WHERE. Esto hace que no haya sobrecarga adicional, ya que el optimizador de MySQL se da cuenta que hay dos llamadas MATCH() son idénticas e invoca la búsqueda FULL-TEXT sólo una vez.

Tomado del Manual de MySQL.
Este mismo post lo publique en mi Blog con alguna explicacion de mas.

Espero sea util

saludos y suerte

muy lindo el resaltador de codigo xD
__________________
Friki y Blogger por Cuenta Propia:213
Twenty'em: Theming is Prose

Última edición por rogertm; 08/11/2010 a las 13:20