• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Ped@ntilva

[Resolvido] Procurar string

9 mensagens neste tópico

Boas,

estou a desenvolver o meu primeiro projecto em php (Tuga.Pedantilva.Com) e criei um script para procurar uma palavra na base de dados (MySQL).

$encontrar=$_POST['procurar'];//palavra que vai ser procurada
$encontrar = strtoupper($encontrar);
while ($linha= mysql_fetch_array( $tabela)){
    $busca= strtoupper($linha['artista']);//palavra onde vai procurar
    $pos = strpos($busca, $encontrar); 
    if ($pos===false){
        $busca= strtoupper($linha['video']);
        $pos = strpos($busca, $encontrar); 
    }if ($pos===false){
        $busca= strtoupper($linha['feat']);
        $pos = strpos($busca, $encontrar); 
    }if ($pos===false){
        ;
    }else {
        print $linha['artista'].' '.$linha['feat'].' - '.$linha['video'];
    }	
}

Este código está a funcionar muito bem. Mas se a palavra a encontrar for:

Utilizador escreve:  boss baza

Deveria devolver: Boss AC - Baza, Baza

Isto simplesmente não encontra pois não tem  nenhuma linha k tenha as duas palavras seguidas....

Gostava k me ajudassem no script para k procure com as duas palvras, ou mais, numa linha....

E também que ignore a acentuação.

Utilizador escreve: ignorancia

Devolve:    Chullage - Ignorância XL

Cumps...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Visto ninguem me ter dado uma ajuda continuei a desenvolver o script...

Já procura mais que uma palavra.

Agora falta só a acentuação...

Aqui fica o script para quem precisar:

$encontra = strtoupper($encontra);                                                 //string que se pretende procurar em maiusculas
$result = mysql_query("SELECT * FROM tabela ") or die(mysql_error());         //tabela com todos os dados onde vão ser procuradas as palavras 
if ($encontra){
    $encontrar = str_word_count($encontra, 1);                      //função que devolve um array em que cada posição do array tem cada uma das palavras a procurar
    $num_palavras = count($encontrar);                               //numero de palavras a procurar
    while ($linha = mysql_fetch_array( $result )){
        $valores_encontrados=0;
        for ($i=0 ; $i < $num_palavras ; $i++){
            $mystring = strtoupper($linha['autor']);                      //transforma a string lida do campo 'autor' em em letras maiusculas para ser comparada com $encontrar
            $pos = strpos($mystring, $encontrar[$i]);                    //caso encontre a palavra devolve a posição
            if ($pos===false){                                                             //se não encontrar a palvra procura noutro campo
                $mystring = strtoupper($linha['video']);
                $pos = strpos($mystring, $encontrar[$i]); 
            }if ($pos===false){
                $mystring = strtoupper($linha['autor_com']);
                $pos = strpos($mystring, $encontrar[$i]); 
            }if ($pos===false){
                ;
            }else
                $valores_encontrados++;          //contabiliza quantas palavras foram encontradas
        }
        if ($valores_encontrados == $num_palavras) {           //caso o numero de palavras encontradas for igual ao numero de palavras do array imprime a linha
            print 'LINHA';
        }
    }
}

[move] :2funny:[/move]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Heyas all...

E que tal se usasses outra query em vez de select * from tabela, imagina que tens 1 milhão de registos nessa tabela...vais ter que percorrer esse milhão até encontrares a string que procuras.

Por exemplo:

select * from tabela where campo like '%boss baza%'

Experimenta lá com isto, a ver se não te dá aquilo que queres, provavelmente até retorna mais do que aquilo que queres, mas aí vais restringindo a query, ou então corres uma função depois de teres o resultado para te limpar certos resultados que não queiras, e se isso é MySQL não precisas de converter para maiusculas ou minusculas em BD's Oracle ja é preciso...

Hasta all e espero ter ajudado [[]]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o problema é k a palavra pod tar em varios campos e não em apenas um...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Heyas all...

o problema é k a palavra pod tar em varios campos e não em apenas um...

Então podes continuar a usar a query que eu propus, imaginando que a tua tabela tem 4 campos:  nome, banda,cancao,etc

Basta fazeres a query:

select nome,banda,cancao,etc from tabela where none like '%boss%' OR banda like '%boss%' OR cancao like '%boss%' OR etc like '%boss%'

Isto vai-te retornar todos os campos da tabela onde exista uma ocorrência de boss.

select nome,banda,cancao,etc from tabela where none like '%boss%' AND banda like '%boss%' AND cancao like '%boss%' AND etc like '%boss%'

Esta vai-te retornar apenas as linhas onde exista a palavra boss em todos os campos.

Hasta all e espero ter ajudado.. [[]]

PS: Canção está mal escrita de propósito, não me cheira que MySQL aceita estes caracteres como nomes válidos para campos de uma tabela..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para por isso a funcionar como kero a pagina teria k fazer muitas queries (devido aos ciclos, dependendo de ktas palavras iria procurar)

e n sei pk n me agrada mto k esteja smp a fazer estes filtros a bd...

Será k é mais rápido do k da forma k eu tenho?

Por enkanto o meu projecto tem poucas linhas na base de dados...

Mas temos k ir pensando no futuro...

Axas k como tas a dizer é mais rápido?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Heyas all....

Acho que não  me consegui explicar bem..

Imaginando que queres procurar por boss baza ( o teu primeiro exemplo ), não precisas de separar a string, se quiseres até podes separar, mas não precisas de fazer mais query's, pode ir tudo na mesma separando ou não separando...

Supondo que tens 3 campos na tabela: artista, album, música

Sem  separar ficaria algo do género (igual à do meu post anteriror):

select artista, album,musica from tabela where artista like '%boss baza%' OR album  like '%boss baza%' OR musica  like '%boss baza%'

Para por isso a funcionar como quero a pagina teria k fazer muitas queries (devido aos ciclos, dependendo de ktas palavras iria procurar)

Não necessariamente...ora vê lá isto...

Separando, tens que fazer um ciclo antes, para te separar as palavras:

$string = 'boss baza';
$string_array = explode(' ',$string);
$query = "select artista, album,musica from tabela where ";
$first = 0;
for ( $i = 0; $i < sizeof($string_array); $i++ )
{
     if ( $first == 0 )
    {
           $query .= "artista like''%".$string_array[$i]."%' OR album  like '%".$string_array[$i]."%' OR musica  like '%".$string_array[$i]."%' ";
           $first = 1;
    }
    else
           $query .= "OR artista like''%".$string_array[$i]."%' OR album  like '%".$string_array[$i]."%' OR musica  like '%".$string_array[$i]."%' ";
}

E depois é só fazer a query e está a andar...

e n sei pk n me agrada mto k esteja smp a fazer estes filtros a bd...

A BD é sempre para ser filtrada ao máximo, porque é mais rápido fazer uma query e o MySQL ( ou outro  DBMS (Database management system)  ) fazer o tratamento dos resultados, do que tratar os resultados em PHP...

Será k é mais rápido do k da forma k eu tenho?

Por enkanto o meu projecto tem poucas linhas na base de dados...

Mas temos k ir pensando no futuro...

Axas k como tas a dizer é mais rápido?

Sinceramente acho que da minha maneira é mais rápido e porquê?

Porque no código que apresentas-te, se a tua tabela tiver um milhão de registos, tu vais ter que iterar esse milhão em PHP que é muito mais lento que iterar em MySQL através de uma query...

Com também é mais rápido ires buscar os valores de 2 tabelas na mesma query em vez de ires buscar em duas query's distintas e depois fazer o tratamento de resultados...

Hasta all e espero ter ajudado [[]]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Correcto e afirmativo!

Usar as possibilidades do MySQL sempre que possível.

Fazer um script em PHP para fazer pesquisas além de ser uma tarefa monstrosa, chata, sujeita a erros e dores de cabeça torna-se incomparavelmente mais lenta do que usar as funções do MySQL. Em tabelas pequenas talvez não se note muito mas em tabelas grandes nota-se... pelo menos é o que dizem os livros!  :cheesygrin:

mas parabens Pedante.. pelo menos ficaste a saber bem as funções de tratamento de strings do PHP.  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Muito obrigado Lancaster! :)

Realmente não tinha a noção que era mais rápido tratar dos filtros nas queries do k em php.

Tamos sempre a aprender. Eu ainda sou iniciado, tou a trabalhar no meu primeiro projecto em php para ir aprendendo e espero k saia um bom projecto.

Ao procurar como tu disseste já n tenho os problemas com a acentuação, pelos vistos o mysql trata de td sem ser preciso eu 'matar a cabeça'. :smoke:

Muito obrigado mesmo... :cheesygrin:

Se puderem passem em Projectos Pessoais e comentem o meu projecto..

Thks!!

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora