Ir para o conteúdo
nuno_couto

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

Mensagens Recomendadas

nuno_couto    0
nuno_couto

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrotuga    31
pedrotuga

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrotuga    31
pedrotuga

@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()

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Gurzi    2
Gurzi

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    312
Rui Carlos

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Gurzi    2
Gurzi

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
LuBoc    1
LuBoc

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
AriOps    0
AriOps

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrotuga    31
pedrotuga

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

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade