Foros del Web » Programando para Internet » PHP »

buscador nosensitivo a tildes y demás

Estas en el tema de buscador nosensitivo a tildes y demás en el foro de PHP en Foros del Web. Hola! He hecho un buscador simple en php, basado en lo típico, introduces una palabra y busca coincidencias en una base de datos. Me gustaría ...
  #1 (permalink)  
Antiguo 30/12/2011, 14:56
Avatar de charlyalegret  
Fecha de Ingreso: septiembre-2011
Ubicación: Barcelona
Mensajes: 705
Antigüedad: 12 años, 7 meses
Puntos: 140
buscador nosensitivo a tildes y demás

Hola!

He hecho un buscador simple en php, basado en lo típico, introduces una palabra y busca coincidencias en una base de datos.

Me gustaría mejorarlo un poco, para que al introducir una palabra por ejemplo sin tilde, también encuentre un resultado si la misma palabra está en la bd con tilde...

Tengo claro como transformar por ejemplo la consulta introducida para quitar acentos, carácteres especiales o cosas raras. Ahora bien, como puedo compararlo con las palabras de la base de datos?

Estoy convencido en que tiene que ser más facil de lo que pienso, que hasta ahora sería sacar un array con toda la bd, transformarla para quitar acentos y demás, y hacer la comparación con la palabra introducida.

Alguna idea?? No sé si sería posible transformar las palabras introducidas en el buscador en alguna especie de expresión que contenga todas las convinaciones posibles y así después pasarla por la bd, pero mis conocimientos distan de eso..

Muchas gracias y felices fiestas!
  #2 (permalink)  
Antiguo 30/12/2011, 15:37
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: buscador nosensitivo a tildes y demás

Si usas MySQL, normalmente, a menos que indiques que un campo en tu BD sea binario, el mismo MySQL es insensible en las búsquedas. Además, claro de la posibilidad de buscar fragmentos de palabras, con like '%%'
  #3 (permalink)  
Antiguo 31/12/2011, 03:24
Avatar de charlyalegret  
Fecha de Ingreso: septiembre-2011
Ubicación: Barcelona
Mensajes: 705
Antigüedad: 12 años, 7 meses
Puntos: 140
Respuesta: buscador nosensitivo a tildes y demás



Pues tienes razón!!

El problema esque estaba usando el Fulltext o mach o como se llame, y sí que es sensible a las tildes.
En las búsquedas en que sí que uso el LIKE sí que acabo de ver que es insensible a los acentos.

Alguien sabe alguna manera de hacer este tipo de búsquedas insensible a las tildes? He intentado usar en lugar de IN BOOLEAN MODE lo de WITH QUERY EXPANSION pero me salta error de Can't find FULLTEXT index matching the column list, cuando las columnas de la tabla donde hago la comparación sí que tienen lo de FULLTEXT...

Si no, pues usaré el LIKE.

Gracias!
  #4 (permalink)  
Antiguo 31/12/2011, 08:06
Avatar de charlyalegret  
Fecha de Ingreso: septiembre-2011
Ubicación: Barcelona
Mensajes: 705
Antigüedad: 12 años, 7 meses
Puntos: 140
Respuesta: buscador nosensitivo a tildes y demás

Bueno, finalmente he hecho los siguiente.
Creo que es un poco burrada pero lo posteo por si le puede servir a alguien y sobretodo, por si alguien me pude comentar alternativas más limpias

Código PHP:
Ver original
  1. // $itmf es una condicion extra que depende del formulario de búsqueda
  2. // $ordf depende también del formulario de búsqueda
  3. // $tipf es AND o OR dependiendo de si se selecciona búsqueda que contengan todas las palabras o no
  4. // para más de 5 palabras, la idea era enviar a la ... pero al final, he decidido que no...
  5. $paraules = explode(" ", $frase);
  6.                 if (count($paraules) == 1){
  7.                     $sqlBuscar = mysql_query("SELECT * FROM items
  8.                                 WHERE $alt LIKE '%$paraules[0]%'
  9.                                  AND sec1+0 > 0
  10.                                  $itmf
  11.                                  OR $texto LIKE '%$paraules[0]%'
  12.                                  AND sec1+0 > 0
  13.                                  $itmf
  14.                                  ORDER BY $ordf")
  15.                                  or die(mysql_error());                              
  16.                     $totalRows = mysql_num_rows($sqlBuscar);
  17.                     }
  18.                 elseif (count($paraules) == 2){
  19.                     $sqlBuscar = mysql_query("SELECT * FROM items
  20.                                 WHERE $alt LIKE '%$paraules[0]%'
  21.                                  AND sec1+0 > 0
  22.                                  $itmf
  23.                                  $tipf $alt LIKE '%$paraules[1]%'
  24.                                  AND sec1+0 > 0
  25.                                  $itmf
  26.                                  OR $texto LIKE '%$paraules[0]%'
  27.                                  AND sec1+0 > 0
  28.                                  $itmf
  29.                                  $tipf $texto LIKE '%$paraules[1]%'
  30.                                  AND sec1+0 > 0
  31.                                  $itmf
  32.                                  ORDER BY $ordf")
  33.                                  or die(mysql_error());                              
  34.                     $totalRows = mysql_num_rows($sqlBuscar);
  35.                     }
  36.                 elseif (count($paraules) == 3){
  37.                     $sqlBuscar = mysql_query("SELECT * FROM items
  38.                                 WHERE $alt LIKE '%$paraules[0]%'
  39.                                  AND sec1+0 > 0
  40.                                  $itmf
  41.                                  $tipf $alt LIKE '%$paraules[1]%'
  42.                                  AND sec1+0 > 0
  43.                                  $itmf
  44.                                  $tipf $alt LIKE '%$paraules[2]%'
  45.                                  AND sec1+0 > 0
  46.                                  $itmf
  47.                                  OR $texto LIKE '%$paraules[0]%'
  48.                                  AND sec1+0 > 0
  49.                                  $itmf
  50.                                  $tipf $texto LIKE '%$paraules[1]%'
  51.                                  AND sec1+0 > 0
  52.                                  $itmf
  53.                                  $tipf $texto LIKE '%$paraules[2]%'
  54.                                  AND sec1+0 > 0
  55.                                  $itmf
  56.                                  ORDER BY $ordf")
  57.                                  or die(mysql_error());                              
  58.                     $totalRows = mysql_num_rows($sqlBuscar);
  59.                     }
  60.                 elseif (count($paraules) == 4){
  61.                     $sqlBuscar = mysql_query("SELECT * FROM items
  62.                                 WHERE $alt LIKE '%$paraules[0]%'
  63.                                  AND sec1+0 > 0
  64.                                  $itmf
  65.                                  $tipf $alt LIKE '%$paraules[1]%'
  66.                                  AND sec1+0 > 0
  67.                                  $itmf
  68.                                  $tipf $alt LIKE '%$paraules[2]%'
  69.                                                                  AND sec1+0 > 0
  70.                                  $itmf
  71.                                  $tipf $alt LIKE '%$paraules[3]%'
  72.                                  AND sec1+0 > 0
  73.                                  $itmf
  74.                                  OR $texto LIKE '%$paraules[0]%'
  75.                                  AND sec1+0 > 0
  76.                                  $itmf
  77.                                  $tipf $texto LIKE '%$paraules[1]%'
  78.                                  AND sec1+0 > 0
  79.                                  $itmf
  80.                                  $tipf $texto LIKE '%$paraules[2]%'
  81.                                  AND sec1+0 > 0
  82.                                  $itmf
  83.                                  $tipf $texto LIKE '%$paraules[3]%'
  84.                                  AND sec1+0 > 0
  85.                                  $itmf
  86.                                  ORDER BY $ordf")
  87.                                  or die(mysql_error());                              
  88.                     $totalRows = mysql_num_rows($sqlBuscar);
  89.                     }
  90.                 elseif (count($paraules) == 5){
  91.                     $sqlBuscar = mysql_query("SELECT * FROM items
  92.                                 WHERE $alt LIKE '%$paraules[0]%'
  93.                                  AND sec1+0 > 0
  94.                                  $itmf
  95.                                  $tipf $alt LIKE '%$paraules[1]%'
  96.                                  AND sec1+0 > 0
  97.                                  $itmf
  98.                                  $tipf $alt LIKE '%$paraules[2]%'
  99.                                  AND sec1+0 > 0
  100.                                  $itmf
  101.                                  $tipf $alt LIKE '%$paraules[3]%'
  102.                                  AND sec1+0 > 0
  103.                                  $itmf
  104.                                  $tipf $alt LIKE '%$paraules[4]%'
  105.                                  AND sec1+0 > 0
  106.                                  $itmf
  107.                                  OR $texto LIKE '%$paraules[0]%'
  108.                                  AND sec1+0 > 0
  109.                                  $itmf
  110.                                  $tipf $texto LIKE '%$paraules[1]%'
  111.                                  AND sec1+0 > 0
  112.                                  $itmf
  113.                                  $tipf $texto LIKE '%$paraules[2]%'
  114.                                  AND sec1+0 > 0
  115.                                  $itmf
  116.                                  $tipf $texto LIKE '%$paraules[3]%'
  117.                                  AND sec1+0 > 0
  118.                                  $itmf
  119.                                  $tipf $texto LIKE '%$paraules[4]%'
  120.                                  AND sec1+0 > 0
  121.                                  $itmf
  122.                                  ORDER BY $ordf")
  123.                                  or die(mysql_error());                              
  124.                     $totalRows = mysql_num_rows($sqlBuscar);
  125.                     }
  126.                 else {
  127.                     $sqlBuscar = mysql_query("SELECT * FROM items
  128.                                 WHERE $alt LIKE '%$frase%'
  129.                                  AND sec1+0 > 0
  130.                                  $itmf
  131.                                  OR $texto LIKE '%$frase%'
  132.                                  AND sec1+0 > 0
  133.                                  $itmf
  134.                                  ORDER BY $ordf")
  135.                                  or die("Error, pruebe más tarde");                            
  136.                     $totalRows = mysql_num_rows($sqlBuscar);
  137.                     }
  138.                    
  139.                 }

Etiquetas: tildes, buscadores
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:51.