Jump to content

Procurar string


Ped@ntilva
Go to solution Solved by Lancaster,

Recommended Posts

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...

Link to comment
Share on other 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] ?[/move]

Link to comment
Share on other 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 [[]]

http://www.mundodotio.com/ Um mundo à parte...ou então não..http://programming.mundodotio.com/ A vida de um programador WEB
Link to comment
Share on other 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..

http://www.mundodotio.com/ Um mundo à parte...ou então não..http://programming.mundodotio.com/ A vida de um programador WEB
Link to comment
Share on other 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?

Link to comment
Share on other sites

  • Solution

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 [[]]

http://www.mundodotio.com/ Um mundo à parte...ou então não..http://programming.mundodotio.com/ A vida de um programador WEB
Link to comment
Share on other 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!  😁

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

Alguem me explica para que é que serve a porra do XML ?

Link to comment
Share on other 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... 😁

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

Thks!!

Cumps

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.