sql >> Base de Datos >  >> RDS >> Mysql

ACTUALIZACIÓN de PDO y MySQL en Foreach Loop

Para empezar, estás usando bindParam() como si fuera bindValue() , son muy diferentes .

Sin ver de dónde obtiene los valores de su matriz, es un poco más difícil ver qué sucede con certeza. Parece que la información que está proporcionando probablemente no sea en realidad el código que está utilizando y se ha modificado, en particular con respecto a los bucles foreach y las variables data_array, ya que lo que está describiendo es un problema común con BindParam, por lo que esa es la suposición. estaré trabajando. Si ese es el caso, en general es una buena idea proporcionar fragmentos de código reales, incluida la inicialización de las variables utilizadas y los bloques donde se encuentra el problema, en lugar de solo el código en esos bloques.

Aquí hay otra respuesta con por qué , básicamente asegúrese de pasar por referencia la parte del valor de su ciclo foreach o de cambiar los parámetros de vinculación a valores de vinculación. También querrá asegurarse de que está usando dos objetos separados aquí en lugar de uno si planea continuar usando esta estructura ya que está ejecutando ambos bindParam() métodos cada vez que llama a execute() .

Entonces algo como, digamos, si la estructura del código no cambió (que probablemente debería ser ya que todo esto está en bucles y solo Ejecutar debería estar en un bucle):

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

Sin embargo, una forma más óptima de hacer esto sería algo como (tenga en cuenta que este es solo un ejemplo general):

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