Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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;
}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;
}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 /> <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!
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.
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
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;
}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;
}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 /> <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
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?
>
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...
>
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
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.
que bom que conseguiu.
poste a versão funcional do script. pode ser útil para outros usuários ;)
Opa, vou postar sim, só vou limpar mais o código aqui e posto.
teria como no select só mostrar as categorias que tem id = 0?
sim. basta usar uma cláusula where, filtrando pelo id_pai = 0
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;$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 /> <input type="hidden" name="cadastro" value="sub" />
<input type="submit" class="botao" value="Sub-Categoria" />
</fieldset>
</form>
</div>
</body>
</html>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?
um select usando COUNT() com uma condição WHERE filtrando por um id_pai específico mostrará quantas sub-categorias uma categoria possui. com isso você faz a restrição que desejar.
teria como me dar um exemplo? pq agora eu complicou, kkk
Select Count(*) as total From tabela Where id_pai = 5;
vai mostrar o total de categorias-filhas da categoria 5
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.
>
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?
>
Beraldo, essa parte seria na hora de cadastrar, ou na exibição do menu?
você que sabe. quer fazer a limitação em qual momento?
>
>
Beraldo, essa parte seria na hora de cadastrar, ou na exibição do menu?
você que sabe. quer fazer a limitação em qual momento?
Prefiro na hora de cadastrar, é possível?
sim. é só fazer o select antes de cadastrar e conferir o valor de retorno, comparando com o máximo permitido
>
sim. é só fazer o select antes de cadastrar e conferir o valor de retorno, comparando com o máximo permitido
Beraldo o caminho seria, mais ou menos por aqui:
// Aqui começa o script para cadastrar as sub-categorias
$sql_selec = "SELECT COUNT (*) as total FROM categorias WHERE id_pai = 5";
$query_selc = mysql_query($sql_selec) or die ("Erro no Select".mysql_query());
if(isset($_POST['cadastro']) && $_POST['cadastro'] == 'sub'){
// Se o não escolher a categoria no select não cadastra.
if($id_pai == ""){
echo '<script>alert("Escolha uma categoria. ")</script>'; }else if($nome == ""){
echo '<script>alert("Escreva o nome da Sub-Categoria!.")</script>';
}else{
$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>';
}
}
}
Desculpa ai, mais é pq to perdidão mesmo.
Alguém sabe se o caminho é este mesmo?
é por aí, sim, mas o query_selc deve usar o $Ip_pai passado pelo usuário, não o número 5
e coloque o select dentro do mesmo if do insert, já que ele só é necessário na inserção. isso evita uma conexão inútil à base de dados
>
é por aí, sim, mas o query_selc deve usar o $Ip_pai passado pelo usuário, não o número 5
e coloque o select dentro do mesmo if do insert, já que ele só é necessário na inserção. isso evita uma conexão inútil à base de dados
Beraldo fiz desse jeito aqui:
// Aqui começa o script para cadastrar as sub-categorias
if(isset($_POST['cadastro']) && $_POST['cadastro'] == 'sub'){
// Se o não escolher a categoria no select não cadastra.
if($id_pai == ""){
echo '<script>alert("Escolha uma categoria. ")</script>';
// Se não colocar o nome da sub-categoria não cadastra.
}else if($nome == ""){
echo '<script>alert("Escreva o nome da Sub-Categoria!.")</script>';
}else{
// Conta a quantidade de categorias suportadas
$sql_selec = "SELECT COUNT (*) as total FROM categorias WHERE id_pai = 5";
$query_selc = mysql_query($id_pai) or die ("Erro no Select".mysql_query());
$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>';
}
}
}
Só que na hora de cadastrar a sub da o seguinte erro:
Warning: mysql_query() expects at least 1 parameter, 0 given in C:\wamp\www\categorias\cadastrar-cat.php on line 40
Erro no Select
A linha 40 é a variável $query_selec
você está passando $id_pai pra query, ou seja, passando um inteiro em vez de uma stirng sql. passe $sql_selct, mas troque o 5 por $id_pai
não entendi o problema. explique o que está acontecendo.
dá erro? não funciona...?
o que o script está fazendo e o que você quer que ele faça a mais (ou a menos)?