quinta-feira, 18 de agosto de 2011

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:
1CREATE TABLE `noticias` (
2`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
3`titulo` VARCHAR( 255 ) NOT NULL ,
4`texto` LONGTEXT NOT NULL ,
5`ativa` BOOL NOT NULL ,
6`cadastro` DATETIME NOT NULL ,
7INDEX ( `ativa` )
8) 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:
1<form method="GET" action="http://www.meusite.com.br/busca.php">
2<fieldset>
3<label for="consulta">Buscar:</label>
4<input type="text" id="consulta" name="consulta" maxlength="255" />
5<input type="submit" value="OK" />
6</fieldset>
7</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):
01<?php
02 
03// Conexão com o MySQL
04// ========================
05$_BS['MySQL']['servidor'] = 'localhost';
06$_BS['MySQL']['usuario'] = 'usuario';
07$_BS['MySQL']['senha'] = 'senha';
08$_BS['MySQL']['banco'] = 'meubanco';
09mysql_connect($_BS['MySQL']['servidor'], $_BS['MySQL']['usuario'], $_BS['MySQL']['senha']);
10mysql_select_db($_BS['MySQL']['banco']);
11// ====(Fim da conexão)====
12 
13// Verifica se foi feita alguma busca
14// Caso contrario, redireciona o visitante
15if (!isset($_GET['consulta'])) {
16header("Location: http://www.meusite.com.br/");
17exit;
18}
19// Se houve busca, continue o script:
20 
21// Salva o que foi buscado em uma variável
22$busca = $_GET['consulta'];
23// Usa a função mysql_real_escape_string() para evitar erros no MySQL
24$busca = mysql_real_escape_string($busca);
25 
26// ============================================
27 
28// Monta outra consulta MySQL para a busca
29$sql = "SELECT * FROM `noticias` WHERE (`ativa` = 1) AND ((`titulo` LIKE '%".$busca."%') OR ('%".$busca."%')) ORDER BY `cadastro` DESC";
30// Executa a consulta
31$query = mysql_query($sql);
32 
33// ============================================
34 
35// Começa a exibição dos resultados
36echo "<ul>";
37while ($resultado = mysql_fetch_assoc($query)) {
38$titulo = $resultado['titulo'];
39$texto = $resultado['texto'];
40$link = 'http://www.meusite.com.br/noticia.php?id=' . $resultado['id'];
41echo "<li>";
42echo '<a href="'.$link.'" title="'.$titulo.'">'.$titulo.'</a><br />';
43echo date('d/m/Y H:i', strtotime($resultado['cadastro']));
44echo '<p>'.$texto.'</p>';
45echo '<a href="'.$link.'" title="'.$titulo.'">'.$link.'</a>';
46echo "</li>";
47}
48echo "</ul>";
49?>
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:
01<?php
02 
03// Configuração do script
04// ========================
05$_BS['PorPagina'] = 20; // Número de registros por página
06 
07// Conexão com o MySQL
08// ========================
09$_BS['MySQL']['servidor'] = 'localhost';
10$_BS['MySQL']['usuario'] = 'usuario';
11$_BS['MySQL']['senha'] = 'senha';
12$_BS['MySQL']['banco'] = 'meubanco';
13mysql_connect($_BS['MySQL']['servidor'], $_BS['MySQL']['usuario'], $_BS['MySQL']['senha']);
14mysql_select_db($_BS['MySQL']['banco']);
15// ====(Fim da conexão)====
16 
17// Verifica se foi feita alguma busca
18// Caso contrario, redireciona o visitante
19if (!isset($_GET['consulta'])) {
20header("Location: http://www.meusite.com.br/");
21exit;
22}
23// Se houve busca, continue o script:
24 
25// Salva o que foi buscado em uma variável
26$busca = $_GET['consulta'];
27// Usa a função mysql_real_escape_string() para evitar erros no MySQL
28$busca = mysql_real_escape_string($busca);
29 
30// ============================================
31 
32// Monta a consulta MySQL para saber quantos registros serão encontrados
33$sql = "SELECT COUNT(*) AS total FROM `noticias` WHERE (`ativa` = 1) AND ((`titulo` LIKE '%".$busca."%') OR ('%".$busca."%'))";
34// Executa a consulta
35$query = mysql_query($sql);
36// Salva o valor da coluna 'total', do primeiro registro encontrado pela consulta
37$total = mysql_result($query, 0, 'total');
38// Calcula o máximo de paginas
39$paginas =  (($total % $_BS['PorPagina']) > 0) ? (int)($total / $_BS['PorPagina']) + 1 : ($total / $_BS['PorPagina']);
40 
41// ============================================
42 
43// Sistema simples de paginação, verifica se há algum argumento 'pagina' na URL
44if (isset($_GET['pagina'])) {
45$pagina = (int)$_GET['pagina'];
46} else {
47$pagina = 1;
48}
49$pagina = max(min($paginas, $pagina), 1);
50$inicio = ($pagina - 1) * $_BS['PorPagina'];
51 
52// ============================================
53 
54// Monta outra consulta MySQL, agora a que fará a busca com paginação
55$sql = "SELECT * FROM `noticias` WHERE (`ativa` = 1) AND ((`titulo` LIKE '%".$busca."%') OR ('%".$busca."%')) ORDER BY `cadastro` DESC LIMIT ".$inicio.", ".$_BS['PorPagina'];
56// Executa a consulta
57$query = mysql_query($sql);
58 
59// ============================================
60 
61// Começa a exibição dos resultados
62echo "<p>Resultados ".min($total, ($inicio + 1))." - ".min($total, ($inicio + $_BS['PorPagina']))." de ".$total." resultados encontrados para '".$_GET['consulta']."'</p>";
63// <p>Resultados 1 - 20 de 138 resultados encontrados para 'minha busca'</p>
64 
65echo "<ul>";
66while ($resultado = mysql_fetch_assoc($query)) {
67$titulo = $resultado['titulo'];
68$texto = $resultado['texto'];
69$link = 'http://www.meusite.com.br/noticia.php?id=' . $resultado['id'];
70echo "<li>";
71echo '<a href="'.$link.'" title="'.$titulo.'">'.$titulo.'</a><br />';
72echo date('d/m/Y H:i', strtotime($resultado['cadastro']));
73echo '<p>'.$texto.'</p>';
74echo '<a href="'.$link.'" title="'.$titulo.'">'.$link.'</a>';
75echo "</li>";
76}
77echo "</ul>";
78 
79// ============================================
80 
81// Começa a exibição dos paginadores
82if ($total > 0) {
83for($n = 1; $n <= $paginas; $n++) {
84echo '<a href="?consulta='.$_GET['consulta'].'&pagina='.$n.'">'.$n.'</a>&nbsp;&nbsp;';
85}
86}
87 
88?>
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.

Artigo originalmente publicado em 12 de maio de 2009 por Thiago Belem: Sistema de busca em PHP e MySQL com paginação

Nenhum comentário:

Postar um comentário

Related Posts Plugin for WordPress, Blogger...