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

nuno_couto

[PHP] Expressão para pesquisa de dados ba BD

14 mensagens neste tópico

Viva.

Tinha bastantes dúvidas em relação à melhor forma de pesquisar dados na BD, por exemplo, pesquisar de forma eficaz o nome de um produto.

Após algumas experiências penso que a seguinte formula é o ideal:

$pesquisa=$_REQUEST['pesquisa'];

$pesquisa=str_replace(" ","%' AND titulo LIKE '%",$pesquisa);

$result = mysql_query("SELECT *  FROM produtos WHERE titulo LIKE '%$pesquisa%'", $dbh);

Exemplificando, a variável "impressora laser" é pesquisada da seguinte forma: SELECT *  FROM produtos WHERE titulo LIKE '%impressora%' AND titulo LIKE '%laser%'

Desta forma não importa a ordem das palavras no título. Desde que estejam no título são encontradas.

Espero que seja útil aos mais iniciados.

Já agora, não troquem as aspas simples ( ' ) por duplas ( " )... A fórmula deixa de trabalhar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Devias colocar na secção Tutorials ou armazem de codigo! penso que tutorials seja o mais indicado :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Penso que é mais aconselhado um moderador mudar para os tutoriais para não ficar repetido.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Lamento mas não posso mover isto para os tutoriais.

Não é que este exemplo não seja bom para os iniciantes perceberem ou que o conceito esteja mal pensado. Simplesmente é má práctica usar esse código.

Vou explicar:

Se o utilizador inserir muitas palavras o mysql vai ter que resalizar uma operação de matching para cara uma delas para cada linha. Se o site for pequeno até pode parecer que isto funciona bem, mas deixem-no chegar a uns poucos milhares de registos... se u utilizador inserir 20 letras separadas por espaços o mysql vai passar-se completamente com tanta verificação.

Sem ofensa, para o autor, ninguem nasce ensinado. Este tipo de código é perigoso pois pode causar completos breckanços da base de dados.

Para pesquisas de texto existem os indices fulltext que são suportados pelo mysql, de resto é uma das funcionalidades mais cool do mysql.

Para sistemas de gestão de bases de dados sem suporte para indices fulltext, pode sempre ser criado um addoc.

Um exemplo de uma boa implementação deste tipo de código encontra-se no código fonte do punbb.

EDIT:Ok, alguem moveu isto para os tutoriais. Não acho que valha a pena estar a mudar outra vez para outro sítio. No entanto mantenho o conselho: evitem usar código deste tipo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@pedrotuga, e também dá para sql injection não?

Hoje em dia 95% ( no mínimo ) das instalações do php têm a directiva GPC_magic_quotes a ON, o que afasta qualquer possibilidade de sql injection. Se esta estiver a OFF a resposta é: sim, abre uma vulnerabilidade a intrusões via sql.

Para proteger esse código poderia usar-se por exemplo a função mysql_escape_string()

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para escusar abrir outro tópico, tenho aqui uma dúvida.

Tenho 5 campos para efectuar uma pesquisa.

Autor Nome

Autor Apelido

Ano

Titulo

Editora

Acontece que se o utilizador especificar só 1 campo é super fácil efecttuar as pesquisas, mas e se ele especificar todos os campos como vou eu fazer , querendo eu fazer pesquisas individuais, ou seja em vez de fazer um sql query com todos os campos logo nao, quero fazer um para o Autor Nome, outro para Autor Apelido mas depois quero remover matchs iguais como é obvio que vao aparecer

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para escusar abrir outro tópico, tenho aqui uma dúvida.

Tenho 5 campos para efectuar uma pesquisa.

Autor Nome

Autor Apelido

Ano

Titulo

Editora

Acontece que se o utilizador especificar só 1 campo é super fácil efecttuar as pesquisas, mas e se ele especificar todos os campos como vou eu fazer , querendo eu fazer pesquisas individuais, ou seja em vez de fazer um sql query com todos os campos logo nao, quero fazer um para o Autor Nome, outro para Autor Apelido mas depois quero remover matchs iguais como é obvio que vao aparecer

não podes fazer isto?

SELECT * FROM ... WHERE AutorNome=... OR AutorApelido=... OR ...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

LOL !! Ai meu Deus..

Brutal, esqueci-me do OR, ando aqui á 1 hora a desenvolver um algoritmo marado e com uma simples linha consigo fazer tudo!

LOL que tanso :P

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá,

Para pesquisas de texto existem os indices fulltext que são suportados pelo mysql, de resto é uma das funcionalidades mais cool do mysql.

Para sistemas de gestão de bases de dados sem suporte para indices fulltext, pode sempre ser criado um addoc.

Um exemplo de uma boa implementação deste tipo de código encontra-se no código fonte do punbb.

Como usar eficientemente a opção Fulltext ? Podes dar exemplos de código (ou com a situação deste Tópico) ?

Cumprimentos,

LuBoc

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas não posso usar o OR se não devolve sempre todos os dados da tabela visto que podem existir campos em branco e um LIKE vai devolver todos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que é que estás a tentar fazer? Pesquisar em todos os campos da tabela?

Não faças isso, usa antes uma dropdown para o utilizador definir o que vai inserir (se é um autor, se é um livro) :D

Assim poupas carga ao mysql e ainda é mais prático para o utilizador do que rever dezenas de resultados :D

Bom trabalho  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá,

Para pesquisas de texto existem os indices fulltext que são suportados pelo mysql, de resto é uma das funcionalidades mais cool do mysql.

Para sistemas de gestão de bases de dados sem suporte para indices fulltext, pode sempre ser criado um addoc.

Um exemplo de uma boa implementação deste tipo de código encontra-se no código fonte do punbb.

Como usar eficientemente a opção Fulltext ? Podes dar exemplos de código (ou com a situação deste Tópico) ?

Cumprimentos,

LuBoc

Isso tem mais que se lhe diga do que duas ou tres linhas de código. Tens k saber em que campos queres pesquisar e criar indices fulltext. Depois a sintace até é bem simples.

Lê este artigo onde está tudo explicadinho.

http://www.phpfreaks.com/tutorials/129/0.php

Não esquecer tambem de ler o manual

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

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