Php 每次通过选择/插入循环都会增加

Php 每次通过选择/插入循环都会增加,php,odbc,Php,Odbc,我有一个理论上非常简单的脚本,我试图在开发DB2数据库上选择关系数据,然后插入到单独的生产DB2服务器中(在过程中在生产端创建新的ID和关系) 在这个脚本中,我: 从dev ITEM表中选择 存储原始主键 将数据插入到dev ITEM表中 获取新插入的ID 从具有原始ID的dev中选择子项 对于每个子项,我将数据插入到prod子项表中,新创建的项ID作为关系 问题是脚本实际上运行成功,但随着它的运行,它只是增加了一个,因此即使它正确地插入了每个项,它也只会获取数据库中的每个子项并存储原始(第

我有一个理论上非常简单的脚本,我试图在开发DB2数据库上选择关系数据,然后插入到单独的生产DB2服务器中(在过程中在生产端创建新的ID和关系)

在这个脚本中,我:

  • 从dev ITEM表中选择
  • 存储原始主键
  • 将数据插入到dev ITEM表中
  • 获取新插入的ID
  • 从具有原始ID的dev中选择子项
  • 对于每个子项,我将数据插入到prod子项表中,新创建的项ID作为关系
问题是脚本实际上运行成功,但随着它的运行,它只是增加了一个,因此即使它正确地插入了每个项,它也只会获取数据库中的每个子项并存储原始(第1行)ID。例如:

我的第一个ITEM select返回ID 1204。当我让它为几个项目运行时,我的ITEM表显示ID为120412051206和1207的记录

这是正确的,但当我查看subITEMS表时,我有10个子项记录,所有记录的itemID都是1204。因此,它为每个迭代项都获得了正确的子项,但只插入了第一个newID变量

我在这里做错了什么:

if($DB2connDEV && $DB2connPROD){

    $getDevItems = "
                SELECT 
                    itemt_ID,
                    DESCRIPTION
                FROM itemt 
            ";

    $stmt = odbc_exec($DB2connDEV, $getDevItems);

    while($gettingDevItems = odbc_fetch_array($stmt)){
        $rows[] = $gettingDevItems;
    }

    foreach($rows as $row){
        $prepInsert = odbc_prepare($DB2connPROD, "INSERT INTO itemt (itemt_id, description) VALUES(?,?)");

        $originalID = $row['itemt_ID'];
        $description = $row['DESCRIPTION'];

        $insertTable = odbc_execute($prepInsert, array($description));

        //Get newly created ID       
        $getIdentity = "SELECT IDENTITY_VAL_LOCAL() AS LASTID FROM SYSIBM.SYSDUMMY1";

        $stmt = odbc_exec($DB2connPROD, $getIdentity);
        $row = odbc_fetch_array($stmt);
        $newID = $row['LASTID'];

        if($newID) {
            echo "Last Insert ID is : " . $newID . "\n";
        } else {
            echo "No Last insert ID.\n";
        }

        //Get subItems and insert 
        $getSubItems = "SELECT NAME, DESCRIPTION
                FROM SUBITEMT
                WHERE itemt_ID = $originalID";

        $selectSubItems = odbc_exec($DB2connDEV, $getSubItems);

        while($gettingSubItems = odbc_fetch_array($selectSubItems)){
            $subItemRows[] = $gettingSubItems;
        }

        foreach($subItemRows as $subItemRow){
            $subItemPrepInsert = odbc_prepare($DB2connPROD, "INSERT INTO subitemt (itemt_id, NAME, DESCRIPTION) VALUES(?,?,?)");
            $subItemName = $subItemRow['NAME'];
            $subItemDescription = $subItemRow['DESCRIPTION'];

            $subtaskInsertExec = odbc_execute($subtaskPrepInsert, array($newID, $subItemName, $subItemDescription));

            //get newly created ID for subitem
            $getsubtaskID = "SELECT IDENTITY_VAL_LOCAL() AS LASTID FROM SYSIBM.SYSDUMMY1";

            $subtaskIDSTMT = odbc_exec($DB2connPROD, $getsubtaskID);

            $newsubItemRow = odbc_fetch_array($subtaskIDSTMT);
            $newSubItemID = $newsubItemRow['LASTID'];

            if($newSubItemID) {
                echo "Last Insert subItem ID is : " . $newSubItemID . "\n";
            } else {
                echo "No Last insert subItem ID.\n";
            }
        }
    }

    odbc_close($DB2connPROD);
    odbc_close($DB2connDEV);
}

问题在于,在主循环的迭代之间没有清除
$subitemrrows
。因此,每次将新的子项添加到以前迭代中的子项时

循环之前:

while($gettingSubItems = odbc_fetch_array($selectSubItems)){
    $subItemRows[] = $gettingSubItems;
}

$prepInsert
有两个占位符,但在
数组($description)
中只有一个值。它应该是
数组($itemt\u ID,$description)
@Barmar很抱歉,这实际上是一个我没有注意到的打字错误,但是我的代码确实有。我想我在格式化此后期图形时意外删除了它,因为没有它,代码甚至无法运行。为什么要将第一个
插入itemt
?您正在插入刚刚选择的内容。@Barmar我正在从数据库在一个单独的IP/服务器上进行开发,然后插入到一个具有不同连接的生产IP/服务器上啊,是的!!!就是这样,我不确定我是如何从一开始就忽略了这一点!我真的很感谢你在这方面的帮助我以前遇到过这个问题,我应该记住在循环之前总是将空数组设置为那样没有理由创建首先是数组。你可以在$subItemRow=odbc\u fetch\u array($selectSubItems))中执行所有操作。因此,我也没有理由在顶层清除$rows[]数组。
$rows
只使用一次,所以没关系。
while($gettingSubItems = odbc_fetch_array($selectSubItems)){
    $subItemRows[] = $gettingSubItems;
}