Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PDO- und MySQL-UPDATE in der Foreach-Schleife

Für den Anfang verwenden Sie bindParam() als wäre es bindValue() , sie sind ganz anders .

Ohne zu sehen, woher Sie Ihre Array-Werte beziehen, ist es etwas schwieriger, mit Sicherheit zu erkennen, was vor sich geht. Es sieht so aus, als ob die von Ihnen bereitgestellten Informationen wahrscheinlich nicht wirklich der Code sind, den Sie verwenden, und geändert wurden, insbesondere in Bezug auf die foreach-Schleifen und die data_array-Variablen, da das, was Sie beschreiben, ein Problem ist, das bei BindParam üblich ist werde daran arbeiten. Wenn dies der Fall ist, ist es im Allgemeinen eine gute Idee, tatsächliche Codeschnipsel bereitzustellen, einschließlich der Initialisierung der verwendeten Variablen und der Blöcke, in denen das Problem gefunden wird, und nicht nur den Code in diesen Blöcken.

Hier ist eine weitere Antwort mit warum , stellen Sie grundsätzlich sicher, dass Sie den Wertteil Ihrer foreach-Schleife als Referenz übergeben oder die bindParams in bindValues ​​ändern. Sie sollten auch sicherstellen, dass Sie hier zwei separate Objekte anstelle von einem verwenden, wenn Sie beabsichtigen, diese Struktur weiterhin zu verwenden, da Sie beide bindParam() ausführen Methoden jedes Mal, wenn Sie execute() aufrufen .

So etwas wie, sagen wir, wurde die Codestruktur nicht geändert (was wahrscheinlich sein sollte, da dies alles in Schleifen ist und nur Execute in einer Schleife sein sollte):

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

Ein optimalerer Weg, dies zu tun, wäre jedoch (beachten Sie, dass dies nur ein allgemeines Beispiel ist):

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