Ir para conteúdo

POWERED BY:

Arquivado

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

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 :)

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

  • Conteúdo Similar

    • Por clovis.sardinha
      Boa noite.
      Tenho um bd com 2 tabelas. A primeira (serv_os) tem as colunas id, fk_os e fk_servico  a segunda (prod_os) tem as colunas id, fk_os e agora eu criei a coluna fk_serv. A coluna fk_serv vai ser preenchida com o valor id da primeira coluna. Fiz o seguinte update entre as tabelas: 
      UPDATE prod_os
      JOIN serv_os ON serv_os.fk_os= prod_os.fk_os
      SET prod_os.fk_serv = serv_os.id
      WHERE prod_os.fk_os=serv_os.fk_os;
       
      Até aqui tudo bem, porém, fiquei com o seguinte problema.  Muitas vezes  existem vários serviços na primeira tabela, por exemplo id=100 produto A, id=101 produto B, porém o fk_os é o mesmo . Ai na coluna fk_serv aparece sempre o id do produto A. Nesse caso duas vezes. O produto B, C,...etc não aparece. 
      Não consegui nenhum comando, já que o join é pela coluna fk_os, que fizesse o update mudar o ponteiro para o serviço B,C,etc.
      Se alguém puder me ajudar eu agradeço.
    • Por vicente386
      Ola. Tenho uma tabela no 3 campos que sao "LIVRO, POS, PAGINA" ao qual a logica e a seguinte: cada livro tem 100 paginas cada pagina tem 30 posiçoes tenho 8,364 registros pra inserir chegando a 100 paginas com 30 posiçoes cada passa para o livro 2 e como fazer o update na tabela inserindo nos campos LIVRO = 1, POS de 0 a 30 e PAGINA 1 para cada 30 registros logos apos pagina 2 ?
      estou tentando fazer assim:
      <?php > ini_set('max_execution_time', 2000); $pdo = new > DO(DB_SERVER.":host=".DB_HOST.";dbname=".DB_BASE,DB_USER,DB_PASSWORD); > $sql = $pdo->prepare("SELECT count(*) FROM tabela2018"); > $sql->execute(); > $livro = 1; > foreach($sql as $obj){ > $variavel = $obj[0]; > ceil((float)$variavel/100); > $qtdlaco = ceil((float)$variavel/100); > for ($id = 1; $id <= 35; $id++) { > for($L=1; $L < $qtdlaco; $L++) { > for ($P = 0; $P <= 30; $P++) { > $sql = $pdo->prepare("UPDATE tabela2018 SET LIVRO = :LIVRO, POS = :POS, PAGINA = :PAGINA WHERE idtabela2018 = $id"); > $sql->bindValue(':LIVRO', $livro); > $sql->bindValue(':POS', $P); > $sql->bindValue(':PAGINA', $L); > $sql->execute(); > } > } > } >} ?> mas na tebela so aparece: LIVRO POS PAGINA 1 30 83 1 30 83 1 30 83 e nao como deveria : LIVRO POS PAGINA 1 0 1 1 1 1 1 2 1
    • Por lezão
      Boa tarde, galera!
      Td bem com vcs?
       
      Estou precisando de um UPDATE que qnd eu seleciono o checkbox e clico no botão submit ele chama para a pagina que ira fazer a alteração.
      Tenho um exemplo só que  em asp, vejam abaixo:
      Imagem UPDATE
       
      espero ter explicado certo.
       
      obrigado!
       
    • Por Samuel Pietro
      Estou com a seguinte situação.
       
      Preciso que o Update só aconteça nos campos vazios. Por exemplo, tenho no CSV 
      id;a;b;c 1;1;;3 1;1;2;;  
      |id | a | b | c |
      | 1 | 1 |    | 3 |
      | 1 | 1 | 2 |  |
       
      Na primeira linha tenho o campo da coluna b em branco, logo ele irá inserir no banco de dados o conteúdo da primeira linha, quando ele ler a segunda linha irá ver que a minha key, que é a coluna id, já existe e irá atualizar, o problema é que eu preciso que  atualize apenas os campos em branco, pois se atualizar todos os campos ele iria substituir o campo da coluna c que ficaria em branco !
       
      O código que fiz até o momento! 
      INSERT INTO tabela (id, a, b, c) VALUES ('$column[0]','$column[1]','$column[2]','$column[3]') on duplicate key UPDATE id='$column[0]',a='$column[0]', b='$column[0]', c='$column[0]'  
      Gostaria da ajuda de vocês para saber como posso adequar esse código na minha necessidade, seria tipo adcionar is null UPDATE.. sei lá, tentei várias opções mas sem sucesso ainda! 
       
       
       
       
    • Por FERREIRA FILHO
      Estou tentando fazer um update de vários registros com checkbox, mais não está atualizando no banco de dados MySQL. Segue o meu código, desde já agradeço!
       
      <?php 
      include_once("../config/conexao.php");

      $nivel = $_SESSION['nivel'];
         
      if ($_SESSION['nivel'] == 4)
          {
      $sql = "SELECT ID, NOME, VOLUNTARIO FROM cidadao ORDER BY NOME";
      $res = mysql_query($sql) or die (mysql_error() );
      if (mysql_num_rows($res) > 0 )
      echo '<form method="post">';
      ?>
      <table width="431" border="0" align="center" cellpadding="0" class="bordaFina">
          <tr bgcolor="#999999" >
            <td width="302" align="center" valign="middle" bgcolor="#F0F0F0" class="style27">Nome  </td>
            <td width="123" align="center" valign="middle" bgcolor="#F0F0F0" class="style27">Voluntário</td>
          </tr>
          <?php
      while ($row = mysql_fetch_assoc($res))
          {     
          ?>
          <tr >
            <td><?php echo $row["NOME"];?></div></td>
        <td ><div align="center"> 
       <input type="checkbox" name= "VOLUNTARIOS[<?php  $row["ID"] ?>]" value="1" <?php if($row["VOLUNTARIO"] == 1){ echo "checked";} ?>> 
       <input type="hidden" name= "VOLUNTARIOS[<?php $row["ID"] ?>]" value="0" <?php if($row["VOLUNTARIO"] == 0){ echo ""; }  ?>>
        </div></td>
        </tr>
          <?php 
        }  //End While
        ?>
      </table>
        
      <p><div align="center"><?php echo '<input type="submit"name= "submit" value= "Salvar">';?></div>
        <?php
      if (isset ($_POST["submit"]))
      {        
              foreach($_POST['VOLUNTARIOS'] as $ID => $VOL) 
                {mysql_query("update cidadao SET VOLUNTARIO ='$VOL' WHERE ID='$ID'")or die(mysql_error()); }                    
                 echo "<meta HTTP-EQUIV='refresh' CONTENT='1;URL=teste.php'>";
      }
      ?>
      <?php
      echo'<br>';
      echo '</form>';
      }//endif
      ?>
       

×

Informação importante

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