Consulta Categoria e Sub Categoria - PHP e MySql

02/08/2014

0

PHP

Bom dia colegas,

Sou novo no fórum, estou com dificuldades em listar categorias e sub categorias, conforme estrutura abaixo.

Categoria 1
- Sub Categoria - Item 1
- Sub Categoria - Item 2

Categoria 2
- Sub Categoria - Item 1
- Sub Categoria - Item 2

Estou trabalhando com duas tabelas (Categoria e SubCategoria), a consulta no BD está funcionando perfeitamente, conforme resultado abaixo:

Tabela categorias:
id
nome_categoria
ordem
status

Tabela subcategoria
id
nome_sub
ordem
id_categoria

Resultado gerado pela query listada abaixo:
id | nome_categoria | items
1 | categoria 1 | Item 1, Item 2, Item 3
2 | categoria 2 | Item 1
3 | categoria 3 | item 2, item 3, item 4


Porém quando tento imprimir o resultado da query utilizando foreach, está ocorrendo o seguinte erro:

Warning: Illegal string offset 'items' in D:\codigo\viewCat.php on line 242
Warning: Illegal string offset 'nome_sub' in D:\codigo\viewCat.php on line 238


Coloquei comentário no código onde está ocorrendo o erro.

Poderia ajudar com o erro? Ou existe outra forma melhor de exibir categoria e sub categorias?

Segue meu código.

Obrigado


<?php
$query = "SELECT c.id,c.nome_categoria, group_concat(s.nome_sub) as items

FROM subcategoria s LEFT JOIN categoria c ON s.id_categoria = c.id 

WHERE c.status = '1'

GROUP BY c.nome_categoria"; 

$res = mysqli_query($mysqli, $query) or die('Erro ao consultar dados. ' . mysqli_error());

$dados = mysqli_fetch_array($res);

foreach($dados as $rowcat){  ?>
        <ul>
                <li><?php 
				echo $rowcat['nome_categoria']; ?></li>
                    <?php 
					
			//ERRO OCORRE AQUI - LINHA 238			
                        $items = $rowcat['items'] ;
                        $items_array = explode(',',$items);
						
											
                        if(is_array($items_array) && count($items_array) > 0 ){
                        ?>
                            <ul>
                                <?php
                                    foreach($items_array as $nome_sub){
                                ?>
                                    <li>
                                        <?php 
										//ERRO OCORRE AQUI - LINHA 242
										echo $nome_sub; ?>
                                    </li>
                                <?php } ?>
                            </ul>
                            <?php }?>
        </ul>
<?php } ?>




<?php
$query = "SELECT c.id,c.nome_categoria, group_concat(s.nome_sub) as items

FROM subcategoria s LEFT JOIN categoria c ON s.id_categoria = c.id

WHERE c.status = '1'

GROUP BY c.nome_categoria";

$res = mysqli_query($mysqli, $query) or die('Erro ao consultar dados. ' . mysqli_error());

$dados = mysqli_fetch_array($res);

foreach($dados as $rowcat){ ?>
<ul>
<li><?php
echo $rowcat['nome_categoria']; ?></li>
<?php

//ERRO OCORRE AQUI - LINHA 238
$items = $rowcat['items'] ;
$items_array = explode(',',$items);


if(is_array($items_array) && count($items_array) > 0 ){
?>
<ul>
<?php
foreach($items_array as $nome_sub){
?>
<li>
<?php
//ERRO OCORRE AQUI - LINHA 242
echo $nome_sub; ?>
</li>
<?php } ?>
</ul>
<?php }?>
</ul>
<?php } ?>

Antonio Almeida

Antonio Almeida

Responder

Posts

02/08/2014

Rafael Carrenho

Olá Antonio,

a forma que você está pegando as linhas do resultado da busca MySQL está na verdade retornando um campo da tabela, ou seja, quando o PHP lê esta linha:

$dados = mysqli_fetch_array($res);


Você está pegando uma linha da tabela, a forma certa seria o seguinte, troque o foreach por um while com o seguinte conteúdo:

while($row = mysqli_fetch_array($res)){
Responder

03/08/2014

Antonio Almeida

Milléo muito obrigado pela ajuda!

Troquei foreach por while, funcionou perfeitamente.

Mais uma vez obrigado.
Responder

03/08/2014

William

Finalizando tópico!!!
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar