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