CFximiti 0 Denunciar post Postado Agosto 19, 2011 Prezados: Como ainda não consegui ir além das funções em php (arrays e classes, por enquanto, são quase grego para mim), tentei um código burro que funciona em tudo, menos no que diz respeito aos checkbox. Tenho o seguinte formulário: <div id="conteudo"> <form name="atualiza" method="post" action="updates.php"> <?php if (!empty($rs1));{echo "<p><span class=red>ATENÇÃO! ".$count1." inscritos sem email</span></p>";}?> <table class="tablesorter {sortlist: [[0,1]]}" border="0" cellspacing="0" cellpadding="0"> <thead> <tr> <th id="tabNome"><span>Para corrigir, edite na própria tabela</span></th> <th id="tabMail"><p align="right">CERTIFICADOS:</p></th> <?php for ($n=1;$n<=11;$n++) {echo "<th>".$n."</th>";} ?> <th>pgto</th> </tr> </thead> <tfoot> <tr> <td colspan="13"><input type="submit" class="adm" value="atualizar" name="atualizar" /></td> </tr> </tfoot> <tbody> //aqui começa o que “interessa”. <?php while($rs = mysql_fetch_array($result)) {?> <tr> <td><input type="hidden" name="dt_atual[]" id="dt_atual" value="<?php echo date('Y-m-d H:i:s') ?>" /> <input type="hidden" name="atual_por[]" id="atual_por" value="<?php echo $usuario?>" /> <input type="hidden" name="id[]" id="id" value="<?php echo $rs['id']?>" /> <input type="text" name="nome[]" id="nome" value="<?php echo $rs['nome']?>" class="nome" /></td> <td> <input type="text" name="emailUp[]" id="emailUp" value="<?php responde($rs['email'],"[".$rs['ddd1']."] ".$rs['tel1'])?>" /></td> <?php for ($j=1;$j<=11;$j++) { ?> <td class="linha"><input type="checkbox" name="cert<?php echo $j?>[]" id="cert<?php echo $j?>" value="S" <?php valCheck($rs['cert'.$j])?> /></td> <? ;}?> <td class="sel"><select name="pgto[]" id="pgto" size="1"> <option value="N" <?php if($rs['pgto']=="N"){echo " selected";}?>>Não</option> <option value="I" <?php if($rs['pgto']=="I"){echo " selected";}?>>Isento</option> <option value="S" <?php if($rs['pgto']=="S"){echo " selected";}?>>Sim</option> </select></td> </tr> </tbody> <?php ;}?> </table> </form> </div> //Obs.: function valCheck($value) {if($value=="S") {print " checked";}} -> apenas para ativar os checkbox cujo valor é “S” no bd. Na verdade, um form bem simples, buscando na tabela id, nome, email, 11 campos de certificados (cert1, cert2, cert3, cert4 etc…), pgto, dt_atual e atual_por. Pagina updates.php: if ($_POST['atualizar'] <> ''){ mysql_select_db(“meudb", $con) or die(mysql_error()); $size = count($_POST['id']); for($i=0;$i<$size;$i++){ for($j=1;$j<=11;$j++){ if(!isset($cert[$j][$i])){$cert[$j][$i]==='N';}else{$cert[$j][$i]==='S';}} $sql2="UPDATE inscritos1 SET nome='$nome[$i]', email='$emailUp[$i]', cert1='$cert1[$i]', cert2='$cert2[$i]', cert3='$cert3[$i]', cert4='$cert4[$i]', cert5='$cert5[$i]', cert6='$cert6[$i]', cert7='$cert7[$i]', cert8='$cert8[$i]', cert9='$cert9[$i]', cert10='$cert10[$i]', cert11='$cert11[$i]', pgto='$pgto[$i]', dt_atual='$dt_atual[$i]', atual_por='$atual_por[$i]' WHERE id='$id[$i]'"; $result2=mysql_query($sql2); } header("Location: index.php"); mysql_close(); exit; } O problema aqui, para um burro como eu, é que a sql faz o update "certinho" (conforme o id[$i]) de todos os campos, menos nos campos "cert" seqüenciais. Por exemplo: se ativo os 3 primeiros checkbox do primeiro registro (cert1, cert2 e cert3 do registro 1) e os 3 últimos do, digamos, segundo registro (cert9, cert10, cert11, registro 2), o código desconsidera o id[$i] e coloca estes valores do cert9, cert10 e cert11 no id 1… Juro que: - o código funciona direitinho para todos os outros campos da tabela. - dei uma boa olhada nos 86 resultados deste fórum, mas não consegui aplicar e/ou entender nenhuma da soluções indicadas. Desde já, obrigado por qualquer ajuda, Carlos Compartilhar este post Link para o post Compartilhar em outros sites
Thales Caricati 3 Denunciar post Postado Agosto 19, 2011 Você tentou dar um echo pra ver o que ele retorna? Compartilhar este post Link para o post Compartilhar em outros sites
CFximiti 0 Denunciar post Postado Agosto 20, 2011 Você tentou dar um echo pra ver o que ele retorna? Oi Thales: Como tentei n+1 coisas, acabei enrolado e não vi que o segundo loop no update (for $j) não estava funcionando. Eliminei este segundo loop, mas... Com o echo abaixo: if(!isset($cert1[$i])){echo "<p>".$i." - N</p>";}else{echo "<p>".$i." - S</p>";} if(!isset($cert2[$i])){echo "<p>".$i." - N</p>";}else{echo "<p>".$i." - S</p>";} if(!isset($cert3[$i])){echo "<p>".$i." - N</p>";}else{echo "<p>".$i." - S</p>";} if(!isset($cert4[$i])){echo "<p>".$i." - N</p>";}else{echo "<p>".$i." - S</p>";} if(!isset($cert5[$i])){echo "<p>".$i." - N</p>";}else{echo "<p>".$i." - S</p>";} if(!isset($cert6[$i])){echo "<p>".$i." - N</p>";}else{echo "<p>".$i." - S</p>";} if(!isset($cert7[$i])){echo "<p>".$i." - N</p>";}else{echo "<p>".$i." - S</p>";} if(!isset($cert8[$i])){echo "<p>".$i." - N</p>";}else{echo "<p>".$i." - S</p>";} if(!isset($cert9[$i])){echo "<p>".$i." - N</p>";}else{echo "<p>".$i." - S</p>";} if(!isset($cert10[$i])){echo "<p>".$i." - N</p>";}else{echo "<p>".$i." - S</p>";} if(!isset($cert11[$i])){echo "<p>".$i." - N</p>";}else{echo "<p>".$i." - S</p>";} Obtive o mesmo retorno descrito no tópico para gravação no bd (exp: assinalo cert1 e cert2 no registro1, cert4 no registro 2 -> retorna “S” para os cert1, 2 e 4 no registro 1, e “N” para todo o resto. Retirei tb. o segundo loop para atualização no bd, com os mesmos resultados do echo: if(!isset($cert1[$i])){$cert1[$i]==='N';}else{$cert1[$i]==='S';} if(!isset($cert2[$i])){$cert2[$i]==='N';}else{$cert2[$i]==='S';} if(!isset($cert3[$i])){$cert3[$i]==='N';}else{$cert3[$i]==='S';} if(!isset($cert4[$i])){$cert4[$i]==='N';}else{$cert4[$i]==='S';} if(!isset($cert5[$i])){$cert5[$i]==='N';}else{$cert5[$i]==='S';} if(!isset($cert6[$i])){$cert6[$i]==='N';}else{$cert6[$i]==='S';} if(!isset($cert7[$i])){$cert7[$i]==='N';}else{$cert7[$i]==='S';} if(!isset($cert8[$i])){$cert8[$i]==='N';}else{$cert8[$i]==='S';} if(!isset($cert9[$i])){$cert9[$i]==='N';}else{$cert9[$i]==='S';} if(!isset($cert10[$i])){$cert10[$i]==='N';}else{$cert10[$i]==='S';} if(!isset($cert11[$i])){$cert11[$i]==='N';}else{$cert11[$i]==='S';} $sql2="UPDATE inscritos1 SET nome='$nome[$i]', email='$emailUp[$i]', cert1='$icert1[$i]', cert2='$icert2[$i]', cert3='$icert3[$i]', cert4='$icert4[$i]', cert5='$icert5[$i]', cert6='$icert6[$i]', cert7='$icert7[$i]', cert8='$icert8[$i]', cert9='$icert9[$i]', cert10='$icert10[$i]', cert11='$icert11[$i]', pgto='$pgto[$i]', dt_atual='$dt_atual[$i]', atual_por='$atual_por[$i]' WHERE id='$id[$i]'"; $result2=mysql_query($sql2);} Tentei tb. colocar no form um hidden com o mesmo nome “cert[$j][]” e valor “N”, conforme artigo publicado neste fórum (sorry, si-esqueci-me onde), mas tb não resolveu. As respostas, neste caso, ficam espacialmente corretas mas pulam sempre 1 registro. Exemplificando, com o hidden, se marco alguma coisa nos registros 1 e 2, o código grava estas alterações nos devidos campos, mas nos registros 2 e 3...:o( Compartilhar este post Link para o post Compartilhar em outros sites
Deleu 0 Denunciar post Postado Agosto 20, 2011 Cara, o que você quer fazer? Por que você está usando Array para todas as informações do formulário? O nome que você dá ao campo HTML (type="text name="nome") (type="hidden" name="teste") é o index do Array $_POST que vai conter o que o usuário digitar. Usa-se nomes com declarações de array para CheckBox, onde o PHP vai fazer concatenação de Array para salvar todos os valores contidos nos CheckBox que estiverem marcados. Ex.: index.php <input type="text" name="nome" /> <inpyt type="hidden" name="teste" value="<?php echo $algumacoisa; ?>" /> <input type="checkbox" name"box[]" value="1" /> <input type="checkbox" name"box[]" value="2" /> <input type="checkbox" name"box[]" value="3" /> Se você der post nesse formulário para um arquivo PHP, você poderá obter os valores da seguinte forma: post.php <?php echo $_POST['nome'].'<br>'; //Aqui contém o valor que o usuário digitou no campo "nome". echo $_POST['teste'].'<br>'; //Aqui contém o mesmo valor da variável $algumacoisa, do arquivo antigo e está no campo "hidden". echo "<pre>"; print_r($box); //Essa função é usada para escrever Arrays completos. Todos os checkBox que tiveram seus valores marcados estarão aqui dentro. echo "</pre>"; ?> Compartilhar este post Link para o post Compartilhar em outros sites
CFximiti 0 Denunciar post Postado Agosto 20, 2011 Oi, Deleu: Se entendi bem sua pergunta, estou usando arrays para as info do formulário porque estão em um loop "do while". Foi uma das formas que vi por aí, de como fazer múltiplos insert’s/update’s sem ter que referenciar como variável todos os campos de formulário e - fazendo analogia com o split do asp, que entendo um pouco mais -, explodir depois os valores obtidos para a sql. Não acredito que utilizar a “fórmula padrão" [input name=teste no form, $teste = $_POST=[ ’teste’]; explode(",”, $teste) no update] vá mudar alguma coisa... imagino que os valores do checkbox "não checados” continuarão não sendo enviados. Mas vou tentar. E obrigado pela pequena lição teórica sobre array em php - já comecei a entender um pouquinho sobre elas, um dia chego lá! :yes: Apenas para ilustrar, segue imagem do meu form de origem: Compartilhar este post Link para o post Compartilhar em outros sites
CFximiti 0 Denunciar post Postado Agosto 25, 2011 Acho que resolvi... mas se alguém souber como escrever isto de forma menos burra, agradeço! No form, os campos checkbox ficaram assim: <?php while($rs = mysql_fetch_array($result)) { <tr> <td><input type="hidden" name="id[]" id="id" value="<?php echo $rs['id']?>" /> <input type="text" name="nome[]" id="nome" value="<?php echo $rs['nome']?>" /></td> <td><input type="text" name="emailUp[]" id="emailUp" value="<?php echo $rs['email']>" /></td> <?php for ($j=0;$j<=11;$j++) { ?> <td><input type="checkbox" name="cert<?php echo $j."_".$rs['id']?>" value="S" <?php echo valCheck($rs['cert'.$j]) ?> /></td> //função valCheck = se está “S” no bd, escreve “checked” <? ;}?> <td><select name="pgto[]" id="pgto" size="1"> <option value="N" <?php if($rs['pgto']=="N"){echo " selected";}?>>Não</option> <option value="I" <?php if($rs['pgto']=="I"){echo " selected";}?>>Isento</option> <option value="S" <?php if($rs['pgto']=="S"){echo " selected";}?>>Sim</option> </select> <input type="hidden" name="dt_atual[]" id="dt_atual" value="<?php echo date('Y-m-d H:i:s') ?>" /> <input type="hidden" name="atual_por[]" id="atual_por" value="<?php echo $usuario?>" /></td> </tr> </tbody> <?php ;} A “sacada”, se é que se pode chamar assim, foi fazer o update com arrays para todos os outros campos, individualizando apenas os checkbox: if($_POST['atualizar'] <> ''){ mysql_select_db(“meubd", $con) or die(mysql_error()); $size = count($_POST['id']); $id = $_POST['id']; $nome = $_POST['nome']; $emailUp = $_POST['emailUp']; $pgto=$_POST['pgto']; $dt_atual=$_POST['dt_atual’]; $atual_por=$_POST['atual_por’]; //até aqui, tudo normal com arrays para o múltiplo update for($i=0;$i<$size;$i++){ //aqui, com os “checkbox” individualizados por [id], posso fazer condicional para quando não houver valor if(isset($_POST['cert0_'.$id[$i]])){$cert0 = $_POST['cert0_'.$id[$i]];}else{$cert0='N';}; if(isset($_POST['cert1_'.$id[$i]])){$cert1 = $_POST['cert1_'.$id[$i]];}else{$cert1='N';}; if(isset($_POST['cert2_'.$id[$i]])){$cert2 = $_POST['cert2_'.$id[$i]];}else{$cert2='N';}; if(isset($_POST['cert3_'.$id[$i]])){$cert3 = $_POST['cert3_'.$id[$i]];}else{$cert3='N';}; if(isset($_POST['cert4_'.$id[$i]])){$cert4 = $_POST['cert4_'.$id[$i]];}else{$cert4='N';}; if(isset($_POST['cert5_'.$id[$i]])){$cert5 = $_POST['cert5_'.$id[$i]];}else{$cert5='N';}; if(isset($_POST['cert6_'.$id[$i]])){$cert6 = $_POST['cert6_'.$id[$i]];}else{$cert6='N';}; if(isset($_POST['cert7_'.$id[$i]])){$cert7 = $_POST['cert7_'.$id[$i]];}else{$cert7='N';}; if(isset($_POST['cert8_'.$id[$i]])){$cert8 = $_POST['cert8_'.$id[$i]];}else{$cert8='N';}; if(isset($_POST['cert9_'.$id[$i]])){$cert9 = $_POST['cert9_'.$id[$i]];}else{$cert9='N';}; if(isset($_POST['cert10_'.$id[$i]])){$cert10 = $_POST['cert10_'.$id[$i]];}else{$cert10='N';}; if(isset($_POST['cert11_'.$id[$i]])){$cert11 = $_POST['cert11_'.$id[$i]];}else{$cert11='N';}; $sql2="UPDATE inscritos1 SET nome='$nome[$i]', email='$emailUp[$i]', cert0='$cert0', cert1='$cert1', cert2='$cert2', cert3='$cert3', cert4='$cert4', cert5='$cert5', cert6='$cert6', cert7='$cert7', cert8='$cert8', cert9='$cert9', cert10='$cert10', cert11='$cert11', pgto='$pgto[$i]', dt_atual='$dt_atual[$i]', atual_por='$atual_por[$i]' WHERE id='$id[$i]'"; $result2=mysql_query($sql2); } header("Location: index.php"); mysql_close(); exit; } UFA!!! :wacko: Compartilhar este post Link para o post Compartilhar em outros sites