Comunidad de diseño web y desarrollo en internet online

Buscador PHP & MySQL con Mayúsculas & Minúsculas

Citar            
MensajeEscrito el 19 Jul 2011 11:45 pm
Hola muchacho/as...

Sigo con el asunto del buscador: PHP & MySQL
Un buscador de palabras o frases en un índice FULLTEXT que involucra
tres campos de mi tabla...

Funciona perfectamente, peeeeero...no distingue mayúsculas de minúsculas.
O sea que si en alguno de mis campos dice "Pepe" y yo busco "pepe", no da
ningún resultado...

¿No existe un "CASE_SENSITIVE = FALSE", y listo?:lol:

Leí mucho por ahí, y probé muchas cosas, pero nada funciona.

El CREATE de mi tabla es así:

Código MySQL :

CREATE TABLE`xxxxxxxx` (
 `product_id` int(11) NOT NULL auto_increment,
 `language_id` int(11) NOT NULL,
 `name` varchar(255) collate utf8_bin NOT NULL,
 `meta_keywords` varchar(255) collate utf8_bin NOT NULL,
 `meta_description` varchar(255) collate utf8_bin NOT NULL,
 `description` text collate utf8_bin NOT NULL,
 PRIMARY KEY  (`product_id`,`language_id`),
 KEY `name` (`name`),
 FULLTEXT KEY `name_2` (`name`,`meta_keywords`,`meta_description`)
) ENGINE=MyISAM AUTO_INCREMENT=155 DEFAULT CHARSET=utf8 COLLATE=utf8_bin


Leí que puede ser el CHARSET y/o el utf8_bin, etc; cambié todo y sigue dando
el mismo resultado.

Mi consulta es así:

Código MySQL :

SELECT c.product_id, c.name, c.meta_keywords, c.meta_description, e.product_id, e.model, e.image , s.category_id ,
MATCH (c.name, c.meta_keywords, c.meta_description) 
AGAINST ('$searchterm' IN BOOLEAN MODE ) AS Score 
FROM $tDescript c

INNER JOIN $tProduct e ON c.product_id = e.product_id
INNER JOIN $tCat     s ON c.product_id = s.product_id

WHERE MATCH (c.name, c.meta_keywords, c.meta_description)  
AGAINST ('$searchterm' IN BOOLEAN MODE ) 
ORDER BY Score DESC 
LIMIT 0 , 20;


Con o sin el IN BOOLEAN MODE también es igual...:|

En fin, puedo postear el código completo del buscador -que me parece
bastante respetable-; si alguien lo quiere, que chifle...

Salud!

Por DiegoVelevu

50 de clabLevel



Genero:Masculino  

Buenos Aires

opera
Citar            
MensajeEscrito el 20 Jul 2011 12:08 am
Hola amigo :D

mira esto

en SQL

LOWER() >> pasa a minusculas

en php

strtolower() >> pasa a minusculas

espero que te sirva :D

Por wsoul

15 de clabLevel



Genero:Masculino  

Programador Web

chrome
Citar            
MensajeEscrito el 20 Jul 2011 03:48 pm

wsoul escribió:

Hola amigo :D
mira esto
en SQL
LOWER() >> pasa a minusculas
en php
strtolower() >> pasa a minusculas
espero que te sirva :D


Gracias amigo por la respuesta.

Lástima que no funcione, quizá plantié mal el problema.
La idea es que no exista distinción entre mayúsculas y minúsculas.
El problema que encuentro en strtolower es que si en la BD hay
alguna palabra con algún carácter en mayúscula -> no devuelve
ningún resultado.

Estoy investigando el BOOLEAN MODE, el utf8_bin, que es por
donde creo que está la respuesta...
"A" en booleano tiene un valor y
"a" en booleano tiene otro valor.
Pues esa es la diferencia que debe saltarse...

En fin, seguiré navegando!

Por DiegoVelevu

50 de clabLevel



Genero:Masculino  

Buenos Aires

chrome
Citar            
MensajeEscrito el 20 Jul 2011 04:23 pm
Para que no haya distinción entre mayúsculas y minúsculas, debes pasar todo a mayúsculas o bién pasar todo a minúsculas. LOWER() hace exactamente esto último.

Código MySQL :

SELECT * FROM `tabla` WHERE LOWER(`campo`) LIKE LOWER('".$cadena."%');


Si $cadena está en UTF-8 y tu base de datos está codificada en UTF-8, podrías hacer

Código MySQL :

SELECT * FROM `tabla` WHERE LOWER(`campo`) LIKE '".mb_strtolower($cadena, 'UTF-8');."%';


(El LOWER() de MySQL en este caso sería redundante)

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 20 Jul 2011 06:40 pm
Gracias DriverOp por la respuesta.

Pero tampoco funciona...o yo no sé cómo aplicarlo :lol:
Según entiendo, la idea sería que pasara todo a, por ejemplo, minúsculas.

Tanto mi cadena a buscar como los campos con los que debo hacer la
comparación MATCH deberían tener los datos todo en minúsculas...

Hacerlo desde PHP es fácil, no así desde mi consulta pues donde sea
que quiero agregar el LOWER() me da error... :oops:

Código MySQL :

SELECT c.product_id, c.name, c.meta_keywords, c.meta_description ,
MATCH (LOWER(c.name), LOWER(c.meta_keywords), LOWER(c.meta_description)) 
AGAINST ('$searchterm')


Me parece muy raro que los poquísimos buscadores php-mysql que hay por ahí,
algunos de ellos muy complejos, se vengan abajo cuando uno pone una mayúscula.

Leí que hay un método más elemental, el LIKE, que colapsa si la búsqueda
tiene más de una palabra o si una palabra única tiene tres letras o menos...

Muy mal...
Seguiré buscando.

Por DiegoVelevu

50 de clabLevel



Genero:Masculino  

Buenos Aires

chrome
Citar            
MensajeEscrito el 20 Jul 2011 07:18 pm
Los mensajes de error están para algo. Copia y pega aquí el mensaje en cuestión.

No sé de dónde has sacado eso de que las búsquedas con LIKE "colapsan". Tengo más de un sitio con búsquedas textuales que funcionan bien.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 20 Jul 2011 10:46 pm
jojojojo...
Pues ahora funciona tío... :cool:

Lástima que no sé porqué funciona... :lol:

He cambiado el cotejamiento, uno a uno (no en bloque), de utf8_bin
a utf8_swedish_ci, y mantuve y extrañamente debo mantener el
"IN BOOLEAN MODE" en mi consulta...
También, y he aquí lo más extraño del caso, he ELIMINADO el índice FULLTEXT...

He aquí mi PhpAdmin



Y he aquí mi consulta

Código MySQL :

SELECT c.product_id, c.name, c.meta_keywords, c.meta_description, e.product_id, e.model, e.image , s.category_id ,
MATCH (c.name, c.meta_keywords, c.meta_description) 
AGAINST ('$searchterm' IN BOOLEAN MODE ) AS Score 
FROM $tDescript c

INNER JOIN $tProduct e ON c.product_id = e.product_id
INNER JOIN $tCat     s ON c.product_id = s.product_id

WHERE MATCH (c.name, c.meta_keywords, c.meta_description)  
AGAINST ('$searchterm' IN BOOLEAN MODE ) 
ORDER BY Score DESC 
LIMIT 0 , 20;"); 


Ahora bien, tengo que cambiar el cotejamiento de las tablas pero del
servidor remoto :(

En fin, acepto sugerencias:
¿Algo así?

Código MySQL :

ALTER TABLE  $tProduct CHANGE  `name`  `name` VARCHAR( 32 ) CHARACTER SET utf8 COLLATE utf8_swedish_ci NOT NULL
 


Saludos!

Por DiegoVelevu

50 de clabLevel



Genero:Masculino  

Buenos Aires

chrome
Citar            
MensajeEscrito el 12 Nov 2012 02:36 am
No entiendo porque tanto rollo con este tema, para mi la solucion fue bastante sencilla:


SELECT * FROM 'tabla' WHERE LOWER('campo') = LOWER('string_a_buscar');

Espero que a alguien le sirva!

Por pamchi

0 de clabLevel



 

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.