ULTIMATE PHP Blog

Conheça 15 Ferramentas Essenciais Para PHP
15 Ferramentas Essenciais Para PHP

Coloque seu e-mail abaixo e baixe agora um PDF 100% gratuito mostrando 15 ferramentas indispensáveis para PHP

Fique tranquilo. Odeio spam tanto quanto você :)

Sistema de Busca com PHP e MySQL usando PDO

Sistema de Busca com PHP e MySQL usando PDO

Um Sistema de Busca é muito utilizado em diversos tipos de aplicação.

Mesmo que o foco do projeto não seja busca de conteúdos, geralmente fazermos algum tipo de filtro para encontrar alguma informação no banco de dados.

Por isso é importante saber desenvolver um Sistema de Busca.

Neste artigo vou mostrar como desenvolver um sistema assim, permitindo busca por palavras e também filtrando por múltiplos valores, criando um sistema de busca avançada.

Usarei o MySQL e, para fazer o PHP interagir com ele, usarei a Biblioteca PDO.

Criando o Banco de Dados do Sistema de Busca

Para começar, vamos criar as tabelas do banco e populá-las com informações.

Optei por fazer uma pequena loja virtual, com duas tabelas: categorias e produtos.

As informações dos produtos eu peguei de um site de compras.

CREATE TABLE IF NOT EXISTS categories(
	id INT UNSIGNED NOT NULL AUTO_INCREMENT,
	name VARCHAR(32) NOT NULL,
	PRIMARY KEY (id)
) COLLATE=utf8_unicode_ci;

CREATE TABLE IF NOT EXISTS products(
	id INT UNSIGNED NOT NULL AUTO_INCREMENT,
	name VARCHAR(255) NOT NULL,
	description TEXT NOT NULL,
	price DECIMAL(10,2) NOT NULL,
	category_id INT UNSIGNED NOT NULL,
	PRIMARY KEY (id)
) COLLATE=utf8_unicode_ci;

INSERT INTO categories(id, name) VALUES
(1, 'Computadores'),
(2, 'Filmes e Séries'),
(3, 'Livros'),
(4, 'Música');

INSERT INTO products(name, description, price, category_id) VALUES
('Computador All in One HP 23-r101br Intel Core i5 6GB 1TB LED 23" Windows 10', 'Mantenha o entretenimento e a produtividade na palma de suas mãos com o All-in-One HP 23-r101br, que é elegante e economiza espaço. Possui potência e desempenho para um excelente entretenimento, experiência com jogos e multitarefas. Sistema operacional Windows 10. Além disso, você conta com Processador Intel Core i5 que é encarregado de suprir as necessidades de quem realiza tarefas mais pesadas. Um processador na medida para você que não pode perder tempo e precisa de um equipamento rápido e veloz. E design Exclusivo, leve e compacto. Aproveite todas as funções que só a HP pode te oferecer:

- Memória 6GB
- HD: 1TB
- Drives: Gravador de DVD Ultra Slim SuperMulti com carregamento por bandeja.
- Som: DTS Studio Sound
- Memória de vídeo: Gráficos Intel® HD 4600
- Conexões: Conjunto de fone de ouvido/microfone, saída HDMI E/S lateral: 2 USB 3.0 e Traseira: 3 USB 2.0', 3369.00, 1),

('All In One Positivo Union Pctv Ud3553 Com Celeron 4gb 500gb Led 18 Polegadas Windows 10', 'A Nova Linha Positivo Union Traz Design E Acabamentos Impressionantes No Conceito De Desktop Que Integra As Tecnologias Mais Modernas A Uma Tela Led De Alta Definição. Com Dimensões Reduzidas, A Economia De Espaço Proporcionada Pelopositivo Union Torna-O Ideal Para Qualquer Ambiente Da Casa. Possui Placa Wireless (Wi-Fi) Para Acessar A Internet Sem Fio, Webcam, Microfone E Alto Falantes Integrados Para Comunicação E Entretenimento.Seu Positivo Possui Diversos Aplicativos Que Foram Desenvolvidos Para Melhorar Sua Experiência E Conectividade.', 1999.00, 1),

('Coleção Friends - As Dez Temporadas Completas (40 DVDs)', 'Ross (David Schwimmer), Rachel (Jennifer Aniston), Mônica (Courtney Cox), Chandler (Matthew Perry), Joey (Matt LeBlanc) e Phoebe (Lisa Kudrow) formam um grupo de seis amigos que lutam para se sobressair e progredir na competitiva cidade de New York. Seu humor inteligente e apoio mútuo incondicional fazem com que sua amizade seja cada vez mais forte, superando assim todos os obstáculos que a vida lhes apresenta.

Trabalho, família, responsabilidade, dinheiro, sexo, compromisso e, sobretudo amor e amizade, são alguns dos temas que preocupam e às vezes divertem esses personagens. Não foi a toa que o sofá do Central Perk, o café onde se reúnem para conversar, foi trocado duas vezes por excesso de uso, mesmo que eles só o usem para sentar.

Milhares de aventuras e reveses são compartilhados por estes simpáticos jovens, em uma série que é vista em todo o mundo por tantos adeptos, ou melhor por tantos "viciados", que não admitem a idéia de perder um só episódio desta famosa comédia. Esta série foi filmada por dez temporadas conquistando com um sucesso após o outro.

Não há um só canto no mundo onde não se conheça este fenômeno da televisão que prende a atenção de homens e mulheres de todas as idades. Sua trilha sonora promocional, "I\'ll Be There for You" (Rembrandts), é tão famosa quanto o programa. É que sua mensagem e o refrão da musica definem perfeitamente o significado da existência desta série.

Alguns convidados famosos da série são: George Clooney, Helen Hunt, Brooke Shields, Jean Claude Van-Damme, Tom Selleck, Julia Roberts, Charlie Sheen, Ben Stiller, Robin Williams, Charlton Heston, Bruce Willis, Susan Sarandon, Brad Pitt, Sean Penn, Alec Baldwin e Christina Applegate, entre outros.
Os Amigos mais conhecidos do mundo. Você não poderia estar em melhor companhia! As 10 temporadas completas pra você!
', 259.00, 2),

('DVD - Coleção Supernatural: Temporadas Completas 1-10', 'Libere as forças místicas do universo!
Com as Temporadas Completas de 1 a 10 do magnético seriado Supernatural. Para os irmãos Sam (Jared Padalecki) e Dean (Jensen Ackles) Winchester, o sacrifício derradeiro se torna o poder definitivo. Com seus limites humanos e sobrenaturais testados, eles caçam implacavelmente anjos caídos, fantasmas, vampiros e demônios em uma odisseia para exterminar o mal em todas suas formas e superar a trágica história que assombra sua família... E seus destinos!', 349.00, 2),

('Kit Livros - Coleção O Guia do Mochileiro das Galáxias - Edição Econômica (5 Volumes)', 'No final da década de 1970, quando os primeiros capítulos de O Guia do Mochileiro das Galáxias foram enviados para a rádio BBC em Londres, ninguém imaginava que seria um sucesso estrondoso em pouco tempo. A combinação bem sucedida de ficção e comédia harmonizou perfeitamente. Na sequencia, Douglas Adams escreveu a lendária série de cinco livros que vendeu mais de quinze milhões de cópias pelo mundo. Mestre da sátira, Adams cria personagens inesquecíveis e situações mirabolantes para debochar da burocracia, dos políticos, da alta cultura e de diversas instituições atuais. Seus livros, que tratam em última instância da busca do sentido da vida, não só divertem como também fazem pensar.', 19.90, 3),

('Livro - As Crônicas de Nárnia (Volume Único)', 'Narnia - onde um dragão desperta, onde as estrelas andam na terra e onde tudo pode acontecer!

50 anos após a primeira aparição das Crônicas de Nárnia, as fabulosas histórias do país do Leão Aslan também fazem parte da biblioteca dos adultos.

Os 7 livros reunidos neste volume único tornaram-se parte do cânone da literatura clássica, atraindo leitores de todas as idades em terras mágicas com personagens inesquecíveis há mais de 60 anos. Batalhas épicas entre o bem e o mal, criaturas fantásticas, traições, feitos heroicos e amizades (ganhas e perdidas) todos reunidos neste mundo inesquecível.

Além de um grande best-seller, a série As Crônicas de Nárnia também tornou-se grande sucesso do cinema!', 19.90, 3),

('CD Dream Theater - Dream Theater 2013', 'Após uma dramática virada na história da banda, o Dream Theater retorna com 12º álbum de estúdio para provar aos devotos do Rock progressivo que o tempo não enferrujou estes ícones da música. 

Quase 30 anos de carreira, mais de 10 milhões de álbuns vendidos, diversas apresentações antológicas e constantes alterações no elenco da banda são traduzidas no álbum homônimo Dream Theater. 

Riffs eletrizantes de John Petrucci, linhas agressivas do baixo de John Myung, os marcantes vocais de James LeBrie, prolíficos teclados de Jordan Rudess e a enérgica bateria do jovem Mike Mangini compõem a mais recente formação do grupo, formando um time de músicos notoriamente talentosos. 

Dream Theater segue o sucesso de A Dramatic Turn of Events, primeiro trabalho do grupo a conquistar uma indicação ao Grammy. Segundo o próprio John Petrucci, a nova obra conta com a introdução épica de False Awakening Suite para trazer ao ouvinte a atmosfera cinematográfica do novo álbum. Progride para a narrativa libertadora de Enigma Machine e evolui para a conclusão multi dimensional de Illumination Theory. 

Entra ano, sai ano e o som do Dream Theater não envelhece. Pelo contrário, ele evolui e os fãs poderão ver este show de performances, tanto individuais quanto coletivas, colocarem o Dream Theater em mais um novo capítulo de sua história.', 55.00, 4),

('Toquinho - Que Maravilha Box4 (1966-1974)', 'No Ano Em Que Toquinho Celebra Seus 70 Anos De Idade E 40 Anos De Carreira, Estes Marcados Pelo Primeiro Lp Solo, Discobertas Reúne Os Discos Solo Que O Cantor E Compositor Lançou Em Seus Primeiros 10 Anos De Trabalhos Solo. Paralelamente À Rica Discografia Em Dupla Com Vinicius De Moraes, Naquela Fase Toquinho Deu Início A Uma Sólida Carreira Solo - À Qual Achamos Justo Acrescentar O Raro Projeto Especial Botequim, Singular Parceria Com Gianfrancesco Guarnieri E Com Participação Da Cantora Marlene.', 87.00, 4);

Formulário de Busca

Vamos começar com nosso formulário do nosso sistema de busca.

Será um simples arquivo HTML, com apenas um formulário, que possui um campo de texto chamado search.

<!doctype html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Sistema de Busca - ULTIMATE PHP</title>
	</head>

	<body>
		

<h1>Sistema de Busca - ULTIMATE PHP</h1>



<form action="search.php">
			<label for="search">Busca: </label>
			<input type="text" name="search" id="search" placeholder="Busca...">

			


			<input type="submit" value="Buscar">
		</form>


	</body>
</html>

Página de Resultados

O script search.php vai receber o texto digitado e pesquisá-lo no MySQL.

Usaremos Prepared Statements para filtrar o texto informado pelo usuário, protegendo a aplicação contra SQL Injection.

Se você não conhece ou não sabe trabalhar com PDO, sugiro que leia este meu artigo.

<?php // credenciais de acesso ao MySQL define('MYSQL_HOST', 'localhost'); define('MYSQL_USER', 'root' ); define('MYSQL_PASSWORD', '' ); define('MYSQL_DB_NAME', 'nome_do_banco'); // palavra digitada na busca $search = isset($_GET['search']) ? $_GET['search'] : ''; $sql = "SELECT c.name AS category, p.name, p.description, p.price FROM products AS p INNER JOIN categories c ON c.id = p.category_id WHERE p.name LIKE :search OR p.description LIKE :search"; // abre a conexão e define codificação UTF-8 $PDO = new PDO('mysql:host=' . MYSQL_HOST . ';dbname=' . MYSQL_DB_NAME, MYSQL_USER, MYSQL_PASSWORD); $PDO->exec("set names utf8");

// cria o Prepared Statement e o executa
$stmt = $PDO->prepare($sql);
$stmt->bindValue(':search', '%' . $search . '%');
$stmt->execute();

// cria um array com os resultados
$products = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<!doctype html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Resultado da Busca - ULTIMATE PHP</title>
	</head>

	<body>
		

<h1>Resultados da busca</h1>


		<?php if (count($products) > 0): ?>
		
		<?php foreach ($products as $product): ?>
			

<div>

<h2><?php echo $product['name'] ?></h2>



Preço: R$ <?php echo number_format($product['price'], 2, ',', '.') ?>



<?php echo $product['description'] ?>

			</div>

			

		<?php endforeach; ?>

		<?php else: ?>



Nenhum resultado encontrado


		<?php endif; ?>

	</body>
</html>

Veja que a consulta utiliza o LIKE na cláusula WHERE. Isso faz com que a palavra digitada seja procurada em qualquer parte do texto. Para mais detalhes, veja este link.

Com isso, o sistema de busca simples já está funcionando. É possível pesquisar pelas palavras, que o resultado é listado pelo nosso script de busca.

Assim, nosso Sistema de Busca jé está funcional!

Mas podemos melhorá-lo, claro!

Sistema de Busca Avançada

Para o nosso sistema de busca avançada, vamos criar filtros dinâmicos. Ou seja, haverá mais de um filtro para a busca e todos serão opcionais.

Isso significa que o script de resultados deverá avaliar cada valor e, se não for vazio, adicioná-lo à consulta.

Formulário de Busca Avançada

Como o sistema é bem simples, a busca não será tão avançada assim. Teremos apenas dois filtros: a palavra, como já existia antes, e um campo para definir a categoria.

Mas a lógica é extensível para inúmeros filtros, pois usaremos um loop para criar a consulta.

<!doctype html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Sistema de Busca - ULTIMATE PHP</title>
	</head>

	<body>
		

<h1>Sistema de Busca - ULTIMATE PHP</h1>



<form action="search.php">
			<label for="search">Busca: </label>
			<input type="text" name="search" id="search" placeholder="Busca...">
			
			

			
			<label for="category">Categoria: </label>
			<select name="category" id="category">
<option value="">TODAS</option>
<option value="1">Computadores</option>
<option value="2">Filmes e Séries</option>
<option value="3">Livros</option>
<option value="4">Música</option>
			</select>

			


			<input type="submit" value="Buscar">
		</form>


	</body>
</html>

Script de Busca Avançada

<?php define('MYSQL_HOST', 'localhost'); define('MYSQL_USER', 'root' ); define('MYSQL_PASSWORD', '' ); define('MYSQL_DB_NAME', 'tutorials'); // filtros da busca $search = isset($_GET['search']) ? $_GET['search'] : ''; $category = isset($_GET['category']) ? $_GET['category'] : ''; // inicia a query, mas os filtros serão adicionados dinamicamente // o 1=1 é adicionado no WHERE para garantir que sempre haverá uma condição na busca, // evitando erro de sintaxe caso o usuário não selecione filtro algum $sql = "SELECT c.name AS category, p.name, p.description, p.price FROM products AS p INNER JOIN categories c ON c.id = p.category_id WHERE 1=1"; // cria um array com os filtros a serem aplicados $filters = []; if (!empty($search)) { $filters[] = [ 'placeholder' => ':search',
		'sql' => '(p.name LIKE :search OR p.description LIKE :search)',
		'value' => '%' . $search . '%',
		'param_type' => PDO::PARAM_STR,
	];
}

if (!empty($category))
{
	$filters[] = [
		'placeholder' => ':category',
		'sql' => 'p.category_id = :category',
		'value' => $category,
		'param_type' => PDO::PARAM_INT,
	];
}

foreach ($filters as $filter)
{
	$sql .= " AND " . $filter['sql'];
}

// abre a conexão e define codificação UTF-8
$PDO = new PDO('mysql:host=' . MYSQL_HOST . ';dbname=' . MYSQL_DB_NAME, MYSQL_USER, MYSQL_PASSWORD);
$PDO->exec("set names utf8");

// cria o Prepared Statement
$stmt = $PDO->prepare($sql);

// faz o bind dos valores dos filtros
foreach ($filters as $filter)
{
	$stmt->bindValue($filter['placeholder'], $filter['value'], $filter['param_type']);
}

// executa a query
$stmt->execute();

// cria um array com os resultados
$products = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<!doctype html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Resultado da Busca - ULTIMATE PHP</title>
	</head>

	<body>
		

<h1>Resultados da busca</h1>


		<?php if (count($products) > 0): ?>
		
		<?php foreach ($products as $product): ?>
			

<div>

<h2><?php echo $product['name'] ?></h2>



Preço: R$ <?php echo number_format($product['price'], 2, ',', '.') ?>



<?php echo $product['description'] ?>

			</div>

			

		<?php endforeach; ?>

		<?php else: ?>



Nenhum resultado encontrado


		<?php endif; ?>

	</body>
</html>

A parte mais “complicada” (na verdade, é simples, mas pode parecer difícil logo de cara) é o array de filtros.

O array é composto por sub-arrays, cada um com informações sobre os filtros, como o placeholder usado no Prepared Statements, o trecho da SQL a ser adicionado, o valor digitado e o tipo do valor.

Depois esse loop é percorrido para completar a consulta com os filtros digitados.

Dessa forma, é possível fazer a busca sem filtros, com um ou com os dois filtros.

E se você quiser adicionar mais filtros, basta seguir a mesma lógica.

Conclusão

Um Sistema de Busca pode parecer difícil para muitos iniciantes, mas a lógica é extremamente simples.

Mesmo um sistema de busca avançada pode ser implementado facilmente, de forma genérica.

Aprenda Ainda Mais Sobre PHP E Os Fundamentos da Linguagem

Se você é iniciante em PHP ou já conhece o básico, mas deseja se aprofundar mais, aprendendo todos os principais fundamentos da linguagem, conheça o meu Curso ULTIMATE PHP 2.0.

O curso ensina PHP desde o básico e é focado nos conceitos e nos fundamentos da linguagem. Dessa forma, você obterá conhecimentos sólidos para aprender técnicas mais avançadas e outros padrões de projeto.

Além disso, o curso está totalmente atualizado para a nova versão do PHP, o PHP 7!

Clique Aqui E Conheça o Curso ULTIMATE PHP 2.0!

Aprenda Ainda Mais

15 Dicas, Boas Práticas e Fundamentos do PHP

Conheça Dicas FUNDAMENTAIS para programar em PHP de forma Profissional

Não se considere Programador PHP sem antes ler este guia e adotar estas práticas!

Baixe gratuitamente este guia com 15 Dicas de PHP

Sobre Roberto Beraldo
Desenvolvedor Web desde 2007, com foco em PHP. Criador do Curso ULTIMATE PHP e autor do Blog do Beraldo (rberaldo.com.br), onde compartilha dicas sobre PHP e Programação em geral.
  • Evaldo Snieto

    boa noite, cara estou tentando coloca o resultar em paginação. pode me dar uma ajuda? Vlw

    • Sim, ajudo. Qual é a sua dúvida?

      • Reginaldo Ferreira

        Roberto Beraldo… eu tambem estou tentando usar essa sua programação… funcionou mas meu site esta em lisPaginas, quer dizer meu link seria.. index.php?mod=Busca.php… mas como usar switch… o sistema não abre pq ai chamaria apenas exemplo a palavra Busca no action e ele direcionaria atraves para o link mas ai fica assim… index.php?search=cabelo… tem como me ajudar? Obrigado ai pelos códigos heim

        • Olá, Reginaldo. Não sei se entendi bem sua dúvida. Você quer que a query string “mod=Busca.php” seja enviada junto com o formulário de busca? Se for isso, crie, além do input search, um input hidden com name “mod” e value “Busca.php”. Dessa forma, tanto a variável “search” quanto a “mod” serão inseridas na URL

          • Reginaldo Ferreira

            Roberto, como usa lisPaginas… e switch… no action fica assim apenas… pq switch é quem passa pra página correta exemplo busca.php.
            e no navegador aparece apenas o dominio do seite e a palavra ex: http://www.meusominio.com.br/Busca... mas quando faço desta forma é que não abre e fica errado. No meu formulário antigo ia porque usava o seguinte:

            Pesquisar!

            e na pagina que buscava o resultado ficava assim:

            Mas agora com pdo e php 7 não funciona

          • Por que não funciona no PHP 7? Dá algum erro?
            Eu não entendi que switch é esse, mas deve haver um jeito de você passar mais query strings, sim. Se não conseguir, use método post em vez de get. Deve resolver seu problema

          • Reginaldo Ferreira

            switch($_GET[‘mod’]){

            default:
            include “detHome.php”;
            break;
            case ‘Home’:
            include “detHome.php”;
            break;
            case ‘Busca’:
            include “busca.php”;
            break;

          • Reginaldo Ferreira

            esse ai é o switch…

          • Esse switch não redireciona a nenhum lugar, só inclui scripts. Então qualquer query string que esteja na URL será interpretada, sim

  • Layana Meirelles

    Olá Roberto, muito bom seu script, porém estou com dificuldade em entender o que está dentro da variavel $sql pois é nela que tenho a dificuldade de apresentar os termos de busca por favor me de uma luz, obrigado.

  • wesleywillians

    Nossa, POO não existe mais não né 😉

    • O objetivo aqui é mostrar a lógica. Ela pode ser implementada em um cenário Orientado a Objetos ou imperativista. Depende apenas do conhecimento de quem vai implementar o sistema

      • wesleywillians

        Nos dias de hoje dar um exemplo desse tipo.
        Bom anyway….
        OO manda abraços, ainda mais no dia de hoje 😉