Mysql
 sql >> Database >  >> RDS >> Mysql

AGGIORNAMENTO PDO e MySQL in Foreach Loop

Per cominciare stai usando bindParam() come se fosse bindValue() , sono abbastanza diversi .

Senza vedere da dove si ottengono i valori dell'array è un po' più difficile vedere con certezza cosa sta succedendo. Sembra che le informazioni che stai fornendo probabilmente non siano effettivamente il codice che stai utilizzando ed è stato modificato, in particolare per quanto riguarda i cicli foreach e le variabili data_array poiché quello che stai descrivendo è un problema comune con BindParam, quindi questo è il presupposto che io ci lavorerò. In tal caso, è generalmente una buona idea fornire frammenti di codice effettivi, inclusa l'inizializzazione delle variabili utilizzate e dei blocchi in cui si trova il problema, anziché solo il codice in quei blocchi.

Ecco un'altra risposta con il motivo , in pratica assicurati di passare per riferimento la parte del valore del tuo ciclo foreach o di modificare bindParams in bindValues. Dovrai anche assicurarti di utilizzare due oggetti separati qui invece di uno se intendi continuare a utilizzare questa struttura poiché stai eseguendo entrambi bindParam() metodi ogni volta che chiami execute() .

Quindi qualcosa come, diciamo, se la struttura del codice non fosse cambiata (cosa che probabilmente dovrebbe essere poiché questo è tutto in loop e solo Execute dovrebbe essere in un 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();

Un modo più ottimale per farlo sarebbe qualcosa del tipo (tieni presente che questo è solo un esempio generale):

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