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