Като за начало използвате bindParam()
като това е bindValue()
, те са съвсем различни
.
Без да виждате откъде получавате стойностите на масива си, е малко по-трудно да видите какво се случва със сигурност. Изглежда, че информацията, която предоставяте, вероятно всъщност не е кодът, който използвате, и е била модифицирана, особено по отношение на циклите foreach и променливите data_array, тъй като това, което описвате, е често срещан проблем с BindParam, така че това е моето предположение ще работи върху. Ако случаят е такъв, като цяло е добра идея да предоставите действителни кодови фрагменти, включително инициализацията на използваните променливи и блоковете, където е открит проблемът, а не само кода в тези блокове.
Ето още един отговор защо
, основно се уверете, че предавате чрез препратка стойностната част на вашия цикъл foreach или че променяте bindParams на bindValues. Също така ще искате да се уверите, че използвате два отделни обекта тук вместо един, ако планирате да продължите да използвате тази структура, тъй като изпълнявате и двата bindParam()
методи всеки път, когато извиквате execute()
.
Така че нещо подобно, да речем, дали структурата на кода не е променена (което вероятно би трябвало да бъде, тъй като всичко това е в цикли и само Execute трябва да бъде в цикъл):
$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();
По-оптимален начин да направите това обаче би бил нещо подобно (имайте предвид, че това е само общ пример):
$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()';
}