Ir para conteúdo
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.

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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...

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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>";
              }

 

Compartilhar este post


Link para o post
Compartilhar em outros 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?

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por martinazzo
      Olá pessoal,
       
      sou novo por aqui e não sei bem como funciona, mas sei que preciso de uma ajuda kkkkk
      se puderem me dar uma mão ficaria grato;
       
      Estou tendo problemas em como pegar id de uma linha clicada em uma table, que já recebe os dados de um bd. Eu gostaria de poder editar os campos e salvar no banco de dados usando o ID da linha clicada;
       
      Vou colar o código abaixo, não reparem na bagunça kkkkk
       
      conexao.php
       
      <?php
      $server = "XXXXX";         Conferido e esta correto;
      $username = "XXXXX";  Conferido e esta correto;
      $password = "XXXXX";  Conferido e esta correto;
      $dbname = "XXXXX";     Conferido e esta correto;
      $conn = mysqli_connect($server, $username, $password, $dbname);
      ?>
       
      altera.php
       
      <?php 
      $link = mysqli_connect("XXXXXX", "XXXXX", "XXXXX", "XXXXXX"); Conferido
      $sql = "SELECT * FROM interface ";
      $consulta = mysqli_query($link, $sql);
      ?>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="UTF-8">
      <meta http-equiv="refresh" content="30">
      <link rel="stylesheet" type="text/css" href="style.css">
      <script src="sorttable.js"></script>
      <title>Dashboard</title>
      <?php 
      session_start();
      if(!isset($_SESSION['login']) and !isset ($_SESSION['senha'])){
          session_destroy();
        unset($_SESSION['login']);
        unset($_SESSION['senha']);
        header('location:index.html');
        
        }
        
      ?>

      </head>
      <body>
      <a href="index.php"><img src="img/ditec_smart_hor_150px.png"></a>
      <div class="borda_titulo">
      <h2><center>DIMILK | Equipamentos</font></h2></center></div><br /><br />
      <form name="equipamento" action="salva.php" method=post>
      <center><table id="minhaTabela" border="3" class="sortable" bgcolor="#1E90FF">
        <tr>
        <th><center>ID </center></th>
        <th><center>MAC</center></th>
        <th><center>Habilitado</center></th>
        <th><center>Descrição</center></th>
        <th><center>Altura Tarro</center></th>
        <th><center>Área Tarro</center></th>
        <th><center>Alterar</center></th>
        </tr>
        
          <?php while($registro = mysqli_fetch_assoc($consulta)){
              echo '<tr bgcolor="#ADD8E6" scope="row">';
              echo '<td name="id"><center>'.$registro["id"].'</center></td>';
              echo '<td name="mac"><center>'.$registro["mac"].'</center></td>';
              echo '<td><center><input type="checkbox" name="status" value="$teste"><br></center></td>';
              echo '<td id="linha_desc"><textarea name="desc" type=text placeholder="'.$registro["descricao"].'" /></textarea></td>';
              echo '<td><input name="altura" type=text style="width: 70px;" placeholder="'.$registro["altura_latao"].' cm" /></td>';
              echo '<td><input name="area" type=text style="width: 70px;" placeholder="'.$registro["area_latao"].' cm" /></td>';
              
              echo '<td><form method="get" action="salva.php"><center><button class="voltar" type="submit">Salvar</button></center></form><br />';
              echo '</tr>';
              }
          echo '</tbody></table></form>';
          
          ?></center><br />
          
              <div>            
                  <form method="get" action="index.html">        
                  <center><button class="voltar" type="submit">Voltar</button></center></form>
              </div>
                      
                      <br />
                      <footer class="borda_texto"><center>
                      <img src="img/rodape_logo.png">
                          2019 © <b>DITEC - Smart Solutions</b> - Todos os Direitos Reservados.
                      <a class="px-4" href="https://www.ditecsc.com.br" target="_blank">Ditec - Smart Solution</a>
                      </center></footer>
      </body>
      </html>
       
      salva.php
       
      <?php
      include('conexao.php');
      include_once('altera.php');
       
      // declaração de variáveis
      $id = 22;
      /*$id = $_GET['id'];
      $status = $_POST['status'];*/
      $descricao = $_POST['desc'];
      $altura = $_POST['altura'];
      $area = $_POST['area'];
       
      $up = mysqli_query($conn, "UPDATE interface SET descricao='$descricao', altura_latao='$altura', area_latao='$area' WHERE id=$id"); 
       
      if(mysqli_affected_rows($conn) > 0){
        echo '<center><h1><b>Sucesso</b></h1><br /> <h2>Atualizado!</h2></center>';
        header("Refresh: 2;url=equipamentos.php");
      }else{
          echo '<center><h1><b>Erro</b></h1><br /> <h2>Não foi atualizado!</h2></center>';
        header("Refresh: 2;url=altera.php");
      }
       
      mysqli_close($conn);
      ?>
       
      Do jeito que esta eu consigo alterar o id=22, mas não consegui pegar o id da linha sequente;
       
       
    • Por LuanMartinsTI
      Eu gostaria de saber se existe algum problema relacionado a seguranca criando uma funcao assim, no exemplo sempre que eu crio uma funcao pre reutilizar os dados sao passados direto na chamada da funcao dentro do php, o usuario nao insere nenhum dado, quando o usuario vai inserir dados eu nao trabalho dessa forma, entao minha duvida [e, se mesmo o parametro da funcao sendo informado dentro do php no codigo pode existir algum problema.
      public function contar_cadastro($tabela, $sql){ try { if($sql == null){ $this->Select = $this->Conn->prepare("SELECT * FROM $tabela"); $this->Select->execute(); return $this->Select->rowCount(); }else{ $this->Select = $this->Conn->prepare("SELECT * FROM $tabela". " " ." $sql"); $this->Select->execute(); return $this->Select->rowCount(); } } catch (PDOException $exc) { exibeMensagens($Msg, $ErrNo); } } E as chamadas das funcoes assim
       
      $cmsPDO = new CmsPDO(); $r_userStaff = $cmsPDO->contar_cadastro('usuarios', ' where cargo > 2'); $r_userVip = $cmsPDO->contar_cadastro('usuarios', ' where cargo = 2'); $r_userBan = $cmsPDO->contar_cadastro('usuarios', " where ban = '1'"); $r_usuarioPDO = $cmsPDO->contar_cadastro('usuarios', null); $r_servVip = $cmsPDO->contar_cadastro('servidores', " where vipfree = 'V'"); $r_servFree = $cmsPDO->contar_cadastro('servidores', " where vipfree = 'F'"); $r_servInat = $cmsPDO->contar_cadastro('servidores', " where verificado = '1'"); $r_servOff = $cmsPDO->contar_cadastro('servidores', " where estado = 'Off'"); $r_servOn = $cmsPDO->contar_cadastro('servidores', " where estado = 'On'"); $r_servidores = $cmsPDO->contar_cadastro('servidores', null); Eu normalmente crio as funcoes assim:
      public function cadastrar_usuario($usuario){ try { if($this->veriricarnick($usuario) == false){ if($this->verificiarEmail($usuario) == false){ $query = 'INSERT INTO usuarios ' . '(id, nome, senha, email, cargo, ip)' . 'value(null,:nome, :senha, :email, :cargo, :ip)'; $this->Criar = $this->Conn->prepare($query); $this->Criar->bindValue(':nome' , $usuario->getNome() , PDO::PARAM_STR); $this->Criar->bindValue(':senha' , $usuario->getSenha(), PDO::PARAM_STR); $this->Criar->bindValue(':email' , $usuario->getEmail(), PDO::PARAM_STR); $this->Criar->bindValue(':cargo' , $usuario->getCargo(), PDO::PARAM_INT); $this->Criar->bindValue(':ip' , $usuario->getIp() , PDO::PARAM_STR); $this->Criar->execute(); if($this->Criar->rowCount() == 1){ return 1; }else{ return false; } }else{ return false; } }else{ return false; } } catch (PDOException $exc) { exibeMensagens("<b> Erro ao inserir.</b> Mensagem:{$exc->getMessage()} Código: {$exc->getCode()}", WS_ERROR); } }  
    • Por nosredna
      Olá amigos,
       
      tenho o seguinte código:
      <html> <script type="text/javascript"> function Soma(){ var soma = 0; var ipts = document.querySelectorAll('input[oninput="Soma()"]'); for(var x=0; x<ipts.length; x++){ var valorItem = parseFloat(ipts[x].value); !isNaN(valorItem) ? soma += parseFloat(valorItem) : null; } document.querySelector('#final').value = soma.toFixed(2); } </script> <form action=""> Total produto1: <input type="text" oninput="Soma()" value="0"><br> Total produto2: <input type="text" oninput="Soma()" value="0"><br> <br> Total todos os produtos12: <input type="text" id="final"> </form> </html> Bom...para essas duas inputs funciona corretamente.
      Porém, se eu quiser colocar mais inputs como: Total produto3 + Total produto4 = Total todos os produtos34, Total produtoX + Total produtoY = Total todos os produtosXY, ...
      e usar o mesmo código JS, é possível? alguém poderia me dar uma dica de como eu faço para fazer isso? já tentei de várias maneiras, mas não estou tendo sucesso...
       
      Fico agradecido. 
    • Por moreaux
      Tenho um apache2 configurado para a minha pasta /var/www/meusite , porem quando clonaram, usaram https e nao SSH, fiz o clone do novo projeto, todos os arquivos estão iguais, porem quando renomeio as pastas para ir para o meu novo projeto, me da o erro :
       
      This page isn’t working
      Dando o erro de HTTP ERROR 500, ja tentei verificar no LOG do apache, porem não esta logando nada, alguem poderia me ajudar? 
    • Por cesaroet
      Galera, estou com o seguinte problema:
      tenho 4 redirecionamento, até a 2 funciona normal, mas a partir da 3 redireciona para o menu.php novamente.
      alguem tem uma dica?
      <?php session_start(); if(!isset($_SESSION['usuario']) /*|| ($_SESSION['nivel']) */){ session_destroy(); header("location:menu.php"); exit; } if($_SESSION['nivel'] == '1'){ header("location:checklist_gabriel/index.php"); } if($_SESSION['nivel'] == '2'){ header("location:checklist/index.php"); } if($_SESSION['nivel'] == '3'){ header("location:conferencia/controle/"); } if($_SESSION['nivel'] == '4'){ header("location:controle/index.php"); } ?>  
×

Informação importante

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