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 landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, ativo. Nela tem cadastrado vários itens. No campo ativo eu coloco a letra "S" para informar que este item está ativo no sistema. Por exemplo: 1, casa, S 2, mesa, S 3, cama, S 4, moto S 5, rádio O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "produtos" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, mesa, moto 2, mesa, casa, cama 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela produtos da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "mesa". Preciso fazer com que o php me liste todos os registros da tabela "produtos" que contenham a palavra "mesa". Até aqui tudo bem eu consigo listar. Estou fazendo assim: <?php $item = "mesa" $sql = mysqli_query($conn, "SELECT * FROM produtos WHERE item1 LIKE '$item' OR item2 LIKE '$item' OR item3 LIKE '$item' LIMIT 10"); while($aux = mysqli_fetch_assoc($sql)) { $id = $aux["id"]; $item1 = $aux["item1"]; $item2 = $aux["item2"]; $item3 = $aux["item3"]; echo $id . " - " . $item1 . ", " . $item2 . ", " $item3 . "<br>"; } ?> O problema é que está listando todos os registros que contém o item mesa. Eu preciso que o php verifique os demais item e me liste somente os registro em que todos os registros estejam ativos no sistema. No exemplo acima ele não deveria listar o registro 3. pois nesse registro contém o item "radio" e este item não está ativo no sistema. Ou seja, o registro "radio" na tabela itens não possui um "S" na coluna "ativo". Alguém sabe como resolver isso?
    • Por ILR master
      Fala galera.
      Espero que todos estejam bem.
      Seguinte: Tenho um arquivo xml onde alguns campos estão com : (dois pontos), como o exemplo abaixo:
       
      <item>
      <title>
      d sa dsad sad sadasdas
      </title>
      <link>
      dsadas dsa sad asd as dsada
      </link>
      <pubDate>sadasdasdsa as</pubDate>
      <dc:creator>
      d sad sad sa ad as das
      </dc:creator>
      </item>
       
      Meu código:
       
      $link = "noticias.xml"; 
      $xml = simplexml_load_file($link); 
      foreach($xml -> channel as $ite) {     
           $titulo = $ite -> item->title;
           $urltitulo = $ite -> item->link;
           print $urltitulo = $ite -> item->dc:creator;
      } //fim do foreach
      ?>
       
      Esse campo dc:creator eu não consigo ler. Como faço?
       
      Agradeço quem puder me ajudar.
       
      Abs
       
       
    • Por First
      Olá a todos!
       
      Eu estou criando um sistema do zero mas estou encontnrando algumas dificuldades e não estou sabendo resolver, então vim recorrer ajuda de vocês.
      Aqui está todo o meu código: https://github.com/PauloJagata/aprendizado/
       
      Eu fiz um sistema de rotas mas só mostra o conteúdo da '/' não sei porque, quando eu tento acessar o register nada muda.
      E eu também quero que se não estiver liberado na rota mostra o erro de 404, mas quando eu tento acessar um link inválido, nada acontece.
      Alguém pode me ajudar com isso? E se tiver algumas sugestão para melhoria do código também estou aceitando.
       
       
      Desde já, obrigado.
×

Informação importante

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