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.

      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
       
       
       
    • Por violin101
      Caros amigos, saudações.

      Por favor, peço desculpa em recorrer a ajuda dos amigos referente uma dúvida.

      Tenho um Sistema que estou escrevendo em PHP + Codeigniter e a minha dúvida em Codeigniter é:
      Obs.: as tabela são em MySql

      => como faço para IMPORTAR o dado de uma Tabela para outra, as tabela são:
      ___________________Tabela de Pedido     =========== para ==========>    Tabela de Entrada de Lançamentos
      itens: codigoProduto | quantidade | valorUnitario  === importar===> itens: codigoProduto | quantidade | valorUnitario
       
      Estou tentando de várias formas, mas não estou conseguindo.

      Por favor, alguém pode me dar uma ajuda, explicação ou orientação.

      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos, saudações.
       
      Estou com uma pequena dúvida que não estou conseguindo resolver.

      Tenho 2 Tabelas, a 1ª.principal e a 2ª.secundária.

      Exemplo:
      Dados da 1ª Tabela - Peças e Equipamentos
      Dados da 2ª Tabela - Veículos.

      Seria isso:
      0010 - Pneu Aro 20
        [x] 001 - Corsa
        [_] 002 - Fusca
        [_] 003 - Palio
      Comentário:________________
       
      0100 - Óleo para Motor
         [x] 002 - Fusca
         [_] 003 - Palio
      Comentário:________________
       
      1030 - Lubrificante
         [_] 001 - Corsa
         [x] 003 - Palio
      Comentário:________________
       
      O meu problema está sendo quando preciso SALVAR/ATERAR o campo COMENTÁRIO, pois trata-se da 1ª.tabela.
       
      Gostaria salvar o COMENTÁRIO sem interferir nas seleção da 2ª. tabela.
       
      Grato,
       
      Cesar
       
       
       
       
       
    • Por Carcleo
      Estou começando no Laravel 11 e me deparei com um problema de belongsTo
       
      public function listOfClass(Request $request, StudentDisciplineClassroom $sdc) : ?string {         $all = $sdc::select('student')->with('studentRelation')->where('classroom',$request->classroom)->distinct('student')->get();     dd($all->toArray());     $students = [];     foreach ($all as $student) {             $students[] =$student;     }       return response()->json($students)->getContent();     } isso

      Em studentRelation temos na tabela StudentDisciplineClassroom com os campos

      id(chave primaria)
      ra (chave estrangera que referencia o campo academic_registration na tabela de students)

      e a tabela student tem os campos

      id (chave primária)
      academic_registration (que vai ser refeenciada na tabela StudentDisciplineClassroom

      Mas na hora de fazer
      $sdc::select('student')->with('studentRelation')->where('classroom',$request->classroom)->distinct('student')->get();
      O studentRelation retorna nulo

      Onde eu posso estar errando?
    • Por joao b silva
      Tenho uma pequena aplicação em php que gera arquivos pdf com a MPDF e envia email com a PHPMAILER. De repente a app parou de enviar os emails  e apresenta a seguinte mensagem de erro:
       
      Error PHPMailer: SMTP Error: Could not authenticate.
       
      Faço uso de um hotmail para a configuração do PHPMAILER.
×

Informação importante

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