Ir para conteúdo

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 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
      ?>
       

    • Por FabianoSouza
      Pessoal, tenho uma lista com 100.000 nomes.
      Preciso colocar o campo sexo para esses registros.
       
      Os colegas sabem dizer se há alguma técnica, ferramenta ou função para realizar esse trabalho?
       
      Tive uma ideia de fazer uma comparação usando  um "dicionário de nomes". Isso seria um caminho viável? Alguém teria um dicionário para disponibilizar?
       
       
      Grato.
       
×

Informação importante

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