sql >> Database >  >> RDS >> Mysql

PDO en MySQL UPDATE in Foreach Loop

Om te beginnen gebruik je bindParam() alsof het bindValue() . is , ze zijn heel anders .

Zonder te zien waar u uw arraywaarden vandaan haalt, is het een beetje moeilijker om met zekerheid te zien wat er aan de hand is. Het lijkt erop dat de informatie die u verstrekt waarschijnlijk niet de code is die u gebruikt en is gewijzigd, met name met betrekking tot de foreach-lussen en de data_array-variabelen, aangezien wat u beschrijft een probleem is dat veel voorkomt bij BindParam, dus dat is de veronderstelling die ik aan zal werken. Als dat het geval is, is het over het algemeen een goed idee om daadwerkelijke codefragmenten te verstrekken, inclusief de initialisatie van de gebruikte variabelen en de blokken waarin het probleem wordt gevonden, in plaats van alleen de code in die blokken.

Hier is nog een antwoord met waarom , zorg er in principe voor dat u het waardegedeelte van uw foreach-lus doorgeeft of dat u de bindParams wijzigt in bindValues. U moet er ook voor zorgen dat u hier twee afzonderlijke objecten gebruikt in plaats van één als u van plan bent deze structuur te blijven gebruiken, aangezien u beide bindParam() gebruikt. methoden elke keer dat u execute() aanroept .

Dus zoiets als, laten we zeggen, was de codestructuur niet veranderd (wat het waarschijnlijk zou moeten zijn aangezien dit allemaal in lussen is en alleen Execute in een lus zou moeten zijn):

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

Een meer optimale manier om dit te doen zou iets zijn als (houd in gedachten dat dit slechts een algemeen voorbeeld is):

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


  1. controleer de handleiding die overeenkomt met uw MySQL-serverversie voor de juiste syntaxis om te gebruiken in de buurt van '' op regel 1

  2. Hoe kan ik veranderingen tussen rijwaarden in een SQL-tabel detecteren en binden?

  3. Oracle SQL Loop door datumbereik

  4. Hoe de kolomgrootte van een weergave in Oracle te wijzigen