PDO和MySQL更新Foreach循环(PDO and MySQL UPDATE in Forea

2019-10-29 21:49发布

我有这个问题,有我彻底难倒。 这是我的执行模式。 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(); 我用一个单独的语句准备,只是结合新语句的参数尝试。 我试过$语句和$ DB实例设置为空,然后将其重新实例无济于事。 我使用情况,那么和IF条件语句查询中...没有尝试过。 对这个问题是什么任何信息将是美好的。 我不知道是否PDO有一个循环中调用同一个表更新的错误,因为我从来没有在其他地方有过这个问题。 提前致谢!

Answer 1:

对于初学者来说,你正在使用bindParam()喜欢它的bindValue()它们是完全不同的 。

没有看到你在哪里得到您的数组值从它有点很难看到发生了什么事情肯定。 它看起来像你提供可能的信息实际上并不您正在使用和已被修改,特别是关于foreach循环和data_array中变量什么你所描述的是BindParam常见的一个问题,所以这是假设我的代码“会被工作。 如果是这样的话,这是一般的好主意,提供实际的代码片段,包括使用的变量和块当问题被发现,而不是仅仅在这些区块的代码初始化。

下面是另一个答案与原因 ,基本上请确保您的引用传递您的foreach循环或您改变bindParams到bindValues的价值部分。 您还需要确保你在这里使用两个单独的对象,而不是之一,如果你打算继续,因为你同时运行采用这种结构bindParam()每次调用时间的方法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()';
}


Answer 2:

虽然这是非常很难说什么是你真正的代码,您提供的草图,

这是你在做的一个简单的例子:

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

需要多少苹果将其打印为什么它会“干扰”初始金额是多少?



文章来源: PDO and MySQL UPDATE in Foreach Loop