Ver Mensaje Individual
  #5 (permalink)  
Antiguo 11/10/2012, 06:11
Avatar de portalmana
portalmana
 
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 17 años, 4 meses
Puntos: 80
Respuesta: Buscador php MySql

Continuación de la clase
Código PHP:
Ver original
  1. /**
  2.      * Metodo getConsultaMysql.
  3.      * Genera una consulta MySQL, para un buscador dependiendo de el largo de la
  4.      * cadena utiliza like o modo fulltext.
  5.      * @param   string  $texto
  6.      * @return  string  Consulta MySQL para busqueda.
  7.      */
  8.     public function getConsultaMysql($texto='')
  9.     {
  10.         // Veo si cambia el texto de busqueda o si lo mantiene.
  11.         $this->_textoDeBusqueda = ($texto)? addslashes($texto) : $this->_textoDeBusqueda;
  12.         // Comienzo a generar la consulta MySql
  13.         $mySqlQuery             = (strlen($this->_textoDeBusqueda) < 4)?
  14.                                 $this->_getConsultaLike($this->_textoDeBusqueda) :
  15.                                 $this->_getConsultaFullText($this->_textoDeBusqueda);
  16.         // Agregamos los Parametros a la consulta
  17.         if ($this->_colParametros) {
  18.             $mySqlQuery        .= ' && (' . implode(' && ', $this->_colParametros) . ' ) ';
  19.         }
  20.         // Cerramos la consulta
  21.         $mySqlQuery             = ($this->_tipoConsulta == 'FULLTEXT')? $mySqlQuery . " ORDER BY puntuacion DESC" : $mySqlQuery;
  22.         $mySqlQuery             = $mySqlQuery . ' LIMIT %d, %d';
  23.         return $mySqlQuery;
  24.     }
  25.  
  26.     /**
  27.      * Genera la consulta tipo Like.
  28.      * @param   string      $texto  Texto de busqueda.
  29.      * @return  string      Cadena para consulta MySQL con LIKE.
  30.      */
  31.     private function _getConsultaLike($texto)
  32.     {   $this->_tipoConsulta= 'LIKE';
  33.         $inicio             = ($this->_SQL_CALC_FOUND_ROWS)? 'SELECT SQL_CALC_FOUND_ROWS ':'SELECT ';
  34.         $camposResultados   = (count($this->_colCamposResultado))? implode(', ', $this->_colCamposResultado) : '*';
  35.         $consulta           = $inicio . $camposResultados . " FROM " . $this->_tablaMysql . " WHERE ( ";
  36.  
  37.         foreach($this->_colCamposFullText as $campo)
  38.         {
  39.             $consulta       = $consulta . " " . $campo . " LIKE '%%" . $texto . "%%' OR ";
  40.         }
  41.         $consulta           = substr($consulta,0,strlen($consulta)-3) ." ) ";
  42.         return $consulta;
  43.     }
  44.  
  45.     /**
  46.      * Genera la consulta fulltext.
  47.      * @param   string      $texto  Texto de busqueda
  48.      * @return  string      Cadena para consulta MySQL tipo FULLTEXT.
  49.      */
  50.     private function _getConsultaFullText($texto)
  51.     {
  52.         $this->_tipoConsulta= 'FULLTEXT';
  53.  
  54.         $camposFullText     = implode(', ', $this->_colCamposFullText);
  55.         $parsearTexto       = $this->_cadenaFullText($texto);
  56.         $inicio             = ($this->_SQL_CALC_FOUND_ROWS)? 'SELECT SQL_CALC_FOUND_ROWS ':'SELECT ';
  57.         $camposResultados   = (count($this->_colCamposResultado))? implode(', ', $this->_colCamposResultado) : '*';
  58.         $consulta           = $inicio . " " . $camposResultados . ", MATCH( $camposFullText ) AGAINST ('$parsearTexto' ";
  59.         $consulta          .= ($this->_sumarUnaVez)? 'IN BOOLEAN MODE )' : ')';
  60.         $consulta          .= " AS puntuacion FROM $this->_tablaMysql "
  61.                             . " WHERE MATCH( $camposFullText ) AGAINST ('$parsearTexto' IN BOOLEAN MODE)";
  62.         return  $consulta;
  63.     }
  64.  
  65.     /**
  66.      * Metodo cadenaFullText.
  67.      * Genera la cadena que ira en la parte  AGAINST, de la consulta MySQL.
  68.      * @param   string  $texto  Texto digitado por el usuario.
  69.      * @return  string
  70.      */
  71.     private function _cadenaFullText($texto)
  72.     {
  73.         $patron     = array('/\s\s+/',                      // Quito espacios en blanco de mas
  74.                             '/\'/',                         // Cambio comillas simples por dobles
  75.                             '/([\+\-\~\<\>])(\s)/',         // junto los simbolos con las palabras de busqueda
  76.                             '/([\w]*)([\+\-\~\<\>\)])/',    // Separo los simbolos de las palabras que los anteceden);
  77.                             '/\*/',
  78.                             '/\s\s+/');                     // Vuelvo a sacar espacios en blanco por las dudas
  79.         $remplazo   = array(' ', '"','\1', '\1 \2', '', ' ');
  80.         $texto      = preg_replace($patron, $remplazo, $texto);
  81.  
  82.         // Separamos las cadenas entre comillas.
  83.         $datos      = explode('"', str_replace('\\', '', $texto));
  84.  
  85.         $cantidad   = count($datos);
  86.         for ($index = 0; $index < $cantidad; $index++) {
  87.             if(($index % 2) == 0 && $datos[$index] ) {
  88.                 $partes         = explode(' ', trim($datos[$index]));
  89.                 $datos[$index]  = implode('* ', $partes) . '* ';
  90.             } elseif ($datos[$index]) {
  91.                 // Ordeno en caso que sea una cadena entrecomillada
  92.                 $simbolo    = substr($datos[$index - 1], strlen($datos[$index - 1])-3,1);
  93.                 $datos[$index]  = '"' . $datos[$index] .'"';
  94.                 if (strpos("+-~<>", $simbolo) !== false) {
  95.                     $datos[$index]  = $simbolo . $datos[$index];
  96.                     $datos[$index-1]= substr($datos[$index-1], 0, strlen($datos[$index - 1])-3);
  97.                 }
  98.             }
  99.         }
  100.         $texto  = implode(' ', $datos);
  101.  
  102.         // Correcciones Finales
  103.         $patron     = array('/\(\*/', '/\)\*/', '/[\+\-\~\<\>]\*/','(á)','(é)','(í)','(ó)','(ú)','(Á)','(É)','(Í)','(Ó)','(Ú)');
  104.         $remplazo   = array('(', ')', '','a','e','i','o','u','A','E','I','O','U');
  105.         $texto      = preg_replace($patron, $remplazo, $texto);
  106.         // Filtrado final
  107.         if (count($this->_filtrarPalabras)) {
  108.             $texto  = preg_replace($this->_filtrarPalabras, '', $texto);
  109.         }
  110.         return $texto;
  111.     }
  112. }

Esa es la ultima version
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp