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