Mysql
 sql >> Base de données >  >> RDS >> Mysql

PDO et MySQL UPDATE dans la boucle Foreach

Pour commencer, vous utilisez bindParam() comme si c'était bindValue() , ils sont très différents .

Sans voir d'où vous tirez les valeurs de votre tableau, il est un peu plus difficile de voir ce qui se passe avec certitude. Il semble que les informations que vous fournissez ne soient probablement pas le code que vous utilisez et qu'elles aient été modifiées, en particulier en ce qui concerne les boucles foreach et les variables data_array, car ce que vous décrivez est un problème courant avec BindParam, c'est donc l'hypothèse que je Je vais travailler dessus. Si tel est le cas, c'est en général une bonne idée de fournir des extraits de code réels, y compris l'initialisation des variables utilisées et les blocs où le problème est trouvé plutôt que simplement le code dans ces blocs.

Voici une autre réponse avec pourquoi , assurez-vous essentiellement que vous passez par référence la partie valeur de votre boucle foreach ou que vous modifiez les bindParams en bindValues. Vous voudrez également vous assurer que vous utilisez deux objets distincts ici au lieu d'un si vous prévoyez de continuer à utiliser cette structure puisque vous exécutez à la fois bindParam() méthodes chaque fois que vous appelez execute() .

Donc, quelque chose comme, disons, si la structure du code n'avait pas changé (ce qui devrait probablement être le cas puisque tout est en boucle et que seul Execute devrait être en boucle) :

$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();

Une façon plus optimale de le faire serait quelque chose comme (gardez à l'esprit qu'il ne s'agit que d'un exemple général) :

$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()';
}