Ir para conteúdo

Arquivado

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

L@nder

Sistema de Categorias

Recommended Posts

Olá, Tenho uma tabela no meu banco de dados chamada categorias com a seguinte estrutura.

 

id Categoria

1 Frutas

2 Legumes

3 Carnes

4 Bebidas

 

E uma tabela chamada produtos com a seguinte estrutura:

 

id categoria nome foto

1 Laranja laranja.jpg

2 Maça maça.jpg

 

No formulário onde cadastro os produtos na parte de escolher a categoria eu fiz com que o php liste todas as categorias do banco de dados e em cada categoria uma check box na qual eu seleciono todas as categorias na qual eu quero que o produto apareça.

 

Minha dúvida: Qual a melhor maneira de fazer essa gravação das múltiplas categorias na coluna categoria da tabela produtos no banco de dados e como devo proceder para fazer a listagem. Pois um mesmo produto vai aparecer em várias categorias.

 

Desde já agradeço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se um mesmo produto pode ter várias categorias então você deve ter uma outra tabela para guardar esta informação, não tente inventar um jeito de salvar todas as categorias ali na mesma coluna (por exemplo, separando os ids por vírgula), pois isto só vai te trazer problemas.

Compartilhar este post


Link para o post
Compartilhar em outros sites
create table if not exists categoria(
    id int not null auto_increment,
    nome varchar(255) not null,
    primary key(id)
);

create table if not exists produto(
    id int not null auto_increment,
    nome varchar(255) not null,
    primary key(id)
);

create table if not exists produto_categoria(
    produto_id int not null,
    categoria_id int not null,
    index(produto_id,categoria_id),
    foreign key (produto_id) references produto(id),
    foreign key (categoria_id) references categoria(id)
);

Quando precisar fazer consultas basta utilizar join :)

Compartilhar este post


Link para o post
Compartilhar em outros sites
create table if not exists categoria(
    id int not null auto_increment,
    nome varchar(255) not null,
    primary key(id)
);

create table if not exists produto(
    id int not null auto_increment,
    nome varchar(255) not null,
    primary key(id)
);

create table if not exists produto_categoria(
    produto_id int not null,
    categoria_id int not null,
    index(produto_id,categoria_id),
    foreign key (produto_id) references produto(id),
    foreign key (categoria_id) references categoria(id)
);

Quando precisar fazer consultas basta utilizar join :)

 

Deixa eu ver se eu entendi.

 

Terei que ter 3 tabelas, categoria, produto, produto_categoria.

Suponhamos que eu vá cadastrar o produto Laranja. Então terei que criar um registro na tabela produtos com esse produto. Exemplo abaixo:

 

id nome

1 Laranja

 

E depois terei que criar um registro na tabela produto_categoria para cada categoria que eu quero que o produto apareça. Exemplo abaixo:

 

produto_id categoria_id

1 2

1 5

1 3

 

Estou certo?

 

Aproveitando o momento, como vou fazer um formulário para preencher a tabela produto_categoria. Visto que as categorias virão do banco de dados não terei como saber quantas check_box terão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deixa eu ver se eu entendi.

Terei que ter 3 tabelas, categoria, produto, produto_categoria.
Suponhamos que eu vá cadastrar o produto Laranja. Então terei que criar um registro na tabela produtos com esse produto. Exemplo abaixo:

id nome

1 Laranja

E depois terei que criar um registro na tabela produto_categoria para cada categoria que eu quero que o produto apareça. Exemplo abaixo:

produto_id categoria_id

1 2

1 5

1 3

Estou certo?

Aproveitando o momento, como vou fazer um formulário para preencher a tabela produto_categoria.Visto que as categorias virão do banco de dados não terei como saber quantas check_box terão

Compartilhar este post


Link para o post
Compartilhar em outros sites

não precisa de um formulário para preencher essa tabela. Quando for cadastrar um novo produto e marcar as categorias a qual ele pertence, basta enviar estas categorias junto com as outras informações (no caso o nome).

 

Na tabela produto, vai salvar o produto:

<?php

$nome = $_POST['nome_produto'];

mysql_query("insert into tbl_produto (nome_produto) values ('".$nome."');");

?>

o preenchimento da tabela produto_categoria é apenas a junção das chaves primarias das tabelas produto e categoria. exemplificando, ficaria assim:

tbl_produto                   produto_categoria               tbl_categoria
id   nome                     fk_produto fk_categoria         id     nome 
1    maça                     1          1                    1      frutas
2    arroz                    1          2                    2      verduras
3    quiabo                   1          3                    3      grãos
                              3          3

são 3 tabelas, mas a tabela do meio é apenas a junção das outras duas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas o problema é que um mesmo produto deve aparecer em mais de uma categoria e eu não estou entendendo como vou fazer para ele cadastrar em mais de uma categoria.

Compartilhar este post


Link para o post
Compartilhar em outros sites

guenta ai...


o formulario fica mais ou menos assim:

<html>
<head>
  <title></title>
</head>
<body>
  <form method="POST" action="protocolo.php?cadastrar=true">
    id:<input type="text" name="id"/> produto:<input type="text" name="produto"/><br/>
    categoria: grãos<input type="checkbox" value="1" name="check[]"/><br/>
    frutas<input type="checkbox" value="2" name="check[]"/><br/>
    verduras<input type="checkbox" value="3" name="check[]"/><br/>
    <input type="submit" value="ok"/>
  </form> 
</body>
</html>

só que os dados estão estaticos.

 

a conexao e a geração de querys ficou assim:

<?php

$host ="localhost"; //host
$user = "root"; //usuario
$senha = ""; //senha
$db = "sistema"; //nome do banco

$con = mysql_connect($host,$user,$senha) or die(mysql_error()); //conexao
mysql_select_db($db,$con) or die(mysql_error()); //seleciona db

if(isset($_GET['cadastrar'])){ //verifica se existe a opção cadastrar
  
  $id = $_POST['id']; /*busca o id do produto (nesse exemplo eu coloquei pra digitar, mas fica pratico o campo sendo auto incremento*/
  $produto = $_POST['produto']; //recebe o nome do produto
  $check = $_POST['check']; //recebe um array com os checkbox

  mysql_query("insert into produto values(".$id.",'".$produto."');") or die(mysql_error()); /*adciona o produto na tabela produto*/
  if(!empty($check)){ //verfica se alguma categoria foi marcada para o produto em questao
    $qtd = count($check); //verifica quantos checks foram marcados
    for( $i = 0; $i < $qtd; $i++){ //laço correspondente ao numero de marcações
      mysql_query("insert into produto_categoria values(".$id.",".$check[$i].");") or die(mysql_error());// query para adcionar cada marcação de categoria ao produto;
      
    }
  }

}

?>

fim meio na marra, mas só pra dar uma ideia de como fazer. ta funcionando.

-- phpMyAdmin SQL Dump
-- version 4.1.6
-- http://www.phpmyadmin.net
--
-- Host: 127.0.0.1
-- Generation Time: 12-Mar-2015 às 23:32
-- Versão do servidor: 5.6.16
-- PHP Version: 5.5.9

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `sistema`
--

-- --------------------------------------------------------

--
-- Estrutura da tabela `categoria`
--

CREATE TABLE IF NOT EXISTS `categoria` (
  `id_cat` int(11) NOT NULL,
  `nome_cat` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id_cat`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Extraindo dados da tabela `categoria`
--

INSERT INTO `categoria` (`id_cat`, `nome_cat`) VALUES
(1, 'graos'),
(2, 'frutas'),
(3, 'verduras');

-- --------------------------------------------------------

--
-- Estrutura da tabela `produto`
--

CREATE TABLE IF NOT EXISTS `produto` (
  `id` int(11) NOT NULL,
  `nome` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Extraindo dados da tabela `produto`
--

INSERT INTO `produto` (`id`, `nome`) VALUES
(1, 'abacaxi'),
(2, 'uva'),
(3, 'quiabo'),
(4, 'canela');

-- --------------------------------------------------------

--
-- Estrutura da tabela `produto_categoria`
--

CREATE TABLE IF NOT EXISTS `produto_categoria` (
  `fk_produto` int(11) DEFAULT NULL,
  `fk_categoria` int(11) DEFAULT NULL,
  KEY `fk_produto` (`fk_produto`),
  KEY `fk_categoria` (`fk_categoria`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Extraindo dados da tabela `produto_categoria`
--

INSERT INTO `produto_categoria` (`fk_produto`, `fk_categoria`) VALUES
(1, 1),
(1, 3),
(2, 1),
(2, 3),
(3, 1),
(3, 2),
(3, 3),
(4, 2);

--
-- Constraints for dumped tables
--

--
-- Limitadores para a tabela `produto_categoria`
--
ALTER TABLE `produto_categoria`
  ADD CONSTRAINT `produto_categoria_ibfk_1` FOREIGN KEY (`fk_produto`) REFERENCES `produto` (`id`),
  ADD CONSTRAINT `produto_categoria_ibfk_2` FOREIGN KEY (`fk_categoria`) REFERENCES `categoria` (`id_cat`);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

esse foi o banco xD.


lembrando que tem coisas estaticas ai, como as categorias. Mas é tranquilo arrumar rs

Compartilhar este post


Link para o post
Compartilhar em outros sites

A categoria irá retornar um array do html, então para criar o relacionamento com a tabela juntando as informações das outras duas você vai criar um laço baseado no tamanho do array e dentro do laço você alimenta a tabela de relacionamento

 
foreach($ArraysCategorias as $idCategoria){
 
$sql = "insert into produto_categoria (idProduto, idCategoria) values(".$idProduto.",".$idCategoria.")";
mysql_query($sql);
}
 

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.