Rasp 3 Denunciar post Postado Setembro 28, 2008 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
Rasp 3 Denunciar post Postado Setembro 29, 2008 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
WarLiKe 0 Denunciar post Postado Setembro 29, 2008 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
hinom 5 Denunciar post Postado Setembro 29, 2008 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
Rasp 3 Denunciar post Postado Setembro 29, 2008 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
Rasp 3 Denunciar post Postado Setembro 29, 2008 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
Rasp 3 Denunciar post Postado Setembro 29, 2008 Alguem tem ideia? Abs Compartilhar este post Link para o post Compartilhar em outros sites
Oenning 0 Denunciar post Postado Setembro 29, 2008 <? 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
Rasp 3 Denunciar post Postado Setembro 29, 2008 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
Oenning 0 Denunciar post Postado Setembro 30, 2008 Qual script você usa para imprimir o: 123456789? Compartilhar este post Link para o post Compartilhar em outros sites
Rasp 3 Denunciar post Postado Setembro 30, 2008 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
gigabytes 0 Denunciar post Postado Setembro 30, 2008 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
Rasp 3 Denunciar post Postado Setembro 30, 2008 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
gigabytes 0 Denunciar post Postado Setembro 30, 2008 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
gigabytes 0 Denunciar post Postado Setembro 30, 2008 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
hinom 5 Denunciar post Postado Setembro 30, 2008 aconselho que re-estruture agora que está no começo. com certeza você vai se enrolar mais pra frente Compartilhar este post Link para o post Compartilhar em outros sites
gigabytes 0 Denunciar post Postado Setembro 30, 2008 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
Rasp 3 Denunciar post Postado Setembro 30, 2008 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
Mário Monteiro 179 Denunciar post Postado Setembro 30, 2008 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
WarLiKe 0 Denunciar post Postado Setembro 30, 2008 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