viernes, 31 de diciembre de 2010

¿Cómo realizar una busqueda avanzada sobre una base de datos Mysql y PHP?

Vamos a realizar una busqueda avanzada con PHP a una base de datos mysql, para ello realizaremos una función en php que tenga en cuenta tres tipos de busqueda FRASE EXACTA, TODAS LAS PALABRAS, CUALQUIER PALABRA, además realizaremos un filtro para eliminar palabras no deseadas del tipo "a","de", "y".


Bueno vamos a comenzar:
Como hemos dicho habrá tres tipos de búsqueda del tipo:

1) FRASE EXACTA,
el string a montar seria del tipo $campo like '%$quebuscar%'
2) TODAS LAS PALABRAS
el string a montar seria del tipo $campo like '%$quebuscar[1]%' AND $campo like '%$quebuscar[2]%' AND .....
3) CUALQUIER PALABRA.
el string a montar seria del tipo $campo like '%$quebuscar[1]%' OR $campo like '%$quebuscar[2]%' OR.....

Además haremos una limpieza de palabras que no queremos en el string

$palabras_nulas= array(" y "," de "," para "," por "," es "," o "," a "," "," ",""," que ");

Es importante los espacios entre las palabras.

Características de la función.

$frase => contiene la frase con las parabra a buscar
$tipo_busqueda =>tendra tres valos [T1,T2,T3] ---> [FRASE EXACTA,CUALQUIER PALABRA,TODAS LAS PALABRAS]
$filtrar =>eliminaremos las palabras que no nos interesen true o false
$campoBD =>contiene el nombre del campo de la base de datos para buscar.
$debug => true o false por defecto true nos presentará mensajes para ver lo que hacemos.
function busqueda_avanzada($frase,$tipo_busqueda,$filtar=true,$campoBD,$debug=true){

  if ($debug){
    echo "<h1>La frase original <font color=red>$frase</font></h1>";
    }
        
  //comprobamos que han escrito una frase.

  if (trim($frase)==""){//el campo esta vacio.
   return false; // no devolvemos nada
  }else{//
     $frase = mb_strtolower(trim($frase),'UTF-8'); 
      // filtramos las palabras 
      if ($filtar){
        $palabras_nulas= array(" y "," de "," para "," por "," o "," a ","  ","   ",""," las ", " los ");
        //Eliminamos las palabras no permitidas
        for ($i = 0; $i < count($palabras_nulas); $i++){ 
         $frase=str_replace($palabras_nulas[$i], " ", $frase);
         $frase_filtrada=$frase;
         }
           if ($debug){
             echo "<h2><font color=blue>He seleccionado filtrar buscaremos 
<font color=red>$frase_filtrada</font></font></h2>";
            }
      }else{//No se ha seleccionado filtrar
           $frase_filtrada=$frase;
            if ($debug){
               echo "<h2><font color=blue>He seleccionado NOOOOOOO filtrar 
buscaremos <font color=red>$frase_filtrada</font></font></h2>";}
      }

       //segunda parte tipo de busquedad
          $string_busqueda = "WHERE (";
           switch ($tipo_busqueda){
              case T1:
                $string_busqueda.=" $campoBD like '%$frase_filtrada%'    "; //hay que dejar 4 espacios
                $tipo_busqueda="FRASE EXACTA";
               break;
              case T2:
                $frase_enpalabras=explode(" ",$frase);   
                   for ( $i=0 ; $i<count($frase_enpalabras); $i++ )
                   {
                     $string_busqueda .= $campoBD." LIKE '%".$frase_enpalabras[$i]."%' OR  ";
                   }
                   $tipo_busqueda="CUALQUIER PALABRA";
                   break;
               case T3:
                  $frase_enpalabras=explode(" ",$frase);   
                    for ( $i=0 ; $i<count($frase_enpalabras); $i++ )
                    {
                    $string_busqueda .= $campoBD." LIKE '%".$frase_enpalabras[$i]."%' AND ";
                    }
                    $tipo_busqueda="TODAS LAS PALABRAS";
                break;
                    }
           
            $string_busqueda = substr_replace( $string_busqueda, "", -4 );
            $string_busqueda .= ')';
          
            if ($debug){
             echo "<h3><font color=blue>He seleccionado $tipo_busqueda el filtro queda
            <font color=green>$string_busqueda</font></font></h3>";                       
            }
           
        }//end primer if
           
            echo $string_busqueda;
               
}//end function?>

Ejemplos de uso: Utilizando debug:


busqueda_avanzada("hola esto es una a prueba de las busquedas avanzadas","T3",true,"txtCASA",true)   


Te devolvera algo como esto:

La frase original hola esto es una a prueba de las busquedas avanzadas

He seleccionado filtrar buscaremos hola esto prueba busquedas avanzadas

He seleccionado TODAS LAS PALABRAS el filtro queda WHERE (txtCASA LIKE '%hola%' AND txtCASA LIKE '%esto%' AND txtCASA LIKE '%prueba%' AND txtCASA LIKE '%busquedas%' AND txtCASA LIKE '%avanzadas%' )

WHERE (txtCASA LIKE '%hola%' AND txtCASA LIKE '%esto%' AND txtCASA LIKE '%prueba%' AND txtCASA LIKE '%busquedas%' AND txtCASA LIKE '%avanzadas%' )

Ejemplos de uso: Sin debug:

busqueda_avanzada("hola esto es una a prueba de las busquedas avanzadas","T3",true,"txtCASA",false)   

Te devolvera algo como esto:

WHERE (txtCASA LIKE '%hola%' AND txtCASA LIKE '%esto%' AND txtCASA LIKE '%prueba%' AND txtCASA LIKE '%busquedas%' AND txtCASA LIKE '%avanzadas%' )


Como utilizarlo para un query:



$sql="select * from tbl ".busqueda_avanzada("hola esto es una a prueba de las busquedas avanzadas","T1",false,"txtCASA",false)

Resultado: select * from tbl WHERE ( txtCASA like '%hola esto es una a prueba de las busquedas avanzadas%')


Si queremos utilizarlo en varios campos debemos sustituir el WHERE por AND o OR


sql="select * from tbl ".busqueda_avanzada("hola esto es una a prueba de las busquedas avanzadas","T1",false,"CAMPO1",false);
$sql.=str_replace("WHERE", "AND", busqueda_avanzada("hola esto es una a prueba de las busquedas avanzadas","T1",false,"CAMPO2",false));

Resultado: select * from tbl WHERE ( CAMPO1 like '%hola esto es una a prueba de las busquedas avanzadas%') AND ( CAMPO2 like '%hola esto es una a prueba de las busquedas avanzadas%')

No hay comentarios:

Publicar un comentario