Php Foreach循环中的PDO和MySQL更新

Php Foreach循环中的PDO和MySQL更新,php,mysql,pdo,foreach,nested,Php,Mysql,Pdo,Foreach,Nested,我遇到了这个问题,我完全被难住了。这是我的执行模式。PDO调用嵌套在foreach循环中 foreach(){ foreach(){ } } 我在MySQL中使用PDO,当我背靠背执行更新查询时,它们在循环中相互干扰。我知道他们从注释一个集合到执行另一个集合都是独立工作的。下面是我正在处理的代码模板: $set_data1 = "UPDATE data_table SET data_status = 'PROCESSED'

我遇到了这个问题,我完全被难住了。这是我的执行模式。PDO调用嵌套在foreach循环中

foreach(){
    foreach(){

    }
}
我在MySQL中使用PDO,当我背靠背执行更新查询时,它们在循环中相互干扰。我知道他们从注释一个集合到执行另一个集合都是独立工作的。下面是我正在处理的代码模板:

$set_data1 = "UPDATE data_table
              SET data_status = 'PROCESSED' 
              WHERE data_id = :data_id1";

$stmt = $db->prepare($set_data1);

$stmt->bindParam(':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";

$stmt = $db->prepare($set_data2);

$stmt->bindParam(':data_id2', $data_array2['data_id'], PDO::PARAM_INT);

$stmt->execute();
出于某种原因,在嵌套的foreach循环中执行两个查询时,$set_data1中的数据被$set_data2抵消。我已尝试使用$stmt->closeCursor()关闭光标;我尝试使用一条语句来准备,只是将新参数绑定到该语句。我尝试将$stmt和$db实例设置为null,然后重新实例化它们,但没有效果。我试过在查询中使用CASE-THEN和IF条件句。。。没有什么。任何关于问题所在的信息都会很好。我不知道PDO在循环中对同一个表调用更新时是否出错,因为我在其他地方从未遇到过这个问题。提前谢谢

虽然很难从你提供的草图中分辨出你真正的代码是什么

以下是您正在做的一个简化示例:

$apples = 4;
$apples = 18;
echo $apples;

它会打印多少苹果,为什么会“干扰”初始数量?

对于初学者来说,你使用的是
bindParam()
就像它是
bindValue()
,它们是

如果不知道从何处获取数组值,就很难确定到底发生了什么。看起来您提供的信息实际上可能不是您正在使用的代码,并且已经被修改,特别是关于foreach循环和data_数组变量,因为您所描述的是BindParam的一个常见问题,所以这是我将要处理的假设。如果是这种情况,通常最好提供实际的代码片段,包括所用变量的初始化和发现问题的块,而不仅仅是这些块中的代码

这里是另一个答案,基本上确保通过引用传递foreach循环的值部分,或者将bindParams更改为bindpalues。如果您计划继续使用此结构,您还需要确保在这里使用两个独立的对象,而不是一个,因为每次调用
execute()
时,您都在运行这两个
bindParam()
方法

比如说,如果代码结构没有改变(可能应该是这样,因为这都在循环中,只有Execute应该在循环中):

不过,一种更为理想的方法是(请记住,这只是一个一般的例子):


但是,不同的数据集仍然存在这个问题。即使我准备了一次,执行了多次,数据仍然会相互干扰。我将不同的参数绑定到两个执行方法,并操作不同的行。我该如何解决这个问题?你能告诉我,它将打印多少以及为什么吗?存储在数据库中的结果是,具有不同ID的两个数据集将被处理为“挂起”,并完全覆盖数据的数据状态。等等,你是说,因为$apples=18覆盖$apples=4,两个不同的实例化以某种方式相互交叉?即使我在执行第一个$stmt后将$db对象设置为null,然后调用$db=new Database(),并将其绑定到$stmt2,它仍然会在数据库中覆盖它。这是MySQL中的问题吗?您没有显示$data_array1和$data_array2的准备代码。是否可能/可能两者中的数据id相同?不,id完全不同,因为它们以前使用不同的参数检索,然后存储在不同的数组中。您能否发布它在foreach循环中的外观?我怀疑你打电话给execute的地方不对。谢谢你的提示。我最终完全重写了逻辑,但也使用了bindValue,一切都运行得很顺利,很漂亮。谢谢大家的帮助。:)
$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()';
}