Ir para conteúdo

Arquivado

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

Ismael Fiorotti

LISTAR CATEGORIA E SUB-CATEGORIA - PDO

Recommended Posts

Olá amigos, Boa tarde.....Sou novo em PHP e estou com uma duvida.

 

Preciso listar todos as categorias e suas respectivas subcategorias.....ex.:

 

Categoria 01

   Subcategoria 01
   Subcategoria 02

Categoria 02
  Subcategoria 01

  Subcategoria 02


no htlm seria um exemplo assim:

<h3>Categoria 01</h3>

       <ul> 

          <li> Subcategoria 01 </li>

      </ul>

 

no meu banco MYSQL está assim:

categorias
   id
   id_categoria
   nome_categoria

 

subcategoria
   id
   id_categoria

   produto

 

Estou tentando fazer mas tenho certeza que está errado ou está faltando alguma coisa, segue o que eu tenho aki.

<?php

$dados = $con->prepare("SELECT * FROM categoria ORDER BY nome_categoria DESC");
$dados->execute();
$registro = $dados->fetchALL(PDO::FETCH_ASSOC);

?>


<?php
foreach ($registro as $item) {
?>
    <h3 id="oceans"><?php echo $item['nome_categoria'] ?></h3>

    <?php
    $dados2 = $con->prepare("SELECT * FROM subcategoria WHERE id_categoria=:id");
    $dados2->execute();
    $registro2 = $dados2->fetchALL(PDO::FETCH_ASSOC);

    foreach ($registro2 as $item2) {}

      ?>
        
<?php
}
?>    

 

 

Obrigado.

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

por que a tabela categorias tem dois campos de id? acredito que ali só precisa de um campo para o id que seria o id, acho que id_categoria tá sobrando na parada e na tabela subcategorias sim teria o campo id que é para o id da própria subcategoria e o campo id_categoria pra relacionar com o campo id da tabela categorias

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja se o exemplo ajuda:

<?php
/*
CREATE TABLE categorias(
	 id				 INT(8) PRIMARY KEY AUTO_INCREMENT
	,nome_categoria  VARCHAR(50)
);
-- INSERINDO CARROS....
INSERT INTO categorias(nome_categoria) VALUES ('FORD');
INSERT INTO categorias(nome_categoria) VALUES ('FIAT');


CREATE TABLE subcategorias(
	 id				INT(8)  PRIMARY KEY AUTO_INCREMENT
	,categorias_id  INT(8)
	,produto  		VARCHAR(50)
);

--INSERINDO CARROS
INSERT INTO subcategorias(categorias_id, produto) VALUES (2, 'FIAT UNO');
INSERT INTO subcategorias(categorias_id, produto) VALUES (1, 'FORD FOCUS');
INSERT INTO subcategorias(categorias_id, produto) VALUES (1, 'FORD KA');
INSERT INTO subcategorias(categorias_id, produto) VALUES (2, 'PALIO');
INSERT INTO subcategorias(categorias_id, produto) VALUES (1, 'ECOSPORT');
INSERT INTO subcategorias(categorias_id, produto) VALUES (2, 'SIENA');
*/ 

$db = new PDO('mysql:host=localhost;dbname=imasters', 'root', '');	

$stmt = $db->prepare("SELECT id, nome_categoria FROM categorias ORDER BY nome_categoria DESC");
$stmt->execute();
$categorias = $stmt->fetchALL(PDO::FETCH_ASSOC);


echo '<ul>';

foreach ($categorias as $categoria){
    echo '<li>' . $categoria['nome_categoria']. '</li>';
	
    $stmt = $db->prepare("SELECT id, produto, categorias_id FROM subcategorias WHERE categorias_id = :categorias_id");		
	$id_categoria = $categoria['id'];
	$stmt->bindParam(':categorias_id', $id_categoria, PDO::PARAM_INT);	
    $stmt->execute();
    $subcategorias = $stmt->fetchALL(PDO::FETCH_ASSOC);
	
	//var_dump($subcategorias);
	
	echo '<ul>';
		foreach($subcategorias as $subcategoria){		
			echo '<li>' . $subcategoria['produto']. '</li>';
		}
	echo '</ul>';
}
echo '</ul>';

 

 

Resultado:

  • FORD
    • FORD FOCUS
    • FORD KA
    • ECOSPORT
  • FIAT
    • FIAT UNO
    • PALIO
    • SIENA

sim... eu curto muito simplificar as paradas e deixar loops com foreach...

 

 

--

Obs... isso cria o problema do N+1, então vale a pena depois de se sentir a vontade com o conceito acima estudar JOINS / IN 

 

Recomendo a leitura:

http://rberaldo.com.br/o-problema-do-n-mais-1/

Compartilhar este post


Link para o post
Compartilhar em outros sites

caracas mano...deu certo agora....eu peguei o codigo que me enviou e adequei ao meu......na vdd só troquei......muito obrigado....segue abaixo como ficou.

<?php

$stmt = $con->prepare("SELECT id, nome_categoria FROM categorias ORDER BY nome_categoria DESC");
$stmt->execute();
$categorias = $stmt->fetchALL(PDO::FETCH_ASSOC);

?>


<?php
foreach ($categorias as $categoria){
?>
    <h3 id="oceans"><?php echo $categoria['nome_categoria'] ?></h3>

    <?php
    $stmt = $con->prepare("SELECT id, produto, categorias_id FROM subcategorias WHERE categorias_id = :categorias_id");        
    $id_categoria = $categoria['id'];
    $stmt->bindParam(':categorias_id', $id_categoria, PDO::PARAM_INT);    
    $stmt->execute();
    $subcategorias = $stmt->fetchALL(PDO::FETCH_ASSOC);

    foreach($subcategorias as $subcategoria){
    ?>
    <ul><li><?php echo $subcategoria['produto'];?></li></ul>
    <?php
    }
    ?>
        
<?php
}


?>    

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal que bom que deu certo.

 

Faz uns testes ai e depois da uma lida nos links referenciado, como eu disse o exemplo tem problemas de performasse 

 

Edit:

Outra coisa que vale a pena estudar é FK (Foreing Key/Chave Estrangeira)

 

Elas garantem integridade na base (não permite registro fantasma uma subcategoria cujo não tem uma categoria por exemplo...)

 

 

 

https://www.w3schools.com/sql/sql_foreignkey.asp

https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Fala galera.
      Espero que todos estejam bem.
      Seguinte: Tenho um arquivo xml onde alguns campos estão com : (dois pontos), como o exemplo abaixo:
       
      <item>
      <title>
      d sa dsad sad sadasdas
      </title>
      <link>
      dsadas dsa sad asd as dsada
      </link>
      <pubDate>sadasdasdsa as</pubDate>
      <dc:creator>
      d sad sad sa ad as das
      </dc:creator>
      </item>
       
      Meu código:
       
      $link = "noticias.xml"; 
      $xml = simplexml_load_file($link); 
      foreach($xml -> channel as $ite) {     
           $titulo = $ite -> item->title;
           $urltitulo = $ite -> item->link;
           print $urltitulo = $ite -> item->dc:creator;
      } //fim do foreach
      ?>
       
      Esse campo dc:creator eu não consigo ler. Como faço?
       
      Agradeço quem puder me ajudar.
       
      Abs
       
       
    • Por First
      Olá a todos!
       
      Eu estou criando um sistema do zero mas estou encontnrando algumas dificuldades e não estou sabendo resolver, então vim recorrer ajuda de vocês.
      Aqui está todo o meu código: https://github.com/PauloJagata/aprendizado/
       
      Eu fiz um sistema de rotas mas só mostra o conteúdo da '/' não sei porque, quando eu tento acessar o register nada muda.
      E eu também quero que se não estiver liberado na rota mostra o erro de 404, mas quando eu tento acessar um link inválido, nada acontece.
      Alguém pode me ajudar com isso? E se tiver algumas sugestão para melhoria do código também estou aceitando.
       
       
      Desde já, obrigado.
    • Por landerbadi
      Olá pessoal, boa tarde
       
      Tenho uma tabela chamada "produtos" com os seguintes campos (id, produto) e outra tabela chamada "itens" com os seguintes campos (id, prod_01, prod_02, prod_03, prod_04).
       
      Na tabela produtos eu tenho cadastrado os seguintes produtos: laranja, maçã, uva, goiaba, arroz, feijão, macarrão, etc.
       
      Na tabela itens eu tenho cadastrado os itens da seguinte maneira:
       
      1, laranja, uva, arroz, feijão;
      2, maçã, macarrão, goiaba, uva;
      3, arroz, feijão, maçã, azeite
       
      Meu problema é o seguinte: 
      Eu escolho um produto da tabela "produtos", por exemplo "uva".  Preciso fazer uma consulta na tabela "itens" para ser listado todos os registros que contenham o produto "uva" e que todos os demais produtos estejam cadastrados na tabela "produtos".
       
      No exemplo acima seria listado apenas dois registros, pois o terceiro registro não contém o produto "uva". 
       
      Alguém pode me ajudar? Pois estou quebrando a cabeça a vários dias e não consigo achar uma solução.
    • Por landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, plural, ativo. Nela tem cadastrado vários itens e seu respectivo plural. No campo ativo eu coloco a letra "S" para informar que esta palavra está ativa no sistema. Por exemplo: 1, casa, casas, S 2, mesa, mesas, S 3, cama, camas, S 4, moto, motos, S 5, rádio, rádios O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "variações" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, camas, moto 2, mesas, casas, radio 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela variações da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "casa". Preciso fazer com que o php me liste todos os registros da tabela "variações" que contenham a palavra "casa". Porém se tiver algum registro com a palavra "casas" também tem que ser listado. Neste caso ele irá encontrar dois registros. Agora eu preciso que o php verifique os demais itens e faça a listagem apenas dos item que estão ativos (que contenham um "S" no campo ativo. Neste caso ele irá encontrar apenas um registro, pois o segundo registro contém a palavra "rádio". E "rádio" não está ativo na tabela itens. Como faço isso?
×

Informação importante

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