Você está na página 1de 6

Sistema de busca em PHP e MySQL com paginao

152 Replies

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 formulrio de busca, que pode ir em qualquer lugar do seu site (topo/lateral) e a pgina de resultados da busca, que exibir um resultado parecido com o do Google. A busca ser feita no ttulo e no contedo das notcias cadastradas no banco de dados, em uma tabela chamada notcias. Veja um exemplo (imagem) de como ficar o resultado da busca sem CSS. Veja o cdigo de criao da tabela:
1 CREATE 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 , 7 INDEX ( `ativa` ) 8 ) ENGINE = MYISAM

As colunas da tabela sero: id, titulo, texto, ativa (1 ou 0), e cadastro (AAAA-MM-DD HH:MM:SS). Esta uma estrutura simples de uma tabela de notcias, e voc vai precisar adaptar o script para a sua tabela caso queira usar uma pronta. Vamos ao formulrio 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>

No se esquea de alterar o action para o endereo certo do seu site Se voc preferir, pode definir o action usando caminho relativo, no h diferena. Passaremos a busca por mtodo GET para ficar mais parecido com o Google.

E agora o arquivo (busca.php) que recebe os dados do formulrio, faz a conexo ao banco de dados, processa a busca e exibe o resultado (sem paginao):
01 <?php 02 03 // Conexo com o MySQL 04 // ======================== 05 $_BS['MySQL']['servidor'] = 'localhost'; 06 $_BS['MySQL']['usuario'] = 'usuario'; 07 $_BS['MySQL']['senha'] = 'senha'; 08 $_BS['MySQL']['banco'] = 'meubanco'; 0 mysql_connect($_BS['MySQL']['servidor'], $_BS['MySQL']['usuario'],$_ 9 BS['MySQL']['senha']); 1 mysql_select_db($_BS['MySQL']['banco']); 0 11 // ====(Fim da conexo)==== 12 13 // Verifica se foi feita alguma busca 14 // Caso contrario, redireciona o visitante 15 if (!isset($_GET['consulta'])) { 16 header("Location: http://www.meusite.com.br/ "); 17 exit; 18 } 19 // Se houve busca, continue o script: 20 21 // Salva o que foi buscado em uma varivel 22 $busca = $_GET['consulta']; 23 // Usa a funo 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 // Comea a exibio dos resultados 36 echo "<ul>"; 37 while ($resultado = mysql_fetch_assoc($query)) { 38 $titulo = $resultado['titulo'];

39 $texto = $resultado['texto']; 4 $link = 'http://www.meusite.com.br/noticia.php?id= ' .$resultado['i 0 d']; 41 echo "<li>"; 42 echo '<a href="'.$link.'" title="'.$titulo.'">'.$titulo.'</a><br />'; 43 echo date('d/m/Y H:i', strtotime($resultado['cadastro'])); 44 echo '<p>'.$texto.'</p>'; 45 echo '<a href="'.$link.'" title="'.$titulo.'">'.$link.'</a>'; 46 echo "</li>"; 47 } 48 echo "</ul>"; 49 ?>

No se esquea de mudar, dentro da exibio dos resultados, como definida a varivel $link para o formato que o seu site usa E pra quem quiser o mesmo script com paginao:
01 <?php 02 03 // Configurao do script 04 // ======================== 05 $_BS['PorPagina'] = 20; // Nmero de registros por pgina 06 07 // Conexo com o MySQL 08 // ======================== 09 $_BS['MySQL']['servidor'] = 'localhost'; 10 $_BS['MySQL']['usuario'] = 'usuario'; 11 $_BS['MySQL']['senha'] = 'senha'; 12 $_BS['MySQL']['banco'] = 'meubanco'; 1 mysql_connect($_BS['MySQL']['servidor'], $_BS['MySQL']['usuario'],$_ 3 BS['MySQL']['senha']); 1 mysql_select_db($_BS['MySQL']['banco']); 4 15 // ====(Fim da conexo)==== 16 17 // Verifica se foi feita alguma busca 18 // Caso contrario, redireciona o visitante 19 if (!isset($_GET['consulta'])) { 20 header("Location: http://www.meusite.com.br/ "); 21 exit; 22 }

23 // Se houve busca, continue o script: 24 25 // Salva o que foi buscado em uma varivel 26 $busca = $_GET['consulta']; 27 // Usa a funo 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 sero 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); // Salva o valor da coluna 'total', do primeiro registro encontrado 36 pela consulta 37 $total = mysql_result($query, 0, 'total'); 38 // Calcula o mximo de paginas 39 40 41 // ============================================ 42 43 // Sistema simples de paginao, verifica se h algum argumento 'pagina' na URL $paginas = (($total % $_BS['PorPagina']) > 0) ? (int)($total /$_BS['PorPagina']) + 1 : ($total / $_BS['PorPagina']);

44 if (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 paginao

$sql = "SELECT * FROM `noticias` WHERE (`ativa` = 1) AND ((`titulo` 55 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 // Comea a exibio dos resultados echo "<p>Resultados ".min($total, ($inicio + 1))." - ".min($total, 62 ($inicio + $_BS['PorPagina']))." de ".$total." resultados encontrados para '".$_GET['consulta']."'</p>"; 63 64 65 echo "<ul>"; 66 while ($resultado = mysql_fetch_assoc($query)) { 67 $titulo = $resultado['titulo']; 68 $texto = $resultado['texto']; 6 $link = 'http://www.meusite.com.br/noticia.php?id= ' .$resultado['i 9 d']; 70 echo "<li>"; 71 echo '<a href="'.$link.'" title="'.$titulo.'">'.$titulo.'</a><br />'; 72 echo date('d/m/Y H:i', strtotime($resultado['cadastro'])); 73 echo '<p>'.$texto.'</p>'; 74 echo '<a href="'.$link.'" title="'.$titulo.'">'.$link.'</a>'; 75 echo "</li>"; 76 } 77 echo "</ul>"; 78 79 // ============================================ 80 81 // Comea a exibio dos paginadores 82 if ($total > 0) { 83 for($n = 1; $n <= $paginas; $n++) { 8 echo '<a 4 href="?consulta='.$_GET['consulta'].'&pagina='.$n.'">'.$n.'</a>&nbsp ;&nbsp;'; 85 } 86 } 87 88 ?> // <p>Resultados 1 - 20 de 138 resultados encontrados para 'minha busca'</p>

Reconheo que o script poderia ser mais simples, mas seu uso ficaria muito limitado (e o cdigo ficaria enorme) E com paginao fica muito mais legal, alm de ser o que todo mundo acaba procurando.

Vocs percebero que no h formatao e estilizao (CSS) nenhuma Esse sistema de busca foi feito para voc usar de base e criar o seu prprio sistema. Espero que tenham gostado! Qualquer dvida, s falar.

http://blog.thiagobelem.net/sistema-de-busca-em-php-e-mysql/