Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.vixi.....to viajando ainda mano...como falei estou novo no php...muitos termos ainda estou tentando pegar
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
pdc......eu posso tirar sem problemas, só coloquei ele para repetir de acordo com o id pra eu não me perder...mas eu tiro aki sem problemas
Veja se o exemplo ajuda:
<?php
/*
CREATE TABLE categorias(
id INT(8) PRIMARY KEY AUTO_INCREMENT
,nome_categoria VARCHAR(50)
);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:
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
}
?>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
bacana...obrigado mano...vlw msmo...vou estudar sim
Na sua query das subcategorias você não está passando o id da categoria, tá faltando o bindValue antes do execute.