Hoje vamos continuar a nossa pequena seqüencia de tutoriais ensinando o básico do trabalho com PHP e MySQL.

Na parte anterior, ensinei a fazer uma consulta simples no MySQL, a consulta utilizada buscava as últimas 10 notícias da tabela de notícias e exibia-as seqüencialmente, da mais recente para a mais antiga.

Hoje vamos fazer uma consulta semelhante, mas iremos fazer o relacionamento entre as duas tabelas (noticias e categorias) para buscar apenas as notícias de uma categoria.

Começaremos o arquivo consulta-avancada.php da mesma forma que iniciamos o anterior, com um bloco de comentários que explica o arquivo e inclui o arquivo que cria a instância do MySQLi que será usada nesse novo arquivo.

<?php
/**
 * PHP e MySQL para iniciantes
 *
 * Arquivo com um exemplo de consulta avançada ao banco de dados MySQL
 *
 * PHP 5+, MySQL 4.1+
 *
 * @author Thiago Belem <contato@thiagobelem.net>
 * @link http://blog.thiagobelem.net/mysql/php-e-mysql-para-iniciantes-consulta-simples/
 */

// Inclui o arquivo que faz a conexão ao banco de dados
require_once('includes/mysqli.php');

?>

Agora iremos definir uma variável contendo o nome da categoria que iremos usar para filtrar as notícias… O conteúdo dessa variável está “hard coded” no arquivo, mas poderia ser dinâmico e vir da uma variável $_GET, por exemplo.

// Iremos buscar apenas as notícias da categoria "Esportes"
$categoria = "Esportes"; // Essa variável poderia ter vindo, por exemplo, do $_GET

Feito isso, montaremos a consulta que será executada no banco de dados:

// Monta a consulta SQL para trazer as últimas 10 notícias ativas e que pertençam à categoria específica
$sql = "SELECT
			Noticia.id, Noticia.titulo, Noticia.descricao,
			Categoria.nome AS categoria
		FROM `noticias` AS Noticia
			INNER JOIN `categorias` AS Categoria
				ON Categoria.`id` = Noticia.`categoria_id`
		WHERE
			Noticia.`ativa` = 1
			AND
			Categoria.`nome` = '{$categoria}'
		ORDER BY Noticia.`cadastro` DESC
		LIMIT 10";

O interessante dessa consulta é que ela busca os registros da tabela noticia que possuam um relacionamento com os registros da tabela categorias e, o registro correspondente na tabela categorias deve possuir o valor da variável $categoria no campo nome.

Para quem não entendeu a explicação acima, vale a pena a leitura do meu artigo Relacionamento de Tabelas no MySQL.

Continuando o script, rodamos a consulta e exibimos o resultado:

// Prepara a consulta OU mostra uma mensagem de erro
$resultado = $MySQLi->query($sql) OR trigger_error($MySQLi->error, E_USER_ERROR);

// Faz um loop, passando por todos os resultados encontrados
while ($noticia = $resultado->fetch_object()) {
	// Exibe a notícia dentro de um bloco HTML
	?>

	<h2><?php echo $noticia->categoria; ?> - <?php echo $noticia->titulo; ?></h2>
	<p><?php echo $noticia->descricao; ?></p>
	<p><a href="noticia.php?id=<?php echo $noticia->id; ?>" title="Continue lendo essa notícia">Leia mais &raquo;</a></p>

	<?php
} // while ($noticia = $resultado->fetch_object())

E, para finalizar, exibimos o total de resultados encontrados e limpamos a consulta da memória do PHP:

// Exibe o total de registros encontrados
echo "<p>Registros encontrados: {$resultado->num_rows}</p>";

// Libera o resultado para liberar memória
$resultado->free();

E vocês acabaram de ver um exemplo de consulta complexa usando MySQLi! :)

Faça o download dos arquivos desse tutorial aqui: PHP-e-MySQL-Consulta-Avançada.zip

Abraços e até a próxima!


Quer copiar esse post no seu site? Você pode!

Segundo a licença da Creative Commons você pode copiar e distribuir esse conteúdo desde que faça menção ao autor original, para isso é só copiar esse código no final do artigo quando for publicá-lo em seu site:

<p>Artigo originalmente publicado em <em>25 de julho de 2010</em> por <strong><a href="http://thiagobelem.net/" title="Thiago Belem, Desenvolvedor PHP">Thiago Belem</a></strong>: <a href="http://blog.thiagobelem.net/php-e-mysql-para-iniciantes-consulta-avancada/" title="PHP e MySQL para iniciantes – Consulta Avançada">PHP e MySQL para iniciantes – Consulta Avançada</a></p>

A não menção ao autor original da obra implicará em cópia e/ou distribuição ilegal de propriedade intelectual, o que é crime segundo a Lei n.º 9.610.