Ped@ntilva Posted January 27, 2006 at 11:17 PM Report Share #12719 Posted January 27, 2006 at 11:17 PM 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 bazaDeveria 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: ignoranciaDevolve: Chullage - Ignorância XL Cumps... Link to comment Share on other sites More sharing options...
Ped@ntilva Posted January 30, 2006 at 04:08 PM Author Report Share #12956 Posted January 30, 2006 at 04:08 PM 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 More sharing options...
Lancaster Posted January 30, 2006 at 09:56 PM Report Share #12989 Posted January 30, 2006 at 09:56 PM 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 More sharing options...
Ped@ntilva Posted January 30, 2006 at 09:58 PM Author Report Share #12994 Posted January 30, 2006 at 09:58 PM o problema é k a palavra pod tar em varios campos e não em apenas um... Link to comment Share on other sites More sharing options...
Lancaster Posted January 31, 2006 at 11:34 PM Report Share #13091 Posted January 31, 2006 at 11:34 PM 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 More sharing options...
Ped@ntilva Posted February 1, 2006 at 12:27 AM Author Report Share #13096 Posted February 1, 2006 at 12:27 AM 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 More sharing options...
Solution Lancaster Posted February 1, 2006 at 04:06 PM Solution Report Share #13126 Posted February 1, 2006 at 04:06 PM 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 More sharing options...
completo77 Posted February 5, 2006 at 12:42 AM Report Share #13353 Posted February 5, 2006 at 12:42 AM 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 More sharing options...
Ped@ntilva Posted February 5, 2006 at 10:17 PM Author Report Share #13411 Posted February 5, 2006 at 10:17 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now