Publicidade (Anuncie Aqui)

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

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.

Você também vai gostar de ler:

Postado em MySQL, PHP, Tutoriais

Com as tags , , , , , , , , , , , , , , , , , , , , , , , , ,

Escrito por Thiago Belem

Gostou desse artigo?

Não se esqueça de assinar o RSS e divulgue-o para o mundo:

58 Comentários ou trackbacks

  1. Gabriel disse:

    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

    • Thiago Belem disse:

      @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.. :)

  2. Jackson disse:

    Pow kra,eu coloco uma coisa pra buscar mais aparece

    Resultados e talz

    mais nao aparece o que encontrou,sabe o q eh?

  3. Evandro disse:

    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

    • Thiago Belem disse:

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

  4. edson disse:

    Obrigado mais uma vez…funcionou.

  5. edson disse:

    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

  6. edson disse:

    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

  7. edson disse:

    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

  8. edson disse:

    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

  9. Lucas Gaspar disse:

    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!

  10. Ttulio disse:

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

  11. Lucas Gaspar disse:

    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?

  12. davyd disse:

    cara, bem legal o site e super bacana e sem falar do conteudo e bem explicado.

  13. Alex Abissulo disse:

    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.

    • Thiago Belem disse:

      @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?

  14. Muuuuuiiitoooo bom cara… parabéns…

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

    vlw

    :D

  15. Rubia disse:

    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.

  16. Leonardo disse:

    hehehe e que nao entendo muito sobre banco de dados. :)

  17. Leonardo disse:

    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.

  18. Rafael disse:

    Vlw Thiago, vou aguardar ;)

  19. Rafael disse:

    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?

    • Thiago Belem disse:

      @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! ;)

  20. Joe disse:

    Muito bom o teu artigo, parabéns.

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

    Desde já obrigado.

Deixe um comentário

XHTML: Você pode usar essas tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Atenção: O seu comentário precisará ser aprovado antes de ser publicado

Trackbacks e Pings