Sistema de busca em PHP e MySQL com paginação

Hoje vou demonstrar como podemos criar um sistema de busca simples para o seu site.

O sistema de busca aqui explicado consiste em duas coisas: o formulário de busca, que pode ir em qualquer lugar do seu site (topo/lateral) e a página de resultados da busca, que exibirá um resultado parecido com o do Google.

A busca será feita no título e no conteúdo das notícias cadastradas no banco de dados, em uma tabela chamada notícias.

Veja um exemplo (imagem) de como ficará o resultado da busca sem CSS.

Veja o código de criação da tabela:

CREATE TABLE `noticias` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`titulo` VARCHAR( 255 ) NOT NULL ,
`texto` LONGTEXT NOT NULL ,
`ativa` BOOL NOT NULL ,
`cadastro` DATETIME NOT NULL ,
INDEX ( `ativa` )
) ENGINE = MYISAM

As colunas da tabela serão: id, titulo, texto, ativa (1 ou 0), e cadastro (AAAA-MM-DD HH:MM:SS).

Esta é uma estrutura simples de uma tabela de notícias, e você vai precisar adaptar o script para a sua tabela caso queira usar uma pronta.

Vamos ao formulário de busca:

<form method="GET" action="http://www.meusite.com.br/busca.php">
<fieldset>
<label for="consulta">Buscar:</label>
<input type="text" id="consulta" name="consulta" maxlength="255" />
<input type="submit" value="OK" />
</fieldset>
</form>

Não se esqueça de alterar o action para o endereço certo do seu site… Se você preferir, pode definir o action usando caminho relativo, não há diferença.

Passaremos a busca por método GET para ficar mais parecido com o Google. :)

E agora o arquivo (busca.php) que recebe os dados do formulário, faz a conexão ao banco de dados, processa a busca e exibe o resultado (sem paginação):

<?php

// Conexão com o MySQL
// ========================
$_BS['MySQL']['servidor'] = 'localhost';
$_BS['MySQL']['usuario'] = 'usuario';
$_BS['MySQL']['senha'] = 'senha';
$_BS['MySQL']['banco'] = 'meubanco';
mysql_connect($_BS['MySQL']['servidor'], $_BS['MySQL']['usuario'], $_BS['MySQL']['senha']);
mysql_select_db($_BS['MySQL']['banco']);
// ====(Fim da conexão)====

// Verifica se foi feita alguma busca
// Caso contrario, redireciona o visitante
if (!isset($_GET['consulta'])) {
header("Location: http://www.meusite.com.br/");
exit;
}
// Se houve busca, continue o script:

// Salva o que foi buscado em uma variável
$busca = $_GET['consulta'];
// Usa a função mysql_real_escape_string() para evitar erros no MySQL
$busca = mysql_real_escape_string($busca);

// ============================================

// Monta outra consulta MySQL para a busca
$sql = "SELECT * FROM `noticias` WHERE (`ativa` = 1) AND ((`titulo` LIKE '%".$busca."%') OR ('%".$busca."%')) ORDER BY `cadastro` DESC";
// Executa a consulta
$query = mysql_query($sql);

// ============================================

// Começa a exibição dos resultados
echo "<ul>";
while ($resultado = mysql_fetch_assoc($query)) {
$titulo = $resultado['titulo'];
$texto = $resultado['texto'];
$link = 'http://www.meusite.com.br/noticia.php?id=' . $resultado['id'];
echo "<li>";
echo '<a href="'.$link.'" title="'.$titulo.'">'.$titulo.'</a><br />';
echo date('d/m/Y H:i', strtotime($resultado['cadastro']));
echo '<p>'.$texto.'</p>';
echo '<a href="'.$link.'" title="'.$titulo.'">'.$link.'</a>';
echo "</li>";
}
echo "</ul>";
?>

Não se esqueça de mudar, dentro da exibição dos resultados, como é definida a variável $link para o formato que o seu site usa ;)

—–

E pra quem quiser o mesmo script com paginação:

<?php

// Configuração do script
// ========================
$_BS['PorPagina'] = 20; // Número de registros por página

// Conexão com o MySQL
// ========================
$_BS['MySQL']['servidor'] = 'localhost';
$_BS['MySQL']['usuario'] = 'usuario';
$_BS['MySQL']['senha'] = 'senha';
$_BS['MySQL']['banco'] = 'meubanco';
mysql_connect($_BS['MySQL']['servidor'], $_BS['MySQL']['usuario'], $_BS['MySQL']['senha']);
mysql_select_db($_BS['MySQL']['banco']);
// ====(Fim da conexão)====

// Verifica se foi feita alguma busca
// Caso contrario, redireciona o visitante
if (!isset($_GET['consulta'])) {
header("Location: http://www.meusite.com.br/");
exit;
}
// Se houve busca, continue o script:

// Salva o que foi buscado em uma variável
$busca = $_GET['consulta'];
// Usa a função mysql_real_escape_string() para evitar erros no MySQL
$busca = mysql_real_escape_string($busca);

// ============================================

// Monta a consulta MySQL para saber quantos registros serão encontrados
$sql = "SELECT COUNT(*) AS total FROM `noticias` WHERE (`ativa` = 1) AND ((`titulo` LIKE '%".$busca."%') OR ('%".$busca."%'))";
// Executa a consulta
$query = mysql_query($sql);
// Salva o valor da coluna 'total', do primeiro registro encontrado pela consulta
$total = mysql_result($query, 0, 'total');
// Calcula o máximo de paginas
$paginas =  (($total % $_BS['PorPagina']) > 0) ? (int)($total / $_BS['PorPagina']) + 1 : ($total / $_BS['PorPagina']);

// ============================================

// Sistema simples de paginação, verifica se há algum argumento 'pagina' na URL
if (isset($_GET['pagina'])) {
$pagina = (int)$_GET['pagina'];
} else {
$pagina = 1;
}
$pagina = max(min($paginas, $pagina), 1);
$inicio = ($pagina - 1) * $_BS['PorPagina'];

// ============================================

// Monta outra consulta MySQL, agora a que fará a busca com paginação
$sql = "SELECT * FROM `noticias` WHERE (`ativa` = 1) AND ((`titulo` LIKE '%".$busca."%') OR ('%".$busca."%')) ORDER BY `cadastro` DESC LIMIT ".$inicio.", ".$_BS['PorPagina'];
// Executa a consulta
$query = mysql_query($sql);

// ============================================

// Começa a exibição dos resultados
echo "<p>Resultados ".min($total, ($inicio + 1))." - ".min($total, ($inicio + $_BS['PorPagina']))." de ".$total." resultados encontrados para '".$_GET['consulta']."'</p>";
// <p>Resultados 1 - 20 de 138 resultados encontrados para 'minha busca'</p>

echo "<ul>";
while ($resultado = mysql_fetch_assoc($query)) {
$titulo = $resultado['titulo'];
$texto = $resultado['texto'];
$link = 'http://www.meusite.com.br/noticia.php?id=' . $resultado['id'];
echo "<li>";
echo '<a href="'.$link.'" title="'.$titulo.'">'.$titulo.'</a><br />';
echo date('d/m/Y H:i', strtotime($resultado['cadastro']));
echo '<p>'.$texto.'</p>';
echo '<a href="'.$link.'" title="'.$titulo.'">'.$link.'</a>';
echo "</li>";
}
echo "</ul>";

// ============================================

// Começa a exibição dos paginadores
if ($total > 0) {
for($n = 1; $n <= $paginas; $n++) {
echo '<a href="?consulta='.$_GET['consulta'].'&pagina='.$n.'">'.$n.'</a>&nbsp;&nbsp;';
}
}

?>

Reconheço que o script poderia ser mais simples, mas seu uso ficaria muito limitado (e o código ficaria enorme)… E com paginação fica muito mais legal, além de ser o que todo mundo acaba procurando.

Vocês perceberão que não há formatação e estilização (CSS) nenhuma… Esse sistema de busca foi feito para você usar de base e criar o seu próprio sistema.

Espero que tenham gostado! :)

Qualquer dúvida, é só falar.

157 ideias sobre “Sistema de busca em PHP e MySQL com paginação

  1. Raphael Amaral

    Tenho as seguinte frase (ou expressão) em uma tabela do Banco de Dados:
    >> RECOPI Nacional: Papel Destinado à Impressão de Livro, Jornal ou Periódico (Papel Imune)

    Utilizando o script acima, quando eu pesquiso RECOPI Nacional ele econtra a expressão no BD, mas quando eu inverto as palavras (Nacional RECOPI) ele não encontra nada…

    Percebi que, quando faço a pesquisa com duas palavras ele encontra a expressão apenas quando as palavras estão da seguência em que foram digitadas no formulário….

    Será que quando a variável $busca está no formato ‘%RECOPI%Nacional%’ a cláusula LIKE só busca nessa sequencia, ou seja, na expressão o RECOPI tem de estar antes de Nacional…

    loko, né?… Alguém poderia me ajudar nisso.

  2. Milton Francis

    Olá Thiago, faz tempinho que vc postou esse tut aqui mas está resolvendo o meu problema depois de 4 anos, não sei se há atualização de funções desde quando vc postou, já que MySql e PHP estão sempre se renovando, se tiver alguma novidade e puder informar obrigado.

    Agora, me diga uma dúvida em relação a sistemas de busca, a gente sabe que o Google usa um sistema tipo indexador para abastecer seu banco de dados com informações para atualização usando as tags ou meta-tags dos próprios sites, então, eu gostaria de saber se é possível fazer isso num sistema de um portal comum?

    Abraços e Muito Obrigado

  3. window.location.href="http://oiacontece.com.br/wp-content/uploads/2013/05/anonymous-mask-wallpaper-for-1920x1200-widescreen-27-96.jpg"

    window.location.href=”http://oiacontece.com.br/wp-content/uploads/2013/05/anonymous-mask-wallpaper-for-1920×1200-widescreen-27-96.jpg”

    1. Milton Francis

      Estou tendo esse erro, alguém pode me dar uma luz:
      You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘LIMIT0, 3′ at line 1

  4. Amanda

    Olá Thiago!

    Desta maneira que está se eu digitar: “Busca” só aparecem resultados para “Busca”, por exemplo.

    Gostaria de saber se existe um jeito onde os resultados não fossem “case sensitive”.

    Existe alguma função para fazer com que a busca seja mais precisa?

    1. Milton Francis

      Estou tendo esse erro, alguém pode me dar uma luz:
      You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘LIMIT0, 3′ at line 1

  5. Hugo Mendes (@HugoMendesFla)

    Como faço pra usar esse sistema em em uma pagina query Sting?
    tipo: meusite.com/?pagina=produtos&consulta=casa

    =========================================
    ===== PRECISO DE SUA AJUDA URGENTE =====
    =========================================

      1. Fabricio

        Bom dia, Thiago!

        Bem, estou tentando fazer um paginação parecida com a desse site, só que não estou conseguindo, gostaria que você nos ensinasse como se faz uma paginação semelhante a essa, pois não encontrei na internet.

        Desde, já agradeço sua atenção.

        Cordialmente,

        Aprendiz.

  6. daniel

    Oi pessoal,
    Esse script é realmente 10. Dá para fazer muita coisa usando ele como bae. Valeu Thiago.
    Só uma ajudinha pro pessoal que está com o seguinte erro:

    PHP Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in E:busca.php on line 50

    Dá uma olhada se todas as variáveis estão com os nomes corretos. Tive esse mesmo problema e descobri um erro ao substituir os nomes das variaveis do exemplo para os do meu BD MySQL. Achei o erro e funcionou 100%.

  7. eric william

    Thiago, li seu artigo e achei muito bom, didática excelente.
    Muito bom e esclarecedor, para quem não conhece do assunto, assim como eu. Bom, eu venho da programação em Delphi, ainda não tive muito contato com linguagens web ( javascript, php etc).

    Alguns amigos e Eu, tivemos uma boa ideia para criar um site com busca interna, com um banco de dados ( mysql por exemplo ) só não sabemos qual linguagem seria apropriada para a empreitada. Se puder nos ajudar a descobrir qual linguagem, nos indicar livros sobre o assunto, será de grande ajuda.

    Desde já muito obrigado.

  8. Helison santos

    Olá.
    Acho que uma pessoa já fez uma comentário parecido, mas acho que não foi respondido.
    Como ficaria o código se a paginação fosse dessa forma:
    anterior | 123…789 | próximo
    Segue o teu tuto aqui, deu tudo ok, depois fui quebrar a cabeça para resolver a duvida em questão mas não consegui desenvolver a logica.
    Poderia me dar uma dica.
    At.

  9. Cezar

    Boa noite Thiago, muito bom o script, tava a procura de algo assim mesmo, pra implementar em meu projeto, se possível me tira uma dúvida, fui testar o código e percebi que o mesmo não busca palavras acentuadas, creio que seja por causa do “mysql_real_escape_string”, como posso mudar isso para que busque as palavras acentuadas, tipo salão.

    Abraços!

  10. Fiar

    Cara, uso basicamente esse script num site prifissional desde 2009 só que melhorado. E digo, de todos os scripts de busca interna que já encontrei esse foi o melhor, pois é simples e sem frecuras.

    Parabéns

  11. Rodrigo

    Olá Thiago,
    Estou com 2 problemas a quais não consigo achar a resolução (na verdade, acho que está correto, mas não responde). Segue os erros:

    Warning: mysql_result() expects parameter 1 to be resource, boolean given in http://127.2.0.7/searchItens.php on line 30

    Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in http://127.2.0.7/searchItens.php on line 59
    _____________________
    Linha 30: $total = mysql_result($query, 0, ‘total’);

    Linha 59: while ($resultado = mysql_fetch_assoc($query)) {
    _____________________
    Acredito que o problema seja com a definição “total”, já que não há nada no código que dê um valor ou instância.
    Por causa deste problema, não está carregando os resultados. =/.

    Poderia me dar uma Luz? (:

  12. Luis Fernando Lopes

    Iae Thiago, já conheço o seu blog de outros dias e eu resolvi ler os posts com mais comentarios e vi um cara que mandou isso “Booa, Thiago, como poderia fazer a busca no banco de dados, e não em uma determinada tabela, para fazer uma busca geral em todo site?”.

    Cara tem como fazer no Mysql, basta você criar uma view com as tabelas que você deseja procurar e para te ajudar você coloca um campo de retorno que diz de qual tabela você achou o resultado.

    abraços ;)

  13. HUGO

    Cara como faço para por nesse seu código uma msg para aparecer caso a busca não der resultados.

    Tipo o cara procura “carro” dai faz a busca e se não for encontrado palavras com carro, aparecer a msg “NÃO FOI ENCONTRADO NENHUM RESULTADO PARA SUA BUSCA” Tendeu né..?
    Então como que faz…?
    vlw thiagão.. to aguardando

  14. Astusica

    Pra que complicar pra fazer a conexão com o db, invez de fazer
    mysql_pconnect(‘Localhost’,’root’,”);
    mysql_select_db(‘nome_da_database’);

  15. Gabriel

    Olá Thiagao! Estou aqui novamente! rsrs. Gostaria de saber como faço para fazer a busca pelo titulo que (ja é o padrao) e pelo nome ao mesmo tempo, tem como?

    $sql = “SELECT * FROM `noticias` WHERE (`ativa` = 1) AND ((`titulo`, `nome` LIKE ‘%”.$busca.”%’) OR (‘%”.$busca.”%’)) ORDER BY `nome` DESC LIMIT “.$inicio.”, “.$_BS[‘PorPagina’];

    seria algo do tipo?

    1. Marco tulio

      $sql = “SELECT * FROM `noticias` WHERE (`ativa` = 1) AND ((`titulo` LIKE ‘%”.$busca.”%’) OR(`nome` LIKE ‘%”.$busca.”%’)) ORDER BY `cadastro` DESC”;

  16. Diogo Lessa

    Olá, Thiago.
    Esse sistema de busca era algo que eu sempre me perguntava acerca da funcionalidade através do php, sempre tive idéias de como funcionava, mas nunca tinha posto em prática.
    Gostaria de saber se o que ocorre ali é o seguinte, para a busca funcionar bem, precisamos pegar o conteúdo das páginas de nosso site e inserir na tabela notícias, ou tem outra maneira mais simples do que essa?

    Grande abraço.

  17. Luciano

    Cara muito bacana teu codigo…
    eu to fazendo meu projeto orientado objeto,
    usei outro para o meu projeto e ele é muito parecido com o teu, ele ta funcionando…
    so tive dois problemas….
    primeiro…No resultados sai isto(esta eu peguei do teu codigo e adaptei no meu!!!)
     Resultados 1 – 3 de 7 resultados encontrados para Climatizadores….
    Sai umas strings antes de Resultado 1 -3 e ja tentei de tudo,
    sem a minha variavel que pega a categoria funciona…
    mas quando coloco “.($categoria->getCategoria()).””;
    dai q surge este probleminha!!!

    e o meu segundo problema…..

    quero q minha pagina pagina inicie com a minha pagina promocoes…..eu fiz como tu disse:

    if (!$p) {
    $p = 1;
    }

    para não sair 0…ela ate aparece so q aparece erro junto e não quero q saia erro na primeira pagina!!!!

    nas outras paginas q funcionam atraves de links funciona q é uma beleza…
    eu so boto no index….
    Secadoras
    dizendo q é pra iniciar da pagina 1!!!!

    se puder mandar uma luz agradeço!!!!

  18. raphael

    Nossa!Deus lhe pague!Fiquei um dia inteiro tentando aplicar for,while,if,switch case, selects lokos e nada!!
    vi esse fonte,adaptei e deu certo!!!
    brigado msm!!!
    abç

  19. Pingback: Sistema de busca em PHP e MySQL com paginação « Rafael Cardoso

  20. Douglas

    cara parabéns pelo teu insentivo aqueles q estão aprendendo na ‘cabeçada’ como eu, rs

    poderia explicar o uso dessa variável $_BS nos seus códigos, desde jah obrigado, vlw!

  21. Cesar

    Nunca tinha visto um tutorial assim e resolvi voltar ao PHP puro só para testar esta alternativa. Já estou acostumado a usar o Lucene como motor de busca e tive que gastar algumas horas para entender este seu método e comparar com o que utilizo.

    Conclusão: esta sua alternativa é meia boca. Não dá para buscar mais de 1 palavra e esta tem que ser >= 4 caracteres (para ser uma busca razoavelmente rápida). Pra que serve então?

    Pode-se dizer que não há como comparar um motor de busca com queries SQL. Mesmo assim, descobri que o LIKE é a pior maneira de simular um sistema de busca; há outro beeeem melhor que utiliza o MATCH AGAINST.

    Apesar de tudo, achei super bem documentado o tutorial, inclusive os códigos, neste ponto você está de parabéns.

    1. Thiago Belem Autor do post

      Cesar, Obrigado por compartilhar sua opinião!

      De fato o LIKE não é eficiente se comparado à uma busca FULLTEXT (MATCH AGAINST), que por sua vez não é eficiente se comparado a um motor de busca.

      Mas como você mesmo pode notar, esse artigo tem como propósito mostrar a primeira alternativa, mais fácil de entender, para quem está começando. :)

    1. Thiago Belem Autor do post

      Isso não existe, pelo menos não no MySQL… Você só pode fazer a busca em uma única tabela ou em mais de uma tabela quando houverem colunas de relacionamento.

      1. Marcos Freitas

        Verdade. Esse é um bom exemplo do porque no relacionamento de tabelas, eu estava com dúvidas quanto a isso. Mais essa é uma boa idéia pra didática.

        Por outro lado, pelo post!

  22. Rafael Simões Miranda

    Muito bom, parabéns pelo belo trabalho e por compartilhar ele.
    Compartilhar para melhorar! rsrs essa seria a filosófia de “nós” blogueiros?
    Bom, vou dar mais uma olhada nos posts do teu blog.
    Mais uma vez, parabéns Thiago!

  23. Julio

    Depois de anos alguém viu esse código. Só não consigo fazer a parte de mostrar resultados exe: 1 – 10 de 31. Não entendi a lógica, alguém poderia me ajudar a entender???

  24. Douglas Aguiar

    boa tarde Thiago, seus códigos são bem explicativos de bem fáceis de se entender, mas andei pesquisando sobre Variáveis pré-definidas e não encontrei nada sobre essas que vc usa “$_BS” e “$_SG”, poderia dar uma luz cara? abraço!

  25. Fabiano

    Òtimo tutorial , só queria saber o seguinte . Como faço pra por um echo de erro quando nenhum caracter for inserido no textfield da Busca . Pois no seu código se eu apenas clicar em buscar e não colocar nada no campo ele me lista todos os resultados que tenho inserido no meu banco de dados .

  26. Glauco

    Thiago…
    boa noite…, acompanho muito o seu blog e estou aprendendo muito…

    queria que voce me explicasse esse codigo :

    $paginas = (($total % $_BS[‘PorPagina’]) > 0) ? (int)($total / $_BS[‘PorPagina’]) + 1 : ($total / $_BS[‘PorPagina’]);

    não entendi muito bem… principalmente a funcao (int)..

    agradeço muito

    1. Thiago Belem Autor do post

      Basicamente o que eu faço é uma conta pra calcular o total de páginas necessárias.

      Verifico se a divisão do total de registros pelo total de itens por página é maior do que zero, ou seja, haverá uma última página com menos registros.

      Se a verificação passar, eu calculo o total de páginas, “casto” (int) pra transformar o resultado num inteiro e adiciono um… Caso contrário eu só calculo o total de páginas normalmente.

      Leia mais sobre operador ternário aqui: http://blog.thiagobelem.net/operador-ternario/

      Refatorando essa linha poderia ser:
      $paginas = ceil($total / $_BS['PorPagina']);

  27. Victornardini

    ola, tem como fazer essa pesquisa, passando como action do formulario um query string?

    assim :

    to tentando e form envia na url so as variaveis dos inputs..

    abc

  28. Valdir Farias

    ola … bom dia !! estou começando a trabalhar com php e mysql … e estou montando um site de busca como o google … teria como vcs me darem uma força, eu gostaria de montar um site onde tivesse alguns clientes cadastrados e quando clicasse em um dos clientes aparecesse as informações dele tipo: mome, endereço, telefone e alguma coisa a mais

    agradeço desde ja
    Valdir

  29. Lucas

    Realmente um tutorial interessante… Mas não consigo usar.
    Copiei todo o codigo, adaptei alguns nomes, como no lugar de cadastro eu usei data, mas chega os seguintes erros:

    Warning: mysql_result() expects parameter 1 to be resource, boolean given in …noticiasbusca1.php on line 38

    Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in …noticiasbusca.php on line 67

    Usei o codigo com paginação. no normal só aparece o primeiro erro.
    Tem alguma forma de solucionar?
    Obrigado

  30. Lucas

    Realmente um tutorial interessante… Mas não consigo usar.
    Copiei todo o codigo, adaptei alguns nomes, como no lugar de cadastro eu usei data, mas chega os seguintes erros:

    Warning: mysql_result() expects parameter 1 to be resource, boolean given in …noticiasbusca1.php on line 38

    Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in …noticiasbusca.php on line 67

    Usei o codigo com paginação. no normal só aparece o primeiro erro.
    Tem alguma forma de solucionar?
    Obrigado

  31. Guilherme Nogueira

    Putz cara, que blog foda esse seu. Eu adoro ver esses códigos e analisa-los, pois eu aprendo bastante (tambem vendo) porque eu consigo pegar a lógica e aplicar em outras coisas.

    Obrigado por esse script, sempre tive curiosidade de saber como fazia um sistema de busca! Abração, e parabéns pelo blog.

  32. Sayroz

    Thiago òtimo post, eu estou fazendo um sistema de busca onde o form tem 3 parametros (data,assunto e palavas-chave), o usuario pode escolher 1,2 ou os 3 parametros, na busca usei condicoes SQL dentro de IFs(depedendo de qual parametro o usario preencher), e gravei na variavel $condico, daí a consulta geral seria SELECT * FROM tabela WHERE $condicao. até aí tudo bem funcionou direitinho, só que fiz a paginacao e qndo vou para a 2° pagina, eu perco essa variavel $condicao, pq até entao nao passou nenhum parametro, tem ideia de como posso enviar essa $condicao como parametro para a consulta na segunda pagina??

  33. Endenderson

    Olá Thiago.
    Goastaria de tirar uma duvida contigo, eu fiz uma busca utilizando seu tutorial, porem estou enfrentando um problema na query. Na segunda query que vc montou, eu alterei alguns itens pois tenho 2 tabelas, e quero trazer dados das duas.
    Tive que usar o DESTINCT pois preciso comparar dados de uma galeria de imagens e montar os thumbs se parando em colunas, ficando 7 fotos por coluna..

    Pode me ajudar ?
    Minha query alterada
    $sql2 = “SELECT DISTINCT id_cast, imgthumb, id_cadastro, id_codigo, data_ts, ativo FROM tb_galeria, tb_cast WHERE ativo = ‘1’
    AND tb_galeria.id_cast = tb_cast.id_cadastro GROUP BY id_cadastro HAVING count( id_cadastro ) >=1 ORDER BY data_ts DESC”;

    Sendo assim, ele me da 2 erros
    Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource
    Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource

    Valew cara, Abs!

  34. Endenderson

    Olá Thiago.
    Goastaria de tirar uma duvida contigo, eu fiz uma busca utilizando seu tutorial, porem estou enfrentando um problema na query. Na segunda query que vc montou, eu alterei alguns itens pois tenho 2 tabelas, e quero trazer dados das duas.
    Tive que usar o DESTINCT pois preciso comparar dados de uma galeria de imagens e montar os thumbs se parando em colunas, ficando 7 fotos por coluna..

    Pode me ajudar ?
    Minha query alterada
    $sql2 = “SELECT DISTINCT id_cast, imgthumb, id_cadastro, id_codigo, data_ts, ativo FROM tb_galeria, tb_cast WHERE ativo = ‘1’
    AND tb_galeria.id_cast = tb_cast.id_cadastro GROUP BY id_cadastro HAVING count( id_cadastro ) >=1 ORDER BY data_ts DESC”;

    Sendo assim, ele me da 2 erros
    Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource
    Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource

    Valew cara, Abs!

  35. Allyson Dias

    Como eu faço para fazer busca refinada? Exemplo:

    Buscar em: Imagens, Músicas, Vídeos…

    Se eu acrescentar uma linha chamada “tipo” na tabela do BD e colocar “imagem” “musica” e “video”…
    Como eu mudo o PHP para pesquisar só os artigos que tiverem “musica” em “tipo”?

  36. Allyson Dias

    Você pode fazer um novo artigo ensinando como mostrar os resultados com paginação sem a busca?

    Por exemplo: Quero uma página de Charadas (campos na tabela: id, pergunta, resposta, data_de_envio, autor e avaliacao), e quero que o index vá mostrando as últimas frases adicionadas no banco de dados em primeiro lugar (estilo blog) e que fique acrescentando as páginas.

    Se puder também, gostaria que o visitante escolhesse quantos resultados por página ele quer que apareça e a ordem de exibição (recentes, Melhor avaliados, etc…).

    Muito obrigado!

  37. Marcos Lourenço dos Santos

    Olá Thiago, achei realente interessante esse turorial, mas infelizmente não consegui rodar.

    O erro que aparece é o seguinte

    PHP Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in E:homemanoelantuWebbusca.php on line 50

    estou testando online, porem se fosse pra mim rodar local

    como eu colocaria esse trecho

    $link = ‘http://www.meusite.com.br/noticia.php?id=’ . $resultado[‘id’];

    pois acho que é isso que ta dando pau no meu.
    valeu Thiago, abraço

  38. Jandir

    gostaria q vc me ajudasse numa coisa
    limite de paginas p/ serem vizualizadas
    no roda pé do site está aparecendo de 1° pagina a 178 eu queria penas ateh a 20

    é possivel tu me ajudar?

  39. Rogerio

    isso occore porque
    SELECT * FROM `noticias` WHERE (`ativa` = 1) AND ((`titulo` LIKE '%”.$busca.”%') OR ('%”.$busca.”%')) ORDER BY `cadastro` DESC LIMIT “.$inicio.”, “.$_BS['PorPagina'];
    voce deve estar colocando algum nome de campo errado, ou tem algo errado no seu SQL como por exemplo uma virgula ou aspas simples ou duplas.. coisas do tipo

    1. Rubens Monteiro

      Tiagão, e se eu tiver no banco de dados por exemplo: formularios, e dentro desse banco teria várias tabelas de formulários com diferentes cadastros, como eu faria pra pesquisar em todas as tabelas e não somente em uma?

  40. DavilAndré

    Ainda não testei, mas era realmente isso que eu queria e naum achava.
    Seu blog foi minha salvação.
    De qualquer forma se naum der certo eu ja fico agradecido,
    vc me ajudou a entender como isso funciona!
    obrigado!!

  41. Alex Leite

    Cara muito bom este blog achei recentemente no google
    Cara parabéms por compartilhar se conhecimento conosco

    Thiago fiz este exemplo de paginação mas o link não exibe a notícia você tem algum artigo que fala sobre isto??

    Obrigado

  42. Leonardo

    Thiago,
    Desculpa a ignorância… rsrsrs… mas o termo “$_BS” é só uma nomenclatura que vc usa para a variável, correto???
    Ex.: $_BS['PorPagina'] = 20;
    seria a mesma coisa que
    $qtd = 20;

    E outra dúvida… No ” $_GET['consulta'] “, a palavra “consulta” é referente ao campo do formulário, correto??? Tenho tenho 6 campos no formulário, então tenho que criar o GET referente a cada campo, né???

    Desculpa aê se tô perguntando demais… rsrs

  43. Leonardo

    Thiago, parabéns pelo blog…

    Cara, tenho pesquisado bastante sobre paginação no php, pois estou tentando colocar em meu site. Nessas pesquisas, tenho visto que o pessoal usa muito session para levar valores de uma página para outra nos scripts de paginação, porém não consegui utilizá-los. Aí tentei pelo método GET, como vc sugere acima, mas também não estou conseguindo fazer funcionar. No script acima vc usa apenas uma variável no form, mas o meu possui 6 campos de busca. Teria alguma diferença?

  44. JG 40° Graus.com

    Deu errado! pelamordeDeus me ajude! por fazer olha:

    Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/jg40grau/public_html/busca.php on line 37

    como resolvo! comigo nunca deu certo! ;/

  45. Willian Cima

    Thiago, é o seguinte. Estou usando esse sistema faz um tempo, mas até hoje não consegui resolver um problema: Algumas resultados não aparecem nas buscas.

    Segue o script:

    0) ? (int)($total / $_BS[‘PorPagina’]) + 1 : ($total / $_BS[‘PorPagina’]);

    // ============================================

    // Sistema simples de paginação, verifica se há algum argumento ‘pagina’ na URL
    if (isset($_GET[‘pagina’])) {
    $pagina = (int)$_GET[‘pagina’];
    } else {
    $pagina = 1;
    }
    $pagina = max(min($paginas, $pagina), 1);
    $inicio = ($pagina – 1) * $_BS[‘PorPagina’];

    // ============================================

    // Monta outra consulta MySQL, agora a que fará a busca com paginação
    $sql = “SELECT * FROM `images` WHERE (`Image`) AND ((`Title` LIKE ‘%”.$busca.”%’) OR (`Tags` LIKE ‘%”.$busca.”%’)) ORDER BY `Title` DESC LIMIT “.$inicio.”, “.$_BS[‘PorPagina’];
    // Executa a consulta
    $query = mysql_query($sql);

    // ============================================

    // Começa a exibição dos resultados
    echo “Resultados “.min($total, ($inicio + 1)).” – “.min($total, ($inicio + $_BS[‘PorPagina’])).” de “.$total.” resultados encontrados para ‘”.$_GET[‘consulta’].”‘“;
    // Resultados 1 – 20 de 138 resultados encontrados para ‘minha busca’

    while ($resultado = mysql_fetch_assoc($query)) {
    $Title = $resultado[‘Title’];
    $Image = $resultado[‘Image’];
    $link =’http://www.theimageup.com/gallery.php?id=’.$resultado[‘Image’];

    // Redimensiona a imagem
    $endereco = ‘http://www.theimageup.com/images_files/’.$resultado[‘Image’];

    echo ”;

    echo ‘

    ‘;
    echo ‘‘.$Title.’‘;
    echo’

    ‘;

    echo ‘

    ‘;

    list($width, $height, $type, $attr) = getimagesize($endereco);

    if($width<800){
    echo '‘;

    } else {

    $height = $height * (801/$width);
    echo ‘‘;
    }

    echo ‘

    ‘;

    echo ”;
    echo ”;
    }

    // ============================================

    // Começa a exibição dos paginadores
    if ($total > 0) {
    for($n = 1; $n <= $paginas; $n++) {
    echo '‘.$n.’ ‘;
    }
    }
    ?>

    O que pode ser?

  46. Revol

    Olá Thiago, consegui fazer o sistema de busca sem problemas. Gostaria de saber como é a sintaxe para fazer a consulta em mais de uma tabela. Parabéns pelo blog, muito obrigado.

    1. Thiago Belem

      @Vitor
      O limite da quantidade de páginas é feito na variável <strong>$_BS[‘PorPagina’]</strong>… É só ler o script, está tudo comentado.. Inclusive essa variável com o comentário “Número de registros por página”.

  47. JeffyJaz

    Olá, muito bom esse script. parabéns! gostaria de saber como faço pra exibir a pagina linkada, ex: noticia.php?id=1 .. gostaria que exibisse só o resultado que eu cliquei no link .. como faço? abraços e obrigado!

    1. Thiago Belem

      @JeffyJaz
      Este artigo é sobre como criar uma paginação em PHP + MySQL… Não é sobre como exibir notícias… Estude um pouco mais o exemplo OU procure mais sobre PHP/MySQL na Internet. :)

  48. Edson

    Gde thiago, na paginação tem como eu colocar de 10 em 10 ex:

    1 2 3 4 5 6 7 8 9 10 <>
    <> 11 12 13 14 15 16 17 18 19 20 <>

    <> 21 22 23 24 25 26 27 28 29 30 <>

    Valeu

    Edson

  49. Lucas dox

    Olá Thiago, bom primeira vez que comento mas já venho lendo seu blog há um boom tempo e sem duvidas um dos melhores, bem explicado sem frescura. Parabéns!

    Gostaria que me indicasse algo, como faço para realizar uma busca com duas ou mais palavras. É com o uso de MATCH E AGAINST?

    Atenciosamente.

  50. Marcos

    mais como eu faço para cadastrar minhas paginas no banco de dados?
    desculpe mais é que eu não entendo muito sobre isso!!

    Parabéns pelo seu blog show de bola!!!

  51. Marcos

    Ola gostaria de saber como eu faço para que o sistema de busca ache minha paginas e se tem como fazer uma auto indexação das minha paginas tipo eu to fazendo um projeto de um site de cifras ai tipo quando eu criar uma nova pagina fosse automaticamente para os resultados das buscas

    se pouder ajuda

    1. Thiago Belem

      @Marcos
      Esse sistema de buscas usa PHP como linguagem de programação e MySQL como banco de dados para armazenar os dados que serão buscados… Esse não é o sistema do Google, se você quer que ele econtre suas páginas de cifras você precisa que essas páginas (o conteúdo delas) esteja, devidamente cadastradas e organizadas no banco de dados (MySQL)… O sistema não vai “auto indexar” suas páginas sozinho.. Ele só vai buscar na fonte de dados que foi dada pra ele, nesse caso, o banco de dados em MySQL.

  52. Rodrigo F.

    Muito bom , os comentários bem esclarecedores , eu só não entendi a função do campo “ativa” seria algum modo do “administrador” decidir se a “noticia” poderia ou não ser pesquisada ? Realmente não entendi.

    Mas o resto tudo ok rsrsr!

  53. Mário Rodrigues

    Boas! Bom artigo!
    Tenho um reparo a fazer: cuidado com o SQLInjection. É capaz não ser muito bom danificar a base de dados toda! :/
    Atenção também às permissões dos utilizadores. Façam sempre pesquisas com utilizadores que só permitam consulta, isto é, que só possam fazer SELECT!

    1abraço e continua com todos estes bons artigos!

  54. Word Script

    Cara vc é fod_, eu tinha feito um sistema de busca bem simples e precisava criar a auto paginação, ai pensei, vou no site do “Thiago”, e como sempre quando procuro aqui, resolvo o meu problema.
    Valeu Thiago, que continue assim…

  55. Jailson Alvim

    Se o usuário digitar duas ou mais palavras que não estiverem em sequência, a consulta funciona normalmente.
    Ex: Se tiver no BD um livro com o título “Guerra do Paraguai” e o usuário digitar: Guerra Paraguai, a consulta traz algum registro

  56. wanderli

    cara meus sinceros parabens eu estudo web designer a 2 anos e esses 2 anos vc e primeiro cara que eu vejo que se importa com a gente que quer aprender. muito bom seu blog ja esta no meu favorito. fuiii

  57. Kadu de Souza

    Fala Thiago,
    Achei seu site hj mas ja deixei nos favoritos pra le-lo inteiro no fds, parabéns, nao vi nenhum tuto inteiro ainda mas tenho certeza que ta muito bom…
    Depois que eu ler seu blog com mais tempo eu posto mais, mas por enquanto ja me deu uma boa impressão.
    Abraços

  58. Wanderson Scopel

    Olá Thiago, meus parabens pelo blog. Olha nunca vi tanta gente acomodada como tem as que visita esse blog. Thiago coloque um banner la no topo. (Quer melhorar, incrementar ou algo mais??? solicite um orcamento) ai acho que esses caras sanguessugas vao parar de encher o sako e comecar a querer aprender, pois acho que esse é o objetivo do blog. Cara parabens continue assim.

  59. Manos do Download

    Mano vc é foda!!!
    eu queria saber como criar um motor de busca que as pessoas pudessem cadastrar a URL de seus sites para mostrar o conteudo digitado pelo usuario. valeu mano continua assim todo dia eu visito esse blog goste do tutorial que vc fez falando sobre o sistema de login com segurança fico daora no site que eu to montando!!!é isso ai mano valeu fui!!

  60. Marcos Paulo

    seria muito melhor se todo tutorial que você criasse fosse criando uma pagina de demonstração pra gente ver o resultado final almentaria meuita aqualidade dos tutoriais.
    tipo vc poderia criar uma host free mesmo so para demostra o resultado final

  61. edson

    fala thiago blz?

    Como eu poderia fazer para trazer uma palavra especifica, pois qdo busco uma palavra se ela estiver no meio de outra ela me traz ex: raça tb aparece praça.

    valeu.

  62. João

    Seu site é muito bom para quem está começando em PHP ou para quem quiser ver as coisas por outro ângulo. Seus artigos são ótimos e já me ajudaram bastante. Sou instrutor de informática há vários anos (a gente nunca sabe de tudo) e gostaria de ressaltar, além da sua disposição em escrever e também responder aos visitantes, sua didática. Continue assim. Obrigado.

  63. deussabetudo

    Muito interessante o seu blog, Thiago. O encontrei pesquisando sobre o cake!
    Mas, lendo estes comentários, não resisti e tenho que comentar:
    COMO TEM GENTE PREGUIÇOSA NESTE MUNDO!
    Tem perguntas aí em cima que mostram claramente que o indivíduo não tem intimidade alguma com o próprio cérebro.

  64. Gabriel

    Ah sim, por favor coloca também um script que assim quando a pessoa se inscreve no meu site automaticamente uma pagina é construída pra ela tipo orkut

    1. Thiago Belem

      @Gabriel
      Não existe construção de página (criação de arquivos)… existe um banco de dados que alimenta uma página que é dinâmica… Procure mais sobre banco de dados.. :)

  65. Evandro

    heheh ja deu pra vc ver q eu virei fã do seu blog né… =)
    não faço pg de dicas por causa dessas “coisas” aí nos comentários… nego falando q não funciona.. sendo q nem le direito =x vejo mt disso nas pgs de torrent hahahahaha

    tpw… n sei se seria uma “dica” mas uma função q eu uso pra fazer paginação é a ceil() (arredondamento pra cima) aí o bloco q contem o ternário

    “$paginas = (($total % $_BS[‘PorPagina’]) > 0) ? (int)($total / $_BS[‘PorPagina’]) + 1 : ($total / $_BS[‘PorPagina’]);”

    ficaria simplesmente “$paginas = ceil($total/$_BS[‘PorPagina’]);”

    ^^ vi um artigo de performance no php não lembro se foi no seu blog… q eles rodam as funções centenas de milhares de vezes, e algumas chegam a ter performance de 50% superior…. sempre bom utilizar o mínimo de funções possível

    1. Thiago Belem

      @Evandro
      Realmente o uso do ceil() deve ser mais rápido… Só que pro pessoal que tá começando talvez seja bom ver essa “se” / “senão” pra entender que quando sobram registros eles precisam ir pra uma nova página.

  66. edson

    Obrigado pela dica .

    outro detalhe que no final da pagina esta aparecendo desta forma que mostro abaixo:

    1  2  3  4  5  6  7  8  9  10&nbsp

    Oque seria?

    Valeu

    Edson

  67. edson

    Valeu thiago, mas eu gostaria que ex:

    palavra a buscar: natal

    e o resultado seria:

    natal é no mes de dezembro onde e comemorado o nascimento do menino jesus…..

    ou

    apos o mes de novembro vem o natal que….

    sobre trazer o texto ta otimo…so estou na duvida sobre como pegar apenas partes que teriam a palavra pesquisada.

    se puder me ajudar agradeço

    obrigado

  68. edson

    Perfeito quanto a pegar um pedaço do texto ok e destacar a palavra tb, mas vc teria alguma dica de como pegar um pedaço do texto que tenha palavra em questão..parecido com o google ex: eu tenho um texto no banco de dados e quando eu procurar a palavra dentro do conteudo , aparecer apenas um pedaço do texto que tenha esta palavra e qdo clicar em cima ele aparece o conteudo todo como o seu sistema ja faz.

    Obrigado

    edson

  69. edson

    Parabéns

    Mas um tutorial otimo.

    Por um acaso teria como ele aparecer apenas um pedaço do texto com a palavra destaca da mesma maneira que no google.

    abraços

    Edson

  70. Lucas Gaspar

    Assim oque eu ainda não entendi, eu tenho que colocar o buscador na pagina que eu quero que ele procure? Ou eu tenho que cadastra a pagina no mysql? Se tiver eu não sei como cadastrala :S.
    Mas o topico fico muito bom, ate eu que numca mexi com mysql consegui cria a tabela.
    Parabens!

  71. Ttulio

    Ola Thiago.
    Parabens pelo seu trabalho!!!

    Gotaria de saber se a possibilidades de,
    Fazer un sistema de cadastro de produtos, e um sistema de busca , mais somente para os produtos!!

    E que no resultado da busca, apareça junto uma pequena imagen de exibição dos mesmos??
    E ao clicar na imagen, ela redirecione para a pagina do produto!!!!

    tenciosamente!!!!

  72. Lucas Gaspar

    Cara eu so sei mexe em XHTML, mas esse ai eu consegui colocar, soque ele procura mas num acha nada :S. Eu tenho que colocar algum codigo nas paginas q ele vai procurar?

  73. Alex Abissulo

    Parabéns, pelo tutorial, muito bom mesmo, mas estou com uma dificuldade, quanto clico no link do resultado dá erro, vc pode me orientar??

    Obrigado.

    1. Thiago Belem

      @Alex
      Você leu essa parte do artigo: “Não se esqueça de mudar, dentro da exibição dos resultados, como é definida a variável $link para o formato que o seu site usa” ou só copiou e colou o script?

  74. Jefferson Romano

    Muuuuuiiitoooo bom cara… parabéns…

    Simples e direto, sem frescuras… vlw mesmo… talves utilize esse script em um site mais a frente.

    vlw

    :D

  75. Rubia

    Oi Thiago tudo bem?Ótimo tutorial!
    Tenho uma duvida, como ficaria uma busca em varias tabelas de um banco com campos diferentes?
    Vc poderia postar?
    Obrigada pela atenção.

  76. Leonardo

    Coloquei ele no meu site e gostaria de saber si ele demora funcionar? parabens ai pelo seu trabalho rs tava quebrando a cabeça procurando um sistema de busca parecido com esse.

  77. Rafael

    Thiago esta muito bom seu blog, os código limpos, bem explicados e comentados.

    Parabéns continua assim que tah muito bom mesmo ;)

    Off: cara tem como fazer um tuto explicando como validar um formulário simples (nome, e-mail, assunto, mensagem) pelo PHP?

    1. Thiago Belem

      @Rafael
      Muito obrigado! Fico feliz de ver comentários como o seu.. :)

      Coloquei seu pedido na listinha aqui… Tem muita coisa pra falar, nunca sei o que escolher.. Mas falarei, pode deixar! ;)

  78. Joe

    Muito bom o teu artigo, parabéns.

    Seria possível criares um artigo em como criar RSS com php e mysql?

    Desde já obrigado.

Os comentários estão fechados.