L@nder 0 Denunciar post Postado Março 10, 2015 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
ESerra 744 Denunciar post Postado Março 10, 2015 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
L@nder 0 Denunciar post Postado Março 10, 2015 Foi justamente isso que eu pensei em fazer. Mas realmente vi que iria ter problemas. Como devo fazer isso? Compartilhar este post Link para o post Compartilhar em outros sites
Dorian Neto 41 Denunciar post Postado Março 10, 2015 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
L@nder 0 Denunciar post Postado Março 12, 2015 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
L@nder 0 Denunciar post Postado Março 12, 2015 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
(RNU) Ruan Silva 61 Denunciar post Postado Março 12, 2015 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
L@nder 0 Denunciar post Postado Março 12, 2015 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
(RNU) Ruan Silva 61 Denunciar post Postado Março 12, 2015 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
Ldovale 9 Denunciar post Postado Março 13, 2015 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