Ir para conteúdo

POWERED BY:

Arquivado

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

Juninho14

Fazer SELECT e buscar palavras com acento ou nao

Recommended Posts

Bom tenho um select assim:

 

$sql = pg_query("SELECT * from pacientes where lower(nome) like '%" . strtolower( $nome ) . "%' order by matricula");

daí quero achar a palavra Antônio, so que seu eu colocar sem o ^ ele me traz so os antonios que nao tem til... como faço para deixar global? Queria procurar por antonio e receber: antonio, antônio, antonió ántóníó hehe e etc...

 

abração

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um jeito arcaico é substituir na query:

 

$letras_especiais = array('á','ã','é','ê','í','ô','õ'); // aki você precisaria colocar TODAS as letras especiais;

 

//na linha abaixo buscamos por estas letras especiais e substituimos pelo caracter % (coringa)

 

 

foreach($letras_especiais as $l){

$nome = str_replace($l, '%', strtolower($nome)); //ja aproveitamos para deixar tudo minusculo aki nesta linha mesmo

}

 

$sql = pg_query("SELECT * from pacientes where lower(nome) like '%" . $nome . "%' order by matricula");

Compartilhar este post


Link para o post
Compartilhar em outros sites

desse jeito funciona quando eu coloco "ANTÔNIO" com acento, ele traz geral, mas quando eu coloco "ANTONIO" ele nao traz os que estão como "ANTÔNIO" no banco, entende?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi, é realmente não vou opinar mais por falta de ideias o que você precisa é complicado

 

Voce pode tentar relacionar os nomes criando um array com as variações (trabalho imenso)

 

ou mesmo fazer consulta tb com um pedaço do nome

exemplo:

 

"SELECT * from pacientes where lower(nome) like '%" . $nome . "%' OR lower(nome) LIKE '". $nome2 . "%' order by matricula");

 

onde nome = ANTONIO

nome2=ANT

 

Só que ai so ia dar certo em alguns casos (João por exemplo ia ser muito dificil)

 

Por isso como eu disse "...não vou opinar mais por falta de ideias...", vou deixar os Prós te ajudarem nesta ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

se eu colocar assim:

 

$letras_especiais = array('a','e','i','o','á','ã','é','ê','í','ô','õ','o','ú','u'); // aki você precisaria colocar TODAS as letras especiais;

 

acho que funciona né?

 

ele transfere a busca de joão para jo%o..

transfere a busca de joao para jo%o...

 

daí acho q dá certo.. ou não? até agora deu hehe

 

vlw pela força

Compartilhar este post


Link para o post
Compartilhar em outros sites

Da certo sim so o problema é por exemplo

 

maria iria buscar m%ri%

 

que iria retorar

 

maria

mario

 

tendeu? ( m +qualquerletra+ ri +qualquerletra)

Compartilhar este post


Link para o post
Compartilhar em outros sites

putz é verdade, cadastrei maria e mario, dai eles aparecem na mesma consulta realmente.... e agora? q q eu faço? Já procurei de tudo no google e não acho nada.. :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

putz é verdade, cadastrei maria e mario, dai eles aparecem na mesma consulta realmente.... e agora? q q eu faço? Já procurei de tudo no google e não acho nada.. :(

Boa pergunta ;) como eu disse prefiro deixar os prós te ajudarem pois ja estou sem ideias

Compartilhar este post


Link para o post
Compartilhar em outros sites

deve ser algo nesta parte:

 

"where lower(nome)"

não? pq é alí q a parada vem do banco...

 

vou continuar pesquisando

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade você nem precisaria usar esta função (lower) no Mysql já que estamos transformando tudo em minusculo via php:

 

$nome = str_replace($l, '%', strtolower($nome));

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas para comparar eu faço isso, pq agente diminui oq vem do usuário, e diminui o q esta guardado no banco. Quando eu guardo no banco eu não diminuo..

 

oolha o q eu fiz.. acho q ta certo:

 

function tirarAcentosPalavra (&$nome_remover_Acento)
  {
	
$letras_especiais = array('á','ã','â'); // aki você precisaria colocar TODAS as letras especiais;
foreach($letras_especiais as $l){
$nome_remover_Acento = str_replace($l, 'a', strtolower($nome_remover_Acento)); //ja aproveitamos para deixar tudo minusculo aki nesta linha mesmo
}

$letras_especiais = array('ú'); // aki você precisaria colocar TODAS as letras especiais;
foreach($letras_especiais as $l){
$nome_remover_Acento = str_replace($l, 'u', strtolower($nome_remover_Acento)); //ja aproveitamos para deixar tudo minusculo aki nesta linha mesmo
}

$letras_especiais = array('é','ê'); // aki você precisaria colocar TODAS as letras especiais;
foreach($letras_especiais as $l){
$nome_remover_Acento = str_replace($l, 'e', strtolower($nome_remover_Acento)); //ja aproveitamos para deixar tudo minusculo aki nesta linha mesmo
}

$letras_especiais = array('í'); // aki você precisaria colocar TODAS as letras especiais;
foreach($letras_especiais as $l){
$nome_remover_Acento = str_replace($l, 'i', strtolower($nome_remover_Acento)); //ja aproveitamos para deixar tudo minusculo aki nesta linha mesmo
}

$letras_especiais = array('ó','ô','õ'); // aki você precisaria colocar TODAS as letras especiais;
foreach($letras_especiais as $l){
$nome_remover_Acento = str_replace($l, 'o', strtolower($nome_remover_Acento)); //ja aproveitamos para deixar tudo minusculo aki nesta linha mesmo
}

$letras_especiais = array('ú'); // aki você precisaria colocar TODAS as letras especiais;
foreach($letras_especiais as $l){
$nome_inserir_Acento = str_replace($l, 'u', strtolower($nome_remover_Acento)); //ja aproveitamos para deixar tudo minusculo aki nesta linha mesmo
}

  }

ai a minha funcao que chama ela...

 

/* Chamado pela controladora após o usuário preencher o nome do paciente */
   function InputBuscarPaciente ($vars)
  {
   $lin = array ();
   $bet = array ();
   $nome = $vars['nome'];
   $nome_remover_Acento = $nome;
   $nome_remover_Acento = strtolower($nome_remover_Acento);
   $nome = strtolower($nome);
	   
   $a = new pacientes ();
   $a = $this-> tirarAcentosPalavra ($nome_remover_Acento);
	

 $sql = pg_query("SELECT * from pacientes where lower(nome) like '%" . $nome_remover_Acento . "%' or lower(nome) like '%" . $nome . "%' order by matricula"); 
   while ($lin = pg_fetch_array($sql)) 
		   {
		   	$e = new pacientes();
		   	$e->preencherAtributosSelect($lin);
			$vet[]=$e;
		   
		   }
   
   $i = new interfaceSis();
   $i -> resultadoInputBuscarPaciente ($vet);
  
  }

 

qq eu fiz? fiz duas strings, uma com acento e outra sem acento... e fiz um or no select..., será q ta certo? ve se dá pra dar uma checada pra mim por favor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

BOA, em teoria deve funcionar na prática é você que vai me falar

 

Você não precisa desta linha:

$nome_remover_Acento = strtolower($nome_remover_Acento);

 

por que em cada parte da função ja existe um strtolower

 

Detalhe, você esta colocando o resultado da sua função na variavel $a mas não esta utilizando ela na query

 

$a = $this-> tirarAcentosPalavra ($nome_remover_Acento);

 

mude para

 

$nome_remover_Acento = $this-> tirarAcentosPalavra ($nome);

 

e remova

 

$nome_remover_Acento = $nome;

$nome_remover_Acento = strtolower($nome_remover_Acento);

 

deve funcionar da forma como você quer

Compartilhar este post


Link para o post
Compartilhar em outros sites

É não funcionou não.. pq depois eu teria q por acento nas palavras q nao foram acentuadas na busca, ai fica dificil, pq eu teria q advinhar qual acento colocar... dificultou bastante..

 

a variável a é so um objeto q usei para chamar um metodo da propria classe...

 

e agora??? ALGUEM ME AJUDAhhhhhhh!!!!!!! PleasE!

 

edit

 

 

FUNCIONOU !! ehhe

 

minha query ficou assim

$sql = pg_query("SELECT * from pacientes where lower(to_ascii(nome)) like lower(to_ascii('%$nome%')) order by matricula");

achei essa funçãozinha para postgresql, ficou show...

 

vlw pela ajuda ein MathBr

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.