Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Cícero Martins

[Resolvido] listando categorias e registros

Recommended Posts

Saudações pessoal do Imasters,

 

Mal cheguei no fórum e já vou ser tão abusado a ponto de já solicitar a ajuda de vocês.

 

Estou criando um sistema onde terá diversas categorias: Axé, Sertanejo, Pop/Rock, Reggae, Heavy Metal, Forró, Pagode, e etc.

 

E em cada categoria, eu cadastro os artistas referentes. Aí ficaria assim:

 

Axé: Ivete Sangalo, Banda Eva, Araketu, Asa de Água, Chiclete com Banana

Sertanejo: Jorge & Mateus, Fernando & Sorocaba, Zezé di Camargo & Luciano, Chitãozinho & Xororó

Pagode: Inimigos da HP, Jeito Moleque, Exaltasamba

Forró: Aviões do Forró, Calcinha Preta, Mastruz com Leite

Reggae: Natiruts, Edu Ribeiro, Armandinho

Pop/Rock: Jota Quest, CPM 22, Tihuana, Pitty, NX Zero, Maskavo

 

Enfim, chega de prosa e vamos lá. Eu quero o seguinte:

Na hora de listar os artistas, listar por categorias. Mostrar o nome da categoria uma única vez (como um título) e todos os registros contidos nestas categorias. Há uma forma de fazer isso de forma manual, que é alterando o query, mas o problema é que se for incluída ou removida alguma categoria eu vou ter que ficar mudando manualmente. Exemplo:

 

Sertanejo:

Jorge & Mateus, Fernando & Sorocaba, Zezé di Camargo & Luciano, Chitãozinho & Xororó

 

Axé:

Ivete Sangalo, Banda Eva, Araketu, Asa de Água, Chiclete com Banana

 

Categoria:

Artistas

 

OBS: Terão outras informações além do nome do artista, como foto, link e outros.

 

 

Desde já, obrigado à todos!

Compartilhar este post


Link para o post
Compartilhar em outros sites

você terá 2 tabelas:

tabela categoria:

id, nome

 

tabela artistas

id, id_categoria, nome

 

E entao, basta utilizar loops para listar todos os artistas. Para exibir as categorias, você pode usar 2 loops encaixados.. sendo o externo de categorias, e o interno de artistas.. ou já relacionar as 2 tabelas, e com apenas um loop e um teste lógico, mostrar a categoria.

 

Várias pessoas já perguntaram isso aqui no fórum. Tem vários exemplos por aqui.

Tente desenvolver, e conforme for surgindo dúvidas ou erros, poste.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olhe esse exemplo:

Código categoria artista

01 axe Ivete Sangalo

02 sertanejo Jorge & Mateus

03 forro Aviões do Forró

04 sertanejo Zezé di Camargo & Luciano

05 pagode Inimigos da HP

 

DISTINCT: retorna apenas uma linha de dados para todo o grupo de linhas que tenha o mesmo valor.

 

Exemplo:

SELECT DISTINCT categoria FROM nome_tabela;

axe

sertanejo (estava duas vezes só que só retornou uma única linha)

forro

pagode

Compartilhar este post


Link para o post
Compartilhar em outros sites

Kratos,

 

A forma que você explicou ficou bem confusa. Eu não entendi. Qual a finalidade desse DISTINCT? Eu não quero retornar uma única linha, eu quero retornar todas os registros contido em uma determinada categoria. Mas que esse retorno seja dinâmico. Por exemplo, se eu adicionar uma nova categoria, ela seja exibida automaticamente com os devidos registros contidos nela.

 

William,

Somente para que eu entenda melhor o que você disse.

Tenho 2 tabelas. artistas e artistas_estilos

Como faria o LOOP (for)???

 

 

$sql = mysql_query("SELECT * FROM artistas_estilos ORDER BY nome ASC");
$conta = mysql_num_rows($sql);
for ($i == 0; $i < $conta; $i++) {
     $r = mysql_fetch_array($sql);
     $id = $r["id"];
     $nome = $r["nome"];
}

 

COMO CONTINUO??

A partir daqui não sei como continuar!!

 

 

Obrigado pela ajuda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O resultado final, seria assim:

http://www.espartaco.com.br/imasters

 

Independente do número de artistas na determinada categoria, ele exibiria uma única vez o nome da categoria (como um título. E exibiria os artistas correspondentes a esta categoria... Depois de ter exibido todas referente a categoria, passaria para a próxima.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, a forma 'simples' com 2 loops:

$sql = "SELECT * FROM artistas_estilos ORDER BY nome ASC"
$query = mysql_query( $sql );
while( $estilos = mysql_fetch_assoc( $query ) )
{
   echo '<h1>'.$estilos['nome'].'</h1>';

   $sql = "SELECT * FROM artistas WHERE estilo = {$estilos['id']} ";
   $query_art = mysql_query( $sql );

   echo '<ul class="listagem-artistas">';
   while( $artistas = mysql_fetch_assoc( $query_art ) )
   {
      echo '<li>'.$artistas['nome'].'</li>';
   }
   echo '</ul>';
}
entendeu ?

 

dá para evitar esse loop interno. Mas vou deixar dessa forma simples pra você ver como funciona.

Ai para deixar um artista do lado do outro, basta você usar a propriedade float do CSS.

Compartilhar este post


Link para o post
Compartilhar em outros sites

William,

 

Está dando um erro que não consegui entender.

 

$sql = "SELECT * FROM artistas_estilos ORDER BY nome ASC";
$query = mysql_query($sql);
while( $estilos = mysql_fetch_assoc( $query ) )
{
   echo '<h1>'.$estilos['nome'].'</h1>';

   $sql = "SELECT * FROM artistas WHERE estilo = {$estilos['nome']} ";
   $query_art = mysql_query($sql);

   echo '<ul class="listagem-artistas">';
   while($artistas = mysql_fetch_assoc($query_art)) {
      echo '<li>'.$artistas['nome'].'</li>';
   }
   echo '</ul>';
}

 

O erro que está dando é este:

http://espartaco.com.br/admin/artistas1.php

 

 

E me diga, qual a diferença de mysql_fetch_assoc e mysql_fetch_array???

 

Aguardo retorno.

Compartilhar este post


Link para o post
Compartilhar em outros sites

troca:

$sql = "SELECT * FROM artistas WHERE estilo = {$estilos['nome']} ";
   $query_art = mysql_query($sql);
por:

$sql = "SELECT * FROM artistas WHERE estilo = '{$estilos['nome']}' ";
   $query_art = mysql_query($sql)or die( mysql_error() );

fetch_array() permite chave numerica e associativa.

fetch_assoc() só permite a chave associativa.

 

como você tava usando a associativa, o assoc é mais rápido pra você usar.

 

você tem uma tabela chamada: artistas mesmo ? e guardou a string do nome do estilo que ele toca nessa tabela?

poste o schema SQL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

William,

 

CREATE TABLE artistas (
	id int(255) not null auto_increment primary key,
	tipo text not null,
	estilo text not null,
	nome text not null,
	link text not null,
	foto text not null
);

CREATE TABLE artistas_estilos (
	id int(255) not null auto_increment primary key,
	nome text not null
);

 

Alterei a linha conforme solicitado e o erro exibido foi este:

http://www.espartaco.com.br/admin/artistas1.php

 

 

Pensei que pudesse ser charset, mas não... Pois quando retiro o or die(mysql_error()), ele exibe todas as categorias e as que não possuem acento também dão erro.

 

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estranho... o charset na tabela do banco é UFT8 mesmo?

 

<?php 
header ('Content-type: text/html; charset=utf-8');
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';


$sql = "SELECT `id`, `nome` FROM artistas_estilos ORDER BY nome ASC";
$query = mysql_query( $sql )or die( mysql_error() );
while( $estilos = mysql_fetch_assoc( $query ) )
{
   echo '<h1>'.$estilos['nome'].'</h1>';

   $sql = "SELECT `id`,`tipo`,`estilo`,`nome`,`link`,`foto` 
   FROM `artistas` 
   WHERE `estilo` = '{$estilos['nome']}' ";

   $query_art = mysql_query( $sql )or die( mysql_error() );

   echo '<ul class="listagem-artistas">';
   while($artistas = mysql_fetch_assoc($query_art)) {
      echo '<li>'.$artistas['foto'].$artistas['nome'].'</li>';
   }
   echo '</ul>';
}
Os registros no banco estão corretos?

Compartilhar este post


Link para o post
Compartilhar em outros sites

William,

 

Os registros foram inseridos no banco através de uma página UTF8, consequentemente os registros que foram inseridos (categorias/estilos) são UTF8. Correto?

 

 

Afinal, mesmo que for charset, o Sertanejo por exemplo que não possui acento, deveria funcionar corretamente, não acha!?

 

 

Vou fazer um teste, listar as categorias pela ordem decrescente pois aí o Sertanejo aparece primeiro na lista, e vamos ver se o erro é o mesmo do "Axé".

 

 

Já posto o resultado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alterei o query que pegava as categorias para DESC

$sql = "SELECT * FROM artistas_estilos ORDER BY nome DESC";

E o erro exibido foi este:

Sertanejo

Unknown column 'Sertanejo' in 'where clause'

 

 

Caso necessário, você poderá ver o erro através desta página:

http://www.espartaco.com.br/admin/artistas1.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendeu o erro? como está o teu código atualmente ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

William,

 

Não entendi o erro.

 

O código está assim:

 

<?php
header ('Content-type: text/html; charset=utf-8');
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';

	include("includes/config.php");
$sql = "SELECT * FROM artistas_estilos ORDER BY nome DESC";
$query = mysql_query($sql);
while( $estilos = mysql_fetch_assoc( $query ) )
{
   echo '<h1>'.$estilos['nome'].'</h1>';
   $nomex = $estilos['nome'];

   $sql = "SELECT * FROM artistas WHERE estilo = $nomex";
   $query_art = mysql_query($sql) or die(mysql_error());

   echo '<ul class="listagem-artistas">';
   while($artistas = mysql_fetch_assoc($query_art)) {
      echo '<li>'.$artistas['nome'].'</li>';
   }
   echo '</ul>';
}
?>

 

Por que 'column' Sertanejo se é um registro e "estilo" é a coluna??

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta usar algo assim para ver se funciona.

 

$sql = "Select * from artistas_estilos";

$dados = mysql_query($sql);
echo "<ul>";
while($categoria = mysql_fetch_array($dados))
{
	echo "<li>".$categoria["nome"]. " - ". $categoria["id"];
	echo "<ul>";
	$sql2 = "Select * From artistas where estilo = $categoria[id]";
	$dados2 = mysql_query($sql2);
	while($artista = mysql_fetch_array($dados2))
	{
		echo "<li>".$artista["nome"]. "</li>";
	}
	echo "</ul>";
	echo "</li>";
}
echo "</ul>"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Preste atenção às aspas e crases que eu coloquei no código...

 

$sql = "SELECT * FROM `artistas` WHERE `estilo` = '{$nomex}'";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você faz a ligação entre as tabelas usando o nome? Porque não utiliza o id, que o mais indicado?

 

Outra coisa, não precisa fazer 2 laços e várias consultas para executar isto. Vejamos:

<?php 
header ('Content-type: text/html; charset=utf-8');
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';

$sql = "SELECT e.id AS idEstilo, e.nome AS nomeEstilo, a.id AS idArtista, a.tipo, a.estilo, a.nome AS nomeArtista, a.link, a.foto FROM artistas a JOIN artistas_estilos e ON a.estilo = e.id ORDER BY nomeEstilo, nomArtista";
$query = mysql_query( $sql )or die( mysql_error() );
$estilo = '';
while( $estilos = mysql_fetch_assoc( $query ) )
{
	if($estilo['nomeEstilo'] != $estilo) 
	{
		if(!empty($estilo)) 
		{
			echo '</ul>',PHP_EOL;
		}
		echo '<h1>'.$estilos['nomeEstilo'].'</h1>',PHP_EOL,'<ul class="listagem-artistas">';
		$estilo = $estilos['nomeEstilo'];
	}
	echo '<li>',$estilos['foto'],$estilos['nomeArtista'],'</li>';
}
Para este exemplo (não testado), estou usando o id como coluna que faz o JOIN nas duas tabelas.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

elas apenas concatenam a string.. se você deixar sem elas, funciona, pois entre aspas duplas o php interpreta variáveis..

prefiro usar, pois fica acho que fica mais legível o código.

 

Pra você deu erro de Unknown column 'Sertanejo' in 'where clause'

pois como você não delimitou com aspas, o interpretador achou que se tratava de uma comparação de 2 colunas. E como não existe a coluna Sertanejo, retornou o erro.

 

Te disse que ia fazer 'da forma simples' com 2 loops, pois é bem fácil de entender.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.