Consulta Categoria e Sub Categoria - PHP e MySql

02/08/2014

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 } ?>

PHP

Antonio Almeida

Respostas

02/08/2014

Milléo

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 Citar

03/08/2014

Antonio Almeida

Milléo muito obrigado pela ajuda!

Troquei foreach por while, funcionou perfeitamente.

Mais uma vez obrigado.
Responder Citar

03/08/2014

William (devwilliam)

Finalizando tópico!!!
Responder Citar