sql >> Databáze >  >> RDS >> Mysql

PDO a MySQL UPDATE ve Foreach Loop

Pro začátek používáte bindParam() jako je to bindValue() , jsou zcela jiné .

Bez toho, abyste viděli, odkud získáváte hodnoty pole, je o něco těžší s jistotou vidět, co se děje. Vypadá to, že informace, které poskytujete, pravděpodobně ve skutečnosti nejsou kód, který používáte, a byly upraveny, zejména pokud jde o smyčky foreach a proměnné data_array, protože to, co popisujete, je problém společný s BindParam, takže to je předpoklad, který jsem bude se pracovat na. Pokud je tomu tak, je obecně dobré poskytnout skutečné úryvky kódu včetně inicializace použitých proměnných a bloků, kde se problém nachází, nikoli pouze kód v těchto blocích.

Zde je další odpověď proč , v podstatě se ujistěte, že předáváte odkazem část hodnoty vaší smyčky foreach nebo měníte bindParams na bindValues. Budete se také chtít ujistit, že zde používáte dva samostatné objekty místo jednoho, pokud plánujete pokračovat v používání této struktury, protože používáte oba bindParam() metody pokaždé, když zavoláte execute() .

Takže něco jako, řekněme, kdyby se nezměnila struktura kódu (což by pravděpodobně měla být, protože je to všechno ve smyčce a pouze Execute by mělo být ve smyčce):

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

Optimálnější způsob, jak toho dosáhnout, by však byl něco jako (mějte na paměti, že toto je pouze obecný příklad):

$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. Konfigurace vyhrazené sítě pro komunikaci skupiny dostupnosti

  2. Nejrychlejší způsob přenosu dat tabulky Excel do SQL 2008R2

  3. Tipy pro upgrade z MySQL 5.7 na MySQL 8

  4. Najděte maximální a druhý maximální plat pro tabulku zaměstnanců MySQL