Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

mapas2002

Busca com acento e sem acento

Recommended Posts

Olá a todos venho até vocês até mesmo por desespero pois estou tendo problemas no meu site nas buscas que o usuário faz. Fiz algumas pesquisas na internet consegui algumas coisas mas não funcionaram, encontrei um exemplo onde pode ser a solução, mas preciso que alguém me ajude a implantar o código de exemplos no meu código original.

 

O problema maior é que por ex: tenho no banco de dados Ação se eu digitar ação vai encontrar mas se eu digitar açao, acao não vai encontrar. Por favor alguém me ajude a fazer esta correção.

 

(Código Original que está no meu site)-----------------------------------------------

<?php
$therow = 0;
if ($_GET['q'] && $_GET['q'] != 'Search...') {
if (!isset($_GET['page'])) {
	$page = 1;
}
else {
	$page = $_GET['page'];
}
$from = (($page * $template['games_per_page']) - $template['games_per_page']);

$trimmed = mysql_secure($_GET['q']);

$total_results_search = mysql_result(mysql_query("SELECT COUNT(*) as Num FROM ava_games WHERE description like \"%$trimmed%\" OR name like \"%$trimmed%\" AND published=1"),0);
if ($trimmed == "" OR $trimmed == 'Search...') {
	echo '<div id="error_message">'.NOSEARCH.'</div>';
	include 'includes/forms/search_form.php';
}

else if ($total_results_search == 0) {
 		echo '<div id="error_message">'.NORESULTS.'</div>';
 		include 'includes/forms/search_form.php';
 	}

else {
	$sql = mysql_query("SELECT * FROM ava_games WHERE description like \"%$trimmed%\" OR name like \"%$trimmed%\" AND published=1
    ORDER BY id DESC LIMIT $from, $template[games_per_page]");

	echo '<div id="catwrapper">';
	while($row = mysql_fetch_array($sql)) {
			$therow = $therow + 1;

		$game = GameData($row, 'category');

		include('.'.$setting['template_url'].'/'.$template['search_game']);

		if ($therow == $template['category_columns']) {
			echo '<br style="clear: both"/></div><div class="homewrapper">';
			$therow = 0;
		}
	}
	echo '<br style="clear: both"/></div>';

	// Pages
	$total_pages = ceil($total_results_search / $template['games_per_page']);

	if ($total_pages > 1) {

		echo '<div class="category_pages">';
		$url = $setting['site_url'].'/index.php?task=search&q='.$trimmed.'&page=';

		if($page > 1){
			$prev = ($page - 1);
			echo '<a href="'.$url.$prev.'">« '.PREVIOUS.'</a> ';
		}

		for($i = 1; $i <= $total_pages; $i++){
			if($page == $i){
       			echo '<b><a href="#">'.$i.'</a></b>';
   			} 
   			else {
				echo '<a href="'.$url.$i.'">'.$i.'</a> ';
   			}
		}

		if($page < $total_pages){
  				$next = ($page + 1);
			echo '<a href="'.$url.$next.'">'.NEXT.' »</a> ';
		}

		echo '</div>';
	}
}
}

else {
include 'includes/forms/search_form.php';
}

?>




(Exemplo)
(funcaoStringParaBusca.php) -----------------------------------------------

<?

function stringParaBusca($str) {
//Transformando tudo em minúsculas
$str = trim(strtolower($str));

//Tirando espaços extras da string... "tarcila  almeida" ou "tarcila   almeida" viram "tarcila almeida"
while ( strpos($str,"  ") )
	$str = str_replace("  "," ",$str);

//Agora, vamos trocar os caracteres perigosos "ã,á..." por coisas limpas "a"
$caracteresPerigosos = array ("Ã","ã","Õ","õ","á","Á","é","É","í","Í","ó","Ó","ú","Ú","ç","Ç","à","À","è","È","ì","Ì","ò","Ò","ù","Ù","ä","Ä","ë","Ë","ï","Ï","ö","Ö","ü","Ü","Â","Ê","Î","Ô","Û","â","ê","î","ô","û","!","?",",","“","”","-","\"","\\","/");
$caracteresLimpos    = array ("a","a","o","o","a","a","e","e","i","i","o","o","u","u","c","c","a","a","e","e","i","i","o","o","u","u","a","a","e","e","i","i","o","o","u","u","A","E","I","O","U","a","e","i","o","u",".",".",".",".",".",".","." ,"." ,".");
$str = str_replace($caracteresPerigosos,$caracteresLimpos,$str);

//Agora que não temos mais nenhum acento em nossa string, e estamos com ela toda em "lower",
//vamos montar a expressão regular para o MySQL
$caractresSimples = array("a","e","i","o","u","c");
$caractresEnvelopados = array("[a]","[e]","[i]","[o]","[u]","[c]");
$str = str_replace($caractresSimples,$caractresEnvelopados,$str);
$caracteresParaRegExp = array(
	"(a|ã|á|à|ä|â|ã|á|à|ä|â|Ã|Á|À|Ä|Â|Ã|Á|À|Ä|Â)",
	"(e|é|è|ë|ê|é|è|ë|ê|É|È|Ë|Ê|É|È|Ë|Ê)",
	"(i|í|ì|ï|î|í|ì|ï|î|Í|Ì|Ï|Î|Í|Ì|Ï|Î)",
	"(o|õ|ó|ò|ö|ô|õ|ó|ò|ö|ô|Õ|Ó|Ò|Ö|Ô|Õ|Ó|Ò|Ö|Ô)",
	"(u|ú|ù|ü|û|ú|ù|ü|û|Ú|Ù|Ü|Û|Ú|Ù|Ü|Û)",
	"(c|ç|Ç|ç|Ç)" );
$str = str_replace($caractresEnvelopados,$caracteresParaRegExp,$str);

//Trocando espaços por .*
$str = str_replace(" ",".*",$str);

//Retornando a String finalizada!
return $str;
}
?>

(exemplo)

(index.php) -----------------------------------------------------------

<?

$HOST 		= "localhost";
$USERNAME 	= "lokal"; 
$PASSWORD	= "passlokal"
$DATABASE	= "lokal";

//Conectando no Banco de Dados
@mysql_connect($HOST,$USERNAME,$PASSWORD);
or die("Não pude conectar: " . mysql_error());

//Selecionando o Banco de Dados
@mysql_select_db($DATABASE) 
or die("Não pude selecionar o BD: " . mysql_error());

//Fazendo a Busca
if ( isset($Submit) ) {
require_once("funcaoStringParaBusca.php");
//Montando a REGEXP
$str=stringParaBusca($textoProcurado);
$sql = "SELECT * FROM noticias WHERE noticia REGEXP \"" . $str . "\"";
}
else
$sql = "SELECT * FROM noticias";

//Exibindo os Rsultados
printf("<br><br>BUSCA: <b> %s </b><br>",$sql);
$result=mysql_query($sql);
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
  printf ("<br>Nome:<i> %s </i>", $row["noticia"]);
}
mysql_close();
?> 
<form action="<?=$PHP_SELF?>" method="post">
Buscar por: 
<input name="textoProcurado" type="text" id="textoProcurado">
<input type="submit" name="Submit" value="Busca">
</form>

 

Espero que vocês possam me ajudar.

Muito obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em um tópico antigo, eu havia abordado sobre o uso do collation latin_swedish_ci para busca com acentos.

Sugiro que leia o tópico, pode resolver seu problema.

 

Busca com ou sem acento

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu já tinha visto o seu post e não consegui, mudei a collation, o meu banco de dados está como utf8_general_ci e as tabelas estão como latin1_swedish_ci

 

os dados com acento na tabela salva assim ex: Ação salca como Ação

 

Infelismente tentei de tudo, não é por preguiça pesquisei mas não consegui resolver o problema.

 

Não sei o que fazer mais

 

 

Em um tópico antigo, eu havia abordado sobre o uso do collation latin_swedish_ci para busca com acentos.

Sugiro que leia o tópico, pode resolver seu problema.

 

Busca com ou sem acento

Compartilhar este post


Link para o post
Compartilhar em outros sites

você apenas modificou o encode do banco de dados, certo?

 

antes disso, não fez a conversão dos dados ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A maneira mais fácil é utilizando o convert: convert('%maçã%' using utf8). Se for preciso faça a conversão no campo da busca também.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu pela ajuda mas não deu certo ainda.

 

A maneira mais fácil é utilizando o convert: convert('%maçã%' using utf8). Se for preciso faça a conversão no campo da busca também.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como é que tu montaste o sql com o convert?

 

Foi dessa maneira?

 

select * from blog where titulo like convert('%personalizável%' using utf8);

Compartilhar este post


Link para o post
Compartilhar em outros sites

não foi exatamente desta maneira, mas tentei da sua forma e mesmo assim ele não encontra palavras com acentos.

 

Como é que tu montaste o sql com o convert?

 

Foi dessa maneira?

 

select * from blog where titulo like convert('%personalizável%' using utf8);

Compartilhar este post


Link para o post
Compartilhar em outros sites

primeiramente, você deve verificar como está o formato dos dados no banco..

 

pode ser que já tenha misturado utf8 com o outro charset anterior.. , portanto verifique isso no arquivo do backup mais recente antes da modificação.

 

após entender como está, saberá como converter de modo mais seguro..

 

do jeito que está fazendo, sem saber o que está fazendo, só vai piorando cada vez mais.. entendeu ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O banco de dados está como latin_swedish_ci e as tabelas latin1_swedish_ci, esta collation permanece inalterada, não modifiquei, no site mostra corretamente uso http-equiv="Content-Type" content="text/html; charset=UTF-8, no banco de dados a palavra por exemplo Civilização está como Civilização, quando faço a busca por Civilização é exibido corretamente, mas quando eu faço a busca Civilizaçao ou Civilizacao, não me retorna nenhum resultado e assim é com todas as palavras com acento, do resto esta perfeito a busca, é uma piada eu já estou quase desistindo e tirando o campo de busca no site, pois todos os exemplos que econtrei na internet nenhum deram resultados, por enquanto vou aguardar uma alma caridosa que possa resolver este problema.

 

primeiramente, você deve verificar como está o formato dos dados no banco..

 

pode ser que já tenha misturado utf8 com o outro charset anterior.. , portanto verifique isso no arquivo do backup mais recente antes da modificação.

 

após entender como está, saberá como converter de modo mais seguro..

 

do jeito que está fazendo, sem saber o que está fazendo, só vai piorando cada vez mais.. entendeu ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente assim:

 

... WHERE noticia like _utf8 '%{$str}%' COLLATE utf8_unicode_ci"

 

Mas isto vai depender do requisito da sua aplicação.

 

A solução do post #5 também funcionou nos meus testes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, tentei o seu código, ele me retornou todos os resultados que estão no banco de dados, posso digitar qualquer palavra ele sempre mostra o mesmo resultado.

 

 

Tente assim:

 

... WHERE noticia like _utf8 '%{$str}%' COLLATE utf8_unicode_ci"

 

Mas isto vai depender do requisito da sua aplicação.

 

estou inserindo também o código do formulário busca, talvez tem que ser alterado alguma coisa, estou postando para vocês analizarem.

<form name="form" action="<?php echo $setting['site_url']?>/index.php?task=search" method="get">
 <div align="center">
     <input name="q" type="text" size="15"/> 
     <input type="submit" name="Submit" value="<?php echo SEARCH; ?>" class="btn" />
     <input name="task" type="hidden" value="search" />
 </div>
</form>

Compartilhar este post


Link para o post
Compartilhar em outros sites

mapas... as tabelas podem estar devidamente configuradas mas antes de modificar o encode das tabelas, você vfez a conversão dos dados ?

 

você modificou somente a estrutura das tabelas mas isso não converte os dados automaticamente..

 

exemplo

 

1. a configuração e os dados estão em latin-iso

2. altera a confoguração da tabela para utf8 (os dados vão continuar em latin-iso)

entendeu ?

 

verifique como estão os dados da tabela e não somente a estrutura da tabela

porque eu presuponho que esse possa ser o problema..

 

 

independente disso você pode manter como está e usar as técnicas do post #5 ou #11

 

o problema é que isso gera processos desnecessarios, sendo que podera eliminar fazendo a conversão dos dados para o formato apropriado.

 

 

 

veja também:

http://forum.imasters.com.br/topic/340459-php-html-mysql-charset-encoding/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom hoje com a cabeça mais fresca voltei a mecher na busca, bom obtive os resultados coma seguinte função:

 

like _utf8 '%{$str}%' COLLATE utf8_unicode_ci 

 

Mas eu só consegui mostrar o resultados alterando manualmente a palavra no banco de dados:

Por ex: no meu banco de dados a palavra está escrita Ação, usando o código acima não me retornou resultado, basicamente não teve diferença do meu código atual, então resolvi alterar a palavra direto no mysql, Ação, aí ele me retornou o resultado, porém no lugar do acento mostrou o famoso "?".

 

Acredito que problema maior seja na configurações do banco de dados, mas eu não tenho muito conhecimento no mysql.

 

Definitivamente não sei aonde eu tenho que alterar, tenho medo de alterar alguma coisa no meu banco de dados e ir tudo pro beleléu, tenho 5 meses de informações neste banco de dados, então tenho que ser cauteloso nas modificações.

 

Portanto o código acima funciona (no meu caso) se a palavra estiver adicionado no banco de dados normalmente "Ação".

 

Tenho que arrumar uma solução pra este problema com o "barco andando", eu não posso começar tudo do zero, impossível.

 

Por isto eu postei o código de exemplo que encontrei que parece ser o mais favorável no meu caso em específico, mas eu testei o código e está com problemas, não consegui testar.

 

Então eu peço para vcs analizarem o código de ex para ver se encaixa no meu problema, pelo o que eu li esta pessoa teve o mesmo problema que o meu e conseguiu corrigir com este código.

 

Obrigado a todos que estão colaborando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom... a primeira coisa que você precisa conhecer chama-se backup. Faça um backup antes de iniciar qualquer alteração deste tipo.

 

Se você já mexeu/alterou alguma coisa no banco/tabelas isto pode estar atrapalhando no funcionamento correto.

 

Antes funcionava tudo corretamente? Volte como estava antes de iniciar este tópico, inclusive a configuração dos seus scripts, e refaça os testes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que vou fazer isto, já tenho um backup, mas está funcionando perfeitamento o resto, só o maldição da busca com acento que não rsrs.... "mas nóis chega lá ..."

 

Vou pegar apenas o scritp e banco de dados de teste "limpo", vou seguir as orientações recomendada por vcs e espero em breve dar as boas notícias, pois continuo acreditando ser na collation do banco de dados o grande problema.

 

Por enquanto obrigado a todos!

 

 

Bom... a primeira coisa que você precisa conhecer chama-se backup. Faça um backup antes de iniciar qualquer alteração deste tipo.

 

Se você já mexeu/alterou alguma coisa no banco/tabelas isto pode estar atrapalhando no funcionamento correto.

 

Antes funcionava tudo corretamente? Volte como estava antes de iniciar este tópico, inclusive a configuração dos seus scripts, e refaça os testes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.