Mysql
 sql >> Baza danych >  >> RDS >> Mysql

PDO i MySQL UPDATE w pętli Foreach

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql:Zamień dane na różne wiersze

  2. Klucz obcy MySQL podczas usuwania

  3. VB MySql AddWithValue nie przekazuje wartości pomyślnie

  4. Jak wybrać tylko 1 element tabeli podrzędnej dla każdego rekordu nadrzędnego?

  5. Obsługa danych przestrzennych w CakePHP