Jump to content
Fórum Script Brasil
  • 0

Atualizar Várias Linhas dentro de Um Loop


Elisame Araújo

Question

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.

Edited by Elisame Araújo
Link to comment
Share on other sites

8 answers to this question

Recommended Posts

  • 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 to comment
Share on other sites

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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.

Edited by Elisame Araújo
Link to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.1k
    • Total Posts
      651.7k
×
×
  • Create New...