Jump to content
L@nder

[RESOLVIDO] Listar categorias e subcategorias

Recommended Posts

Olá pessoal

 

Estou quebrando a cabeça para fazer com que o php liste as categorias e sub-categorias.do menu da página que estou fazendo.

A estrutura do menu deve ser esta

============================

Categoria 1

  • Subcategoria
  • Subcategoria
  • Subcategoria

Categoria 2

  • Subcategoria
  • Subcategoria
  • Subcategoria

Categoria 3

  • Subcategoria
  • Subcategoria
  • Subcategoria

==============================

 

Eu fiz a consulta e fiz com que as categorias sejam listadas, porém não estou conseguindo fazer listar abaixo de cada categoria suas respectivas sub-categorias.

 

Segue abaixo o código que estou usando para listar as categorias.

 

<?php
$sql = mysqli_query($conn, "SELECT * FROM categoria ORDER BY categoria ASC");
while($dados=mysqli_fetch_array($sql))
{
    echo '<li><span class="opener">' . $dados['categoria'] . '</span><ul>';
    echo '<li><a href="#">subcategoria</a></li>'; //E justamente nesta linha que preciso fazer aparecer as subcategorias que estão na tebela "sub_categoria"
    echo '</ul></li>';
}
?> 

 

Se alguém puder me ajudar ficarei agradecido.

Share this post


Link to post
Share on other sites
4 minutos atrás, Gleyson Abreu disse:

Como está a estrutura do banco de dados da categoria e sub_categoria? acho que com INNER JOIN resolveria seu problema.

Está assim:

 

Tabela categoria:

  • id
  • categoria
  • imagem

Tabela sub_categoria

  • id
  • id_categoria
  • sub_categoria

Share this post


Link to post
Share on other sites

Uma relação simples de tabela seria:

	  $query = $db->prepare("SELECT * FROM categoria");
          $query->execute();

          while($cat = $query->fetch(PDO::FETCH_ASSOC)){
              $nomecat = $cat['categoria'];
              $idcat = $cat['id'];

              echo $nomecat."<BR>";
              
              $subcat = $db->prepare("SELECT * FROM subcategoria WHERE id_categoria = :idcat ");
              $subcat->bindValue(":idcat", $idcat, PDO::PARAM_STR);
              $subcat->execute();

              while ($sub = $subcat->fetch(PDO::FETCH_ASSOC)) {
                    $subcatnome = $sub['subcategoria'];

                    echo "SUB CATEGORIA: ".$subcatnome."<BR>";
              }
              echo "<HR>";
          }

Tem outros métodos como INNER JOIN, LEFT JOIN, RIGHT JOIN etc...

Share this post


Link to post
Share on other sites
1 hora atrás, Gleyson Abreu disse:

Uma relação simples de tabela seria:


	  $query = $db->prepare("SELECT * FROM categoria");
          $query->execute();

          while($cat = $query->fetch(PDO::FETCH_ASSOC)){
              $nomecat = $cat['categoria'];
              $idcat = $cat['id'];

              echo $nomecat."<BR>";
              
              $subcat = $db->prepare("SELECT * FROM subcategoria WHERE id_categoria = :idcat ");
              $subcat->bindValue(":idcat", $idcat, PDO::PARAM_STR);
              $subcat->execute();

              while ($sub = $subcat->fetch(PDO::FETCH_ASSOC)) {
                    $subcatnome = $sub['subcategoria'];

                    echo "SUB CATEGORIA: ".$subcatnome."<BR>";
              }
              echo "<HR>";
          }

 

Testei aqui e apresentou este erro:

 

Notice: Undefined variable: db in C:\xampp\htdocs\template\teste.php on line 5

Fatal error: Uncaught Error: Call to a member function prepare() on null in C:\xampp\htdocs\visudic-template-final\teste.php:5 Stack trace: #0 {main} thrown in C:\xampp\htdocs\template\teste.php on line 5

Share this post


Link to post
Share on other sites
10 minutos atrás, Gleyson Abreu disse:

A variável $db e a conexão com o banco de dados meu localhost, você tem que substituir pela conexão do seu banco de dados. Se você usa PDO só troca a conexão se usa MySQLi tem adaptar um pouco o código.

Agora deu erro em outra linha

 

Eu uso MySQLi 

 

Warning: mysqli_stmt::fetch() expects exactly 0 parameters, 1 given in C:\xampp\htdocs\template\teste.php on line 8

Share this post


Link to post
Share on other sites
17 minutos atrás, Gleyson Abreu disse:

A variável $db e a conexão com o banco de dados meu localhost, você tem que substituir pela conexão do seu banco de dados. Se você usa PDO só troca a conexão se usa MySQLi tem adaptar um pouco o código.

Conectei via PDO (Algo que até agora era uma novidade para mim) e deu certo.

 

Muito obrigado pela ajuda. Fique com Deus.

Share this post


Link to post
Share on other sites

Você deve está usando MySQLi dei uma adaptada olha aí aqui está funcionando tudo ok.

$mysqli = new mysqli('localhost', 'root', '', 'teste');

              $query = mysqli_query($mysqli, "SELECT * FROM categoria");

              while ($cat = $query->fetch_assoc()) {
                 $nomecat = $cat['categoria'];
                 $idcat = $cat['id'];
                 echo $nomecat."<BR>";

              $subcat = mysqli_query($mysqli, "SELECT * FROM subcategoria WHERE id_categoria = '$idcat' ");

              while ($sub = $subcat->fetch_assoc()) {
                    $subcatnome = $sub['subcategoria'];

                    echo "SUB CATEGORIA: ".$subcatnome."<BR>";
              }
              echo "<HR>";
              }

 

Share this post


Link to post
Share on other sites
6 minutos atrás, Gleyson Abreu disse:

Você deve está usando MySQLi dei uma adaptada olha aí aqui está funcionando tudo ok.


$mysqli = new mysqli('localhost', 'root', '', 'teste');

              $query = mysqli_query($mysqli, "SELECT * FROM categoria");

              while ($cat = $query->fetch_assoc()) {
                 $nomecat = $cat['categoria'];
                 $idcat = $cat['id'];
                 echo $nomecat."<BR>";

              $subcat = mysqli_query($mysqli, "SELECT * FROM subcategoria WHERE id_categoria = '$idcat' ");

              while ($sub = $subcat->fetch_assoc()) {
                    $subcatnome = $sub['subcategoria'];

                    echo "SUB CATEGORIA: ".$subcatnome."<BR>";
              }
              echo "<HR>";
              }

 

Também deu certo aqui.

 

N a sua opinião qual o melhor a usar, mysli ou PDO?

Share this post


Link to post
Share on other sites

Cara uma das vantagens de usar o PDO é quele e suporta vários tipos de bancos de dados como (Postgre SQL, SQLite, MySQL, Oracle, etcs..) já o MySQLi apenas e suportado o MySQL, encontra partida o MySQLi e mais rápido que o PDO em execuções. Acho que se você está procurando um desempenho melhor opte por MySQLi, pela portabilidade de acesso a mais bancos de dados eu utilizo já a um tempo o PDO é ambas as linguagens são seguras desde quem estiver programando saiba usar de forma correta. Tem vários artigos sobre MySQLi x PDO no google com vantagens e desvantagens de cada uma, no final e você vai escolher qual melhor para seu projeto.

  • Obrigado! 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Julie_santiago
      Olá!
      Pessoal, preciso muito de um help urgente. Estou tentando fazer uma simples query ao banco de dados, usando o Axios. Mas, não importa a forma de fazer a requisição, o Axios não funciona. O HTML está abaixo, onde chamo a função enviaDados() através do onsubmit.
      <div class="input-group md-form"> <form method="get" onsubmit="enviaDados()" name="buscar"> <input type="text" id="Form-search2" class="form-control" name="nomeReagente"> <label for="Form-search2">Search</label> <input type="submit" name="pesquisar" value="buscar"> </form> <span class="input-group-text dark lighten-2" id="basic-text1"> <i class="fas fa-search text-dark" aria-hidden="true"></i> </span> </div> Meu arquivo main.js que contém a função enviaDados().
      function enviaDados(){ let nome = buscar.nomeReagente.value recebeDados(nome); } Dentro dessa função, estou chamando outra: recebeDados() que executa a requisição Axios. Passo como parâmetro o valor lá do meu input. OBS.: Meu código está assim, aparentemente confuso, porque o objetivo é ter funções que enviam os dados dos meus formulários e outras funções (genéricas) para receber e tratar esses dados. Abaixo a função recebeDados():
      function recebeDados(nome_reagente){ axios.get('http://localhost/Quimica/php/recebe_json.php', { params: { nome } }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log('Não foi possível realizar a requsição: '+error); }) .finally(function () { }); } Não importa o que eu faça, sempre cai no CATCH  - request aborted. Preciso muito resolver esse problema, mas não faço ideia do que pode ser. Relevem qualquer "noobice" porque estou aprendendo o básico ainda.
       
    • By JeanTDZ
      Olá pessoal!
       
      Estou com uma tremenda dificuldade.
      Tenho um formulário na qual está funcionando e cadastrando, porém preciso que o meu botão adicionar autorizado funcione e mostre o que foi digitado para o e-mail. As informações na vdd é enviada para o e-mail e o que será enviado é oque será digitado.
       
      Simplificando ->
      Tenho um botão que adiciona 2 inputs (NOME E SALDO) e conforme for clicando nesse botão, vai adicionando mais campos.
      Dúvida: Como posso fazer com que grave o que foi digitado nesses campos?
       
      Segue o que eu tentei fazer até agora:

      HTML
      <!DOCTYPE html> <html>     <head>         <title>Chame Taxi PrePago</title>                 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>         <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />         <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>         <link rel="icon" type="image/x-icon" href="https://www.flaticon.com/premium-icon/icons/svg/1361/1361253.svg" />         <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>     <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.mask/1.14.15/jquery.mask.min.js"></script>     <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>     <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>     </head>     <body>         <br />         <div class="container" style="width:100%; max-width:600px">             <h2 align="center">Pré-Pago</h2>             <br />             <div class="panel panel-default">                 <div class="panel-heading"><h4>Registrar</h4></div>                 <div class="panel-body">                     <form method="post" id="register_form">                         <?php echo $message; ?>                         <div class="form-group">                             <label>Nome Completo</label>                             <input type="text" name="user_name" style="text-transform:uppercase" class="form-control" pattern="[a-zA-Z ]+" required />                         </div>                         <div class="form-group">                             <label>E-mail</label>                             <input type="email" name="user_email"  style="text-transform:uppercase" class="form-control" required />                         </div>                         <div class="form-group">                             <label>CEP</label>                             <input type="text" name="campob" id="cep" value="" maxlength="9" onblur="pesquisacep(this.value);" class="form-control">                         </div>                         <div class="form-group"> <table id="myTable" class="table"> <a class="btn btn-primary" onclick="myFunction()" href="#" role="button">Adicionar Autorizado</a>             <thead>                 <tr>                     <th>NOME</th>                     <th>SALDO</th>                 </tr>             </thead>         </table>                         <div class="form-group">                             <input type="submit" name="register" id="register" value="Validar" class="btn btn-info" />                         </div>                     </form>                 </div>             </div>         </div>     </body> </html> JAVASCRIPT 
       
          <script>         var incremento = -1;         function myFunction() {             incremento++;             var table = document.getElementById("myTable");             var row = table.insertRow(0);             var cell1 = row.insertCell(0);             var cell2 = row.insertCell(1);             var cell3 = row.insertCell(2);             var cell4 = row.insertCell(3);             cell1.innerHTML = "NOME";             cell2.innerHTML = '<input type="text" name="name1[${incremento}]" >';             cell3.innerHTML = "SALDO";             cell4.innerHTML = '<input type="text" name="saldo[${incremento}]" size="15px" >';         }     </script>  
    • By gramosiri2
      Oi estou tentando passar um valor através de uma variável em uma query, porém não está mostrando o resultado que eu quero.
       
      Aqui eu pego o ultimo id do pedido
      <?php while($row = $consulta_pedido2->fetch_assoc()){ echo $row['id_pedido']; }?> E aqui eu faço a query e passo variável...
      $query ="SELECT itempedido.id_itempedido, itempedido.valor, ... FROM itempedido INNER JOIN produto ON ... WHERE itempedido.pedido_id = '$row'"; No caso onde está a variável $row, se eu colocar o numero do pedido manualmente, me retorno os itens daquele pedido, agora com a variável não está mostrando, alguma ideia?
    • By gustavodubarbosa
      Estou criando uma página que realize monitoramento de atividades.
      No meu código PHP defini uma variável que busca a data atual, depois passei o parâmetro de conexão com o banco de dados, depois criei um while para buscar as informações, dentro do while criei um if, a condição if é que se a variável data for igual a data cadastrada na atividade, exiba toda a atividade cadastrada. Mas o problema é que o if não está controlando essa condição, está passando direto e exibindo tudo.
      <?php $number = ('23'); $data = date("Y-m-d"); echo "$data"; /*Aqui realizo a conexão com o banco de dados, passo os dados para conectar, caso dê algum erro, o sistema me retorna uma mensagem de erro*/ $conect = mysqli_connect('localhost','root','','projeto_pessoal') or die ('Erro na conexão com o banco de dados'); /*Aqui passo o comando para realizar a busca no banco de dados, aplicando o filtro de pesquisa*/ $result_pesquisa = "SELECT * FROM cadastrar_atividade"; /*Neste momento, mando a execução, preciso passar como parametro a variável com a conexão e a variável com o comando, caso dê erro, será exibido uma mensagem*/ $resultado_pesquisa = mysqli_query($conect, $result_pesquisa); /*Aqui é aberto um laço de repetição para fazer uma varredura no banco de dados, em seguida realizo a exibição do que foi encontrado*/ ?> <h1>Resultado da Pesquisa</h1> <?php while($rows_pesquisa = mysqli_fetch_array($resultado_pesquisa)){ if($rows_pesquisa['prazo'] == $data) echo '<p class="title">'.'ID da atividade: '.'</p>'.'<p class="result">'.$rows_pesquisa['id'].'<br>'.'</p>'; echo '<p class="title">'.'Nome da atividade: '.'</p>'.'<p class="result">'.$rows_pesquisa['nome_atividade'].'<br>'.'</p>'; echo '<p class="title">'.'Descrição da atividade: '.'</p>'.'<p class="result">'.$rows_pesquisa['desc_atividade'].'<br>'.'</p>'; echo '<p class="title">'.'Prioridade: '.'</p>'.'<p class="result">'.$rows_pesquisa['prioridade'].'<br>'.'</p>'; echo '<p class="title">'.'Prazo: '.'</p>'.'<p class="result">'.$rows_pesquisa['prazo'].'<br>'.'</p>'; echo 'carregado'; echo '<hr></hr>'; } ?>  
    • By violin101
      Caros amigos, saudações...
       
      Por favor me perdoa por recorrer ao auxílio dos amigos, mas estou com uma pequena dúvida.
       
      Preciso passar uma Variável [_caminho de Imagem_] para a Modal mas infelizmente não estou conseguindo.
       
      Consigo passar as variáveis do ID e DESCRIÇÃO, mas não consigo passar a variável da IMAGEM.
      <?php <a href="#modalImagem" role="button" data-toggle="modal" class="btn btn-warning" codg="'.$r->idcodigo.'" descr="'.$r->descprd.'" image="'.$r->imgprd.'" style="margin-right: 1%">Ver </a> ?>  
      Como consigo passar essa variável para poder visualizar ?
       
      Grato,
       
      Cesar
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.