Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

PDO e MySQL UPDATE no Loop Foreach


Para começar, você está usando bindParam() como se fosse bindValue() , eles são bem diferentes .

Sem ver de onde você está obtendo seus valores de matriz, é um pouco mais difícil ver o que está acontecendo com certeza. Parece que as informações que você está fornecendo provavelmente não são realmente o código que você está usando e foram modificadas, principalmente em relação aos loops foreach e às variáveis ​​data_array, pois o que você está descrevendo é um problema comum com BindParam, então essa é a suposição que eu estará trabalhando. Se for esse o caso, em geral é uma boa ideia fornecer trechos de código reais, incluindo a inicialização das variáveis ​​usadas e os blocos onde o problema é encontrado, em vez de apenas o código nesses blocos.

Aqui está outra resposta com o motivo , basicamente, certifique-se de passar por referência a parte do valor do seu loop foreach ou alterar o bindParams para bindValues. Você também vai querer ter certeza de que está usando dois objetos separados aqui em vez de um se planeja continuar usando essa estrutura, pois está executando tanto bindParam() métodos cada vez que você chama execute() .

Então, algo como, digamos, a estrutura do código não foi alterada (o que provavelmente deveria ser, já que tudo está em loops e apenas Execute deve estar em um loop):
$set_data1 = "UPDATE data_table
          SET data_status = 'PROCESSED' 
          WHERE data_id = :data_id1";

$stmt = $db->prepare($set_data1);

$stmt->bindValue(':data_id1', $data_array1['data_id'], PDO::PARAM_INT);

$stmt->execute();

$set_data2 = "UPDATE data_table
              SET data_status = 'PENDING'
              WHERE data_id = :data_id2";

$stmt2 = $db->prepare($set_data2);

$stmt2->bindValue(':data_id2', $data_array2['data_id'], PDO::PARAM_INT);

$stmt2->execute();

Uma maneira mais ideal de fazer isso seria algo como (lembre-se de que este é apenas um exemplo geral):
$set_data = "UPDATE data_table
          SET data_status = :data_status 
          WHERE data_id = :data_id";

$data_array = array( array('data_status' => $dataStatus1, 'data_id' => $dataId), array('data_status' => $dataStatus2, 'data_id' => $dataId2) ); 
/* this is just to represent a multidimensional array (or a multidimensional object) containing the data status and the data id which should be handled and decided before you pass them into a loop. */

$stmt = $db->prepare($set_data);

$data_status = null;
$data_id = null;

$stmt->bindParam(':data_status', $data_status);
$stmt->bindParam(':data_id', $data_id);

foreach( $data_array as $name => $val ) {
    $data_status = $val['data_status'];
    $data_id = $val['data_id'];
    $stmt->execute()';
}