Na początek używasz bindParam()
jak to jest bindValue()
, są zupełnie inne
.
Bez sprawdzania, skąd czerpiesz wartości z tablicy, trochę trudniej jest zobaczyć, co się dzieje z pewnością. Wygląda na to, że informacje, które podajesz, prawdopodobnie nie są w rzeczywistości kodem, którego używasz, i zostały zmodyfikowane, szczególnie w odniesieniu do pętli foreach i zmiennych data_array, ponieważ to, co opisujesz, jest problemem powszechnym z BindParam, więc takie założenie będę pracował. Jeśli tak jest, ogólnie dobrym pomysłem jest dostarczenie rzeczywistych fragmentów kodu, w tym inicjalizacji używanych zmiennych i bloków, w których występuje problem, a nie tylko kodu w tych blokach.
Oto kolejna odpowiedź dlaczego
, po prostu upewnij się, że przekazujesz przez referencję część wartości pętli foreach lub zmieniasz bindParams na bindValues. Będziesz także chciał się upewnić, że używasz tutaj dwóch oddzielnych obiektów zamiast jednego, jeśli planujesz nadal używać tej struktury, ponieważ używasz obu bindParam()
metody za każdym razem, gdy wywołujesz execute()
.
Czyli coś w rodzaju, powiedzmy, gdyby struktura kodu nie uległa zmianie (co prawdopodobnie powinno być, ponieważ wszystko jest w pętlach i tylko Execute powinno być w pętli):
$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();
Bardziej optymalnym sposobem na zrobienie tego byłoby coś takiego (pamiętaj, że to tylko ogólny przykład):
$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()';
}