Ir para conteúdo

POWERED BY:

Arquivado

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

DouGuAra

Update Múltiplo com Checkbox

Recommended Posts

Senhores, boa tarde.

 

Eu tenho uma aplicação que está funcionando 100%, porém só funciona quando eu uso assim

 

<?php if ($correio == '0' OR $correio == '') { ?>
<TD bgcolor="<?php echo $cor ?>">

<input type="text" name="correio[]" value="0">


</TD>
<?php } else {  ?>

<TD bgcolor="<?php echo $cor ?>">

<input type="text" name="correio[]" value="1" checked>


</TD>

<?php } ?>

 

e recebo na outro página assim

 

<?php 
include_once('conexao_oficios.php');


if(isset($_POST)){

$count = count($_POST['chave']); 
$i = 0; 

while ($i < $count) { 
$id1 = $_POST['chave'][$i]; 
$correio = $_POST['correio'][$i]; 

$alterar_dados = odbc_exec($conexao,"UPDATE oficios SET inf_correio = '$correio' where Chave = $id1");

++$i; 
}
}

?>

</BODY></HTML>

 

Porém, eu gostaria de usar ele com Checkbox assim

 

<?php if ($correio == '0' OR $correio == '') { ?>
<TD bgcolor="<?php echo $cor ?>"><input type="checkbox" name="correio" value="0"> </TD>
<?php } else { ?>

<TD bgcolor="<?php echo $cor ?>"><input type="checkbox" name="correio" value="1" checked> </TD>

<?php } ?>

</TR>
</TBODY>


<?php



}
?>

 

Só que quando eu tento receber me da o erro que não é compativel, entendo o erro, fiz várias mudanças porém nada faz funcionar, fiz algo semelhante a

 

$radio=$_POST['N_campo'];
if ($radio == 'rnome')
{ $campo='nome'; }
if ($radio == 'rcpf')
{ $campo='CPF'; }
if ($radio == 'rcontrato')
{ $campo='Contrato'; }
if ($radio == 'rvalor')
{ $campo='Valor'; }

 

Porém nada resolve, alquém poderia me ajudar. Grato.

 

Douglas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu problema está aqui

 

<input type="checkbox" name="correio" value="0">
<input type="checkbox" name="correio" value="1">

 

você se esqueceu de colocar o name como array, assim o html entrará em conflito.

 

substitua o name para:

 

<input type="checkbox" name="correio[]" value="0">
<input type="checkbox" name="correio[]" value="1">

 

Assim você define que o checkbox será um array, e não apenas um input.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, eu já tinha feito isso

 

<?php if ($correio == '0' OR $correio == '') { ?>
<TD bgcolor="<?php echo $cor ?>">

<input type="checkbox" name="correio[]" value="0">


</TD>
<?php } else {  ?>

<TD bgcolor="<?php echo $cor ?>">

<input type="checkbox" name="correio[]" value="1" checked>


</TD>

<?php } ?>

</TR>
</TBODY>


<?php
}
?>

 

ai, a hora que ele vai pra outro páginas

 

da erro nessa linha

 

$correio = $_POST['correio'][$i]; 

 

Notice: Undefined offset: 198 in C:\Webserver\Apache\htdocs\Oficios\corr2.php on line 12

 

Varios erros, só mudando o 198 (que deve ser o número da chave)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tem que entender que um checkbox funciona diferente de um text field.

 

O text field sempre existe, da forma que, se el não for preenchido, envia o texto em branco.

 

Já um checkbox, só vai enviar quando for selecionado, por isso, você nunca poderá iterar um vetor de checkbox do jeito que estava tentando.

 

Vou lhe dar um exemplo:

 

Suponha que tenha 4 checkbox:

 

<input value='0' type="checkbox" name="checkbox[]" />
<input value='1' type="checkbox" name="checkbox[]" />
<input value='2' type="checkbox" name="checkbox[]" />
<input value='3' type="checkbox" name="checkbox[]" />

 

Agora, você seleciona somente os campos que possuam o valor 0 e 3, e da um var_dump no post, assim:

 

var_dump( $_POST['checkbox'] );

 

a saída será:

 

array( 0 => 0, 1 => 3 );

 

Apesar do valor 3 ser o quarto checkbox, ele está na chave 1, pois você selecionou somente o primeiro e o quarto checkbox. Se você for tentar acessar ele como:

$_POST['checkbox'][3]

Vai lançar esse notice:

Notice: Undefined offset

 

Que significa que a chave do vetor não existe.

Para iterar um vetor dinâmico, você deve usar, preferencialmente, um foreach

foreach( $_POST['checkbox'] AS $checkbox ) {
  echo $checkbox;
} 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Grabiel desde já obrigado pela atenção!

 

Olha só, fiz, tudo que você disse, até chegar nesse código aqui.

 

Mas nada.

 

 

<?php 
include_once('conexao_oficios.php');


if(isset($_POST)){

$count = count($_POST['chave']); 
$i = 0; 

while ($i < $count) { 
$id1 = $_POST['chave'][$i]; 
//$correio = $_POST['correio'][$i]; 

$correio = $_POST['correio'];
for($s=0; $i<sizeof($correio); $s++){
       $correio = $correio[$s];




$alterar_dados = odbc_exec($conexao,"UPDATE oficios SET inf_correio = '$correio' where Chave = $id1");



++$i; 


}
}
} 


?>




</BODY></HTML>





 

Ele não da erro, porém não faz as alterações. Usei o seu foreach mas também não deu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

o for, nesse caso, está correto.

 

faz assim, altere essa linha:

 

$alterar_dados = odbc_exec($conexao,"UPDATE oficios SET inf_correio = '$correio' where Chave = $id1");

 

para:

 

 

echo "UPDATE oficios SET inf_correio = '$correio' where Chave = $id1<br />";
$alterar_dados = odbc_exec($conexao,"UPDATE oficios SET inf_correio = '$correio' where Chave = $id1") or die( odbc_error($conexao) );

 

O echo é para ver o que aparece no sql, e o die é para, caso houver um erro, mostrar.

Caso seja exibida a sql, tente inserir diretamente no bd, e tente inserir diretamente no SGBD

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Gabriel, não vai.

 

 

Olha só

 

UPDATE oficios SET inf_correio = '0' where Chave = 260

UPDATE oficios SET inf_correio = '0' where Chave = 259

UPDATE oficios SET inf_correio = '0' where Chave = 258

Fatal error: Maximum execution time of 30 seconds exceeded in C:\Webserver\Apache\htdocs\Oficios\corr2.php on line 14

 

 

Ai ele entra num loop infinito e não altera o que eu eu deixo como ckeck. ou seja 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Gabriel, não vai.

 

 

Olha só

 

UPDATE oficios SET inf_correio = '0' where Chave = 260

UPDATE oficios SET inf_correio = '0' where Chave = 259

UPDATE oficios SET inf_correio = '0' where Chave = 258

Fatal error: Maximum execution time of 30 seconds exceeded in C:\Webserver\Apache\htdocs\Oficios\corr2.php on line 14

 

 

Ai ele entra num loop infinito e não altera o que eu eu deixo como ckeck. ou seja 1

 

seu problema está qui

 

for($s=0; $s < sizeof($correio); $s++)

você tinha, no lugar de $s, $i, substitua essa linha e teste novamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

seu problema está qui

 

for($s=0; $s < sizeof($correio); $s++)

você tinha, no lugar de $s, $i, substitua essa linha e teste novamente.

 

 

Gabriel, grato desde já.

 

Agora os loopings estão, okay, porém ele não me tras os resultados que foram checados, os inputs estão certos.

<input type="checkbox" name="correio[]" value="0">

<input type="checkbox" name="correio[]" value="1" checked>

 

e ele me tras isso

UPDATE oficios SET inf_correio = '0' where Chave = 58

UPDATE oficios SET inf_correio = '0' where Chave = 57

UPDATE oficios SET inf_correio = '0' where Chave = 56

UPDATE oficios SET inf_correio = '0' where Chave = 55

UPDATE oficios SET inf_correio = '0' where Chave = 3

 

Não sei mais o que fazer, será que na página que ele vai fazer o update tenhamos que definir o valor lá, igual eu fiz com um radio.

 

$radio=$_POST['N_campo'];

if ($radio == 'rnome')

{ $campo='nome'; }

 

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

você está usando o mesmo nome de variável para duas variáveis.

 

tenta assim:

$correios = $_POST['correio'];
for( $s = 0; $s < sizeof( $correios ); $s++ ){
   $correio = $correios[$s];
   $alterar_dados = odbc_exec($conexao,"UPDATE oficios SET inf_correio = '$correio' where Chave = $id1");
   ++$i; 
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel, mudei, mas o resultado da input é sempre 0.

 

Olha como ficou

 

$correio1 = $_POST['correio'];

for($s=0; $s<sizeof($correio1); $s++){

$correio1 = $correio1[$s];

 

 

echo "UPDATE oficios SET inf_correio = '$correio1' where Chave = $id1<br />";

$alterar_dados = odbc_exec($conexao,"UPDATE oficios SET inf_correio = '$correio1' where Chave = $id1") or die( odbc_error($conexao) );

 

 

e olha o resultado.

 

 

 

UPDATE oficios SET inf_correio = '0' where Chave = 63

UPDATE oficios SET inf_correio = '0' where Chave = 62

UPDATE oficios SET inf_correio = '0' where Chave = 61

UPDATE oficios SET inf_correio = '0' where Chave = 60

UPDATE oficios SET inf_correio = '0' where Chave = 59

UPDATE oficios SET inf_correio = '0' where Chave = 58

UPDATE oficios SET inf_correio = '0' where Chave = 57

UPDATE oficios SET inf_correio = '0' where Chave = 56

UPDATE oficios SET inf_correio = '0' where Chave = 55

UPDATE oficios SET inf_correio = '0' where Chave = 3

 

 

 

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites
$correio1 = $_POST['correio'];

for($s=0; $s<sizeof($correio1); $s++){

$correio1 = $correio1[$s];

 

novamente, você repetiu os nomes das variáveis. Tem que entender que, aqui, $correio1

$correio1 = $_POST['correio']; 

necessita ser diferente de, $correio1 (o primeiro que aparece):

$correio1 = $correio1[$s];

 

Você está sobrescrevendo as suas variáveis e, assim, perdendo seus atuais valores.

Se você ver bem como eu coloquei no exemplo anterior, verá nomes diferentes para as variáveis.

 

$correios = $_POST['correio'];

for( $s = 0; $s < sizeof( $correios ); $s++ ){

$correio = $correios[$s];

$alterar_dados = odbc_exec($conexao,"UPDATE oficios SET inf_correio = '$correio' where Chave = $id1");

++$i;

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Grande Gabriel.

 

Veja, só, se eu fizer isso que você falou, o sistema roda. Mas veja como fica a chave, ela repete várias vezes e o valor continua sendo "0", só fazendo daquela for o sistema roda todas as chaves.

 

$correios = $_POST['correio']; 
for( $s = 0; $s < sizeof( $correios ); $s++ ){ 
   $correio = $correios[$s]; 
echo "UPDATE oficios SET inf_correio = '$correio' where Chave = $id1<br />"; 
   $alterar_dados = odbc_exec($conexao,"UPDATE oficios SET inf_correio = '$correio' where Chave = $id1"); 

 

 

UPDATE oficios SET inf_correio = '0' where Chave = 70

UPDATE oficios SET inf_correio = '0' where Chave = 70

UPDATE oficios SET inf_correio = '0' where Chave = 70

UPDATE oficios SET inf_correio = '0' where Chave = 70

UPDATE oficios SET inf_correio = '0' where Chave = 70

UPDATE oficios SET inf_correio = '0' where Chave = 63

UPDATE oficios SET inf_correio = '0' where Chave = 63

UPDATE oficios SET inf_correio = '0' where Chave = 63

UPDATE oficios SET inf_correio = '0' where Chave = 63

UPDATE oficios SET inf_correio = '0' where Chave = 63

UPDATE oficios SET inf_correio = '0' where Chave = 63

UPDATE oficios SET inf_correio = '0' where Chave = 63

UPDATE oficios SET inf_correio = '0' where Chave = 56

UPDATE oficios SET inf_correio = '0' where Chave = 56

UPDATE oficios SET inf_correio = '0' where Chave = 56

UPDATE oficios SET inf_correio = '0' where Chave = 56

UPDATE oficios SET inf_correio = '0' where Chave = 56

UPDATE oficios SET inf_correio = '0' where Chave = 56

UPDATE oficios SET inf_correio = '0' where Chave = 56

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você aplicou de forma errada a lógica errada, e está tendo um resultado errado...

 

Me diga, o que realmente necessita vir no campo inf_correio?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel Heming

 

Vamos lá, deu um tempo aqui e consegui refazer e agora sim, cheguei num ponto, de todos os reguistro que tenho eu consigo fazer aparecer apenas os que eu selecionei. O problema agora é o seguinte. Eu não consigo pegar o número da chave (id) do banco

 

Nesse exemplo ele me tras as quantidade que eu selecionei e seu valor, ótimo, porém, eu não sei como vou fazer pra pegar a Chave de cada registro.

 

<TD bgcolor="<?php echo $cor ?>" title="<?php echo $pos ?>"><a href="oficios_editar.php?id=<?php echo $id ?>"><?php echo $oficio ?></a></TD>
<TD bgcolor="<?php echo $cor ?>" title="Demorou <?php echo $df;?> dias para chegar"><?php echo $data_rec2 ?></TD>
<TD bgcolor="<?php echo $cor ?>"><?php echo $data_of2 ?> </TD>
<TD bgcolor="<?php echo $cor ?>"><?php echo $ref?></TD>
<TD bgcolor="<?php echo $cor ?>"><?php echo $parte?></TD>
<input type="hidden" name="chave[]" value="<?php echo $id ?>">
<TD bgcolor="<?php echo $cor ?>">

<input type="checkbox" name="correio[]" value="11">

 

 

<?php 
if (isset($_POST['submit'])) { 
   $correio1 = $_POST["correio"]; 
   $quantidade = count($correio1); 

   echo 'Total encontrados: '.$quantidade.'<br><br>'; 

   if ($quantidade > 0) { 
       echo 'Você escolheu:<br>'; 
   } 
   for ($i=0; $i < $quantidade; $i++) { 
       echo ($i+1) . '- ' . $correio1[$i] . '<br>'; 

//echo $correio1[$i];

 echo "<br><br>" ; 

   } 
       echo "<br><br>" ; 

} 
?> 

 

Abraços..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel Heming

 

Vamos lá, deu um tempo aqui e consegui refazer e agora sim, cheguei num ponto, de todos os reguistro que tenho eu consigo fazer aparecer apenas os que eu selecionei. O problema agora é o seguinte. Eu não consigo pegar o número da chave (id) do banco

 

Nesse exemplo ele me tras as quantidade que eu selecionei e seu valor, ótimo, porém, eu não sei como vou fazer pra pegar a Chave de cada registro.

 

<TD bgcolor="<?php echo $cor ?>" title="<?php echo $pos ?>"><a href="oficios_editar.php?id=<?php echo $id ?>"><?php echo $oficio ?></a></TD>
<TD bgcolor="<?php echo $cor ?>" title="Demorou <?php echo $df;?> dias para chegar"><?php echo $data_rec2 ?></TD>
<TD bgcolor="<?php echo $cor ?>"><?php echo $data_of2 ?> </TD>
<TD bgcolor="<?php echo $cor ?>"><?php echo $ref?></TD>
<TD bgcolor="<?php echo $cor ?>"><?php echo $parte?></TD>
<input type="hidden" name="chave[]" value="<?php echo $id ?>">
<TD bgcolor="<?php echo $cor ?>">

<input type="checkbox" name="correio[]" value="11">

 

 

<?php 
if (isset($_POST['submit'])) { 
   $correio1 = $_POST["correio"]; 
   $quantidade = count($correio1); 

   echo 'Total encontrados: '.$quantidade.'<br><br>'; 

   if ($quantidade > 0) { 
       echo 'Você escolheu:<br>'; 
   } 
   for ($i=0; $i < $quantidade; $i++) { 
       echo ($i+1) . '- ' . $correio1[$i] . '<br>'; 

//echo $correio1[$i];

 echo "<br><br>" ; 

   } 
       echo "<br><br>" ; 

} 
?> 

 

Abraços..

 

Bom, se você tem de passar o valor do checkbox, junto com a chave do banco, fica mais fácil de eu te ajudar e de encontrar uma solução.

 

Primeiro passo, associar as coisas.

 

Algo que pouca gente utiliza, no HTML ao menos, é utilizar chaves de vetores (do mesmo modo que o php). E como diabos se faz isso?

<input type="checkbox" name="correio[<?php echo $id /** esse é o id do banco **/ ?>]" value="<?php echo $value /** aqui você insere o valor correspondente **/ ?>">

 

E agora, como se faz para pegar a chave no php?????

Do mesmo modo que se pega uma chave no php \o/

$correios = $_POST['correios'];
foreach( $correios AS $key => $correio ) {
   /** 
   $correio é o value que está no checkbox
   $key é o valor que está dentro dos colchetes ( correio[ esse valor aqui ] )
   **/
   echo "UPDATE oficios SET inf_correio = '$correio' where Chave = $key<br />"; 
}

 

É isso cara, mais fácil impossível.

Agora é só você adaptar isso ao seu código.

 

Qualquer dúvida, não tenha medo de perguntar. O que eu não quero, é fazer por ti, pois a ideia do fórum é aprender e não ganhar pronto

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.