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

Fala galera! tudo certo?

Estou com um problema... acho que bobo, mais mesmo tendo em mente a solução não consigo fazê-la.

Tenho um cadastro de Alunos, e nesse cadastro digo através de checkboxes retornados por um loop do BD quais as matérias que o mesmo faz. Ai queria ao criar o usuario que essas materias selecionadas fossem inseridas no banco... pois a opção de download de arquivos colocados pelos professores, e só são listados arquivos das matérias que esse aluno é cadastrado... inclusive criei uma tabela separada pra isso, relacionada a tabela dos usuarios.

Sei que isso deve ser feito através de um array mais (acho eu) que já montei corretamente porém ele só me mostra um checkboxes selecionado de todos os que eu marquei.

 

Os arquivos que uso são os seguintes:

 

usuario.php

<form method="post" name="formpadrao" id="formpadrao" action="?usuario=cadastrar">
					  <table class="conteudo" cellpadding="0" cellspacing="0">
						  <?php if(isset($usuario_salvar) && $usuario_salvar != '') {	echo $usuario_salvar; } ?>
						 <tr>
							<td colspan="2" valign="top"><h4 class="infoforms">Dados para Login:</h4></td>
						 </tr>
						 <tr>
							<td style="width: 130px; height: 25px;" valign="top"><label for="login">Login:</label></td>
							<td valign="top"><input type="text" name="login" id="login" class="campotexto" /></td>
						 </tr>
						 <tr>
							<td style="height: 25px;" valign="top"><label for="senha">Senha:</label></td>
							<td valign="top"><input type="password" name="senha" id="senha" class="campotexto" /></td>
						 </tr>
						 <tr>
						 	<td valign="top"><label for="id_nivel">Nível do Usuário:</label></td>
						 	<td valign="top">
										<select name="niveis" id="niveis" class="campotexto" style="width: 130px; height: 21px;">
										<?php
										while($l = mysql_fetch_array($cnx)) {
											$id_nivel	 = $l["id_nivel"];
											$nivel = $l["nivel"];
											echo "<option value=\"$id_nivel\">$nivel</option>\n";
										}
										?>
										</select>
						 	</td>
						 </tr>
						 <tr>
						 	<td valign="top"><label for="materias">Matérias:</label></td>
						 	<td valign="top">
											<?php
											$cnx2	= mysql_query("select * from materias order by materia");
											if(mysql_errno() != 0) {
												if(!isset($erros)) {
													echo "Erro o arquivo init.php foi alterado, nao existe $erros";
													exit;
												}
												echo $erros[mysql_errno()];
												exit;
											}
											while($l = mysql_fetch_array($cnx2)) {
												$id_materia = $l["id_materia"];
												$materia		= $l["materia"];
												echo "<input type=\"checkbox\" name=\"materia[]\" id=\"materias\" value=\"$id_materia\" style=\"margin: 3px 0 0 0;\" /> $materia<br />\n";
											}
											mysql_close();
											?>
						 	</td>
						 <tr>
							<td colspan="2" valign="top"><h4 class="infoforms">Dados Cadastrais:</h4></td>
						 </tr>
						 <tr>
							<td style="height: 25px;" valign="top"><label for="nome">Nome:</label></td>
							<td valign="top"><input type="text" name="nome" id="nome" class="campotexto" /></td>
						 </tr>
						 <tr>
							<td style="height: 25px;" valign="top"><label for="email">Email:</label></td>
							<td valign="top"><input type="text" name="email" id="email" class="campotexto" /></td>
						 </tr>
						 <tr>
							<td colspan="2"><input type="submit" name="btn_formpadrao" id="btn_formpadrao" class="btntexto submit" value="Cadastrar" /></td>
						 </tr>
					  </table>
				  </form>

 

usuario_salvar.php

<?php
if(isset($_POST['materia'])) {
	foreach(($_POST['materia']) as $materias) {
		$materias[] = $materiaows;
	}
}

if($_SERVER['REQUEST_METHOD'] == 'POST') {
	foreach($_POST as $campo => $valor) { $$campo = anti_injection($valor); }
	$erro = array();
	if($login == NULL || $login == '')
		$erro[] = "Informe um login (nome de usuário)";
	if($senha == NULL || $senha == '')
		$erro[] = "Informe uma senha";
	if(strlen($senha) < 6)
		$erro[] = "A senha deve ter pelo menos 6 caracteres";
	if($nome == NULL || $nome == '')
		$erro[] = "Informe o nome completo do usuário";
	if($email == NULL || $email == '')
		$erro[] = "Infome um endereço de email válido";
	if($niveis == NULL || $niveis == '')
		$erro[] = "Informe o tipo de usuário";
	if(strlen($niveis) > 2)
		$erro[] = "Nível informado está incorreto";
	if(count ($erro) > 0) {
		$msg = '';
		foreach($erro as $v)
			$msg .= $v."\\n";
			$usuario_salvar = "<script type=\"text/javascript\">alert('".$msg."');</script>";
			return false;
		}

	$senha = sha1($senha);
	$chave = sha1( sha1(strtolower(trim($login))) . sha1(strtolower(trim($senha))) );
	Abre_Conexao();
	if(@mysql_query("INSERT INTO usuarios VALUES ( NULL , '$login', '$senha', '$nome', '$email', '$niveis', '$materias', '$chave' )")) {
		if(mysql_affected_rows() == 1) {
			$usuario_salvar = "<script type=\"text/javascript\">alert('Registro efetuado com sucesso');</script>";
		}
	} else {
		if(mysql_errno() == 1062) {
			echo $erros[mysql_errno()];
			exit;
		} else {
			echo mysql_error();
			exit;
		}
		@mysql_close();
	}
}
?>

 

A estrutura do banco está assim:

 

--
-- Estrutura da tabela `materias`
--

CREATE TABLE IF NOT EXISTS `materias` (
  `id_materia` smallint(5) unsigned NOT NULL auto_increment,
  `materia` varchar(50) NOT NULL,
  PRIMARY KEY  (`id_materia`),
  UNIQUE KEY `login` (`materia`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=36;

--
-- Extraindo dados da tabela `materias`
--

INSERT INTO `materias` (`id_materia`, `materia`) VALUES
(1, 'Administração Eclesiástica'),
(2, 'Arqueologia Bíblica'),
(3, 'Capelania'),
(4, 'Doutrina da Vocação'),
(5, 'Educação Religiosa Cristã'),
(6, 'Estágio Supervisionado'),
(7, 'Evangelismo'),
(8, 'Exegese I'),
(9, 'Exegese II'),
(10, 'Geografia Bíblica'),
(11, 'Grego I'),
(12, 'Grego II'),
(13, 'Grego III'),
(14, 'Hebraico I'),
(15, 'Hebraico II'),
(16, 'Hebraico III'),
(17, 'Hermenêutica I'),
(18, 'Hermenêutica II'),
(19, 'História Eclesiástica'),
(20, 'Homilética I'),
(21, 'Homilética II'),
(22, 'Homilética II 3º'),
(23, 'Língua Portuguesa I'),
(24, 'Língua Portuguesa II'),
(25, 'Metodologia da Pesquisa'),
(26, 'Missões'),
(27, 'Panorama Bíblico'),
(28, 'Religiões Comparadas'),
(29, 'Sociologia'),
(30, 'Teologia Bíblica  do N.T.'),
(31, 'Teologia Bíblica do A.T.'),
(32, 'Teologia Contemporânea'),
(33, 'Teologia Sistemática I'),
(34, 'Teologia Sistemática II'),
(35, 'Teologia Sistemática III');

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

--
-- Estrutura da tabela `usuarios`
--

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,
  PRIMARY KEY  (`id_usuario`),
  UNIQUE KEY `login` (`login`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6;

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

--
-- Estrutura da tabela `usuarios_materias`
--

CREATE TABLE IF NOT EXISTS `usuarios_materias` (
  `id_usuario` smallint(5) unsigned NOT NULL,
  `id_materia` varchar(40) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Extraindo dados da tabela `usuarios_materias`
--

INSERT INTO `usuarios_materias` (`id_usuario`, `id_materia`) VALUES
(1, '1'),
(2, '30');

Se alguém puder dar um help agradeço.

Abss

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera... só pra constar... tentei algumas coisas com uns exemplos que encontrei na net porém... foram inuteis...

Vlww (y)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloca o array implodido num campo de texto do seu bd de forma que fique assim por exemplo:

 

--mat1--mat2--mat3--mat4--

 

 

pra tornar array depois era só usar explode pelos "--"

Compartilhar este post


Link para o post
Compartilhar em outros sites

sugiro que estruture a o banco de dados para nao sofrer com complicações futuras com performance.

 

nesse caso, bastaria criar uma tabela "usuarios_conf" ou "usuarios_nivel" e estruturar os campos.

 

ou, mesmo dentro da tabela usuarios, criar campos por exemplo

 

nivel1

nivel2

nivel3

nivel4

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi hinom,

Estou colocando abaixo meu banco completo... do modo que utilizo... pois pelo que entendi oq você me indicou é algo parecido com oq eu tenho.

 

--
-- Estrutura da tabela `arquivos`
--

CREATE TABLE IF NOT EXISTS `arquivos` (
  `id_arquivo` smallint(5) unsigned NOT NULL auto_increment,
  `caminho` varchar(200) NOT NULL,
  `fk_materia` smallint(2) NOT NULL,
  PRIMARY KEY  (`id_arquivo`),
  UNIQUE KEY `login` (`caminho`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=14;


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

--
-- Estrutura da tabela `materias`
--

CREATE TABLE IF NOT EXISTS `materias` (
  `id_materia` smallint(5) unsigned NOT NULL auto_increment,
  `materia` varchar(50) NOT NULL,
  PRIMARY KEY  (`id_materia`),
  UNIQUE KEY `login` (`materia`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=36;

--
-- Extraindo dados da tabela `materias`
--

INSERT INTO `materias` (`id_materia`, `materia`) VALUES
(1, 'Administração Eclesiástica'),
(2, 'Arqueologia Bíblica'),
(3, 'Capelania'),
(4, 'Doutrina da Vocação'),
(5, 'Educação Religiosa Cristã'),
(6, 'Estágio Supervisionado'),
(7, 'Evangelismo'),
(8, 'Exegese I'),
(9, 'Exegese II'),
(10, 'Geografia Bíblica'),
(11, 'Grego I'),
(12, 'Grego II'),
(13, 'Grego III'),
(14, 'Hebraico I'),
(15, 'Hebraico II'),
(16, 'Hebraico III'),
(17, 'Hermenêutica I'),
(18, 'Hermenêutica II'),
(19, 'História Eclesiástica'),
(20, 'Homilética I'),
(21, 'Homilética II'),
(22, 'Homilética II 3º'),
(23, 'Língua Portuguesa I'),
(24, 'Língua Portuguesa II'),
(25, 'Metodologia da Pesquisa'),
(26, 'Missões'),
(27, 'Panorama Bíblico'),
(28, 'Religiões Comparadas'),
(29, 'Sociologia'),
(30, 'Teologia Bíblica  do N.T.'),
(31, 'Teologia Bíblica do A.T.'),
(32, 'Teologia Contemporânea'),
(33, 'Teologia Sistemática I'),
(34, 'Teologia Sistemática II'),
(35, 'Teologia Sistemática III');

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

--
-- Estrutura da tabela `niveis`
--

CREATE TABLE IF NOT EXISTS `niveis` (
  `id_nivel` smallint(5) unsigned NOT NULL auto_increment,
  `nivel` varchar(20) NOT NULL,
  PRIMARY KEY  (`id_nivel`),
  UNIQUE KEY `login` (`nivel`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3;

--
-- Extraindo dados da tabela `niveis`
--

INSERT INTO `niveis` (`id_nivel`, `nivel`) VALUES
(1, 'Administrador'),
(2, 'Aluno');

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

--
-- Estrutura da tabela `usuarios`
--

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,
  PRIMARY KEY  (`id_usuario`),
  UNIQUE KEY `login` (`login`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6;

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

--
-- Estrutura da tabela `usuarios_materias`
--

CREATE TABLE IF NOT EXISTS `usuarios_materias` (
  `id_usuario` smallint(5) unsigned NOT NULL,
  `id_materia` varchar(40) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

No caso eu estou tentando de acordo com o id de cada materia da tabela materia inserir na tabela usuarios_materias... não sei se planejei errado.

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então galera!

Consegui resgatar as informações dos checkboxes como queria... printo todos checkboxes marcados, porém... estou com dúvidas de como inseri-los no banco.

Exemplo:

 

marquei 4 materias e elas tem os seguintes ids: 4, 5, 6, 7... como eu faço pra inserilas de forma que quando for resgatar possa identificar que são ids e nao 4567 como um unico numero.

 

<?php
$materia = array();
foreach($_POST['materia'] as $materias) {
	echo $materias;
}
exit;

?>

Obrigado a galera que está ajudando.

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?
echo "<pre>";
print_r($_POST);
?>

<form action="index.php" method="post">
	<input type="checkbox" name="chk[]" id="chk1" value="1"/>
	<input type="checkbox" name="chk[]" id="chk2" value="2"/>
	<input type="submit" value="Submit">
</form>

Veja o resultado, use o name do combo como um array, no $_POST você vai ter como saber quais foram enviados pelo post.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Oenning,

Eu já sei oq foi selecionado na boa, ele printa todos os dados só que assim: 123456789 eu queria uma forma que pudesse ao fazer um select separar quais ids foram inseridos ex: 1, 2, 3, 4, 5 para que eu possa identificar pelos ids quais são as materias cadastradas para aquele usuario

sacou?

 

Abvs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz o seguinte...

No form o name do checkbox tá assim: name="materia[]"

 

ai no arquivo que processa o formulario fiz isso para printar se os dados estavam vindo certos:

 

<?php
$materia = array();
foreach($_POST['materia'] as $materias) {
	echo $materias;
}
exit;

E print numa boa todos os checks marcados, só que desta forma que falei acima.

Compartilhar este post


Link para o post
Compartilhar em outros sites

esta aparecendo como um unico numero pois o seu echo esta imprindo um numero apos o outro, sem nenhum separador...

 

coloque:

 

echo $materias . ' - ';

 

que irá entender melhor...

 

 

no caso, no lugar do echo, você terá que ter algo como:

 

mysql_query("INSERT INTO `usuarios_materias` (`id_usuario`, `id_materia`) VALUES (".$id_usuario.", " . $materias . ")");

 

para incluir no bd os registros das materias para aquele usuário...

Compartilhar este post


Link para o post
Compartilhar em outros sites

gigabytes,

Cara seguindo sua dica e ficou deste modo:

 

$materia = array();
foreach($_POST['materia'] as $materias) {
	$mat = $materias.',';
	if(mysql_query("UPDATE usuarios_materias SET id_usuario = '$id', id_materia = '$mat' WHERE id_usuario = '$id'"));
}
exit;

Porém, ele só está salvando o ultimo check marcado com a virgula... agora fiquei perdido... pois se colocar echo ele marca numa boa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rasp,

 

note que o foreach vai fazer um loop e executar um INSERT para cada id de materia marcado, sendo assim você esta errando ao colocar a virgula no id da materia, deixe apenas o ID, pois será executado um INSERT para cada checkbox marcado, inserindo todos os registros na tabela...

Compartilhar este post


Link para o post
Compartilhar em outros sites

agora que percebi que esta usando UPDATE, numa tentativa de manter tudo num unico registro, esta errado, deve ficar um registro para cada materia mesmo...

 

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

 

 

depois basta fazer um select buscando pelo userid desejado para saber as materias que ele faz...

Compartilhar este post


Link para o post
Compartilhar em outros sites

com um registro para cada materia, você poderá inclusive fazer uma consulta pelo id da materia e obter os usuários que fazem aquela materia, ou contar quantos usuarios fazem ela...

 

se colocar tudo em um unico campo/registro apenas separado por virgula, será praticamente impossivel de fazer isso...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hinom e gigabytes,

Como posso fazer então para restruturar este banco? Se puderem me ajudar eu agradeço... admito que fiquei completamente perdido agora.

Compartilhar este post


Link para o post
Compartilhar em outros sites

isso se chama normalização de banco e é fundamental que seja executada desde o inicio do projeto para evitar re-trabalho

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gigabytes, não é impossível

 

Eu faço assim sempre:

 

coloco os IDs entre traços duplos "--" de modo que fiquem assim:

 

--1--2--3--4--5--6--7--8--9--10--11--

 

e assim por diante, mas sempre começando com -- e terminando também com --

 

Digamos que eu queira contar quantos usuários possuem a matéria de ID 5

 

select count(*) from usuarios where materias like '%-5-%'

Tem que estar sempre entre traços duplos pra não acontecer de ele confundir -33 com -3 por exemplo

 

Para desmontar o array depois pode-se usar:

 

$array_materias = explode("--", $materias);

Ai teremos um array novamente com os IDs como conteúdo e podemos procurar IDs dentro desse array usando array_keys por exemplo:

 

if(!array_keys($array_materias, 5))
	  echo "Não possui a matéria numero 5";
else
	  echo "Possui a matéria numero 5";

ou ainda pode-se usar eregi para procurar dentro dos valores sem nem mesmo transforma-los em array

 

if(eregi("-5-", $materias))
	  echo "Possui a matéria 5";
else
	  echo "Não possui a matéria 5";

Pra tirar uma matéria depois pode-se usar

 

$materias = str_replace("-5-", "", $materias);

Assim um grupo de materias dessa forma:

--61--22--4--5--69--

ficaria assim:

--61--22--4--69--

 

continuando a política de traços duplos

 

O banco fica mais leve e menos confuso e cada usuário tem num campo só todas as IDs de suas matérias . . . . bom . . são milhares de vantagens. . . .

isso não é só uma teoria, eu uso isso e nunca me dei mal

 

 

 

Aproveitando o post . . . . . . . Desculpem a ignorância mas como eu faço pra fazer um quote???

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.