Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Dúvida - Update em tabelas do SQL, através de formulário php

Gente, boa tarde,

Existe uma tabela que preciso atualizar apenas 3 colunas dela, via formulário... Mas quando eu atualizo, por algum motivo, o valor que eu lanço na última linha atualiza a tabela inteira...

Meu ID não é primary key, é Not Null, pois ele não será gerado sozinho... eu disponibilizarei a tabela no site da intranet e outros usuários da empresa atualizarão os valores das colunas variáveis..

Não posso fazer uma query por linha, pois futuramente essa planilha terá mais de 1000 valores..

Agradeço quem puder ajudar

9 respostas

Oi Karyna, Tudo bem? Mostra um exemplo do SQL pra gente ver como podemos resolver isso? Um exemplo da estrutura da tabela também seria ótimo.

Oi, Wanderson, vamos lá: A tabela, no index possui esse código, no inicio dele existem 3 includes: cabeçalho, conecta (onde existe a $conexao) e o banco-dado

        <div class="table-striped">
            <form action="adiciona-dado.php" method="post">

                <table class="table-striped">            
                    <thead>
                        <tr>
                            <th class="titulo_cell">CPF ou CNPJ</th>
                            <th class="titulo_cell" >Agência</th>
                            <th class="titulo_cell" >Valor</th>
                            <th class="titulo_cell" >Origem Recurso</th>
                            <th class="titulo_cell" >Origem Avaliação</th>
                            <th class="titulo_cell" >Situação</th>
                            <th class="titulo_cell" >Pendência</th>
                            <th class="titulo_cell" >Observação</th>
                        </tr>
                    </thead>

                    <?php $dados = listaDados($conexao); foreach($dados as $dado) : ?>
                        <tbody>
                            <tr>
                                <td name="campo1"> <?php echo $dado['Campo1']; ?> </td>
                                <td name="campo2"> <?php echo $dado['Campo2']; ?> </td>
                                <td name="campo3"> <?php echo $dado['Campo3']; ?> </td>
                                <td name="campo4"> <?php echo $dado['Campo4']; ?></td>
                                <td name="campo5"> <?php echo $dado['Campo5']; ?> </td>
                                <td><input type="text" name="campo6" class="form-control"><? $dado['Campo6']?></input></td>
                                <td><input type="text" name="campo7" class="form-control"><? $dado['Campo7']?></input></td>
                                <td><input type="text" name="campo8" class="form-control"><? $dado['Campo8']?></input></td>
                                <td><button type="submit" class="btn">Incluir</button></td>
                            </tr>
                        </tbody>
                    <?php endforeach ?>
                </table>
            </form>
        </div>

O código do Banco-Dado é

<?php

function listaDados($conexao) {
    $dados = array();
    $resultado = mssql_query("select * from dbo.avalia_pf2", $conexao);

    while($dado = mssql_fetch_assoc($resultado)) {
        array_push($dados, $dado);
    }

    return $dados;
}

function insereDado($conexao, $id, $campo6, $campo7, $campo8) {
    $query = "update dbo.avalia_pf2 set campo6 = '{$campo6}', campo7 = '{$campo7}', campo8 = '{$campo8}' where id= {$id}";
    $resultadoDaInsercao = mssql_query($query, $conexao);
    return $resultadoDaInsercao;
}



?>

O código de adiciona-dado é:

<?php

//variáveis//
$id = 'id';
$campo6 = $_POST["campo6"];
$campo7 = $_POST["campo7"];
$campo8 = $_POST["campo8"];


?>

<?php if (insereDado($conexao, $id,$campo6, $campo7, $campo8)) { ?>    
    <p class="text-success"> Resposta adicionada com sucesso!</p>

<?php } else { ?>
    <p class="text-danger">Algum campo não foi preenchido corretamente.</p>
<?php } ?>

Aqui embaixo seguem imagens da planilha na página e de como ela sobe para o SQL:

http://ap.imagensbrasil.org/image/j93rmX http://ap.imagensbrasil.org/image/j93FeD

Olá Karyna, na sua query você usa o id para filtrar os dados que serão alterados:

$query = "update dbo.avalia_pf2 set campo6 = '{$campo6}', campo7 = '{$campo7}', campo8 = '{$campo8}' where id= {$id}";

Mas nesse trecho você esta definindo a variável $id com um valor fixo 'id':

//variáveis//
$id = 'id';
$campo6 = $_POST["campo6"];

Se o valor do campo id for igual em todas as linhas da sua tabela, o update vai alterar todas essas linhas com o último valor inserido.

Oi, Alex, eu imaginei que fosse isso mesmo. Mas como eu faço para passar a informação que é para alterar só os dados daquela linha? Eu imagino que seja uma informação que diz que o id muda linha a linha, mas não sei como fazer isso no código. Alguma ideia? Obrigada!

Karyna, pleo que entendi, você vai precisar enviar o ID da agência, não é mesmo? Considerando isso você precisa transformar aquela coluna da tabela do id da agência em um campo input.

<td name="campo2"> 
  <input type="text" name="campo2" value="<?php echo $dado['Campo2']; ?>">
</td>

Receber esse valor como id:

$id = $_POST['id'];

E executar a consulta SQL como o Alex mostrou, usando o WHERE. A dica agora é: Como você vai transformar o campo2 em um input pra ele poder ser enviado para o servidor, você também precisa precaver de alguém não alterar esse valor manualmente, fazendo com que outra linha do seu banco seja alterada indevidamente.

Neste caso você pode usar o atribudo readonly ou criar um outro input oculto com o ID da agência e não alterar o atual. Ai você pode ter o seguinte código:

<td id="campo2"> 
  <value="<?php echo $dado['Campo2']; ?>
  <input type="hidden" name="campo2" value="<?php echo $dado['Campo2']; ?>">
</td>

Cuidado pra não ter várias tags com o mesmo valor no name isso pode confundir tudo.

Não, Wanderson, as agências estão como número 1, 2, 3 porque eu inseri dados fictícios, ele não é o ID.

Eu vou enviar uma tabela onde os Campos de 1 a 5 são informados por mim e as agências precisam responder os Campos 6, 7 e 8 de cada linha.

Já tentei declarar a variável do ID tanto como Get quanto como Post. O resultado é esse mesmo que enviei nas imagens.

Karyna, o problema é que o ID não está sendo nem enviado, eu presumi que o campo2 fosse o ID por causa do que as imagens mostra, você precisa informar esse ID em um input, ai sim ele vai ser enviado. Entendeu?

solução!

Pelo que eu vi seria necessário criar um formulário por linha, o problema é que isto não é algo semântico, ou seja, ou o formulário pega a tabela inteira (como se fez no HTML postado), ou fica dentro de uma célula, fazer a tag form pegar a linha (TR) é algo não recomendado pelas regras do W3C.

Porém, nada que um pouco de Javascript não resolva.

Como eu suponho que o ID é automático no banco de dados, se poderia eliminar o formulário que pega a tabela inteira e fazer o seguinte ajuste no HTML:


<?php $dados = listaDados($conexao); 
foreach($dados as $dado) : ?>
    <tbody>
        <tr>
            <td name="campo1"> <?php echo $dado['Campo1']; ?> </td>
            <td name="campo2"> <?php echo $dado['Campo2']; ?> </td>
            <td name="campo3"> <?php echo $dado['Campo3']; ?> </td>
            <td name="campo4"> <?php echo $dado['Campo4']; ?></td>
            <td name="campo5"> <?php echo $dado['Campo5']; ?> </td>
            <td><input type="text" id="campo6_<? echo $dado['id']?>" name="campo6_<? echo $dado['id']?>" class="form-control"><? echo $dado['Campo6']?></input></td>
            <td><input type="text" id="campo7_<? echo $dado['id']?>" name="campo7_<? echo $dado['id']?>" class="form-control"><? echo $dado['Campo7']?></input></td>
            <td><input type="text" id="campo8_<? echo $dado['id']?>" name="campo8_<? echo $dado['id']?>" class="form-control"><? echo $dado['Campo8']?></input></td>
            <td>
            <form method="POST" name="form_<? echo $dado['id']?>" action="adiciona-dado.php" onSubmit="return EnviarDados(this, <? echo $dado['id']?>)">
                <input type="hidden" name="campo6" value="">
                <input type="hidden" name="campo7" value="">
                <input type="hidden" name="campo8" value="">
                <input type="hidden" name="id" value="<? echo $dado['id']?>">
                <input type="submit" class="btn" value="Incluir">
            </form>
            </td>
        </tr>
    </tbody>
 <?php endforeach ?>

No exemplo acima, é criado um form dentro da última coluna de cada linha. Os campos editáveis ganham um id único, e cada form tem um nome único. Todos os campos são hidden, sendo que o id é o único a estar preenchido

O javascript a ser executado ao enviar o formulário vai transferir os campos da linha atual para o formulário correspondente, que vai ser postado para a pagina onde vai ser feita a atualização dos dados

<script type="text/javascript">
function EnviarDados(form, id){
    form.campo6.value = document.getElementById("campo6_" + id).value;
    form.campo7.value = document.getelementbyId("campo7_" + id).value;
    form.campo8.value = document.getelementbyId("campo8_" + id).value;
}

</script>

Para receber, os dados, seria assim:

<?php
//variáveis//
$id = "";
$campo6 = "";
$campo7 = "";
$campo8 = "";
if (isset($_POST["id"])){
    $id = $_POST["id"];
}
if (isset($_POST["campo6"])){
    $campo6 = $_POST["campo6"];
}
if (isset($_POST["campo7"])){
    $campo7 = $_POST["campo7"];
}
if (isset($_POST["campo8"])){
    $campo8 = $_POST["campo8"];
}
if ($id != ""){
    if (insereDado($conexao, $id,$campo6, $campo7, $campo8)) {
?>    
    <p class="text-success"> Resposta adicionada com sucesso!</p>
<?    
    } else {
?>
    <p class="text-danger">Algum campo não foi preenchido corretamente.</p>
<?    
    }
} else {
?>
    <p class="text-danger">Não recebi o ID.</p>
<?
}
?>

Bom, se for seguir abordagem do Daniel, também é uma coisa válida. Você vai começar a depender do JavaScript pra que tudo funcione. E se for usar mesmo assim, nem precisa criar os inputs em cada linha, basta usar o atributo contenteditable na tr que assim você pode alterar os valores normalmente :)