Ir para conteúdo

Arquivado

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

Guilherme Peixoto

[Resolvido] Cadastrar sub-categorias

Recommended Posts

Iai galera tudo bem?

estou com um probleminha aqui, estou fazendo um sisteminha em que o cliente possa criar categorias e sub-Categorias, com base no tutorial do blog do Beraldo ESSE AQUI, até ai tudo bem, o banco de dados está dessa forma:

 

mysql> select * from categorias;

+----+--------+----------------------+

| id | id_pai | nome |

+----+--------+----------------------+

| 1 | 0 | A Empresa |

| 2 | 1 | Sobre Nós |

| 3 | 1 | Objetivos |

| 4 | 3 | Objetivo dos nossos |

| 5 | 0 | Contato |

| 6 | 0 | Produtos |

+----+--------+----------------------+

6 rows in set (0,00 sec)

 

Quem possui id_pai = 0 são as principais categorias.

 

Fiz um form onde o cliente poderá criar a categoria desejada, para criar a categoria principal ta ok, só que preciso criar as sub-categorias.

eu parei no meio do caminho praticamente, não sei como criar a sub resgatando o id_pai da categoria principal.

 

meu form está assim:

<?php 
 include_once('conexao.php');

$nome =  isset($_POST['nome']) ? $_POST['nome'] : false;

if(isset($_POST['cadastro']) && $_POST['cadastro'] == 'add'){
if($nome == ""){
   echo '<script>alert("Preencha o Nome")</script>';

}else{
if(isset($_POST['cadastro']) && $_POST['cadastro'] == 'add'){
         $sql = "INSERT INTO categorias VALUES (null, 0, '$nome')";
         $query = mysql_query($sql) or die ("Erro na Insercao ao bando de dados".mysql_error());

         if ($query == true) {
              echo '<script>alert("Categoria cadastrada!")</script>';
         }else{
              echo '<script>alert("Ocorreu algum erro ao cadastrar a Categoria!")</script>';
         }
    }
}
}



//SQL  para listar os albuns
$query = mysql_query("SELECT * FROM categorias ORDER BY nome") or die(mysql_error());

?>





<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>Cadastrar Albuns</title>
   <style type="text/css">
<!--
#corpo{
margin:0 auto;
text-align:center;
}
.titulo{
font-family:Verdana, Geneva, sans-serif;
font-size:20px;
background-color:#09F;
color:#FFF;
text-align:left;
padding:10px;
}
.descricoes {
font-family: verdana;
font-size: 16px;
color:#333333;
letter-spacing:1px;
}
.botao {
background-color: #333333;
height: 40px;
width: 150px;
font-family: verdana;
color: #FFFFFF;
border:0;
font-size: 16px;
cursor:pointer;
border-radius: 5px 5px 5px;
-moz-border-radius: 5px 5px 5px;
-webkit-border-radius: 5px 5px 5px;
float:right;
}
.botao:hover{
background-color:#404040;
}
.textfild {
font-family: Verdana;
font-size: 14px;
font-weight:bold;
color: #333333;
height: 25px;
width: 400px;
border:1px solid #666666;
}
.textarea{
font-family: Verdana;
font-size: 14px;
color: #333333;
height: 150px;
width: 400px;
border:1px solid #666666;
}
.resumo{
width:400px;
font-family: Verdana;
font-size: 14px;
color: #333333;
}
.obs{
font-family:Verdana, Arial, Helvetica, sans-serif;
font-size:11px;
color:#333;
}
.importante{
font-family:Verdana, Arial, Helvetica, sans-serif;
font-size:14px;
color:#F00;
}
fieldset{
border:0;
}

-->
</style>
</head>
<body>
<div id="corpo">
<h2 class="titulo">Cadastrar uma Categoria</h2>
<form action="" method="post" enctype="multipart/form-data">

<fieldset>
	<label><span class="descricoes">Nome Categoria<br />
	</span>
   <input name="nome" type="text" class="textfild" /></label>
	<br />
  <br />
 <label><br /></label>
	<!-- Indica o tipo que será, no se for album ou Imagem -->
 <input type="hidden" name="cadastro" value="add" />
	<br />
	<input type="submit" class="botao" value=" Categoria" />
</fieldset>
</form>

<br /><br />

<h2 class="titulo">Criar sub-categoria</h2>
	<form action="" method="post" enctype="multipart/form-data">
	<span class="importante"> <?php 
		if(isset($msgFoto)) {
			printf('<p>%s</p>', $msgFoto);
		}
 ?>
    </span>
 <fieldset>
	<label><span class="descricoes"><br />
    Escolha uma Categoria</span>
<select name="id_album">
		  <option value="" selected="selected">Categorias</option>
		  <?php 
				while($row = mysql_fetch_assoc($query)) {
					printf('<option value="%u">%s</option>', $row['id_pai'], $row['nome']);
				}
			?>
		  </select>
 </label>
	<br />
	<br />
<br />

	<label><span class="descricoes">Nome da Sub-Categoria<br />
	</span></label>
  <label for="nome2"></label>
	<input name="nome2" type="text" class="textfild" id="nome2" />
	<label><span class="descricoes">	    </span></label>
  <label for="nome"></label>
  <br />
<!-- Indica o tipo que será, no se for album ou Imagem -->
	<input type="hidden" name="cadastro" value="add" />
	<input type="submit" class="botao" value="Sub-Categoria" />
</fieldset>

</form>
</div>
</body>
</html>

Desde já agradeço e até mais!

Compartilhar este post


Link para o post
Compartilhar em outros sites

não esta dando erro, eu consegui criar as categorias principais com id_pai = 0, e tbm consegui printar as categorias no selected, ai falta a ultima parte que não sei como fazer, escolher a categoria no selected e criar a sub-categoria da categoria escolhida.

Compartilhar este post


Link para o post
Compartilhar em outros sites

o select id_album irá enviar o ID da categoria-pai. aí basta fazer o insert na tabela assim:

 

insert into tabela(id_pai, nome) values( id_album, 'nome_da_categoria');

 

é parecido com o que você já fez, porém, em vez de 0 em id_pai, você usará o valor de $id_album

Compartilhar este post


Link para o post
Compartilhar em outros sites

esse id_album, é porque aproveitei outro script, só que ele está me fazendo confundir ainda mais, troquei os nomes aqui para ficar mais fácil pra mim e no momento meu código está assim:

 


<?php 
 include_once('conexao.php');

$nome =  isset($_POST['nome']) ? $_POST['nome'] : false;

if(isset($_POST['cadastro']) && $_POST['cadastro'] == 'add'){
if($nome == ""){
   echo '<script>alert("Preencha o Nome")</script>';

}else{
if(isset($_POST['cadastro']) && $_POST['cadastro'] == 'add'){
         $sql = "INSERT INTO categorias VALUES (null, 0, '$nome')";
         $query = mysql_query($sql) or die ("Erro na Insercao ao bando de dados".mysql_error());

         if ($query == true) {
              echo '<script>alert("Categoria cadastrada!")</script>';
         }else{
              echo '<script>alert("Ocorreu algum erro ao cadastrar a Categoria!")</script>';
         }
    }
}
}

// Aqui começa o script para cadastrar as sub-categorias

if(isset($_POST['cadastro']) && $_POST['cadastro'] == 'add'){
         $sql = "INSERT INTO categorias VALUES(null, '$id', '$nome')";
         $query = mysql_query($sql) or die ("Erro na Insercao ao bando de dados".mysql_error());

         if ($query == true) {
              echo '<script>alert("Sub-Categoria cadastrada!")</script>';
         }else{
              echo '<script>alert("Ocorreu algum erro ao cadastrar a Sub-Categoria!")</script>';
         }
    }


//SQL  para listar os albuns
$query = mysql_query("SELECT * FROM categorias ORDER BY nome") or die(mysql_error());

?>





<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>Cadastrar Albuns</title>
   <style type="text/css">
<!--
#corpo{
margin:0 auto;
text-align:center;
}
.titulo{
font-family:Verdana, Geneva, sans-serif;
font-size:20px;
background-color:#09F;
color:#FFF;
text-align:left;
padding:10px;
}
.descricoes {
font-family: verdana;
font-size: 16px;
color:#333333;
letter-spacing:1px;
}
.botao {
background-color: #333333;
height: 40px;
width: 150px;
font-family: verdana;
color: #FFFFFF;
border:0;
font-size: 16px;
cursor:pointer;
border-radius: 5px 5px 5px;
-moz-border-radius: 5px 5px 5px;
-webkit-border-radius: 5px 5px 5px;
float:right;
}
.botao:hover{
background-color:#404040;
}
.textfild {
font-family: Verdana;
font-size: 14px;
font-weight:bold;
color: #333333;
height: 25px;
width: 400px;
border:1px solid #666666;
}
.textarea{
font-family: Verdana;
font-size: 14px;
color: #333333;
height: 150px;
width: 400px;
border:1px solid #666666;
}
.resumo{
width:400px;
font-family: Verdana;
font-size: 14px;
color: #333333;
}
.obs{
font-family:Verdana, Arial, Helvetica, sans-serif;
font-size:11px;
color:#333;
}
.importante{
font-family:Verdana, Arial, Helvetica, sans-serif;
font-size:14px;
color:#F00;
}
fieldset{
border:0;
}

-->
</style>
</head>
<body>
<div id="corpo">
<h2 class="titulo">Cadastrar uma Categoria</h2>
<form action="" method="post" enctype="multipart/form-data">

<fieldset>
	<label><span class="descricoes">Nome Categoria<br />
	</span>
   <input name="nome" type="text" class="textfild" /></label>
	<br />
  <br />
 <label><br /></label>
	<!-- Indica o tipo que será, no se for album ou Imagem -->
 <input type="hidden" name="cadastro" value="add" />
	<br />
	<input type="submit" class="botao" value=" Categoria" />
</fieldset>
</form>

<br /><br />

<h2 class="titulo">Criar sub-categoria</h2>
	<form action="" method="post" enctype="multipart/form-data">
	<span class="importante"> <?php 
		if(isset($msgFoto)) {
			printf('<p>%s</p>', $msgFoto);
		}
 ?>
    </span>
 <fieldset>
	<label><span class="descricoes"><br />
    Escolha uma Categoria</span>
<select name="id_pai">
		  <option value="" selected="selected">Categorias</option>
		  <?php 
				while($row = mysql_fetch_assoc($query)) {
					printf('<option value="%u">%s</option>', $row['id_pai'], $row['nome']);
				}
			?>
	  </select>
 </label>
	<br />
	<br />
<br />

  <label><span class="descricoes">Nome da Sub-Categoria<br />
	</span></label>
  <label for="nome"></label>
	<input name="nome" type="text" class="textfild" id="nome" />
	<label><span class="descricoes">	    </span></label>
  <label for="nome"></label>
  <br />
<!-- Indica o tipo que será, no se for album ou Imagem -->
	<input type="hidden" name="cadastro" value="add" />
	<input type="submit" class="botao" value="Sub-Categoria" />
</fieldset>

</form>
</div>
</body>
</html>

 

 

Só que ainda não estou dando conta de pegar o ID e gravar no ID_PAI

Compartilhar este post


Link para o post
Compartilhar em outros sites

você está executando este if duas vezes:

if(isset($_POST['cadastro']) && $_POST['cadastro'] == 'add'){

 

ou seja, irá cadastrar a mesma categoria sempre duas vezes, como pai e como filha. agrupe tudo no mesmo if.

 

verifique se id_pai é vazio (será categoria pai, fazendo insert com 0).

caso contrário, id_pai será utilizado.

 

outra coisa: $id surgiu do nada. onde você cria essa variável?

Compartilhar este post


Link para o post
Compartilhar em outros sites

você está executando este if duas vezes:

if(isset($_POST['cadastro']) && $_POST['cadastro'] == 'add'){

 

ou seja, irá cadastrar a mesma categoria sempre duas vezes, como pai e como filha. agrupe tudo no mesmo if.

 

verifique se id_pai é vazio (será categoria pai, fazendo insert com 0).

caso contrário, id_pai será utilizado.

 

outra coisa: $id surgiu do nada. onde você cria essa variável?

 

A parte de cadastrar 2 vezes arrumei, só não entendi essa parte que você falou

 

"caso contrário, id_pai será utilizado"

 

essa parte mesmo que ta pegando...

Compartilhar este post


Link para o post
Compartilhar em outros sites

só não entendi essa parte que você falou

 

"caso contrário, id_pai será utilizado"

 

essa parte mesmo que ta pegando...

 

se o cara selecionar uma categoria-pai, você usará esse valor (que estará em $id_pai - crie essa variável, pois você não a criou) em vez de 0

um simples if. nada mais

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só que no meu SELECT

ele está printando as categorias desse jeito

<select name="id_pai">
		  <option value="" selected="selected">Categorias</option>
		  <?php 
				while($row = mysql_fetch_assoc($query)) {
					printf('<option value="%u">%s</option>', $row['id_pai'], $row['nome']);
				}
			?>
	  </select>

 

como eu recupero esse $row['id_pai'] para jogar no meu INSERT?

 

Beraldo, consegui finalmente. Obrigado pela paciência ai Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, funcionou que é uma beleza, mais uma vez obrigado!

 

e aqui vai o código pra galera que tiver duvidas em criar Categorias e Sub-Categorias.

 

BD categorias


CREATE TABLE IF NOT EXISTS `categorias` (
 `id` int(5) unsigned NOT NULL AUTO_INCREMENT,
 `id_pai` int(5) unsigned NOT NULL,
 `nome` varchar(20) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;

 

Menu.php

 

<?php
// array que conterá as categorias
$cats = array();

$mysqli = new mysqli( 'localhost', 'root', '', 'menu' );

$sql = 'SELECT * FROM categorias ORDER BY nome';

$exec = $mysqli->query( $sql ) or exit( $mysqli->error );

$i = 1;
while ( $f = $exec->fetch_object() )
{
$cats[$i]['id'] = $f->id;
$cats[$i]['id_pai'] = $f->id_pai;
$cats[$i]['nome'] = $f->nome;
$i++;
}

/**
* Função que monta o menu com as categorias e subcategorias.
* @param id_pai ID da categoria pai cujas subcategorias serão buscadas.
* @param ArrayCats Array com as categorias do menu.
*/
function montaMenu( $id_pai, $arrayCats )
{
// calcula o número de índices do array
$catsSize = count( $arrayCats );

echo "<ul>";

for ( $i = 1; $i <= $catsSize; $i++ )
{
	if ( $arrayCats[ $i ]['id_pai'] == $id_pai )
	{
		echo "<li>";
			echo $arrayCats[ $i ]['nome'];

		// busca as subcategorias da categoria atual
		montaMenu( $arrayCats[ $i ]['id'], $arrayCats );

		echo "</li>";
	}
}
echo "</ul>";
}
?>

<a href="#"><?php  echo montaMenu( 0, $cats ); ?></a>

 

Cadastrar-categorias.php

<?php 
 include_once('conexao.php');

$nome 	=  isset($_POST['nome']) ? $_POST['nome'] : false;
$id_pai =  isset($_POST['id_pai']) ? $_POST['id_pai'] : false;

if(isset($_POST['cadastro']) && $_POST['cadastro'] == 'add'){
if($nome == ""){
   echo '<script>alert("Preencha o Nome")</script>';

}else{
if(isset($_POST['cadastro']) && $_POST['cadastro'] == 'add'){
         $sql = "INSERT INTO categorias VALUES (null, 0, '$nome')";
         $query = mysql_query($sql) or die ("Erro na Insercao ao bando de dados".mysql_error());

         if ($query == true) {
              echo '<script>alert("Categoria cadastrada!")</script>';
         }else{
              echo '<script>alert("Ocorreu algum erro ao cadastrar a Categoria!")</script>';
         }
    }
}
}

// Aqui começa o script para cadastrar as sub-categorias

if(isset($_POST['cadastro']) && $_POST['cadastro'] == 'sub'){
         $sql = "INSERT INTO categorias VALUES(null, '%s', '%s')";
	  $sql = sprintf($sql, $id_pai, $nome);
         $query = mysql_query($sql) or die ("Erro na Insercao ao bando de dados".mysql_error());

         if ($query == true) {
              echo '<script>alert("Sub-Categoria cadastrada!")</script>';
         }else{
              echo '<script>alert("Ocorreu algum erro ao cadastrar a Sub-Categoria!")</script>';
         }
    }

//SQL  para listar os albuns
//WHERE id_pai = 0 serve para mostrar somente categorias que possui id_pai = 0
$query = mysql_query("SELECT * FROM categorias WHERE id_pai = 0 ORDER BY nome") or die(mysql_error());

?>





<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>Cadastrar Albuns</title>

</head>
<body>
<div id="corpo">
<h2 class="titulo">Cadastrar uma Categoria</h2>
<form action="" method="post" enctype="multipart/form-data">

<fieldset>
	<label><span class="descricoes">Nome Categoria<br />
	</span>
   <input name="nome" type="text" class="textfild" /></label>
	<br />
  <br />
 <label><br /></label>
	<!-- Indica o tipo que será, no se for album ou Imagem -->
 <input type="hidden" name="cadastro" value="add" />
	<br />
	<input type="submit" class="botao" value=" Categoria" />
</fieldset>
</form>

<br /><br />

<h2 class="titulo">Criar sub-categoria</h2>
	<form action="" method="post" enctype="multipart/form-data">
 <fieldset>
	<label><span class="descricoes"><br />
    Escolha uma Categoria</span>
<select name="id_pai">
		  <option value="" selected="selected">Categorias</option>
		  <?php 
				while($row = mysql_fetch_assoc($query)) {
					printf('<option value="%u">%s</option>', $row['id'], $row['nome']);
				}
			?>
	  </select>
 </label>
	<br />
	<br />
<br />

  <label><span class="descricoes">Nome da Sub-Categoria<br />
	</span></label>
  <label for="nome"></label>
	<input name="nome" type="text" class="textfild" id="nome" />
	<label><span class="descricoes">	    </span></label>
  <label for="nome"></label>
  <br />
<!-- Indica o tipo que será, no se for album ou Imagem -->
	<input type="hidden" name="cadastro" value="sub" />
	<input type="submit" class="botao" value="Sub-Categoria" />
</fieldset>

</form>
</div>
</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aproveitando o tópico novamente, alguém sabe me dizer se é possivel limitar a quantidade de categorias e sub-categorias?

Por exemplo, a pessoa só pode criar 10 categorias com 5 sub em cada?

Compartilhar este post


Link para o post
Compartilhar em outros sites

As categorias principais consegui limitar, só as sub que não, nas principais fiz assim:

$query = mysql_query("SELECT * FROM categorias WHERE id_pai = 0 ORDER BY id DESC LIMIT 5") or die(mysql_error());

Achei mais fácil.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Select Count(*) as total From tabela Where id_pai = 5;

 

vai mostrar o total de categorias-filhas da categoria 5

Beraldo, essa parte seria na hora de cadastrar, ou na exibição do menu?

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.