Continuación de la clase
Código PHP:
Ver original/**
* Metodo getConsultaMysql.
* Genera una consulta MySQL, para un buscador dependiendo de el largo de la
* cadena utiliza like o modo fulltext.
* @param string $texto
* @return string Consulta MySQL para busqueda.
*/
public function getConsultaMysql($texto='')
{
// Veo si cambia el texto de busqueda o si lo mantiene.
$this->_textoDeBusqueda
= ($texto)?
addslashes($texto) : $this->_textoDeBusqueda
; // Comienzo a generar la consulta MySql
$mySqlQuery = (strlen($this->_textoDeBusqueda
) < 4)?
$this->_getConsultaLike($this->_textoDeBusqueda) :
$this->_getConsultaFullText($this->_textoDeBusqueda);
// Agregamos los Parametros a la consulta
if ($this->_colParametros) {
$mySqlQuery .= ' && (' . implode(' && ', $this->_colParametros
) . ' ) '; }
// Cerramos la consulta
$mySqlQuery = ($this->_tipoConsulta == 'FULLTEXT')? $mySqlQuery . " ORDER BY puntuacion DESC" : $mySqlQuery;
$mySqlQuery = $mySqlQuery . ' LIMIT %d, %d';
return $mySqlQuery;
}
/**
* Genera la consulta tipo Like.
* @param string $texto Texto de busqueda.
* @return string Cadena para consulta MySQL con LIKE.
*/
private function _getConsultaLike($texto)
{ $this->_tipoConsulta= 'LIKE';
$inicio = ($this->_SQL_CALC_FOUND_ROWS)? 'SELECT SQL_CALC_FOUND_ROWS ':'SELECT ';
$camposResultados = (count($this->_colCamposResultado
))?
implode(', ', $this->_colCamposResultado
) : '*'; $consulta = $inicio . $camposResultados . " FROM " . $this->_tablaMysql . " WHERE ( ";
foreach($this->_colCamposFullText as $campo)
{
$consulta = $consulta . " " . $campo . " LIKE '%%" . $texto . "%%' OR ";
}
return $consulta;
}
/**
* Genera la consulta fulltext.
* @param string $texto Texto de busqueda
* @return string Cadena para consulta MySQL tipo FULLTEXT.
*/
private function _getConsultaFullText($texto)
{
$this->_tipoConsulta= 'FULLTEXT';
$camposFullText = implode(', ', $this->_colCamposFullText
); $parsearTexto = $this->_cadenaFullText($texto);
$inicio = ($this->_SQL_CALC_FOUND_ROWS)? 'SELECT SQL_CALC_FOUND_ROWS ':'SELECT ';
$camposResultados = (count($this->_colCamposResultado
))?
implode(', ', $this->_colCamposResultado
) : '*'; $consulta = $inicio . " " . $camposResultados . ", MATCH( $camposFullText ) AGAINST ('$parsearTexto' ";
$consulta .= ($this->_sumarUnaVez)? 'IN BOOLEAN MODE )' : ')';
$consulta .= " AS puntuacion FROM $this->_tablaMysql "
. " WHERE MATCH( $camposFullText ) AGAINST ('$parsearTexto' IN BOOLEAN MODE)";
return $consulta;
}
/**
* Metodo cadenaFullText.
* Genera la cadena que ira en la parte AGAINST, de la consulta MySQL.
* @param string $texto Texto digitado por el usuario.
* @return string
*/
private function _cadenaFullText($texto)
{
$patron = array('/\s\s+/', // Quito espacios en blanco de mas '/\'/', // Cambio comillas simples por dobles
'/([\+\-\~\<\>])(\s)/', // junto los simbolos con las palabras de busqueda
'/([\w]*)([\+\-\~\<\>\)])/', // Separo los simbolos de las palabras que los anteceden);
'/\*/',
'/\s\s+/'); // Vuelvo a sacar espacios en blanco por las dudas
$remplazo = array(' ', '"','\1', '\1 \2', '', ' ');
// Separamos las cadenas entre comillas.
$cantidad = count($datos); for ($index = 0; $index < $cantidad; $index++) {
if(($index % 2) == 0 && $datos[$index] ) {
$datos[$index] = implode('* ', $partes) . '* '; } elseif ($datos[$index]) {
// Ordeno en caso que sea una cadena entrecomillada
$simbolo = substr($datos[$index - 1], strlen($datos[$index - 1])-3,1); $datos[$index] = '"' . $datos[$index] .'"';
if (strpos("+-~<>", $simbolo) !== false) { $datos[$index] = $simbolo . $datos[$index];
$datos[$index-1]= substr($datos[$index-1], 0, strlen($datos[$index - 1])-3); }
}
}
// Correcciones Finales
$patron = array('/\(\*/', '/\)\*/', '/[\+\-\~\<\>]\*/','(á)','(é)','(í)','(ó)','(ú)','(Á)','(É)','(Í)','(Ó)','(Ú)'); $remplazo = array('(', ')', '','a','e','i','o','u','A','E','I','O','U'); // Filtrado final
if (count($this->_filtrarPalabras
)) { }
return $texto;
}
}
Esa es la ultima version