Ir para conteúdo
Fórum Script Brasil
  • 0

Atualizar Várias Linhas dentro de Um Loop


Elisame Araújo

Pergunta

Seguinte,

Eu tenho uma página de atualização de lista de faixas que estão agrupados por álbum, porém quando faço o submit destes dados, ele atualiza apenas a última linha desse processo.

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="https://google.com"><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");
        /*$sucesso = "<div class='alert alert-success text-white' role='alert'>
            Dados atualizados com sucesso!
        </div>";*/
        
    }  else {
        echo "Ocorreu um erro ao atualizar os dados";
        /*$erro = "<div class='alert alert-danger' role='alert'>
            Não foi possível atualizar os dados do pedido.
        </div>";*/
    }

}

?>

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.

Editado por Elisame Araújo
Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

Olá!
Vais precisar definir todos os names dos seus inputs como array.
Basta acrescentar os colchetes ao name, assim:

name="trackID[]"
name="albumID[]"

Dessa forma vais receber todos os dados de todas as faixas no backend.
Só então poderás percorrer os dados e montar a query de cada um.

Link para o comentário
Compartilhar em outros sites

  • 0
21 minutos atrás, lowys disse:

Olá!
Vais precisar definir todos os names dos seus inputs como array.
Basta acrescentar os colchetes ao name, assim:

name="trackID[]"
name="albumID[]"

Dessa forma vais receber todos os dados de todas as faixas no backend.
Só então poderás percorrer os dados e montar a query de cada um.

Agora ele me retorna um Warning e um Fatal Error na hora de fazer a query rodar:

Warning: Array to string conversion in atualizar-faixas.php on line 12

Fatal error: Uncaught mysqli_sql_exception: Unknown column 'Array' in 'where clause' in atualizar-faixas.php:14 Stack trace: #0 atualizar-faixas.php(14): mysqli_query(Object(mysqli), 'UPDATE `faixas`...') #1 {main} thrown in atualizar-faixas.php on line 14

Eu ainda não entendi a lógica na hora de fazer querys dentro de loops.

Link para o comentário
Compartilhar em outros sites

  • 0

Não consigo adivinhar qual seria a linha 12
mas tudo o q você trabalhava de $_POST como string, agora é array.
você vai precisar trabalhar com um $_POST de arrays e não strings
de strings, você só vai receber o útlimo registro
de arrays, você vai receber todos os registros

Link para o comentário
Compartilhar em outros sites

  • 0
6 minutos atrás, lowys disse:

Não consigo adivinhar qual seria a linha 12
mas tudo o q você trabalhava de $_POST como string, agora é array.
você vai precisar trabalhar com um $_POST de arrays e não strings
de strings, você só vai receber o útlimo registro
de arrays, você vai receber todos os registros

E como eu faria isso? Seria com um foreach?

Eu dei uma olhada aqui no código ele se refere literalmente a linha da query:

$sqlUpdate = "UPDATE `faixas` SET `trackTitulo` = '$trackTitulo', `trackNumero` = '$trackNumero', `trackTraducao` = '$trackTraducao' WHERE `albumID` = $albumID AND `trackID` = $trackID";

Mas eu ainda não consigo identificar o erro.

Além disso, olhando o Fatal Error ele parece ter transformado a array numa coluna para ser inserida na query.

Editado por Elisame Araújo
Link para o comentário
Compartilhar em outros sites

  • 0
1 minuto atrás, lowys disse:

Sim. Pode-se resolver com um foreach.
É necessário debugar $_POST, para entender como proceder.

Tentei a seguinte solução:

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

Mas agora o foreach diz que não é um array ou objeto, com o erro novamente sendo na linha 11 onde se encontra a query:

Warning: foreach() argument must be of type array|object, string given in atualizar-faixas.php on line 11

Link para o comentário
Compartilhar em outros sites

  • 0

Entendi, pelo seu trecho de scrip, que estás iniciando no php.
Saber usar strings e arrays deve estar na página 2 do manual do php.
Mas de qualquer linguagem que tenhas vindo, a lógica é a mesma.
Não se usa strings como arrays, nem se usa arrays como strings.

Toda variável que foi definida no form html terminando em [] vai chegar ao php como array.
portanto, 
$_POST['qualquer-variavel-array-do-form-html'], é um array

Como em todas as linguagens que conheço, não é possível interpolar um array no meio de uma string.
Vais precisar iterar sobre o array e, usando os indexes, recuperar os valores que precisas.

Link para o comentário
Compartilhar em outros sites

  • 1

Eu montei o seguinte código para demonstrar a atualização de vários registros ao mesmo tempo:

index.php

<?php
$mysqli=new mysqli("localhost","root","","astudy");
$result=$mysqli->query("select * from faixas");
?>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" 
    rel="stylesheet" 
    integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" 
    crossorigin="anonymous">
<div style="width:50%;margin:0 auto;margin-top:5%">
<table>
<tr style=height:20px>
<form method=post>
<button type=submit name=update class="btn btn-success"><i class="fa-solid fa-arrow-up-from-bracket"> Atualizar</i> </button>
  	<?php while($sqlSelect = mysqli_fetch_assoc($result)) { ?>
    <tr>
    <td><input value="<?=$sqlSelect['trackNumero']?>" class="form-control" name=trackNumero[]>
    <td><input value="<?=$sqlSelect['trackTitulo']?>" class="form-control" name=trackTitulo[]>
    <td><input value="<?=$sqlSelect['trackTraducao']?>" class="form-control" name=trackTraducao[]>
    <td><input value="<?=$sqlSelect['trackID']?>" class="form-control" name=trackID[] readonly>
    <td><input value="<?=$sqlSelect['albumID']?>" class="form-control" name=albumID[] readonly>
    <td>      <?php } ?>
</form></table>
<?php
if(isset($_POST['update'])){
    $j=Count($_POST['trackNumero'])-1;
    for($i=0;$i<=$j;$i++){
        $trackNumero = $_POST['trackNumero'][$i];
        $trackTitulo = mysqli_real_escape_string($mysqli, $_POST['trackTitulo'][$i]);
        $trackTraducao = $_POST['trackTraducao'][$i];
        $trackID = $_POST['trackID'][$i];
        $albumID = $_POST['albumID'][$i];
        $sqlUpdate = "update faixas set trackTitulo='$trackTitulo', 
            trackNumero=$trackNumero, trackTraducao='$trackTraducao'
            where albumID=$albumID and trackID=$trackID";
        mysqli_query($mysqli,$sqlUpdate);
        if(!mysqli_affected_rows($mysqli)){echo "grande problema!";exit;}}
    header('location:index.php');
    }
?>

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...