Ir para conteúdo

POWERED BY:

Arquivado

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

Guilherme Oderdenge

[Resolvido] Buscar por palavras no MySQL

Recommended Posts

Olá, senhores.

 

Meu sistema de busca consiste em buscar por palavras diferentes nas mesmas tabelas. Basicamente o seguinte:

 

$var = explode("-", "joao-da-silva-pereira");
print_r($var);

 

Ele vai me retornar:

 

Array
(
   [0] => joao
   [1] => da
   [2] => silva
   [3] => pereira
)

 

E eu quero que ele busque cada uma dessas palavras em todas as colunas do MySQL, ou seja, não quero que ele busque "joao da silva pereira" na mesma tabela.

 

Já olhei na internet, tentei usar for, while e foreach pra fazer isso, mas nada. Tentei usar $i++ pra pegar o valor do Array mas nada com êxito.

 

Poderiam me ajudar?

 

Desde já, grato.

 

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

usa o IN com implode, exemplo:

SELECT * FROM `...` WHERE `nome` IN ( ... )

 

Você vai fazer um:

implode( ',', $Array ) 

 

Que vai retornar

joao,da,silva,pereira 

 

Então vai pesquisar todos os dados na tabela que tenham essas palavras no nome. 'tem que ser igual', caso você

for buscar por semelhança.. vai ter que usar 'OR' com LIKE

 

function Search( Array $Fields, $Numeric = false, $field = null ){
     if( !is_array( $Fields ) ){
         throw new OutOfBoundsException( 'Esperavamos um array' );
     }else{
         $Fields = array_filter( $Fields );
         if( $Numeric == false ){
             foreach( $Fields as $index => $data ){
                 $fields[] = sprintf( '`%s`', $index );
                 $values[] = !is_numeric( $data ) ? sprintf( "%s", $data ) : intval( $data );
             }
         }elseif( !is_null( $field ) && $Numeric = true ){
             foreach( $Fields as $index => $data ){
                  $fields[] = sprintf( '`%s`', $field );
                  $values[] = !is_numeric( $data ) ? sprintf( "%s", $data ) : intval( $data );
             }
         }
         for( $i = 0; $i < sizeOf( $fields ); ++$i ){
              if( $i %count( $fields ) == 0 ){
                  $sql[ $i ] = sprintf( '%s LIKE \'%s%s%s\'', $fields[ $i ], '%', $values[ $i ], '%' );
              }else{
                  $sql[ $i ] = sprintf( 'OR %s LIKE \'%s%s%s\'', $fields[ $i ], '%', $values[ $i ], '%' );
              }
         }
         return implode( ' ', $sql );
     }
}

 

A Função acima, faz exatamente o que você deve estar precisando, porem ele não está revisada achei isso por aqui

no meio de uns scripts .. mais vejamos:

$Array = Array(
    0 => 'jose',
    1 => 'da',
    2 => 'silva',
    3 => 'pereira'
);
echo sprintf( 'SELECT * FROM `...` WHERE %s', search( $Array ) );

Saída:

SELECT * FROM `...` WHERE `0` LIKE '%jose%' OR `1` LIKE '%da%' OR `2` LIKE '%silva%' OR `3` LIKE '%pereira%'

No caso, isso seria o índice do array = nome do campo .. porem se você tiver um array numérico igual ao exemplo

acima que você deu, a função não ia servir, se não tivesse o parâmetro 2 & 3, então vejamos:

$Array = Array(
    0 => 'jose',
    1 => 'da',
    2 => 'silva',
    3 => 'pereira'
);
echo sprintf( 'SELECT * FROM `...` WHERE %s', search( $Array, true, 'nome' ) );

 

Saída:

SELECT * FROM `...` WHERE `nome` LIKE '%jose%' OR `nome` LIKE '%da%' OR `nome` LIKE '%silva%' OR `nome` LIKE '%pereira%'

 

Então outra pergunta, e se tivermos somente 'jose' no array ? como ficaria o SQL com a função ?

$Array = Array(
   0 => 'jose'
);
echo sprintf( 'SELECT * FROM `...` WHERE %s', search( $Array, true, 'nome' ) );

 

Saída:

SELECT * FROM `...` WHERE `nome` LIKE '%jose%'

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, Andrey.

 

Acho que eu não fui muito específico... o que eu quero é o seguinte:

tenho as colunas a seguir em suas tabelas: tbl_usuarios.nome, tbl_usuarios.sobrenome e tbl_posts.titulo.

 

Beleza, daí eu digito no campo de busca: "josé da silva pereira". Então, ele manda pra URL como "jose-da-silva-pereira" e eu uso um explode pra pegar palavra por palavra, mas não sei como percorrer cada palavra em cada coluna de uma tabela.

 

Por exemplo, eu quero que ele procure "josé" na tabela tbl_usuarios nas colunas nome e sobrenome, e então, ao mesmo tempo, ele busque por "josé" na tabela tbl_posts e na coluna titulo. Está entendendo? E quero que esse procedimento se repita com todas as palavras jogadas no Array pelo explode.

 

Não utilizarei o LIKE para esse caso. O que vou usar aí é a palavra em específico mesmo. Se procurar por João, é só João, e não seus valores próximos. Entende?

 

Mas então, em sumo era isso, e dessa(s) maneira(s) que você me passou não deu certo.

 

No primeiro caso não deu porque utilizo a seguinte sintaxe:

SELECT * FROM tbl_usuarios
WHERE nome IN ('jose', 'da', 'silva', 'pereira');

 

Ou seja, ele está buscando por "josé, da, silva, pereira" somente na coluna NOME da tabela TBL_USUARIOS, e eu gostaria de procurar pelas 4 palavras em outra coluna.

 

Como devo fazer isso?

 

Desde já, grato.

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, Andrey, em partes era isso mesmo, só tenho que dar uma adaptada aqui.

 

Mas como devo fazer para pegar cada resultado do array? Usar um foreach? Se sim, como devo retornar estes valores?

 

Desde já, grato.

 

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

pra que ? o explode já vai retornar um array ..

<?php
       $words = implode( ', ', explode( '-', 'andrey-knupp-vital' ) );
       printf( 'SELECT * FROM `...` WHERE `...` IN ( %s ) OR `...` IN( %s ) OR ..', $words, $words );

 

Saída:

SELECT * FROM `...` WHERE `...` IN ( andrey, knupp, vital ) OR `...` IN( andrey, knupp, vital ) OR ..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado de novo, Andrey.

 

Mas aqui mora mais um problema: você está usando o printf para exibir a query... e se eu quiser usar o "%s" dentro da query, o que eu faço?

 

Desde já, grato.

 

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

$PDO-> .. ( sprintf( %s ) ) ...

 

Esqueci do cast nas palavras / números:

<?php
       $array = explode( '-', 'andrey-knupp-vital' );
       array_walk( $array, function( &$value ){
             $value = !is_numeric( $value ) ? sprintf( "'%s'", $value ) : intval( $value );
       });
       $words = implode( ',', $array );
       printf( 'SELECT * FROM `...` WHERE `...` IN ( %s ) OR `...` IN( %s ) OR ..', $words, $words );

 

Saída:

SELECT * FROM `...` WHERE `...` IN ( 'andrey','knupp','vital' ) OR `...` IN( 'andrey','knupp','vital' ) OR ..

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.