Ir para conteúdo

Arquivado

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

Rasp

Inserir dados de array no bd

Recommended Posts

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

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.