Ir para conteúdo
phpnoob

[Resolvido] update em múltiplas linhas da mesma coluna

Recommended Posts

Boa noite galera, gostaria muito de uma ajudinha
Tenho em meu banco de dados uma tabela com três colunas (id - valor - titulo).

 

Meu formulário recebe estes dados e exibe nos inputs para uma possível atualização.

<form action="" method="post" enctype="multipart/form-data">
  
  <button>Atualizar</button>
  <input type="hidden" name="id[]" value="1">
  <label>Item 1</label>
  <input name="valor[]" value="Item 1" type="text">
  
  <input type="hidden" name="id[]" value="2">
  <label>Item 2</label>
  <input name="valor[]" value="Item 2" type="text">
  
</form>


Preciso que esse formulário atualize suas linhas correspondentes.

Executando o script a baixo direto no mysql funciona porem queria passar isso de forma dinâmica usando o php por que nem sempre o id e o valor serão o mesmo.

UPDATE tabela SET valor = CASE id WHEN 1 THEN 'Valor do item' WHEN 2 THEN 'valor do item 2' END WHERE id in(1, 2)


Alguém tem alguma ideia de como posso fazer ?

Estou usando PDO, ja tentei inúmeras formas com for, while e foreach mas sempre atualiza as linhas com o mesmo valor do ultimo campo.

 

Desde já agradeço vocês

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

1 - Livre-se do input hidden com o ID.

 

2 - Coloque o ID junto à informação do valor a ser editado. Assim:

<form action="" method="post" enctype="multipart/form-data">
  <button>Atualizar</button>
  <label>Item 1</label>
  <input name="valor[1]" value="Item 1" type="text">
  
  <!-- perceba que mudei o id, para mostrar que não precisa ser sequencial -->
  <label>Item 4</label>
  <input name="valor[4]" value="Item 4" type="text">
  
</form>

 

3 - Agora, no PHP, faça uma volta ao redor deles, atualizando um por um.

foreach( $_POST[ 'valor' ] as $id => $valor ) {
    if ( $valor !== '' ) { //se não estiver vazio, vamos atualizar
        $consulta = "UPDATE FROM tabela SET coluna = '{$valor}' WHERE id = {$id}";
        // e agora execute a consulta aqui...
    }
}

 

Nota que isso é bem mais simples? Para cada input valorado, você roda um UPDATE. Para situações normais, geralmente esse caminho é suficiente, além de ser mais legível e prático.

Mas algumas vezes, otimizar para reduzir as consultas é bacana, e aí a sua consulta com CASE entra.

 

Caso prefira com apenas uma consulta, você poderia fazer dessa forma:

<?php
// Apenas para testar
$array = [
    3 => 'testando',
    4 => 'hehe',
    10 => 'foo',
];

// Estou usando $array para testar, mas na prática basta substituir por $_POST[ 'valor' ]
$ids = array_keys( $array );
$ids_string = implode( ', ', $ids );

$case_string = implode( ' ', array_map(
    function( $id, $valor ) {
        return "WHEN {$id} THEN '{$valor}'";
    },
    $ids,
    $array
) );

// Agora atualizamos, mas apenas se a string não estiver vazia
if ( $case_string ) {
    $sql = "UPDATE tabela SET valor = CASE {$case_string} END WHERE id IN( {$ids_string} )";
    
    echo $sql;
}

 

Resultado do exemplo acima:

UPDATE tabela SET valor = CASE WHEN 3 THEN 'testando' WHEN 4 THEN 'hehe' WHEN 10 THEN 'foo' END WHERE id IN( 3, 4, 10 )

 

Ainda daria para otimizar mais, se fosse o caso... mas assim ao menos está rodando em uma consulta. Como efeito colateral, você tem um código maior e mais complexo. Geralmente, eu iria preferir a alternativa anterior...

 

Observe também que nenhuma das consultas está segura contra SQL injection, pois isso é outro tópico...

 

Espero ter ajudado. Até mais :)

  • Obrigado! 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
25 minutos atrás, Matheus Tavares disse:

Olá!

 

1 - Livre-se do input hidden com o ID.

 

2 - Coloque o ID junto à informação do valor a ser editado. Assim:


<form action="" method="post" enctype="multipart/form-data">
  <button>Atualizar</button>
  <label>Item 1</label>
  <input name="valor[1]" value="Item 1" type="text">
  
  <!-- perceba que mudei o id, para mostrar que não precisa ser sequencial -->
  <label>Item 4</label>
  <input name="valor[4]" value="Item 4" type="text">
  
</form>

 

3 - Agora, no PHP, faça uma volta ao redor deles, atualizando um por um.


foreach( $_POST[ 'valor' ] as $id => $valor ) {
    if ( $valor !== '' ) { //se não estiver vazio, vamos atualizar
        $consulta = "UPDATE FROM tabela SET coluna = '{$valor}' WHERE id = {$id}";
        // e agora execute a consulta aqui...
    }
}

 

Nota que isso é bem mais simples? Para cada input valorado, você roda um UPDATE. Para situações normais, geralmente esse caminho é suficiente, além de ser mais legível e prático.

Mas algumas vezes, otimizar para reduzir as consultas é bacana, e aí a sua consulta com CASE entra.

 

Caso prefira com apenas uma consulta, você poderia fazer dessa forma:


<?php
// Apenas para testar
$array = [
    3 => 'testando',
    4 => 'hehe',
    10 => 'foo',
];

// Estou usando $array para testar, mas na prática basta substituir por $_POST[ 'valor' ]
$ids = array_keys( $array );
$ids_string = implode( ', ', $ids );

$case_string = implode( ' ', array_map(
    function( $id, $valor ) {
        return "WHEN {$id} THEN '{$valor}'";
    },
    $ids,
    $array
) );

// Agora atualizamos, mas apenas se a string não estiver vazia
if ( $case_string ) {
    $sql = "UPDATE tabela SET valor = CASE {$case_string} END WHERE id IN( {$ids_string} )";
    
    echo $sql;
}

 

Resultado do exemplo acima:


UPDATE tabela SET valor = CASE WHEN 3 THEN 'testando' WHEN 4 THEN 'hehe' WHEN 10 THEN 'foo' END WHERE id IN( 3, 4, 10 )

 

Ainda daria para otimizar mais, se fosse o caso... mas assim ao menos está rodando em uma consulta. Como efeito colateral, você tem um código maior e mais complexo. Geralmente, eu iria preferir a alternativa anterior...

 

Observe também que nenhuma das consultas está segura contra SQL injection, pois isso é outro tópico...

 

Espero ter ajudado. Até mais :)


Cara .. Muitíssimo obrigado, é exatamente o que eu preciso.

As duas formas resolvem meu problema.
Novamente obrigadoo 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por MAKAVELIQUE
      Pessoal, imaginem a seguinte situação: o usuário A clica no botão enviar no mesmo instante que o usuário B, caso a ação do sql seja um comando update no mesmo campo, id=7 por exemplo e isso acontecer exatamente no mesmo instante, ocorre perca de dados? 
      <?php $update = "UPDATE br_gang SET i='$i', data= NOW() WHERE id='$id'"; $query = mysqli_query($update, $conn) or die (mysqli_error($conn)); if($update==true){ echo "<script>alert ('DADOS SALVOS COM SUCESSO, BOA SORTE!');</script>"; } ?> Se isso acontecer e ocorrer perca de dados, qual o procedimento possível para resolver o problema?
    • Por GabrielB3r
      Bom dia,
      estou tentando criar um sistema de empréstimo e devolução de documentos.
      Funciona da seguinte forma:
      A pessoa tem o opção de cadastrar novos documentos,os quais são inseridos da tabela "dossie_cadastrado", e ela pode cadastrar o empréstimo e a devolução do mesmo que ficam salvos na tabela "dossie_emprestimo".
      A parte de cadastro e empréstimo consegui fazer funcionar, meu problema é na hora de cadastrar a devolução. Preciso inserir a data atual no último cadastro de um determinado dossie na tabela "dossie_emprestimo".
       
      Tenho o seguinte código:
      if(isset($_POST["cod_cad"])){         $cod_cad = $_POST["cod_cad"];         }          if(isset($_GET["cod_cad"])){         $cod_cad = $_GET["cod_cad"];     } $cod_cad = strip_tags($_POST['cod_cad']); $select_upd= mysqli_query($conexao_bd,"SELECT id_emp, data_emp from dossie_emprestimo where cod_cad='$cod_cad' ORDER BY data_emp desc limit 1") ; $sql_update="UPDATE dossie_emprestimo SET data_dev=CURDATE() WHERE id_emp='$id_emp'"; mysqli_query($conexao_bd, $sql_update);  
      quando eu rodo esse código separado no phpmyadmin, funciona normalmente, mas quando coloco no meu código ele não encontra o id_emp.
      id_emp - id de empréstimo, chave primaria com auto incremento.
      data_emp - data que foi realizado o empréstimo.
      cod_cad - código de cadastro, é o código que esta relacionado a tabela de cadastro, é o id do documento. ex: toda vez que o documento "20" for emprestado esse código sera "20".
       
    • Por teteuvec
      Prezados boa noite,
       
      Estou tentando atualizar dados no BD. Porém ao aplicar o update não gera erro e nem atualiza no DB.
      Segue abaixo o script. Já testei a conexão com o DB e funciona perfeitamente como function.
       
      <?php session_start(); if ($_SESSION['validate_login'] != true) { header("Location: /index.php"); } ini_set( "display_errors", true ); error_reporting( E_ALL ); require_once('../phpfunctions.php'); header('Content-Type: text/html; charset=utf-8'); switch ($_POST['action']) { case '0': $recordset = mysqli_query(connect(tupa), "SELECT * FROM people_records WHERE cpf_cnpj = {$_POST['cpf_cnpj']} ORDER BY id DESC") or die(mysqli_error(connect(tupa))); $_row = mysqli_num_rows($recordset); if ($_row == 0) { mysqli_query(connect(tupa), "UPDATE people_records SET name = {$_POST['name']}, cpf_cnpj = {$_POST['cpf_cnpj']}, cellphone = {$_POST['cellphone']}, telephone = {$_POST['telephone']} WHERE id = {$_POST['id']}") or die (mysqli_error(connect(tupa))); } else { echo "<script language='JavaScript'>alert('Este registro já existe.')</script>"; } mysqli_free_result($recordset); echo "<script language='JavaScript'>location.href='../system.php';</script>"; break;  
       
    • Por brunobos21
      Olá, eu criei um formulario que salva os dados em um banco de dados mysql, e criei uma pagina de relatorio para mostrar todo mundo que se cadastra nesse banco, até ai tudo certo, só que eu tenho um campo "Status" que eu queria colocar um checkbox para o administrador poder marcar esse campo e mudar no mysql o valor do Status para 1 sempre que clicar no botão atualizar, e se o administrador desmarcar antes apertar o botão Atualizar, não mudar na tabela. Já pesquisei em tudo quer canto e não achei, se puderem me ajudar enviando algum modelo de código ou algum tópico aqui do forúm que ja fale sobre isso, agradeço. Aqui está meu código:
      <?php // definições de host, database, usuário e senha $host = "host"; $banco = "banco"; $user = "user"; $pass = "pass"; $tbl_name="tabela";   $nome = $_POST['nome']; $numero = $_POST['numero']; $email = $_POST['email']; $cidade = $_POST['cidade']; $whatsapp = $_POST['whatsapp']; $data = $_POST['data']; $status = $_POST['status'];   // conecta ao banco de dados $con = mysql_pconnect($host, $user, $pass) or trigger_error(mysql_error(),E_USER_ERROR); // seleciona a base de dados em que vamos trabalhar mysql_select_db($banco, $con); // cria a instrução SQL que vai selecionar os dados $query = sprintf("SELECT * FROM Pesquisas"); // executa a query $dados = mysql_query($query, $con) or die(mysql_error()); // transforma os dados em um array $linha = mysql_fetch_assoc($dados); // calcula quantos dados retornaram $total = mysql_num_rows($dados); ?> <!DOCTYPE html> <html lang="en"> <head>     <title>Relatorio</title>     <meta charset="latin1_swedish_ci">     <meta name="viewport" content="width=device-width, initial-scale=1"> <!--===============================================================================================-->       <link rel="icon" type="image/png" href="images/icons/favicon2.ico"/> <!--===============================================================================================-->     <link rel="stylesheet" type="text/css" href="vendor/bootstrap/css/bootstrap.min.css"> <!--===============================================================================================-->     <link rel="stylesheet" type="text/css" href="fonts/font-awesome-4.7.0/css/font-awesome.min.css"> <!--===============================================================================================-->     <link rel="stylesheet" type="text/css" href="vendor/animate/animate.css"> <!--===============================================================================================-->     <link rel="stylesheet" type="text/css" href="vendor/select2/select2.min.css"> <!--===============================================================================================-->     <link rel="stylesheet" type="text/css" href="vendor/perfect-scrollbar/perfect-scrollbar.css"> <!--===============================================================================================-->     <link rel="stylesheet" type="text/css" href="css/util.css">     <link rel="stylesheet" type="text/css" href="css/main.css"> <!--===============================================================================================--> <script src="vendor/jquery/jquery-3.2.1.min.js"></script> <script type="text/javascript"> //--> </script> </head> <body> <form action=" " method="post">     <div class="limiter">         <div class="container-table100">             <div class="wrap-table100">                 <div class="table100">                     <table>                         <thead>                             <tr class="table100-head">                                 <th class="column1">Nome</th>                                 <th class="column2">Numero</th>                                 <th class="column3">Cidade</th>                                 <th class="column4">E-mail</th>                                 <th class="column5">Whatsapp</th>                                 <th class="column6">Tipo</th>                                 <th class="column6">Data</th>                                 <th class="column6">Status</th>                             </tr>                         </thead>                           <?php                         // se o número de resultados for maior que zero, mostra os dados                         if($total > 0) {                     // inicia o loop que vai mostrar todos os dados                     do {                         ?>                         <tbody>                                 <tr>                                     <td class="column1"><?=$linha['nome']?></td>                                     <td class="column2"><?=$linha['numero']?></td>                                     <td class="column3"><?=$linha['cidade']?></td>                                     <td class="column4"><?=$linha['email']?></td>                                     <td class="column5"><?=$linha['whatsapp']?></td>                                     <td class="column6"><?=$linha['tipo']?></td>                                     <td class="column6"><?=$linha['data']?></td>                                     <td class="column6">                                     <input type=checkbox name="banco[]" value="1"><?=$linha['status']?>                                     </td>                                 </tr>                                </tbody>                         <?php                     // finaliza o loop que vai mostrar os dados                     }while($linha = mysql_fetch_assoc($dados));                         // fim do if                         }                         ?>                     </table>                     <div class="container-contact2-form-btn">                                 <div class="wrap-contact2-form-btn">                                     <div class="contact3-form-bgbtn"></div>                                     <button class="contact2-form-btn" type="submit" value="Enviar" name="enviar">                                         Atualizar                                     </button>                                 </div>                             </div>                 </div>             </div>         </div>     </div> </form>   <!--===============================================================================================-->       <script src="vendor/jquery/jquery-3.2.1.min.js"></script> <!--===============================================================================================-->     <script src="vendor/bootstrap/js/popper.js"></script>     <script src="vendor/bootstrap/js/bootstrap.min.js"></script> <!--===============================================================================================-->     <script src="vendor/select2/select2.min.js"></script> <!--===============================================================================================-->     <script src="js/main.js"></script> </body> </html> <?php // tira o resultado da busca da memória mysql_free_result($dados); ?>
    • Por unnie
      Se alguém estiver lendo, olá! Estou tentando fazer um CRUD e na parte de validação do e-mail, eu recebo um email tudo certinho, entretanto não estou conseguindo fazer o update de um campo do BD que corresponde ao id que informa se o e-mail está verificado ou não ...
       
      O código de verificação de e-mail está abaixo:
      <?php include "dbh.inc.php"; $token = $_GET['token']; $email = $_GET['email']; $idEmail = 1; $sql = "SELECT * FROM users WHERE emailUsers=? AND token=?"; $stmt = mysqli_stmt_init($conn); if(!mysqli_stmt_prepare($stmt, $sql)){ echo"".$email; header("Location: ../header.php?error=sqlerror"); exit(); } else{ mysqli_stmt_bind_param($stmt, "ss", $email, $token); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); if($row = mysqli_fetch_assoc($result)){ ############################################################################################## $sql = "UPDATE users SET emailConfirm='$idEmail' WHERE emailUsers='$email' AND token='$token'"; $stmt = mysqli_stmt_init($conn); mysqli_stmt_execute($stmt); echo "".$row['emailConfirm'].$row['emailUsers'].$row['token'].$row['']; ############################################################################################## } if(!mysqli_stmt_affected_rows()>0){ echo"Afetou Linhas"; } else{ echo"Nenhuma Linha Afetada"; } } no e-mail contém um link estilo:
       
      site.com/arquivo.php?email=$email&token=$token
      site.com/arquivo.php?email=oemaildousuario&token=tokendousuario
       
      quando peço que faça o 'echo' do token e e-mail, é imprimido na tela o email e token que estão no link corretamente como eu quero e quando peço 'echo' de outra informação do usuário que contem as informações equivalentes ao do token e email do link as informações são mostradas corretamente também, mas no momento que peço pelo UPDATE nada acontece no BD, o id de validação (emailConfirm) de e-mail continua em '0'  e não faz o update para 1...
       
      alguém pode me ajudar???  Obrigada !
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.