Jump to content


Photo

Busca Em Campo Gravado Com Htmlentities


  • Faça o login para participar
15 replies to this topic

#1 Stormbringer

Stormbringer

    I'd love to stay with you all

  • Ex-Admins
  • 2927 posts
  • Sexo:Não informado
  • Localidade:Goiânia - GO
  • Interesses:Atualmente: pesquisa e desenvolvimento de web-games

Posted 21/12/2010, 15:04

Opa galera,

é o seguinte, preciso fazer uma busca em um campo que pode estar gravado com htmlentities(não posso mudar isso)

de forma que
"eletrônico" fica gravado "eletrônico"

muito bem, minha busca funciona:
...
$busca2 = htmlentities($busca);
...
$busca_produtos = "select * from wfp_produtos where (nome like '%$busca%' or resumo like '%$busca%' or texto like '%$busca%' or nome like '%$busca2%' or resumo like '%$busca2%' or texto like '%$busca2%')and desativa='0' $outras";

ja que previ e converti a string a ser buscada pra htmlentities também...


mas surgiu um problema:
em campos gravados normalmente, sem htmlentities, por exemplo "eletrônico"... se eu busco, com "like" por "eletronico"(sem acento), ele me da o resultado com e sem acento(como eu quero)... porem, gravado com htmlentities, ele só me retorna o resultado se eu busca-lo com o acento, ele nao tem a mesma "tolerância"

existe alguma funçao (ou outra forma de fazer) no mysql, parecida com a função html_entity_decode do php, pra que eu possa fazer uma busca hipotetica como essa:
$busca_produtos = "select * from wfp_produtos where (html_entity_decode(nome) like '%$busca%')";

valeu galera!
lembrando que eu não tenho permissão pra trocar a forma de como o dado é gravado no BD, portanto eu tenho que trabalhar com o dado da forma como ele é...

Edição feita por: Stormbringer, 21/12/2010, 15:18.

๑۩۞۩๑Let the Carnage Begin!!๑۩۞۩๑


#2 KILLME

KILLME

    Normal

  • Usuários
  • 117 posts
  • Sexo:Não informado
  • Localidade:Caraguatatuba-SP

Posted 22/12/2010, 09:38

Não existe nenhuma função que converta entities no MySQL, o que você pode fazer é gravar direto com acento no banco.
http://www.liveworks.com.br : Soluções para internet
http://www.phpmysqljquery.com.br : PHP, MySQL e jQuery
http://www.passoapasso.info : Minhas dicas

#3 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 22/12/2010, 10:07

O jeito é comparar pelos dois.

WHERE nome LIKE '%$busca%' OR nome LIKE '%$busca2%'


#4 Stormbringer

Stormbringer

    I'd love to stay with you all

  • Ex-Admins
  • 2927 posts
  • Sexo:Não informado
  • Localidade:Goiânia - GO
  • Interesses:Atualmente: pesquisa e desenvolvimento de web-games

Posted 22/12/2010, 10:32

Não existe nenhuma função que converta entities no MySQL, o que você pode fazer é gravar direto com acento no banco.

infelizmente eu não tenho poder pra decidir como é a gravação, isso é de outra equipe e ja esta definido e homologado assim :(... Burocracia de sistema grande, não gosto, ams tenhoq ue conviver, ehehhe... senão ja teria feito.

O jeito é comparar pelos dois.

WHERE nome LIKE '%$busca%' OR nome LIKE '%$busca2%'

nope :( vc nao entendeu... eu já busco por "entities" e sem "entities":
$busca_produtos = "select * from wfp_produtos where (nome like '%$busca%' or resumo like '%$busca%' or texto like '%$busca%' or nome like '%$busca2%' or resumo like '%$busca2%' or texto like '%$busca2%')and desativa='0' $outras";


o problema é que, se o cara digitar na busca "eletronico" eu quero que também ache o "eletrônico" e o "eletrônico"... se eu pudesse gravar sem o "entities" no bd, estaria resolvido, pois "eletronico" acha ëletronico" e "eletrônico"

mas enfim, vou ter que aumentar o escopo da busca pra prever todas as variaçoes de acentos e "ç" possiveis a partir da string digitada :D

mesmo assim, valeu galera

Edição feita por: Stormbringer, 22/12/2010, 10:35.

๑۩۞۩๑Let the Carnage Begin!!๑۩۞۩๑


#5 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 22/12/2010, 10:56

Verdade, não tinha olhado pro final da query. Esse negócio de prever todas as possibilidades não vai ser bom. Na falta de uma função própria no mysql, o mais adequado é fazer a sua. Crie uma que decodifique os acentos. Assim você pode fazer a comparação. Ex:

... WHERE HTMLENTITIES_DECODE(nome) LIKE '%$busca%'

Sendo HTMLENTITIES_DECODE uma user function. Veja:

http://dev.mysql.com...-procedure.html

Um exemplo:

CREATE FUNCTION HTMLENTITIES_DECODE (s varchar(255)) RETURNS varchar(255) DETERMINISTIC NO SQL
BEGIN
    RETURN REPLACE(s, 'ô', 'ô');
END;
Pode pesar um pouco se os registros forem muitos, mas é o preço a ser pago por essa inconsistência no banco.

#6 Stormbringer

Stormbringer

    I'd love to stay with you all

  • Ex-Admins
  • 2927 posts
  • Sexo:Não informado
  • Localidade:Goiânia - GO
  • Interesses:Atualmente: pesquisa e desenvolvimento de web-games

Posted 22/12/2010, 12:57

LeoB, sua idéia é muito boa...

nao fosse pelo fato de, tanto no server de testes quanto no server de produçao, estarmos rodando mysql 4.x... esse lance de funçoes acho que foi implementado a partir do 5.0, né?
mas é mais facil eu sugerir atualizarem o mysql, que pedir pra trocarem a sistematica de gravação dos nomes dos produtos :D

valeu pela ideia!

up de resolução

no meu server de testes instalei o mysql 5
bom

select * from wfp_produtos where HTMLENTITIES_DECODE(nome) like '%eletronico%'


funcionou do jeito que eu queria... muito obrigado pela ideia, LeoB...
Agora só falta eu convvencer a gerencia de desenvolvimento a atualizar o mysql e permitir stores functions :D

/********/
la vou eu encher o saco com uma coisa básica

nao entendi como funcionam as funçoes mysql
DELIMITER //
CREATE FUNCTION HTMLENTITIES_DECODE (s varchar(255)) RETURNS varchar(255) DETERMINISTIC NO SQL
BEGIN
    RETURN REPLACE(s, 'ô', 'ô');
END;
DELIMITER;
legal, eu criei a funçao de testes que funciona só pra esse caso do ô, como teste

fui criar pra todas

DELIMITER //
CREATE FUNCTION HTMLENTITIES_DECODE (s varchar(255)) RETURNS varchar(255) DETERMINISTIC NO SQL
BEGIN
    RETURN REPLACE(s, 'Á', 'Á');
[...]
    RETURN REPLACE(s, 'ô', 'ô');
END;
DELIMITER;

obviamente, por causa do return, ele só faz a primeira linha... entao mudei

DELIMITER //
CREATE FUNCTION HTMLENTITIES_DECODE (s varchar(255)) RETURNS varchar(255) DETERMINISTIC NO SQL
BEGIN
    REPLACE(s, 'Á', 'Á');
[...]
    REPLACE(s, 'ô', 'ô');
 
    RETURN s;
END;
DELIMITER;

nao rola... como faço? não achei nenhum exemplo de tratamento de string assim em stored functions... eu sei que é elementar, mas realmente nao achei exemplos :P

๑۩۞۩๑Let the Carnage Begin!!๑۩۞۩๑


#7 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 22/12/2010, 13:00

RETURN REPLACE(REPLACE(s, 'Á', 'Á'), 'ô', 'ô');
ou

SET s = REPLACE(s, 'Á', 'Á');
SET s = REPLACE(s, 'ô', 'ô');
RETURN s;


#8 Stormbringer

Stormbringer

    I'd love to stay with you all

  • Ex-Admins
  • 2927 posts
  • Sexo:Não informado
  • Localidade:Goiânia - GO
  • Interesses:Atualmente: pesquisa e desenvolvimento de web-games

Posted 22/12/2010, 14:07

/****************************/


consegui
DELIMITER //
CREATE FUNCTION HTMLENTITIES_DECODE (s varchar(255)) RETURNS varchar(255) DETERMINISTIC NO SQL
BEGIN
    set s = REPLACE(s, 'À', 'À');	
[...]	
    set s =REPLACE(s, 'ô', 'ô');
RETURN s;
END;
DELIMITER;//


valeu :D

Edit: bem na hora que vc respondeu... obrigado denovo leob :D

agora com o prototipo funcionando, posso convencer os caras a aplicarem... pior que nem fez tanta diferença na performance da busca, quase nao se nota, e a tabela é beeeeeem populosa

/***************/
droga... mais um problema

essa busca, no phpmyadmin, me retorna resultados:

select * from wfp_produtos where (HTMLENTITIES_DECODE(nome) like '%dalmatica%' or HTMLENTITIES_DECODE(resumo) like '%dalmatica%' or HTMLENTITIES_DECODE(texto) like '%dalmatica%' or nome like '%dalmatica%' or resumo like '%dalmatica%' or texto like '%dalmatica%')and desativa='0' limit 0, 9

no sistema propriamente dito, não retorna nada....

se, em vez de "dalmatica" eu escrever so "dalma" funciona (o que procuro sao Dalmáticas)


o que sera que estou fazendo de errado?

trecho do codigo:
...
$buscaprod = "select * from wfp_produtos where (HTMLENTITIES_DECODE(nome) like '%$busca%' or HTMLENTITIES_DECODE(resumo) like '%$busca%' or HTMLENTITIES_DECODE(texto) like '%$busca%' or nome like '%$busca2%' or resumo like '%$busca2%' or texto like '%$busca2%')and desativa='0' $outras limit $_GET[inicio], $quantos";
...
$achaprod = mysql_query($buscaprod, $conexao);
...
  while ($produto=@mysql_fetch_assoc($achaprod)){
...

mysql_num_rows me retorna zero... acontece que, dando um echo na variavel $buscaprod, copiando e colando a query no phpmyadmin, ela rola... entao eu acho que tenho que escapar algum caractere ou "sei lá"


valeu

Edição feita por: Stormbringer, 22/12/2010, 14:07.

๑۩۞۩๑Let the Carnage Begin!!๑۩۞۩๑


#9 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 22/12/2010, 14:19

Manda um or die(mysql_error()) no mysql_query().

---

A propósito, se você já está comparando o texto tratado pela função, não precisa comparar também sem o tratamento.

Edição feita por: LeoB, 22/12/2010, 14:20.


#10 Stormbringer

Stormbringer

    I'd love to stay with you all

  • Ex-Admins
  • 2927 posts
  • Sexo:Não informado
  • Localidade:Goiânia - GO
  • Interesses:Atualmente: pesquisa e desenvolvimento de web-games

Posted 22/12/2010, 14:32

pior que nao devolve erro... a query esta "certa" do ponto de vista sintático :(

veja, simplifiquei a query pra testes:

$buscaprod = "select * from wfp_produtos where (HTMLENTITIES_DECODE(nome) like '%$busca%')";

legal... no sistema, no campo de busca, digito:
"dalma"

e ele me acha todos os registros que contem palavra "Dalmática"

ja, se eu digito "dalmat" no campo de busca, me retorna ZERO resultados... o que é muito estranho

Debugando, mostrando com echo a string que executo a busca, copio, colo no phpmyadmin, e ela funciona com "dalma", "dalmat", "dalmatica", "dalmática"... enfim, todas as variações previstas funcionam... só no phpmyadmin

sera que eu tenho que "escapar" algo em algum lugar?(to tentando de tudo)

Edição feita por: Stormbringer, 22/12/2010, 14:35.

๑۩۞۩๑Let the Carnage Begin!!๑۩۞۩๑


#11 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 22/12/2010, 14:37

Mostre como está a função que você fez.

#12 Stormbringer

Stormbringer

    I'd love to stay with you all

  • Ex-Admins
  • 2927 posts
  • Sexo:Não informado
  • Localidade:Goiânia - GO
  • Interesses:Atualmente: pesquisa e desenvolvimento de web-games

Posted 22/12/2010, 14:47

DELIMITER //
CREATE FUNCTION HTMLENTITIES_DECODE (s varchar(255)) RETURNS varchar(255) DETERMINISTIC NO SQL
BEGIN
 SET s = REPLACE(s, 'À','À') ;
 SET s = REPLACE(s, 'Á','Á') ;
 SET s = REPLACE(s, 'Â','Â') ;
 SET s = REPLACE(s, 'Ã','Ã') ;
 SET s = REPLACE(s, 'Ä','Ä') ;
 SET s = REPLACE(s, 'Å','Å') ;
 SET s = REPLACE(s, 'Ç','Ç') ;
 SET s = REPLACE(s, 'È','È') ;
 SET s = REPLACE(s, 'É','É') ;
 SET s = REPLACE(s, 'Ê','Ê') ;
 SET s = REPLACE(s, 'Ë','Ë') ;
 SET s = REPLACE(s, 'Ì','Ì') ;
 SET s = REPLACE(s, 'Í','Í') ;
 SET s = REPLACE(s, 'Î','Î') ;
 SET s = REPLACE(s, 'Ï','Ï') ;
 SET s = REPLACE(s, 'Ñ','Ñ') ;
 SET s = REPLACE(s, 'Ò','Ò') ;
 SET s = REPLACE(s, 'Ó','Ó') ;
 SET s = REPLACE(s, 'Ô','Ô') ;
 SET s = REPLACE(s, 'Õ','Õ') ;
 SET s = REPLACE(s, 'Ö','Ö') ;
 SET s = REPLACE(s, 'Ù','Ù') ;
 SET s = REPLACE(s, 'Ú','Ú') ;
 SET s = REPLACE(s, 'Û','Û') ;
 SET s = REPLACE(s, 'Ü','Ü') ;
 SET s = REPLACE(s, 'Ý','Ý') ;
 SET s = REPLACE(s, 'à','à') ;
 SET s = REPLACE(s, 'á','á') ;
 SET s = REPLACE(s, 'â','â') ;
 SET s = REPLACE(s, 'ã','ã') ;
 SET s = REPLACE(s, 'ä','ä') ;
 SET s = REPLACE(s, 'å','å') ;
 SET s = REPLACE(s, 'ç','ç') ;
 SET s = REPLACE(s, 'è','è') ;
 SET s = REPLACE(s, 'é','é') ;
 SET s = REPLACE(s, 'ê','ê') ;
 SET s = REPLACE(s, 'ë','ë') ;
 SET s = REPLACE(s, 'ì','ì') ;
 SET s = REPLACE(s, 'í','í') ;
 SET s = REPLACE(s, 'î','î') ;
 SET s = REPLACE(s, 'ï','ï') ;
 SET s = REPLACE(s, 'ñ','ñ') ;
 SET s = REPLACE(s, 'ò','ò') ;
 SET s = REPLACE(s, 'ó','ó') ;
 SET s = REPLACE(s, 'ô','ô') ;
 SET s = REPLACE(s, 'õ','õ') ;
 SET s = REPLACE(s, 'ö','ö') ;
 SET s = REPLACE(s, 'ù','ù') ;
 SET s = REPLACE(s, 'ú','ú') ;
 SET s = REPLACE(s, 'û','û') ;
 SET s = REPLACE(s, 'ü','ü') ;
 SET s = REPLACE(s, 'ý','ý') ;

RETURN s;
END;
//
DELIMITER;

vou limitar ela só no "á" pra testar


edit: nem mesmo tirando tudo e deixando so a parte do "á" rolou

Edição feita por: Stormbringer, 22/12/2010, 14:50.

๑۩۞۩๑Let the Carnage Begin!!๑۩۞۩๑


#13 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 22/12/2010, 14:49

E se no campo de busca você colocar a palavra com acento? Funciona?

#14 Stormbringer

Stormbringer

    I'd love to stay with you all

  • Ex-Admins
  • 2927 posts
  • Sexo:Não informado
  • Localidade:Goiânia - GO
  • Interesses:Atualmente: pesquisa e desenvolvimento de web-games

Posted 22/12/2010, 15:34

E se no campo de busca você colocar a palavra com acento? Funciona?


finciona, por conta da segunda parte da query
...or nome like '%$busca2%'...
sem ela, nao funciona tambem (por isso eu mantive a redundância)

bem bizarro
fiz uma pagininha de testes rapida
<?
$conexao = mysql_connect("localhost", "xxxxxxxx", "xxxx");
mysql_select_db("xxxxxx", $conexao);
$queryc="select nome from wfp_produtos where (HTMLENTITIES_DECODE(nome) like '%$_GET[busca]%')";
echo $queryc;
$consultapagina = mysql_query($queryc, $conexao);

echo "<br>Numero de resultados: ".mysql_num_rows($consultapagina);
?>
mandando pra pagina a string a ser buscada por GET
"dalma" retorna o numero de resultados: 8, no caso
"dalmatica" retorna zero

contudo, copiando o $queryc que o echo printa e colando na execuçao de sql do phpmyadmin, acha os 8 resultados

/***************************/
resolvido...
em vez de substituir os entities pelos caracteres acentuados, eu fiz
DELIMITER //
CREATE FUNCTION HTMLENTITIES_DECODE (s varchar(255)) RETURNS varchar(255) DETERMINISTIC NO SQL
BEGIN
 SET s = REPLACE(s, '&Agrave;','A') ;
 SET s = REPLACE(s, '&Aacute;','A') ;
 SET s = REPLACE(s, '&Acirc;','A') ;
 SET s = REPLACE(s, '&Atilde;','A') ;
 SET s = REPLACE(s, '&Auml;','A') ;
 SET s = REPLACE(s, '&Aring;','A') ;
 SET s = REPLACE(s, '&Ccedil;','C') ;
 SET s = REPLACE(s, '&Egrave;','E') ;
 SET s = REPLACE(s, '&Eacute;','E') ;
 SET s = REPLACE(s, '&Ecirc;','E') ;
 SET s = REPLACE(s, '&Euml;','E') ;
 SET s = REPLACE(s, '&Igrave;','I') ;
 SET s = REPLACE(s, '&Iacute;','I') ;
 SET s = REPLACE(s, '&Icirc;','I') ;
 SET s = REPLACE(s, '&Iuml;','I') ;
 SET s = REPLACE(s, '&Ntilde;','N') ;
 SET s = REPLACE(s, '&Ograve;','O') ;
 SET s = REPLACE(s, '&Oacute;','O') ;
 SET s = REPLACE(s, '&Ocirc;','O') ;
 SET s = REPLACE(s, '&Otilde;','O') ;
 SET s = REPLACE(s, '&Ouml;','O') ;
 SET s = REPLACE(s, '&Ugrave;','U') ;
 SET s = REPLACE(s, '&Uacute;','U') ;
 SET s = REPLACE(s, '&Ucirc;','U') ;
 SET s = REPLACE(s, '&Uuml;','U') ;
 SET s = REPLACE(s, '&Yacute;','Y') ;
 SET s = REPLACE(s, '&agrave;','a') ;
 SET s = REPLACE(s, '&aacute;','a') ;
 SET s = REPLACE(s, '&acirc;','a') ;
 SET s = REPLACE(s, '&atilde;','a') ;
 SET s = REPLACE(s, '&auml;','a') ;
 SET s = REPLACE(s, '&aring;','a') ;
 SET s = REPLACE(s, '&ccedil;','c') ;
 SET s = REPLACE(s, '&egrave;','e') ;
 SET s = REPLACE(s, '&eacute;','e') ;
 SET s = REPLACE(s, '&ecirc;','e') ;
 SET s = REPLACE(s, '&euml;','e') ;
 SET s = REPLACE(s, '&igrave;','i') ;
 SET s = REPLACE(s, '&iacute;','i') ;
 SET s = REPLACE(s, '&icirc;','i') ;
 SET s = REPLACE(s, '&iuml;','i') ;
 SET s = REPLACE(s, '&ntilde;','n') ;
 SET s = REPLACE(s, '&ograve;','o') ;
 SET s = REPLACE(s, '&oacute;','o') ;
 SET s = REPLACE(s, '&ocirc;','o') ;
 SET s = REPLACE(s, '&otilde;','o') ;
 SET s = REPLACE(s, '&ouml;','o') ;
 SET s = REPLACE(s, '&ugrave;','u') ;
 SET s = REPLACE(s, '&uacute;','u') ;
 SET s = REPLACE(s, '&ucirc;','u') ;
 SET s = REPLACE(s, '&uuml;','u') ;
 SET s = REPLACE(s, '&yacute;','y') ;

RETURN s;
END;
//
DELIMITER;

e mantive a redundancia da busca, caso o usuario tenha digitado acentos :D

Edição feita por: Stormbringer, 22/12/2010, 15:21.

๑۩۞۩๑Let the Carnage Begin!!๑۩۞۩๑


#15 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 22/12/2010, 15:45

É... não deveria ser assim, mas por enquanto é a solução. Se funcionou no phpmyadmin, deveria funcionar no seu sistema. Mistério...




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq