Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Henrique Flausino

[Resolvido] Menu sanfonado

Recommended Posts

Pessoal.

Tenho um banco de dados que contém alguns itens cadastrados com Categoria e Sub-Categoria.

Gostaria de fazer um menu sanfonado, porém não está funcionando.

 

Estou usando esta opção mas o Menu repete as categorias ao invéz de adcionar.

 


<?php
require_once("include/conexao.php");
$sql = "SELECT* FROM categoria ORDER BY id ASC";
$query = @mysql_query($sql);
if (!$query){
die ("Problemas ao executar o sql !!!");
} else {
while ($coluna = @mysql_fetch_array($query)){
$id = $coluna["id"];
$cat = $coluna["categoria"];
$rol = $coluna["categoria"];
$sub = $coluna["subcategoria"];
?>
<li><? echo $cat; ?>
<br />
<a href="exibindo.php?subcategoria=<? echo $sub; ?>">» <? echo $sub; ?></a></li>
<?
}
}
// e para finalizar, fechamos a conexão com servidor MySQL
mysql_close($conn);
?>

Será que alguém poderia me dizer onde estou errando?

 

Att.

Henrique Flausino

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Henrique,

 

mostra aí como está o seu BD pra ficar melhor de te ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só nao esqueça que a hierarquia de uma lista é:

<ul>
  <li>1</li>    //Categorias
  <li>2</li>
    <ul>
        <li>a</li> // Subcategorias
        <li>b</li>
        <li>c</li>
        <li>d</li>
    </ul>
  <li>3</li>
  <li>4</li>
</ul>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Henrique,

 

mostra aí como está o seu BD pra ficar melhor de te ajudar.

 

Olá Diego.

 

Segue abaixo modelo do banco.

 

id

categoria

subcategoria

 

Ex.:

id categoria subcategoria

44 Diet Receitas

45 Diet Produtos

 

Agradeço desde já a ajuda de vocês

 

 

Att.

Henrique Flausino

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por que você não começa alterando esse BD pro seguinte esquema:

CATEGORIAS:
- id_categoria (PK)
- nome

SUBCATEGORIAS
- id_subcategoria (PK)
- id_categoria (FK)
- nome 

Ficaria algo com mais sentido e organizado pro seu BD. Depois só fazer uma consulta pra pegar as categorias e verificar se tem algum registro nas subcategorias e mandar listar, se não tiver, só ir pra próxima categoria.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por que você não começa alterando esse BD pro seguinte esquema:

CATEGORIAS:
- id_categoria (PK)
- nome

SUBCATEGORIAS
- id_subcategoria (PK)
- id_categoria (FK)
- nome 

Ficaria algo com mais sentido e organizado pro seu BD. Depois só fazer uma consulta pra pegar as categorias e verificar se tem algum registro nas subcategorias e mandar listar, se não tiver, só ir pra próxima categoria.

 

Olá Diego.

 

Fiz o que me falou.

Criei duas tabelas

1ª categoria

id (PRIMARY)

categoria

 

2ª sub

id_subcategoria (PRIMARY)

id

subcategoria

 

Código usado para consulta

<?
require_once("include/conexao.php");
$sql = ("SELECT * FROM categoria, sub ORDER BY categoria.id");
$query = @mysql_query($sql);
if (!$query){
die ("Problemas ao executar o sql !!!");
} else {
while ($coluna = @mysql_fetch_array($query)){
$cat = $coluna["categoria"];
$id = $coluna["id_subcategoria"];
$sub = $coluna["subcategoria"];
?>
<ul>
	<li><? echo $cat; ?></li>
    	<ul>
        	<li><? echo $sub; ?></li>
		</ul>
</ul>
<?
}
}
// e para finalizar, fechamos a conexão com servidor MySQL
mysql_close($conn);
?>
Porém o registro está me aparecendo assim:

Receitas

>>Diet

Receitas

>>Light

 

E preciso que seja mostrado assim:

Receitas

>>Diet

>>Light

Compartilhar este post


Link para o post
Compartilhar em outros sites

Voce precisa fazer uma pesquisa dentro de outra (talvez haja outra forma de fazer isso). Podemos montar uma pesquisa que, quando "Categoria" tiver um numero maior que zero de "subcategoria" ele pesquise a quantidade de subcategorias.

 

<?
require_once("include/conexao.php");

aqui sua pesquisa foi incrementada com as clausulas 
COUNT, GROUP BY, para saber quantas subcategorias cada categoria tem.

$sql = ("SELECT categoria.categoria, COUNT(*) AS subs FROM categoria, sub WHERE categoria.id = subcategoria.id GROUP BY categoria.categoria ORDER BY categoria.id");
$query = @mysql_query($sql);
if (!$query){
die ("Problemas ao executar o sql !!!");
} else {
while ($coluna = @mysql_fetch_array($query)){
$cat = $coluna["categoria"];
$subs = $coluna["subs"];
?>
<ul>
	<li><? echo $cat; ?></li>
<? if($subs>0){
                    //Aqui você vai fazer a logica da pesquisa das subcategorias
                }
</ul>
<?
}
}
// e para finalizar, fechamos a conexão com servidor MySQL
mysql_close($conn);
?>

A Logica do COUNT, GROUP BY você encontra aqui: http://dev.mysql.com/doc/refman/4.1/pt/counting-rows.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

Neste meu caso o valor sempre será maior que 2 subs.

Só não estou conseguindo montar esta logica dentro do código como falou.

Será que poderia me dar um ex.?

Nesce código você só está verificando as categorias, coloquei para subcategorias também.

SELECT categoria.categoria, COUNT(*) AS subs, sub.subcategoria FROM categoria, sub WHERE categoria.id = sub.id GROUP BY categoria.categoria ORDER BY categoria.id

Att.

Henrique Flausino

Compartilhar este post


Link para o post
Compartilhar em outros sites

Neste meu caso o valor sempre será maior que 2 subs.

Só não estou conseguindo montar esta logica dentro do código como falou.

Será que poderia me dar um ex.?

Nesce código você só está verificando as categorias, coloquei para subcategorias também.

SELECT categoria.categoria, COUNT(*) AS subs, sub.subcategoria FROM categoria, sub WHERE categoria.id = sub.id GROUP BY categoria.categoria ORDER BY categoria.id

Att.

Henrique Flausino

 

Bom, na verdade esta query recupera a categoria para usar na lista. A ideia seria fazer:

 

$sql = ("SELECT categoria.categoria, categoria.id COUNT(*) AS subs FROM categoria, sub WHERE categoria.id = subcategoria.id GROUP BY categoria.categoria ORDER BY categoria.id");
$query = @mysql_query($sql);
if (!$query){
die ("Problemas ao executar o sql !!!");
} else {
while ($coluna = @mysql_fetch_array($query)){
$cat = $coluna["categoria"];
$subs = $coluna["subs"];
$id = $coluna["id"];

?>

<ul>
       <li><? echo $cat; ?></li>
<? if($subs>0){

echo "<ul>";
    $sql = ("SELECT subcategoria FROM sub WHERE subcategoria.id = $id");
$query = @mysql_query($sql);
if (!$query){
die ("Problemas ao executar o sql !!!");
} else {
while ($coluna = @mysql_fetch_array($query)){
$subcat = $coluna["subcategoria"];

echo "<li>".$subcat."</li>";               }
}
echo "</ul>"; }
</ul>
<?
}
}
// e para finalizar, fechamos a conexão com servidor MySQL
mysql_close($conn);
?>

A idéia é essa, se tiver mais de uma subcategoria, pesquisar quais sao e lista-las. Talvez um mysql_fetch_Object e ajude, mas nunca usei, converter o resultado em objeto (creio que venha em matriz, nao sei qual teu conhecimento para uso tal) http://www.php.net/manual/pt_BR/function.mysql-fetch-object.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, Pierry.

 

Muito obrigado pela ajuda.

Só falta agora um detalhe.

Depois de implementar a consulta não me retornou as demais categorias, parou a 1ª categoria com as subs.

Será que tem algo errado na minha alteração?

 

Não conheço muito de PHP mas estou tentando aprender com pessoas atenciosas como você.

 

<?
require_once("include/conexao.php");
$sql = ("SELECT categoria.categoria, COUNT(*) AS subs FROM categoria, sub WHERE categoria.id = sub.id GROUP BY categoria.categoria ORDER BY categoria.id");
$query = @mysql_query($sql);
if (!$query){
die ("Problemas ao executar o sql !!!");
} else {
while ($coluna = @mysql_fetch_array($query)){
$cat = $coluna["categoria"];
$sub = $coluna["subcategoria"];
$subs = $coluna["subs"];
$id = $coluna["id"];
?>
<ul>
<li><? echo $cat; ?></li>
<? if($subs>0){
echo "<ul>";
$sql2 = ("SELECT subcategoria FROM categoria, sub WHERE categoria.id = sub.id GROUP BY sub.subcategoria ORDER BY categoria.id");
$query = @mysql_query($sql2);
if (!$query){
die ("Problemas ao executar o sql !!!");
} else {
while ($coluna = @mysql_fetch_array($query)){
$subcat = $coluna["subcategoria"];

echo "<li>".$subcat."</li>"; }
}
echo "</ul>"; 
}
?>
</ul>
<?
}
}
// e para finalizar, fechamos a conexão com servidor MySQL
mysql_close($conn);
?>
Muito obrigado pela atenção e ajuda.

 

Att.

Henrique Flausino

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é boa ideia consultas SQL dentro de loop. Ainda mais se tratando de consultas inúteis (repetidas).

 

Vou dar um palpite:

$sql = ("SELECT c.categoria, c.id, sc.id as sub_id, sc.categoria as sub_categoria FROM categoria c, sub sc WHERE c.id = sc.id ORDER BY c.id");
$query = @mysql_query($sql);

$c = array();
while ($coluna = @mysql_fetch_array($query))
   $c[] = $coluna;

mysql_close($conn);

$categorias = array();
foreach ($c as $categoria)
{
   extract($categoria);
   $cat = array();
   $sub = array();
   $sub["id"] = $sub_id;
   $sub["nome"] = $sub_categoria;
   $cat["sub_categorias"][] = $sub;
   $cat["id"] = $id;
   $cat["nome"] = $categoria;

   $categorias[] = $cat;
}
unset($c);
...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, Jaime.

 

Poderia me explicar como funciona esta função que me passou?

Acredito que seja mais ou menos assim:

 

<?
require_once("include/conexao.php");
$sql = ("SELECT categoria.categoria, categoria.id, sub.id as sub_id, sub.subcategoria as sub_categoria FROM categoria, sub WHERE categoria.id = sub.id ORDER BY categoria.id");
$query = @mysql_query($sql);
$c = array();
while ($coluna = @mysql_fetch_array($query))
    $c[] = $coluna;

mysql_close($conn);

$categorias = array();
foreach ($c as $categoria)
{
    extract($categoria);
    $cat = array();
    $sub = array();
    $sub["sub_id"] = $sub_id;
    $sub["subcategoria"] = $sub_categoria;
    $cat["sub_categorias"][] = $sub;
    $cat["id"] = $id;
    $cat["categoria"] = $categoria;
    
    $categorias[] = $cat;
}
unset($c);

?>
<?

// e para finalizar, fechamos a conexão com servidor MySQL
mysql_close($conn);
?>
Coloquei mas não apareceu nada.

Poderia me ajudar?

Somente relembrando, não entendo muito de php, mas estou tentando aprender.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou postar abaixo o script com o html:

require_once("include/conexao.php");
$sql = ("SELECT categoria.categoria, categoria.id, sub.id as sub_id, sub.subcategoria as sub_categoria FROM categoria, sub WHERE categoria.id = sub.id ORDER BY categoria.id");
$query = @mysql_query($sql);
$c = array();
while ($coluna = @mysql_fetch_array($query))
   $c[] = $coluna;

mysql_close($conn);

$categorias = array();
foreach ($c as $categoria)
{
   extract($categoria);
   $cat = array();
   $sub = array();
   $sub["sub_id"] = $sub_id;
   $sub["subcategoria"] = $sub_categoria;
   $cat["sub_categorias"][] = $sub;
   $cat["id"] = $id;
   $cat["categoria"] = $categoria;

   $categorias[] = $cat;
}
unset($c);

?>

<?php if (count($categorias) > 0):?>
<?php foreach ($categorias as $categoria):?>
	<ul>
		<li><?php echo $categoria["categoria"];?></li>
	<?php if (count($categoria["sub_categorias"]) > 0):?>
		<ul>
		<?php foreach ($categoria["sub_categorias"] as $sub_categoria):
			<li><?php echo $sub_categoria["subcategoria"];?></li>	
		<?php endforeach;?>
		</ul>
	<?php endif;?>
	</ul>
<?php endforeach;?>
<?php endif;?>

 

Vê o que acontece agora...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não aparece nada, nenhum erro.

Estou usando apenas este ultimo código que me foi informado.

conexao.php

<?

/* informações para conexão à base de dados */

$host = "localhost";  // host do mysql
$user = "@@@@";       // usuário
$pass = "@@@@@";     // senha do usuário
$base = "@@@@@@"; // nome da base de dados

// conecta o mysql
$conn = mysql_connect($host, $user, $pass) or die ("<br><br><center>Problemas ao conectar no servidor: " . mysql_error() . "</center>");
// seleciona a base de dados
$banc = mysql_select_db($base) or die ("<br><br><center>Problemas ao selecionar a base de dados do sistemas: " . mysql_error() . "</center>");

?>
exibir.php

<?
require_once("include/conexao.php");
$sql = ("SELECT categoria.categoria, categoria.id, sub.id as sub_id, sub.subcategoria as sub_categoria FROM categoria, sub WHERE categoria.id = sub.id ORDER BY categoria.id");
$query = @mysql_query($sql);
$c = array();
while ($coluna = @mysql_fetch_array($query))
    $c[] = $coluna;

mysql_close($conn);

$categorias = array();
foreach ($c as $categoria)
{
    extract($categoria);
    $cat = array();
    $sub = array();
    $sub["sub_id"] = $sub_id;
    $sub["subcategoria"] = $sub_categoria;
    $cat["sub_categorias"][] = $sub;
    $cat["id"] = $id;
    $cat["categoria"] = $categoria;
    
    $categorias[] = $cat;
}
unset($c);

?>

<?php if (count($categorias) > 0):?>
        <?php foreach ($categorias as $categoria):?>
                <ul>
                        <li><?php echo $categoria["categoria"];?></li>
                <?php if (count($categoria["sub_categorias"]) > 0):?>
                        <ul>
                        <?php foreach ($categoria["sub_categorias"] as $sub_categoria):
                                <li><?php echo $sub_categoria["subcategoria"];?></li>   
                        <?php endforeach;?>
                        </ul>
                <?php endif;?>
                </ul>
        <?php endforeach;?>
<?php endif;?>
--

-- Estrutura da tabela `categoria`

--

 

CREATE TABLE IF NOT EXISTS `categoria` (

`id` int(11) NOT NULL auto_increment,

`categoria` char(100) NOT NULL default '',

PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=54 ;

 

--

-- Estrutura da tabela `sub`

--

 

CREATE TABLE IF NOT EXISTS `sub` (

`id_subcategoria` int(11) NOT NULL auto_increment,

`id` int(11) NOT NULL default '0',

`subcategoria` char(100) NOT NULL default '',

PRIMARY KEY (`id_subcategoria`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Foi mal, Henrique. Rateei feio.

 

Fiz este script para agrupar, mas tem um erro, além de um parse error. Não tive tempo de testar.

 

 

Este está ok, testado.

O primeiro array $c simula um record set.

 

É uma solução simples, não gambiarra.

$c = array(
array("id" => 1, "categoria" => "categoria_1", "sub_categoria" =>  "sub_categoria_1", "sub_id" => 1),
array("id" => 1, "categoria" => "categoria_1", "sub_categoria" => "sub_categoria_2", "sub_id" => 2),
array("id" => 2, "categoria" => "categoria_2", "sub_categoria" => "sub_categoria_3", "sub_id" => 3 ),
);


$categorias = array();
foreach ($c as $categoria)
{
   extract($categoria);
   $cat = array();
   $sub = array();
   $sub["sub_id"] = $sub_id;
   $sub["subcategoria"] = $sub_categoria;
   $categorias[$id]["sub_categorias"][] = $sub;
   $categorias[$id]["id"] = $id;
   $categorias[$id]["categoria"] = $categoria;
}
unset($c);

?>

<?php if (count($categorias) > 0):?>
       <?php foreach ($categorias as $categoria):?>
               <ul>
	    <li><?php echo $categoria["categoria"];?></li>
               <?php if (count($categoria["sub_categorias"]) > 0):?>
                       <ul>
                       <?php foreach ($categoria["sub_categorias"] as $sub_categoria):?>
                               <li><?php echo $sub_categoria["subcategoria"];?></li>   
                       <?php endforeach;?>
                       </ul>
               <?php endif;?>
               </ul>
       <?php endforeach;?>
<?php endif;?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia.

 

Cara não entendi nada deste array.

você me passou assim:

$c = array(
        array("id" => 1, "categoria" => "categoria_1", "sub_categoria" =>  "sub_categoria_1", "sub_id" => 1),
        array("id" => 1, "categoria" => "categoria_1", "sub_categoria" => "sub_categoria_2", "sub_id" => 2),
        array("id" => 2, "categoria" => "categoria_2", "sub_categoria" => "sub_categoria_3", "sub_id" => 3 ),
);
Teste e não funcionou, ai modifiquei para isso:

$c = array(
        array("id" => 1, "categoria" => "categoria_1", "sub_categoria" => "sub_categoria_1", "sub_id" => 1),
        array("id" => 2, "categoria" => "categoria_2", "sub_categoria" => "sub_categoria_2", "sub_id" => 2),
        array("id" => 3, "categoria" => "categoria_3", "sub_categoria" => "sub_categoria_3", "sub_id" => 3 ),
);
E para minha surpresa... não funcionou também rsrs.

 

Segue meu código completo com a ultima alteração.

 

<?
require_once("include/conexao.php");
$sql = ("SELECT categoria.categoria, categoria.id, sub.id_subcategoria as sub_id, sub.subcategoria as sub_categoria FROM categoria, sub WHERE categoria.id = sub.id ORDER BY categoria.id");
$query = @mysql_query($sql);
$c = array(
        array("id" => 1, "categoria" => "categoria_1", "sub_categoria" => "sub_categoria_1", "sub_id" => 1),
        array("id" => 2, "categoria" => "categoria_2", "sub_categoria" => "sub_categoria_2", "sub_id" => 2),
        array("id" => 3, "categoria" => "categoria_3", "sub_categoria" => "sub_categoria_3", "sub_id" => 3 ),
);


$categorias = array();
foreach ($c as $categoria)
{
    extract($categoria);
    $cat = array();
    $sub = array();
    $sub["sub_id"] = $sub_id;
    $sub["subcategoria"] = $sub_categoria;
    $categorias[$id]["sub_categoria"][] = $sub;
    $categorias[$id]["id"] = $id;
    $categorias[$id]["categoria"] = $categoria;
}
unset($c);

?>
<?php echo $c;?>
<?php if (count($categorias) > 0):?>
        <?php foreach ($categorias as $categoria):?>
                <ul>
                    <li><?php echo $categoria["categoria"];?></li>
                <?php if (count($categoria["sub_categoria"]) > 0):?>
                        <ul>
                        <?php foreach ($categoria["sub_categoria"] as $sub_categoria):?>
                                <li><?php echo $sub_categoria["subcategoria"];?></li>   
                        <?php endforeach;?>
                        </ul>
                <?php endif;?>
                </ul>
        <?php endforeach;?>
<?php endif;?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testa agora. Se não funcionar, poste o erro:

 

<?
require_once("include/conexao.php");
$sql = ("SELECT categoria.categoria, categoria.id, sub.id as sub_id, sub.subcategoria as sub_categoria FROM categoria, sub WHERE categoria.id = sub.id ORDER BY categoria.id");
$query = @mysql_query($sql);

$c=array();
while ($reg = mysql_fetch_assoc($query))
{
$c[] = $reg;
}
mysql_close($conn);

$categorias = array();
foreach ($c as $categoria)
{
   extract($categoria);
   $cat = array();
   $sub = array();
   $sub["sub_id"] = $sub_id;
   $sub["subcategoria"] = $sub_categoria;
   $cat["sub_categorias"][] = $sub;
   $cat["id"] = $id;
   $cat["categoria"] = $categoria;

   $categorias[] = $cat;
}
unset($c);

?>

<?php if (count($categorias) > 0):?>
       <?php foreach ($categorias as $categoria):?>
               <ul>
                       <li><?php echo $categoria["categoria"];?></li>
               <?php if (count($categoria["sub_categorias"]) > 0):?>
                       <ul>
                       <?php foreach ($categoria["sub_categorias"] as $sub_categoria):?>
                               <li><?php echo $sub_categoria["subcategoria"];?></li>   
                       <?php endforeach;?>
                       </ul>
               <?php endif;?>
               </ul>
       <?php endforeach;?>
<?php endif;?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desconsidera este post acima: Já tinha corrigido o código... Favor utilizar este:

 

<?
require_once("include/conexao.php");
$sql = ("SELECT categoria.categoria, categoria.id, sub.id as sub_id, sub.subcategoria as sub_categoria FROM categoria, sub WHERE categoria.id = sub.id ORDER BY categoria.id");
$query = @mysql_query($sql);

$c=array();
while ($reg = mysql_fetch_assoc($query))
{
$c[] = $reg;
}
mysql_close($conn);

$categorias = array();
foreach ($c as $categoria)
{
   extract($categoria);
   $sub = array();
   $sub["sub_id"] = $sub_id;
   $sub["subcategoria"] = $sub_categoria;
   $categorias[$id]["sub_categorias"][] = $sub;
   $categorias[$id]["id"] = $id;
   $categorias[$id]["categoria"] = $categoria;
}
unset($c);

?>

<?php if (count($categorias) > 0):?>
       <?php foreach ($categorias as $categoria):?>
               <ul>
                       <li><?php echo $categoria["categoria"];?></li>
               <?php if (count($categoria["sub_categorias"]) > 0):?>
                       <ul>
                       <?php foreach ($categoria["sub_categorias"] as $sub_categoria):?>
                               <li><?php echo $sub_categoria["subcategoria"];?></li>   
                       <?php endforeach;?>
                       </ul>
               <?php endif;?>
               </ul>
       <?php endforeach;?>
<?php endif;?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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