Ir para conteúdo
Elisame Araújo

Atualizar Várias Linhas dentro de Um Loop

Recommended Posts

Seguinte,

Eu tenho uma página de atualização de lista de faixas que estão agrupados por álbum, com os dados vindo através de parâmetros na url como o albumID e detalhes e são retornados dentro de um while.

O que eu queria é que ele atualizasse todos os campos que fossem editados se eles fossem modificados, mas o que o ocorre é que apenas o último registro é atualizado.

 

O script que traz as faixas:

 

<tr>
                            <form class="form-group" method="post" action="includes/funcoes/atualizar-faixas.php">
                            <?php while($sqlSelect = mysqli_fetch_assoc($result)) { ?>
                                <td><input type="text" value="<?php echo $sqlSelect['trackNumero'] ?>" class="form-control" name="trackNumero"></td>
                                <td><input type="text" value="<?php echo $sqlSelect['trackTitulo'] ?>" class="form-control" name="trackTitulo"></td>
                                <td><input type="text" value="<?php echo $sqlSelect['trackTraducao'] ?>" class="form-control" name="trackTraducao"></td>
                                <td><input type="text" value="<?php echo $sqlSelect['trackID'] ?>" class="form-control" name="trackID" readonly></td>
                                <td><input type="text" value="<?php echo $sqlSelect['albumID'] ?>" class="form-control" name="albumID" readonly></td>
                            </tr>
                            <?php } ?>
                            <tr><a href="albuns-lista.php"><button name="cancelar" id="cancelar" class="btn btn-danger mb-3 mr-1" type="button"> <i class="fa-solid fa-arrow-left"></i> Voltar</button></a></tr>
                            <tr><button name="update" id="update" class="btn btn-success mb-3" type="submit" value=""><i class="fa-solid fa-arrow-up-from-bracket"></i> Atualizar</button></tr>
                        </form>

 

 

E esse é o resultado do código acima:

resultado.jpg.ae97fdf5679682fd8137f43b4cf9d84f.jpg

 

E este é o código que uso pra fazer o UPDATE no banco de dados:

<?php 
require_once "../db/albuns.php";

if(isset($_POST['update'])){
    $trackNumero = $_POST['trackNumero'];
    $trackTitulo = mysqli_real_escape_string($conecta2, $_POST['trackTitulo']);
    $trackTraducao = $_POST['trackTraducao'];
    $trackID = $_POST['trackID'];
    $albumID = $_POST['albumID'];
    
        $sqlUpdate = "UPDATE `faixas` SET `trackTitulo` = '$trackTitulo', `trackNumero` = '$trackNumero', `trackTraducao` = '$trackTraducao' WHERE `albumID` = $albumID AND `trackID` = $trackID";
        
        if($atualizaDados = mysqli_query($conecta2, $sqlUpdate) == true){
           var_dump($sqlUpdate);
            //header("location: ../../albuns.php?update=sucesso");
        }  else {
            //header("location: ../../albuns.php?update=erro");
        }
    }

?>

Como eu faria para que cada linha fosse atualizada individualmente? Já tentei diversos métodos, mas o resultado continua sendo a atualização apenas do último registro no banco, ignorando o restante das atualizações.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Simples dados 1 é substituído por dados 2/ e 3 substitui 2/ 4 substitui 3 etc... etc... etc...

Exemplo:

$variavel = 'AAA';
$variavel = 'BBB';
$variavel = 'CCC';
var_dump($variavel); // Resultado é (string) CCC pois é a ultima informação igual definida.

$variavel = [
  'AAA',
  'BBB',
  'CCC'
];
var_dump($variavel); // Resultado é (array) AAA,BBB,CCC.

Na verdade a substituição já acontece quando o navegador vai enviar as informação, somente enviando a última que substitui todas anteriores.

Você pode definir os inputs como um array assim quando chegar ao lado do servidor terá vários dados dentro de uma array na super-global post

Exemplo:

<input type="text" name="como_array[]" value="A" />
<input type="text" name="como_array[]" value="B" />
<input type="text" name="como_array[]" value="C" />

Então a cada índice você faz o update.

Eu não mecho com mysqli, então apenas vou dizer para dar uma lida nisso talvez possa ser útil:

https://www.php.net/manual/pt_BR/mysqli.multi-query.php

 

Outra forma é criar cada input individual de acordo com a chave do array de retorno na query

Exemplo:

$sqlSelect = mysqli_fetch_assoc($result);
foreach ($sqlSelect as $chave => $valor) {
  ?>
  <input type="text" value="<?= $valor['trackNumero'] ?>" name="trackNumero-<?= $chave ?>">
  <?php
}

Então no lado do servidor os valores serão separados (https://www.php.net/manual/pt_BR/function.substr.php) e indexados em um array.

Então percorrer esse array criado e a cada chave idêntica no mesmo índice realizar o update.

 

 

Ponderações:

  • Filtre melhor os dados que serão processados no servidor, imagine alguém quebrar a sintaxe do php para expor o código fonte que está sendo processado pelo servidor.
  • mysqli_real_escape_string é muito fácil burlar se é que isso funciona mesmo.
  • Nunca passe uma informação vinda do usuário direto dentro de uma query, nunca se sabe o que está sendo executado, injeções de código vem de todo lugar e você não vai querer alguma detonando todo seu baco de dados ou vai?
  • Use query pré preparadas https://www.php.net/manual/pt_BR/mysqli.quickstart.prepared-statements.php

 

Dica pessoal minha:

PDO é uma boa (não a melhor)  alternativa  pois já possui uma pequena proteção em seu mais simples uso. Não é bicho de sete cabeça e mais fácil e seguro de usar que mysqli.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado! Eu vou fazer algumas alterações no meu código para ver o resultado e dar um feedback.

 

Como é um projeto pra eu botar a prova alguns cursos que fiz, boa parte disso é feito localmente - não que segurança não seja uma preocupação.

 

Sobre as ponderações:

- Qual seria a melhor forma de fazer essa filtragem?

- Qual seria a melhor forma para escapar caracteres como aspas simples que geralmente aparecem em textos em inglês sem quebrar a query?

- Eu não sabia que o msyqli tinha suporte a querys preparadas, pensei fosse uma coisa do PDO apenas. Vou dar uma olhada nisso.

 

Sobre a sugestão:

Eu ainda estou me aprofundando em PDO, ainda pretendo converter meu projeto para PDO da facilidade.

Compartilhar este post


Link para o post
Compartilhar em outros sites

As filtragens que pode aplicar é bem variável, pois depende se vai ou não manter ou permitir determinadas entradas.

  • Digamos que eu não queira uso de um caractere de aspa, então eu não executo o restante do código porque tem uma aspa na informação.
  • Mas se eu quero essa aspa eu posso alterar ela de forma que a mesma não chegue a atrapalhar ou quem sabe até dar algum problema.
  • Ou então não quero essa aspa ao invés parar a execução ou converter, simplesmente removo e meu código pode continuar.

Isso também remonta a vários outros caracteres também usados no nosso ou em outros idiomas.

 

O ruim de barrar caracteres atualmente são os conhecidos emoticon comuns em aparelhos móveis.

Então bloquear determinados caracteres deve-se assegurar que esses caracteres não vão comprometer a exibição desses emoticon que são compostos caracteres unicode.

 

Vou compor uma situação aqui:

<?php
class exemplo {
  private static $string;
  
  public static function converter($x) {
    self::$string = (string) $x;
    self::codificar();
    self::aspas();
    return (self::$string);
  }

  private static function codificar() {
    self::$string = mb_convert_encoding(htmlentities(self::$string), 'UTF-8', 'ASCII');
  }

  private static function aspas() {
    $aspas = ['/\'/', '/"/', '/`/'];
    $entidades = ['&apos;', '&quot;', '&grave;'];
    self::$string = preg_replace($aspas, $entidades, self::$string);
  }
}

// É um texto com "aspas" > e com a mesma 'simples' e invertida `também`
$strA = "It'is a text with \"quotes\" > and with the same 'simple' and inverted `also`";

$strB = exemplo::converter($strA);

echo ($strB . "<br />");

echo ("<pre>");
var_dump($strB);
echo ("</pre>");

Se executar o código $strB mesmo sendo o valor aplicado pela classe é mostrado como o texto original não aparenta que nada foi modificado, até mesmo a função var_dump não monstra nada diferente.

Até mesmo se inspecionar o texto pelo navegador não se ver diferença.

Isso porque quaisquer caracteres especiais que venha a conter foram substituídos por entidades html então o navegador sempre irá mostrar ele como ele deveria ser exemplo:

Mostra " mas na verdade é &quot;

Mostra > mas na verdade é &gt;

A única forma que existe para que se consiga ver como realmente é o texto é executando ele com algo que não é um interpretador html, PHP é um interpretador html.

Podemos usar o javascript:

echo ("<script>console.log(\"{$strB}\")</script>");

Então no console do navegador verei como o texto é antes de ser interpretado.

Digamos que salvo algum texto no banco de dados, quaisquer eventuais códigos serão salvos no banco sim, mas não como códigos funcionais apenas como uma simples string que nunca será interpretada como função, ou seja nunca sendo executada. Mesmo repassando a mesma eu várias ocasiões.

A não ser que eu transforme novamente o texto de entidades a caracteres:

echo html_entity_decode(utf8_decode($strB)); // Retorna o código ao estado original

 

Você pode aplicar muito mais conversões usando entidades der uma olhada nisso que achei

https://oinam.github.io/entities/

 

Mas deixo claro que só a função htmlentities já faz um bom trabalho.

O ponto forte de se usar entidades é que nunca irá precisar se preocupar com erros de acentuação por causa de codificação da aplicação pois não importa o idioma se é árabe, chinês, inglês ou português, se é utf-8, ANSI ou sei lá, quaisquer problemas relacionados a isso estarão solucionados.

  • João é amigo de maria
  • Jo&atilde;o &eacute; amigo de maria

 

PDO e áspas....

PDO já salva aspas escapadas para evitar justamente a quebra da coluna no banco de dados. 

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 violin101
      Caros amigos, saudações.
       
      Humildemente peço desculpa por postar uma dúvida que tenho.

      Preciso salvar no MySql, os seguinte Registro:

      1 - Principal
      ====> minha dúvida começa aqui
      ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____?
      1.01 - Matriz
      1.01.0001 - Estoque
      1.01.0002 - Oficina
      etc

      2 - Secundário
      2.01 - Loja_1
      2.01.0001 - Caixa
      2.01.0002 - Recepção
      etc
       
      Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL.

      Grato,


      Cesar









       
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • Por violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a ajuda dos amigos, mas preciso entender uma processo que não estou conseguindo sucesso.

      Como mencionado no Título estou escrevendo um Sistema Web para Gerenciamento de Empresa.
       
      Minha dúvida, que preciso muito entender:
      - preciso agora escrever a Rotina para Emissão de NFe e essa parte não estou conseguindo.
       
      tenho assistido alguns vídeos e leituras, mas não estou conseguindo sucesso, já fiz toda as importações das LIB da NFePhp conforme orientação.

      Preciso de ajuda.

      Algum dos amigos tem conhecimento de algum passo-a-passo explicando a criação dessa rotina ?

      tenho visto alguns vídeos com LARAVEL, mas quando tento utilizar e converter para PHP+Codeiginter, dá uma fila de erros que não entendo, mesmo informando as lib necessárias.

      Alguns do amigo tem algum vídeo, leitura explicando essa parte ?

      Grato,

      Cesar.
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer ao auxílio dos amigos, mas preciso entender e resolver um problema.
       
      Tenho uma Rotina que o usuário seleciona os produtos que deseja para requerer ao setor responsável.
       
      O usuário escolhe um produto qualquer e Clicla em um button para incluir a lista.

      O problema que estou enfrentando é que após escolher o produto e teclar ENTER o Sistema já salva no BD.
       
      Gostaria de criar uma Tecla de Atalho, para quando incluir/escolher o produto na lista, o usuário tecla como exemplo:
      ALT+A  para agregar a lista
      ALT+S para salvar a lista de itens desejados.

      Assim, quando teclar enter, o sistema não dispara o GRAVAR na Base de Dados.

      Grato,

      Cesar
       
       
       
×

Informação importante

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