Rasp 3 Denunciar post Postado Setembro 30, 2008 Warlike... Sei que devo fazer de um modo mais estruturado até porque meu banco vai acabar se tornando grande mais pra frente... mais a principio preciso colocar pra funcionar, e queria saber de você... como você fez seu array e o foreach para inserir os dados? Abs ps: Mário, hinom, já estou esturando sobre normalização de banco e transações para que possa desenvolver melhor meus trabalhos. Compartilhar este post Link para o post Compartilhar em outros sites
WarLiKe 0 Denunciar post Postado Setembro 30, 2008 eu havia feito assim pra receber e montar a string pra o banco: $arr = "--"; for($i=0;$i < $num_materias;$i++){ if(isset($_POST["check$i"])){ $arr .= $_POST["check$i"] . "--"; } } sendo que o form tinha varios checkbox com o name tipo "ckeck0", "check1" . . . . . . . . e cada um tendo o ID da matéria como value O número de matérias $num_materias pode ser uma contagem (select count) de matérias que há no banco cadastradas O form foi montado dinamicamente também só pra constar Compartilhar este post Link para o post Compartilhar em outros sites
hinom 5 Denunciar post Postado Setembro 30, 2008 pode fazer do modo como Warlike mostrou. mas ainda sim recomendo re-estruturar. a sua pressa em terminar algo agora com certeza trará problemas maiores. se estiver preocupado com prazos converse com seus superiores / cliente a respeito disso e prolongue a data. quantas matérias existem? 40 ? 60 ? 200 ? até umas 200, pode criar 200 campos na tabela usuarios exemplo em negrito CREATE TABLE IF NOT EXISTS `usuarios` ( `id_usuario` smallint(5) unsigned NOT NULL auto_increment, `login` varchar(20) NOT NULL, `senha` char(40) NOT NULL, `nome` varchar(45) NOT NULL, `email` varchar(60) NOT NULL, `fk_nivel` tinyint(2) unsigned NOT NULL, `chave` char(40) NOT NULL, `usuario_nivel1` tinyint(1) unsigned NOT NULL, `usuario_nivel2` tinyint(1) unsigned NOT NULL, `usuario_nivel3` tinyint(1) unsigned NOT NULL, `usuario_nivel4` tinyint(1) unsigned NOT NULL, `usuario_nivel5` tinyint(1) unsigned NOT NULL, `usuario_nivel6` tinyint(1) unsigned NOT NULL, `usuario_nivel7` tinyint(1) unsigned NOT NULL, PRIMARY KEY (`id_usuario`), UNIQUE KEY `login` (`login`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6; a princípio parece "tosco", mas o processador da maquina que rodará o sistema e o mecanismo do banco de dados agradece. rss quando estava aprendendo PHP fiz bastante dessa forma como o WarLike sugeriu, pois achava fácil e não pensava sobre como isso influenciaria na performance do server. depois de um tempo comecei a fazer conforme o gigabytes sugeriu userid 1 materia 1 userid 1 materia 2 userid 1 materia 3 userid 2 materia 2 userid 2 materia 4 userid 2 materia 5 userid 3 materia 1 userid 3 materia 6 userid 3 materia 7 mas.. gera redundância de dados além de comprometer a performance em consultas após atingir certo volume de dados Compartilhar este post Link para o post Compartilhar em outros sites
WarLiKe 0 Denunciar post Postado Setembro 30, 2008 Hum . . . Bom saber . . . . nunca pensei nesse lado também! Vou procurar usar esse método nas minhas próximas aplicações ou estudar um outro modo! Vlw . . . . Compartilhar este post Link para o post Compartilhar em outros sites
Rasp 3 Denunciar post Postado Setembro 30, 2008 Oi hinom, Bom dia! Entendi a questão da performance do server... mais por favor me tire umas dúvidas.. atualmente são 30 matérias cadastradas em uma tabela chamada materias, onde eu armazeno o id (id_materia) e nome da materia (materia), porém podem ser incluídas novas materias, já que o administrador tem esta opção. - Como eu faria caso fosse criada uma nova materia no banco? eu teria de criar um novo campo na tabela de usuarios ex: usuario_materia31? - Poderia estar removendo a tabela usuarios_materias, onde eu pretendia fazer a relação correto? e fazer a consulta diretamente na tabela de usuarios, como fazia antes. Obrigado pela grande ajuda que esta me dando. obs: antes eu relacionava os usuarios com a materia (na verdade o modulo que incluia várias materias) com um campo chamado fk_materia dentro da tabela usuarios (como o fk_nivel) onde eu armazenava somente o modulo que o aluno estava fazendo e funcionava muito bem, mais foi necessária esta mudança. Compartilhar este post Link para o post Compartilhar em outros sites
hinom 5 Denunciar post Postado Setembro 30, 2008 se for seguir esse metodo de criar os campos todos na mesma tabela, cada nova matéria cadastrada teria que gerar um novo campo você pode por exemplo, já deixar preparado por exemplo umas 80 matérias. Acho que uma escola nao tem mais do que isso. materia1 materia2 etc.. nao tem problema se ficarem vazias.. para poupar espaço defina como tinyint(1) null quando o usuario possuir nivel de acesso coloque valor 1, senao, deixe 0 nos campos que nao for alterar nao mexa.. mantenha como null Compartilhar este post Link para o post Compartilhar em outros sites
Rasp 3 Denunciar post Postado Setembro 30, 2008 hinom, se eu entendi a estrutura da tabela usuarios teria de ficar assim certo? CREATE TABLE IF NOT EXISTS `usuarios` ( `id_usuario` smallint(5) unsigned NOT NULL auto_increment, `login` varchar(20) NOT NULL, `senha` char(40) NOT NULL, `nome` varchar(45) NOT NULL, `email` varchar(60) NOT NULL, `fk_nivel` tinyint(2) unsigned NOT NULL, `chave` char(40) NOT NULL, `materia1` tinyint(1) unsigned NULL, `materia2` tinyint(1) unsigned NULL, `materia3` tinyint(1) unsigned NULL, `materia4` tinyint(1) unsigned NULL, `materia5` tinyint(1) unsigned NULL, `materia6` tinyint(1) unsigned NULL, `materia7` tinyint(1) unsigned NULL, ... `materia80` tinyint(1) unsigned NULL, PRIMARY KEY (`id_usuario`), UNIQUE KEY `login` (`login`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; Agora minha dúvida é a seguinte... (acho que entendi a questão da estrutura do banco) os campos "materia1, materia2..." cada um será referente ao ID da matéria cadastrada na tabela de materias certo? ex: TABELA MATERIAS id_materia materia 1 matemática TABELA USUARIOS: materia1 1 materia2 2 seria isto? Compartilhar este post Link para o post Compartilhar em outros sites