Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

rickygac

[Resolvido] Categorias e Subcategorias

Mensagens Recomendadas

rickygac

Boa noite, precisava de criar onde tenho o select das categorias (pre-definidas no codigo), passar esses dados antes para a db em vez de os ter no codigo e no lugar deste select, colocar outro que fosse buscar esses dados ao db e os mostrasse no select e a frente um input que permitisse criar uma nova categoria ou no caso de ja selecionada uma no select usar essa ou criar uma subcategoria dessa... ex:

SELECT (vai ao db buscar as categorias existentes) INPUT (permite criar categorias novas ou caso se escolha no select uma permite criar uma subcategoria)

[sELECT] + [iNPUT] = [CATEGORIAS E SUBCATEGORIAS NO DB]

o meu código atual é (index.php):

<html>
<body>

<?php
include "ligar-bd.php";
include "estilos/estilos.css";

ini_set('default_charset','UTF-8');

include "conta_total.php";
?>

<center>
<titulo>Adicionar Nova Entrada</titulo>
<hr size=1 width=500 class="degrade">

<form action="envia.php" method="POST" enctype="multipart/form-data">

<table align="center" width="500px" border="0" cellpading="4" cellspacing="8" bgcolor="#f0f0f0">
<tr>
<td align="center">
<hr size=1 width=500 class="degrade">
Nome:
<br>
<input type="text" name="nome">

Categoria:
<br>
<select name="categoria">
<option>teste 1</option>
<option>teste 2</option>
</select>
<br><br>

Adicionar uma imagem:
<br>
<input type="file" name="file">

<hr size=1 width=500 class="degrade">
<br>
<input type="submit" value="Adicionar Entrada" class="button buttonfx buttonredondo">
<br>
<br>

</td>
</tr>
</table>

</form>

<?php include "rodape.php"; ?>

</center>

</body>
</html>

depois tenho outro com os dados php para enviar (envia.php)

Editado por rickygac

Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruicosta.web

Até fico com "medo" de dar a minha opinião, pois pode levar à divisão de tabelas....depois vem um php expert (Não quer dizer que seja Database expert) e diz para juntar tudo se não irá complicar

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

nãop precisas ficar ofendido com nada, a pessoa que te falo é realmente veterana em php, o brasileiro Beraldo do forum script brasil... so estava a comentar ctg que no ver dele uma so tabela basta e realmente faz todo o sentido, porquê complicar quando se pode simplificar... mas estou aberto a sugestões, o principal é resolver o problema seja da forma mais eficaz ou nao...


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruicosta.web

Não fico ofendido,fico é perplexo, mas ok. Seguindo:

Tabela categorias

id

id_parent

categoria

Com isto tens categorias/subcategorias, subsubcategorias e por ai adiante.

O id_parent serve para indicares o id da categoria a que pertence

1 | 0 | Fotografias

2 | 1 | Fotografias de Animais

3 | 1 | Fotografias Urbanas

4 | 2 | Fotografias de Pássaros

Esta seria a base.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

olha so para veres a tal forma como o veterano me disse para fazer e que funciona...

CREATE TABLE IF NOT EXISTS `categorias` (
`id` int(5) unsigned NOT NULL AUTO_INCREMENT,
`catID` int(5) unsigned NOT NULL,
`categoria` varchar(30) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

INSERT INTO `categorias` (`id`, `catID`, `categoria`) VALUES
(1, 0, 'A Empresa'),
(2, 1, 'Sobre Nós'),
(3, 1, 'Objetivos'),
(4, 3, 'Objetivo dos nossos clientes'),
(5, 0, 'Contato'),
(6, 0, 'Produtos');

<?php

// LIGA-SE Á BASE DE DADOS
include('ligar-bd.php');

// array que conterá as categorias
$sql = 'SELECT id, catID, categoria FROM categorias';

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

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


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

echo "<ul>";

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

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

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

// PARA MOSTRAR O MENU BASTA CHAMAR A FUNÇÃO ABAIXO
montaMenu( 0, $cats );

?>

Editado por rickygac

Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

agora a minha questão é saber como adaptar isso ao meu código atual (acima), porque o ideal seria:

ter um campo select com a primeira opção vazia e que iria buscar à base de dados (caso existissem categorias) as categorias existentes e mostrava-as dentro das várias "<option>" do select...

ao clicar em enviar, era feita uma verificação que caso o campo categoria estivesse vazio (não existissem categorias selecionadas) o valor do campo subcategoria, passaria a ser inserido como categoria ou caso tivesse sida selecionada uma categoria, o valor inserido em subcategoria seria a nova subcategoria.

caso nada disso tivesse sido inserido ou selecionado, ao clicar enviar mostrava a mensagem a dizer que é obrigatório inserir uma categoria/subcategoria.

Editado por rickygac

Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruicosta.web

A tabela é igual à que te dei. A utilização do campo catID = id_parent.

Vamos focar-nos num passo de cada vez:

<label for="categoria">Categoria:</label>
<div>
<select name="categoria" id="categoria">
<option value="0" selected="selected"></option>"
<?php
$sql ="select id, categoria from categorias order by categoria asc";
$mysqli->query($sql);
if($row = $result->fetch_assoc()){
echo '<option value="'.$row["id"].'">'.$row['categoria'].'</option\r\n";
}
?>
</select>
</div>

Isto irá preencher a selectbox com todas as categorias. 1º Valor vazio. Testa e diz qualquer coisa.

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

bem isto ja vai praqui uma confusão de códigos... vamos la dar uma limpeza nisto então.

A base de dados que tenho chama-se "teste" e é a seguinte:

CREATE TABLE IF NOT EXISTS `teste` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(50) CHARACTER SET utf8 NOT NULL,
`imagem` longtext CHARACTER SET utf8 NOT NULL,
`catid` int(11) NOT NULL,
`categoria` varchar(50) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=40 ;
o ficheiro atual do formulário é o "index.php" abaixo.
<html>
<body>

<?php
include "ligar-bd.php";
include "estilos/estilos.css";

ini_set('default_charset','UTF-8');

include "conta_total.php";
?>

<center>
<titulo>Adicionar Nova Entrada</titulo>
<hr size=1 width=500 class="degrade">

<form action="envia.php" method="POST" enctype="multipart/form-data">

<table align="center" width="500px" border="0" cellpading="4" cellspacing="8" bgcolor="#f0f0f0">
<tr>
<td align="center">
<hr size=1 width=500 class="degrade">
Nome:
<br>
<input type="text" name="nome">
<br>

<label for="categoria">Categoria:</label>
<br>
<select name="categoria" id="categoria">
<option value="0" selected="selected"></option>

<?php
$sql ="SELECT id, categoria FROM teste ORDER BY categoria ASC";
$mysqli->query($sql);

if($row = $result->fetch_assoc()){
echo "<option value='".$row['id']."'>".$row['categoria']."</option>\r\n";
}
?>
</select>


<br>
<br>
Adicionar uma imagem:
<br>
<input type="file" name="file">

<hr size=1 width=500 class="degrade">
<br>
<input type="submit" value="Adicionar Entrada" class="button buttonfx buttonredondo">
<br>
<br>

</td>
</tr>
</table>

</form>

<?php include "rodape.php"; ?>

</center>

</body>
</html>
e o que aconteceu depois de adaptar esse código que deste (acima a verde) é que continua sem mostrar nada no select e que deixou de mostrar tudo abaixo do código verde.

Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruicosta.web

Isso é porque deu erro e o site parou a execução.

Cria um ficheiro .htaccess (SEM NOME) e cola este código

# enable PHP error logging
php_flag  log_errors on
php_value error_log  PHP_errors.log
# prevent access to PHP error log
<Files PHP_errors.log>
Order allow,deny
Deny from all
Satisfy All
</Files>
# supress php errors
php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
php_value docref_root 0
php_value docref_ext 0

Vai fazer com que os erros de php sejam escritos dentro do ficheiro PHP_errors.log e assim podes ver o que está a acontecer.

Executa o site depois de teres o .htaccess na raíz do site. Quando descobrires o erro, cola aqui.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

eu meti assim e funciona ve la...

...com a exceção que ele se tiver mais que uma categoria com o mesmo nome mostra no select varias iguais em vez de so uma e no primeiro add, ele como ainda não tem categorias na base de dados insere o valor "0" em vez de mostrar a mensagem que é obrigatório escolher ou inserir uma categoria ou subcategoria, mas para isso precisamos do campo "subcategoria" e como tal o mesmo já foi também criado.

outra coisa que acontece estranhamente desde que criei esse código é tambem que no "apagar.php" ele esta a apagar sempre a ultima entrada independentemente da entrada que se clique para eliminar, isto não acontecia antes.

ora então atualmente o código é este:

base de dados "teste":

CREATE TABLE IF NOT EXISTS `teste` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(50) CHARACTER SET utf8 NOT NULL,
`imagem` longtext CHARACTER SET utf8 NOT NULL,
`catid` int(11) NOT NULL,
`categoria` varchar(50) CHARACTER SET utf8 NOT NULL,
`subcategoria` varchar(50) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=40 ;

e o ficheiro atual do formulário "index.php":

<html>
<body>

<?php
include "ligar-bd.php";
include "estilos/estilos.css";

ini_set('default_charset','UTF-8');

include "conta_total.php";
?>

<center>
<titulo>Adicionar Nova Entrada</titulo>
<hr size=1 width=500 class="degrade">

<form action="envia.php" method="POST" enctype="multipart/form-data">

<table align="center" width="500px" border="0" cellpading="4" cellspacing="8" bgcolor="#f0f0f0">
<tr>
<td align="center">
<hr size=1 width=500 class="degrade">
<label for="nome">Nome:</label>
<br>
<input type="text" name="nome">
<br>

<label for="categoria">Escolha a Categoria:</label>
<br>
<select name="categoria" id="categoria">
<option value="0" selected="selected"> </option>

<?php
$result = $mysqli->query("SELECT * FROM teste ORDER BY categoria ASC");
if ($result->num_rows != 0){

	 while ($i = mysqli_fetch_assoc($result)){
		echo "<option value='".$i['categoria']."'> ".$i['categoria']." </option>\r\n";
	}
}
?>

</select>

<br>
ou insira uma nova...
<br>
<br>

<label for="subcategoria">Nova Subcategoria ou Categoria:</label>
<br>
<input type="text" name="subcategoria">
<br>

<label for="imagem">Adicione uma imagem:</label>
<br>
<input type="file" name="file">
<hr size=1 width=500 class="degrade">
<br>

<input type="submit" value="Adicionar Entrada" class="button buttonfx buttonredondo">
<br>
<br>

</td>
</tr>
</table>

</form>

<?php include "rodape.php"; ?>

</center>

</body>
</html>

isto haviamos estar era a falar no messenger ou assim para ser rapido, um codigo que em dialogo se faria numa hora, andamos dias nisto...

acrescento ainda que podes acompanhar como está a ficar o script em: http://www.rpublicidade.com/teste/index.php

Editado por rickygac

Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

ok com a opção DISTINCT consigo ja que me me mostre apenas 1 nome de cada categoria em vez de mostrar varias vezes o mesmo nome... mais um passo resolvido... resta resolver os ourtos....

Atualmente ao enviar pela primeira vez um add... ele como ainda não la tem categorias na base de dados, esta a inserir o valor "0" em vez de mostrar a mensagem que é obrigatório escolher ou inserir uma categoria ou subcategoria.

OIutra coisa que acontece estranhamente desde que criei esse código é também que no "apagar.php" ele esta a apagar sempre a ultima entrada independentemente da entrada que se clique para eliminar, isto não acontecia antes.

<?php
$result = $mysqli->query("SELECT DISTINCT categoria FROM teste ORDER BY categoria ASC");

   if ($result->num_rows != 0){

        while ($i = mysqli_fetch_assoc($result)){
           echo "<option value='".$i['categoria']."'> ".$i['categoria']." </option>\r\n";
           //$result = array_unique($categoria);
       }
   }
?>


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rickygac

ruicosta

então vamos dar mais um avanço nisto? já não falta muito!


Ass: Ricky

Sou um génio... só nunca subi na vida porque tenho vertigens! rsrsrs....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.