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> ';
}
}
?>
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:
- Entendendo a paginação de registros no MySQL
- Criando um sistema de login com PHP e MySQL
- Como criar um Sistema de Login com Níveis de Permissão
- Busca no MySQL usando palavra-chave
- Resultados de busca do Google no seu site
Postado em MySQL, PHP, Tutoriais
Com as tags Banco de Dados, Busca, Código, Conexão, Configuração, CSS, Erros, Formulário, Google, Header, HTML, Max, MySQL, Paginação, PHP, Resultados, Script, Scripts, Search, Senha, SEO, Servidor, Sistema, SQL, Submit, URL
Escrito por Thiago Belem
Gostou desse artigo?
Não se esqueça de assinar o RSS e divulgue-o para o mundo:

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
@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..
Pow kra,eu coloco uma coisa pra buscar mais aparece
Resultados e talz
mais nao aparece o que encontrou,sabe o q eh?
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
@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.
Obrigado mais uma vez…funcionou.
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 
Oque seria?
Valeu
Edson
@Edson
Havia um erro nos scripts do artigo.. Veja agora, por favor…
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
@edson
Use um pouco de lógica e essas duas funções:
http://br2.php.net/manual/en/function.strpos.php
http://br2.php.net/manual/en/function.substr.php
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
@Edson
Use a função substr() para pegar o pedaço de um texto.
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
@Edson
Aí você precisa fazer uma função que corte um texto pegando apenas X caracteres e dê um highlight na palavra em questão…
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!
@Lucas Gaspar
Isso é tutorial de busca em PHP E MySQL… Isso significa que sim, você precisa ter as “páginas” no MySQL.
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!!!!
@Ttulio
Tudo é possível.. É só uma questão de lógica e planejamento.
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?
@Lucas Gaspar
Verifica se você tá usando o script direitinho… Outras pessoas já conseguiram usar o script do artigo sem problemas.
cara, bem legal o site e super bacana e sem falar do conteudo e bem explicado.
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.
@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?
Muuuuuiiitoooo bom cara… parabéns…
Simples e direto, sem frescuras… vlw mesmo… talves utilize esse script em um site mais a frente.
vlw
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.
hehehe e que nao entendo muito sobre banco de dados.
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.
@Leonard
Como assim, demora pra funcionar? Ele é baseado no seu banco de dados, é instantâneo
Vlw Thiago, vou aguardar
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?
@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!
Muito bom o teu artigo, parabéns.
Seria possível criares um artigo em como criar RSS com php e mysql?
Desde já obrigado.
@Joe
Será feito amanhã.