gpt4 book ai didi

php - Foreach 循环中的 PDO 和 MySQL 更新

转载 作者:行者123 更新时间:2023-11-29 13:03:33 26 4
gpt4 key购买 nike

我遇到了这个问题,这让我完全陷入困境。这是我的执行模式。 PDO 调用嵌套在 foreach 循环中。

foreach(){
foreach(){

}
}

我将 PDO 与 MySQL 一起使用,当我连续执行 UPDATE 查询时,它们在循环内相互干扰。我知道他们通过注释一组并执行另一组来单独工作。这是我正在处理的代码模板:

$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(); 关闭光标我尝试使用单个语句进行准备,然后将新参数绑定(bind)到该语句。我尝试将 $stmt 和 $db 实例设置为 null,然后重新实例化它们,但无济于事。我尝试在查询中使用 CASE THEN 和 IF 条件...什么也没有。任何有关问题所在的信息都会很棒。我不知道 PDO 在循环内对同一个表调用 UPDATES 是否有错误,因为我在其他地方从未遇到过这个问题。提前致谢!

最佳答案

对于初学者,您正在使用 bindParam()就像bindValue() ,他们是quite different .

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

这是另一个答案 with why ,基本上确保您通过引用传递 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()';
}

关于php - Foreach 循环中的 PDO 和 MySQL 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23026175/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com