Update de foreach aninhado

Enviada por Thiago Henrique 
Thiago Henrique
Update de foreach aninhado
27 de April de 2012 às 12:11PM
Boa tarde galera,
A pouco tempo eu postei aqui uma duvida sobre dados dinamicos de um formulario, que o Jayme me ajudou a resolver usando foreach aninhado (link do post: http://phpbrasil.com/phorum/read.php?1,184677,184677#msg-184677 ).
Até então tudo funcionou na parte de inserir os dados, mas agora estou tentanto fazer um update nesses dados e não estou conseguindo, esse é o código que estou tentando fazer o update:

if($id) {

if(isset($_POST["responsavel_acao"])) {
// Faz um loop no Array dos campos da tabela 5

foreach($_POST["responsavel_acao"] as $key => $responsavel_acao) {
$acao_tomada = isset($_POST['acao_tomada'][$key])? $_POST['acao_tomada'][$key] :null;
$data_realizacao = isset($_POST['data_realizacao'][$key])? $_POST['data_realizacao'][$key] :null;

$sql_update = "UPDATE acao_corretiva SET responsavel_acao='$responsavel_acao',acao_tomada='$acao_tomada',data_realizacao='$data_realizacao';";

$retorno = mysql_query($sql_update);

}
}
}
if($retorno)
{
echo "<script>alert('Alteração realizada com sucesso!'); window.location='exibir_nc.php?id=$id' </script>";
}else
{
echo "Nao foi possivel concluir a alteracao!<br>";
echo mysql_error();
}

}

Eu usei a mesma lógica do insert e não funcionou, quando clico no botão alterar no meu form os dados que estão na tabela acao_corretiva são todos substituidos pelo o ultimo dado listado da mesma tabela, ou seja, se eu tenho 3 informações diferentes referentes ao mesmo cadastro, essas informações são todas alteradas para a ultima informação digitada e no fim o window.location retorna para uma pagina de id não cadastrado.

Muito obrigado pela atenção!
Jayme A. C. Gimenez
Re: Update de foreach aninhado
27 de April de 2012 às 03:03PM
Sua dificuldade, agora, está no SQL (a query que faz o update).

E é um erro bem, bem básico...

Você não está especificando a linha do bd em que o update será feito. Isso é feito com uma cláusula WHERE na query, geralmente usando o id da linha a ser atualizada.

Tipo:

$sql_update = "UPDATE acao_corretiva SET responsavel_acao='$responsavel_acao',acao_tomada='$acao_tomada',data_realizacao='$data_realizacao' WHERE tabela_id = '$id'; (claro que, para isso, o id de cada linha tem que estar no form - geralmente como um campo hidden, e ser capturado pelo foreach aninhado).

Mas, olha, deixa eu dizer uma coisa: sem saber um mínimo de SQL não tem como sequer pensar em se meter a fazer sistemas que usam bancos de dados.
Thiago Henrique
Re: Update de foreach aninhado
30 de April de 2012 às 09:14AM
Então Jayme eu acabei postando apenas parte do código, mas a parte original tem sim o WHERE id = $id
e esse ID vem de um campo hidden passado no form. Todo o meu formulario funciona a parte de alteração e inserção, porém apenas a parte do foreach é que não está 100%.

if(isset($_POST["responsavel_acao"])) {
// Faz um loop no Array dos campos da tabela 5
foreach($_POST["responsavel_acao"] as $key => $responsavel_acao) {
$acao_tomada = isset($_POST['acao_tomada'][$key])? $_POST['acao_tomada'][$key] :null;
$data_realizacao = isset($_POST['data_realizacao'][$key])? $_POST['data_realizacao'][$key] :null;
$id_corretiva = isset($_POST['id_corretiva'][$key])? $_POST['id_corretiva'][$key] :null;

$sql_update = "UPDATE acao_corretiva SET responsavel_acao='$responsavel_acao',acao_tomada='$acao_tomada',data_realizacao='$data_realizacao' where id_acao = '$id_corretiva';";

$retorno = mysql_query($sql_update);

Esse é o original seguindo o modelo do insert que vc havia me mostrado da ultima vez.Deixa eu explicar a situação: O $id_corretiva é referente ao id passado no form, na tela de exibição todos os dados da acao_corretiva são mostrados normalmente.Na hora da alteração apenas o primeiro dado dessa lista é alterado e esse dado é copiado para as demais linhas.

esse é o código de exibição:

<table>
<tr>
<td colspan="4">5 - Ação Corretiva</td>
</tr>
<?php
while($linha = mysql_fetch_array($resultado2))
{
?>
<input type="hidden" name="id_corretiva" value="<?php echo $linha['id_acao'] ?>">

<tr>
<td>Responsável</td>
<td colspan="2">Ação tomada</td>
<td>Data Realização</td>
</tr>
<tr>
<td align="center">
<select name="responsavel_acao[]">
<option value="<?php echo $linha['responsavel_acao'] ?>" selected><?php echo $linha['nome'] ?></option>
<option value="">Selecione...</option>

<?php $query = mysql_query('SELECT id_login, nome FROM login WHERE situacao = "Ativo" order by nome');
while($login = mysql_fetch_array($query)) { ?>
<option value="<?php echo $login["id_login"] ?>"><?php echo $login['nome'] ?></option>
<?php } ?>
</select>
</td>

<td colspan="2" align="center"><textarea name="acao_tomada[]" rows="2" cols="35"><?php echo $linha['acao_tomada'] ?></textarea></td>
<td align="center"><input type="text" name="data_realizacao[]" size="10" value="<?php echo $linha['data_realizacao'] ?>"></td>
</tr>
<?php
}
?>
</table>

Além dele exibir os dados da acao_corretiva, ele também lista em um combobox os usuarios disponiveis(isso funciona normalmente) para seleção. Eu acredito que o erro esteja no meu foreach de update, pois todo o resto do form funciona, apenas o foreach que não está 100%, o while $resultado2 vem de um SELECT do banco.Eu acredito que o erro esteja no meu foreach, pois eu nunca tinha usando ele dessa forma, então nao sei a forma correta de passar os parametros.



Muito obrigado pela atenção!
Thiago Henrique
Re: Update de foreach aninhado
03 de May de 2012 às 06:46AM
Ainda não consegui resolver o problema acima, alguém tem alguma ideia de como resolver?


Obrigado!
Jayme A. C. Gimenez
Re: Update de foreach aninhado
03 de May de 2012 às 02:01PM
Se este é o original, não está dando erro de sintaxe?

$sql_update = "UPDATE acao_corretiva SET responsavel_acao='$responsavel_acao',acao_tomada='$acao_tomada',data_realizacao='$data_realizacao' where id_acao = '$id_corretiva';";

Não entendi bem o problema, agora. Mas arrisco um palpite: o $id_corretiva está correto no form? Está seguro de que cada grupo de campos do form, gerados dinamicamente, está atrelado ao seu respectivo $id_corretiva ?
Thiago Henrique
Re: Update de foreach aninhado
03 de May de 2012 às 02:26PM
Erro de sintaxe? Ele nao retorna nenhuma mensagem de erro aqui.
O $id_corretiva esta sendo gerado corretamente, ja feriquei isso, a cada ação que ele retorna vem o id correspondente.
O erro que acontece é assim:
Tem 2 ações listadas;
E altero as informações da primeira ação e clico em alterar;
Não aparece nenhum erro, apenas a mensagem de alteração realizada com sucesso;
Quando os dados são listados de novo o primeiro dado que alterei continua o mesmo, porém o segundo o qual eu nao havia mexido, agora ele contém as informações que eu tinha alterado na primeira ação.
Eu achei que o erro seria no foreach, porque ja verifiquei se ele retorna o id correto, ja troquei a parte where id_acao = '$id_corretiva pelo id da tabela vinculada a ação e também não funcionou.

Teria mais algum outro palpite? Se quiser posto um print, ou mando um e-mail com o código para visualizar melhor.

Obrigado pela atenção!
Jayme A. C. Gimenez
Re: Update de foreach aninhado
03 de May de 2012 às 02:52PM
Loops sempre nos causam alguma confusão, de fato. Não é intuitivo lidar com eles.

Se você troca o update por um simples echo, os dados aparecem, na tela, corretamente aninhados?

Tipo:

if(isset($_POST["responsavel_acao"])) {
// Faz um loop no Array dos campos da tabela 5
foreach($_POST["responsavel_acao"] as $key => $responsavel_acao) {
$acao_tomada = isset($_POST['acao_tomada'][$key])? $_POST['acao_tomada'][$key] :null;
$data_realizacao = isset($_POST['data_realizacao'][$key])? $_POST['data_realizacao'][$key] :null;
$id_corretiva = isset($_POST['id_corretiva'][$key])? $_POST['id_corretiva'][$key] :null;


echo $responsavel_acao.", ".$acao_tomada", ".$data_realizacao.", ".$id_corretiva;
echo "<br />";

}
}

Em cada uma das linhas de um echo desse tipo, estão os dados certos? Não estão trocados? Poste os resultados de um echo desse tipo para vermos.
Thiago Henrique
Re: Update de foreach aninhado
04 de May de 2012 às 09:05AM
Bom dia!
Então Jayme fiz o teste e realmente o ID do segundo item não estava aparecendo corretamente e por esse motivo acontecia o erro.
Após analizar meu código percebi onde estava o erro, é um erro bem básico e um pouco dificil de perceber:

<input type="hidden" name="id_corretiva" value="<?php echo $linha['id_acao'] ?>

O problema está no name="id_corretiva", como ele faz parte do foreach o correto seria name="id_corretiva[]", por causa da falta do [] ele não mostrava o id corretamente.

Muito obrigado pela ajuda e pela atenção!
Você precisa estar logado no PHPBrasil.com para poder enviar mensagens para os nossos fóruns.

Faça o login aqui.